From 5c510ebd07c3e1029108e2dcea584e6328050e9a Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 20 Aug 2025 16:06:09 +0200 Subject: [PATCH] Add skill removal functionality and enhance UI components - Integrated onRemoveSkill functionality in SkillEvaluation, SkillSelector, and SkillEvaluationCard components for better skill management. - Updated UI to improve user experience when removing skills, including tooltip descriptions and styling adjustments. - Added new skills to backend, devops, frontend, and mobile JSON files for comprehensive skill coverage. --- .../evaluation/skill-evaluation-card.tsx | 28 ++-- .../evaluation/skill-evaluation-grid.tsx | 5 + components/skill-evaluation.tsx | 1 + components/skill-selector.tsx | 41 +++--- data/skills/backend.json | 126 ++++++++++++++++++ data/skills/cloud.json | 96 +++++++++++++ data/skills/data.json | 96 +++++++++++++ data/skills/design.json | 96 +++++++++++++ data/skills/devops.json | 126 ++++++++++++++++++ data/skills/frontend.json | 117 ++++++++++++++++ data/skills/mobile.json | 99 ++++++++++++++ data/skills/security.json | 96 +++++++++++++ lib/category-icons.ts | 10 +- lib/data-loader.ts | 11 +- public/data/skills/backend.json | 126 ++++++++++++++++++ public/data/skills/cloud.json | 96 +++++++++++++ public/data/skills/data.json | 96 +++++++++++++ public/data/skills/design.json | 96 +++++++++++++ public/data/skills/devops.json | 126 ++++++++++++++++++ public/data/skills/frontend.json | 117 ++++++++++++++++ public/data/skills/mobile.json | 99 ++++++++++++++ public/data/skills/security.json | 96 +++++++++++++ 22 files changed, 1758 insertions(+), 42 deletions(-) create mode 100644 data/skills/cloud.json create mode 100644 data/skills/data.json create mode 100644 data/skills/design.json create mode 100644 data/skills/security.json create mode 100644 public/data/skills/cloud.json create mode 100644 public/data/skills/data.json create mode 100644 public/data/skills/design.json create mode 100644 public/data/skills/security.json diff --git a/components/evaluation/skill-evaluation-card.tsx b/components/evaluation/skill-evaluation-card.tsx index 9270206..25eafb2 100644 --- a/components/evaluation/skill-evaluation-card.tsx +++ b/components/evaluation/skill-evaluation-card.tsx @@ -1,4 +1,4 @@ -import { ExternalLink, BookOpen, Target, Info } from "lucide-react"; +import { ExternalLink, Info, X } from "lucide-react"; import { Tooltip, TooltipContent, @@ -11,6 +11,7 @@ interface SkillEvaluationCardProps { skill: Skill; currentLevel: SkillLevel; onUpdateSkill: (skillId: string, level: SkillLevel) => void; + onRemoveSkill: (skillId: string) => void; } function getLevelColor(level: Exclude) { @@ -43,6 +44,7 @@ export function SkillEvaluationCard({ skill, currentLevel, onUpdateSkill, + onRemoveSkill, }: SkillEvaluationCardProps) { const TechIcon = getTechIcon(skill.id); @@ -131,27 +133,19 @@ export function SkillEvaluationCard({ ); })} - {/* Goal buttons */} -
+ {/* Remove button */} +
- -

Envie d'apprendre

-
-
- - - - - - -

Peut encadrer

+

Supprimer cette technologie

diff --git a/components/evaluation/skill-evaluation-grid.tsx b/components/evaluation/skill-evaluation-grid.tsx index 767be2a..357d1a8 100644 --- a/components/evaluation/skill-evaluation-grid.tsx +++ b/components/evaluation/skill-evaluation-grid.tsx @@ -5,12 +5,14 @@ interface SkillEvaluationGridProps { currentCategory: SkillCategory; currentEvaluation: CategoryEvaluation; onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void; + onRemoveSkill: (category: string, skillId: string) => void; } export function SkillEvaluationGrid({ currentCategory, currentEvaluation, onUpdateSkill, + onRemoveSkill, }: SkillEvaluationGridProps) { const getSkillLevel = (skillId: string): SkillLevel => { const skillEval = currentEvaluation?.skills.find( @@ -52,6 +54,9 @@ export function SkillEvaluationGrid({ onUpdateSkill={(skillId, level) => onUpdateSkill(currentCategory.category, skillId, level) } + onRemoveSkill={(skillId) => + onRemoveSkill(currentCategory.category, skillId) + } /> ); })} diff --git a/components/skill-evaluation.tsx b/components/skill-evaluation.tsx index c48365c..8eae501 100644 --- a/components/skill-evaluation.tsx +++ b/components/skill-evaluation.tsx @@ -94,6 +94,7 @@ export function SkillEvaluation({ currentCategory={currentCategory} currentEvaluation={currentEvaluation} onUpdateSkill={onUpdateSkill} + onRemoveSkill={onRemoveSkill} /> )}
diff --git a/components/skill-selector.tsx b/components/skill-selector.tsx index 5faa6a3..08a94a3 100644 --- a/components/skill-selector.tsx +++ b/components/skill-selector.tsx @@ -11,8 +11,7 @@ import { DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; -import { Plus, Search, X } from "lucide-react"; +import { Plus, Search } from "lucide-react"; import { SkillCategory, CategoryEvaluation } from "@/lib/types"; import { getTechIcon } from "./icons/tech-icons"; @@ -41,9 +40,9 @@ export function SkillSelector({ (evaluation) => evaluation.category === selectedCategory ); - if (!currentCategory || !currentEvaluation) return null; + if (!currentCategory) return null; - const selectedSkillIds = currentEvaluation.selectedSkillIds || []; + const selectedSkillIds = currentEvaluation?.selectedSkillIds || []; const filteredSkills = currentCategory.skills.filter( (skill) => @@ -67,7 +66,10 @@ export function SkillSelector({

Mes compétences sélectionnées

- @@ -147,24 +149,17 @@ export function SkillSelector({ {selectedSkills.length > 0 ? ( -
- {selectedSkills.map((skill) => ( - - {skill.name} - - - ))} +
+
+

+ {selectedSkills.length} compétence + {selectedSkills.length > 1 ? "s" : ""} sélectionnée + {selectedSkills.length > 1 ? "s" : ""} +

+
+ Supprimez directement depuis les lignes ci-dessous +
+
) : (
diff --git a/data/skills/backend.json b/data/skills/backend.json index 07f9bdd..23e98c8 100644 --- a/data/skills/backend.json +++ b/data/skills/backend.json @@ -61,6 +61,132 @@ "https://redis.io/documentation", "https://github.com/redis/redis" ] + }, + { + "id": "golang", + "name": "Go", + "description": "Langage de programmation développé par Google", + "links": [ + "https://golang.org/", + "https://golang.org/doc/" + ] + }, + { + "id": "rust", + "name": "Rust", + "description": "Langage de programmation système sûr et performant", + "links": [ + "https://www.rust-lang.org/", + "https://doc.rust-lang.org/" + ] + }, + { + "id": "java-spring", + "name": "Java Spring", + "description": "Framework Java pour applications d'entreprise", + "links": [ + "https://spring.io/", + "https://docs.spring.io/" + ] + }, + { + "id": "csharp-dotnet", + "name": "C# .NET", + "description": "Plateforme de développement Microsoft", + "links": [ + "https://dotnet.microsoft.com/", + "https://docs.microsoft.com/dotnet/" + ] + }, + { + "id": "php-laravel", + "name": "PHP Laravel", + "description": "Framework PHP moderne pour applications web", + "links": [ + "https://laravel.com/", + "https://laravel.com/docs" + ] + }, + { + "id": "ruby-rails", + "name": "Ruby on Rails", + "description": "Framework web en Ruby", + "links": [ + "https://rubyonrails.org/", + "https://guides.rubyonrails.org/" + ] + }, + { + "id": "graphql", + "name": "GraphQL", + "description": "Langage de requête pour APIs", + "links": [ + "https://graphql.org/", + "https://graphql.org/learn/" + ] + }, + { + "id": "prisma", + "name": "Prisma", + "description": "ORM moderne pour Node.js et TypeScript", + "links": [ + "https://www.prisma.io/", + "https://www.prisma.io/docs" + ] + }, + { + "id": "trpc", + "name": "tRPC", + "description": "Framework TypeScript pour APIs type-safe", + "links": [ + "https://trpc.io/", + "https://trpc.io/docs" + ] + }, + { + "id": "nest-js", + "name": "NestJS", + "description": "Framework Node.js pour applications scalables", + "links": [ + "https://nestjs.com/", + "https://docs.nestjs.com/" + ] + }, + { + "id": "fastify", + "name": "Fastify", + "description": "Framework web rapide pour Node.js", + "links": [ + "https://www.fastify.io/", + "https://www.fastify.io/docs/" + ] + }, + { + "id": "rabbitmq", + "name": "RabbitMQ", + "description": "Broker de messages open source", + "links": [ + "https://www.rabbitmq.com/", + "https://www.rabbitmq.com/documentation.html" + ] + }, + { + "id": "apache-kafka", + "name": "Apache Kafka", + "description": "Plateforme de streaming distribuée", + "links": [ + "https://kafka.apache.org/", + "https://kafka.apache.org/documentation/" + ] + }, + { + "id": "microservices", + "name": "Microservices", + "description": "Architecture en microservices", + "links": [ + "https://microservices.io/", + "https://martinfowler.com/articles/microservices.html" + ] } ] } diff --git a/data/skills/cloud.json b/data/skills/cloud.json new file mode 100644 index 0000000..04915d4 --- /dev/null +++ b/data/skills/cloud.json @@ -0,0 +1,96 @@ +{ + "category": "Cloud", + "icon": "cloud", + "skills": [ + { + "id": "aws", + "name": "Amazon Web Services", + "description": "Plateforme de services cloud d'Amazon", + "links": [ + "https://aws.amazon.com/", + "https://docs.aws.amazon.com/" + ] + }, + { + "id": "azure", + "name": "Microsoft Azure", + "description": "Plateforme cloud de Microsoft", + "links": [ + "https://azure.microsoft.com/", + "https://docs.microsoft.com/azure/" + ] + }, + { + "id": "gcp", + "name": "Google Cloud Platform", + "description": "Services cloud de Google", + "links": [ + "https://cloud.google.com/", + "https://cloud.google.com/docs" + ] + }, + { + "id": "terraform", + "name": "Terraform", + "description": "Outil d'infrastructure as code", + "links": [ + "https://www.terraform.io/", + "https://learn.hashicorp.com/terraform" + ] + }, + { + "id": "serverless", + "name": "Serverless Framework", + "description": "Framework pour applications serverless", + "links": [ + "https://www.serverless.com/", + "https://www.serverless.com/framework/docs/" + ] + }, + { + "id": "lambda", + "name": "AWS Lambda", + "description": "Service de calcul serverless d'AWS", + "links": [ + "https://aws.amazon.com/lambda/", + "https://docs.aws.amazon.com/lambda/" + ] + }, + { + "id": "cloudformation", + "name": "CloudFormation", + "description": "Service d'infrastructure as code d'AWS", + "links": [ + "https://aws.amazon.com/cloudformation/", + "https://docs.aws.amazon.com/cloudformation/" + ] + }, + { + "id": "s3", + "name": "Amazon S3", + "description": "Service de stockage d'objets d'AWS", + "links": [ + "https://aws.amazon.com/s3/", + "https://docs.aws.amazon.com/s3/" + ] + }, + { + "id": "ec2", + "name": "Amazon EC2", + "description": "Service de calcul élastique d'AWS", + "links": [ + "https://aws.amazon.com/ec2/", + "https://docs.aws.amazon.com/ec2/" + ] + }, + { + "id": "cloudfront", + "name": "CloudFront", + "description": "Réseau de diffusion de contenu (CDN) d'AWS", + "links": [ + "https://aws.amazon.com/cloudfront/", + "https://docs.aws.amazon.com/cloudfront/" + ] + } + ] +} diff --git a/data/skills/data.json b/data/skills/data.json new file mode 100644 index 0000000..471f2c6 --- /dev/null +++ b/data/skills/data.json @@ -0,0 +1,96 @@ +{ + "category": "Data", + "icon": "database", + "skills": [ + { + "id": "sql", + "name": "SQL", + "description": "Langage de requête pour bases de données relationnelles", + "links": [ + "https://www.postgresql.org/docs/", + "https://dev.mysql.com/doc/" + ] + }, + { + "id": "postgresql", + "name": "PostgreSQL", + "description": "Base de données relationnelle open source avancée", + "links": [ + "https://www.postgresql.org/", + "https://www.postgresql.org/docs/" + ] + }, + { + "id": "mongodb", + "name": "MongoDB", + "description": "Base de données NoSQL orientée documents", + "links": [ + "https://www.mongodb.com/", + "https://docs.mongodb.com/" + ] + }, + { + "id": "redis", + "name": "Redis", + "description": "Base de données en mémoire, cache et courtier de messages", + "links": [ + "https://redis.io/", + "https://redis.io/docs/" + ] + }, + { + "id": "elasticsearch", + "name": "Elasticsearch", + "description": "Moteur de recherche et d'analyse distribué", + "links": [ + "https://www.elastic.co/elasticsearch/", + "https://www.elastic.co/guide/" + ] + }, + { + "id": "python-data", + "name": "Python (Data Science)", + "description": "Python pour l'analyse de données et machine learning", + "links": [ + "https://pandas.pydata.org/", + "https://scikit-learn.org/" + ] + }, + { + "id": "tableau", + "name": "Tableau", + "description": "Plateforme de visualisation de données", + "links": [ + "https://www.tableau.com/", + "https://help.tableau.com/" + ] + }, + { + "id": "powerbi", + "name": "Power BI", + "description": "Service d'analyse de données de Microsoft", + "links": [ + "https://powerbi.microsoft.com/", + "https://docs.microsoft.com/power-bi/" + ] + }, + { + "id": "spark", + "name": "Apache Spark", + "description": "Moteur de traitement de données distribuées", + "links": [ + "https://spark.apache.org/", + "https://spark.apache.org/docs/" + ] + }, + { + "id": "airflow", + "name": "Apache Airflow", + "description": "Plateforme d'orchestration de workflows", + "links": [ + "https://airflow.apache.org/", + "https://airflow.apache.org/docs/" + ] + } + ] +} diff --git a/data/skills/design.json b/data/skills/design.json new file mode 100644 index 0000000..6b9f94a --- /dev/null +++ b/data/skills/design.json @@ -0,0 +1,96 @@ +{ + "category": "Design", + "icon": "palette", + "skills": [ + { + "id": "figma", + "name": "Figma", + "description": "Outil de design d'interface collaboratif", + "links": [ + "https://www.figma.com/", + "https://help.figma.com/" + ] + }, + { + "id": "sketch", + "name": "Sketch", + "description": "Outil de design d'interface pour macOS", + "links": [ + "https://www.sketch.com/", + "https://www.sketch.com/docs/" + ] + }, + { + "id": "adobe-xd", + "name": "Adobe XD", + "description": "Outil de design et prototypage d'Adobe", + "links": [ + "https://www.adobe.com/products/xd.html", + "https://helpx.adobe.com/xd/" + ] + }, + { + "id": "ux-ui", + "name": "UX/UI Design", + "description": "Conception d'expérience et d'interface utilisateur", + "links": [ + "https://www.nngroup.com/", + "https://material.io/design/" + ] + }, + { + "id": "design-system", + "name": "Design System", + "description": "Systèmes de design et composants réutilisables", + "links": [ + "https://designsystemsrepo.com/", + "https://www.designbetter.co/design-systems-handbook" + ] + }, + { + "id": "prototyping", + "name": "Prototypage", + "description": "Création de prototypes interactifs", + "links": [ + "https://www.prototypr.io/", + "https://www.invisionapp.com/" + ] + }, + { + "id": "user-research", + "name": "Recherche utilisateur", + "description": "Méthodologies de recherche UX", + "links": [ + "https://www.nngroup.com/articles/", + "https://www.usability.gov/" + ] + }, + { + "id": "accessibility", + "name": "Accessibilité", + "description": "Design accessible et inclusive", + "links": [ + "https://www.w3.org/WAI/", + "https://webaim.org/" + ] + }, + { + "id": "responsive-design", + "name": "Design Responsive", + "description": "Conception adaptative multi-dispositifs", + "links": [ + "https://developers.google.com/web/fundamentals/design-and-ux/responsive", + "https://responsivedesign.is/" + ] + }, + { + "id": "motion-design", + "name": "Motion Design", + "description": "Animation et transitions d'interface", + "links": [ + "https://material.io/design/motion/", + "https://www.framer.com/" + ] + } + ] +} diff --git a/data/skills/devops.json b/data/skills/devops.json index c94161b..fd5ae1d 100644 --- a/data/skills/devops.json +++ b/data/skills/devops.json @@ -61,6 +61,132 @@ "https://docs.github.com/en/actions", "https://github.com/actions" ] + }, + { + "id": "ansible", + "name": "Ansible", + "description": "Outil d'automatisation IT et de gestion de configuration", + "links": [ + "https://www.ansible.com/", + "https://docs.ansible.com/" + ] + }, + { + "id": "jenkins", + "name": "Jenkins", + "description": "Serveur d'automatisation open source", + "links": [ + "https://www.jenkins.io/", + "https://www.jenkins.io/doc/" + ] + }, + { + "id": "gitlab-ci", + "name": "GitLab CI/CD", + "description": "Pipeline d'intégration continue de GitLab", + "links": [ + "https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/", + "https://docs.gitlab.com/ee/ci/" + ] + }, + { + "id": "prometheus", + "name": "Prometheus", + "description": "Système de monitoring et d'alerting", + "links": [ + "https://prometheus.io/", + "https://prometheus.io/docs/" + ] + }, + { + "id": "grafana", + "name": "Grafana", + "description": "Plateforme de visualisation et monitoring", + "links": [ + "https://grafana.com/", + "https://grafana.com/docs/" + ] + }, + { + "id": "elk-stack", + "name": "ELK Stack", + "description": "Elasticsearch, Logstash, et Kibana pour logs", + "links": [ + "https://www.elastic.co/what-is/elk-stack", + "https://www.elastic.co/guide/" + ] + }, + { + "id": "nginx", + "name": "Nginx", + "description": "Serveur web et proxy inverse", + "links": [ + "https://nginx.org/", + "https://nginx.org/en/docs/" + ] + }, + { + "id": "apache", + "name": "Apache HTTP Server", + "description": "Serveur web open source", + "links": [ + "https://httpd.apache.org/", + "https://httpd.apache.org/docs/" + ] + }, + { + "id": "traefik", + "name": "Traefik", + "description": "Proxy inverse moderne et load balancer", + "links": [ + "https://traefik.io/", + "https://doc.traefik.io/" + ] + }, + { + "id": "helm", + "name": "Helm", + "description": "Gestionnaire de packages pour Kubernetes", + "links": [ + "https://helm.sh/", + "https://helm.sh/docs/" + ] + }, + { + "id": "istio", + "name": "Istio", + "description": "Service mesh pour microservices", + "links": [ + "https://istio.io/", + "https://istio.io/latest/docs/" + ] + }, + { + "id": "vault", + "name": "HashiCorp Vault", + "description": "Gestion des secrets et chiffrement", + "links": [ + "https://www.vaultproject.io/", + "https://learn.hashicorp.com/vault" + ] + }, + { + "id": "consul", + "name": "HashiCorp Consul", + "description": "Service discovery et configuration", + "links": [ + "https://www.consul.io/", + "https://learn.hashicorp.com/consul" + ] + }, + { + "id": "nomad", + "name": "HashiCorp Nomad", + "description": "Orchestrateur de workloads", + "links": [ + "https://www.nomadproject.io/", + "https://learn.hashicorp.com/nomad" + ] } ] } diff --git a/data/skills/frontend.json b/data/skills/frontend.json index 349fa21..56599bc 100644 --- a/data/skills/frontend.json +++ b/data/skills/frontend.json @@ -61,6 +61,123 @@ "https://webpack.js.org/concepts/", "https://github.com/webpack/webpack" ] + }, + { + "id": "vite", + "name": "Vite", + "description": "Outil de build rapide pour applications modernes", + "links": [ + "https://vitejs.dev/", + "https://vitejs.dev/guide/" + ] + }, + { + "id": "svelte", + "name": "Svelte", + "description": "Framework de compilation pour interfaces utilisateur", + "links": [ + "https://svelte.dev/", + "https://svelte.dev/docs" + ] + }, + { + "id": "solidjs", + "name": "SolidJS", + "description": "Framework JavaScript réactif et performant", + "links": [ + "https://www.solidjs.com/", + "https://www.solidjs.com/docs" + ] + }, + { + "id": "astro", + "name": "Astro", + "description": "Framework statique multi-framework", + "links": [ + "https://astro.build/", + "https://docs.astro.build/" + ] + }, + { + "id": "remix", + "name": "Remix", + "description": "Framework full-stack centré sur les standards web", + "links": [ + "https://remix.run/", + "https://remix.run/docs" + ] + }, + { + "id": "storybook", + "name": "Storybook", + "description": "Outil de développement pour composants UI", + "links": [ + "https://storybook.js.org/", + "https://storybook.js.org/docs" + ] + }, + { + "id": "cypress", + "name": "Cypress", + "description": "Framework de tests end-to-end", + "links": [ + "https://www.cypress.io/", + "https://docs.cypress.io/" + ] + }, + { + "id": "playwright", + "name": "Playwright", + "description": "Framework de tests pour applications web", + "links": [ + "https://playwright.dev/", + "https://playwright.dev/docs/" + ] + }, + { + "id": "three-js", + "name": "Three.js", + "description": "Bibliothèque JavaScript pour 3D dans le navigateur", + "links": [ + "https://threejs.org/", + "https://threejs.org/docs/" + ] + }, + { + "id": "d3", + "name": "D3.js", + "description": "Bibliothèque de visualisation de données", + "links": [ + "https://d3js.org/", + "https://github.com/d3/d3/wiki" + ] + }, + { + "id": "gsap", + "name": "GSAP", + "description": "Bibliothèque d'animations web performantes", + "links": [ + "https://greensock.com/gsap/", + "https://greensock.com/docs/" + ] + }, + { + "id": "web-components", + "name": "Web Components", + "description": "Standards natifs pour composants réutilisables", + "links": [ + "https://developer.mozilla.org/en-US/docs/Web/Web_Components", + "https://web.dev/web-components/" + ] + }, + { + "id": "pwa", + "name": "Progressive Web Apps", + "description": "Applications web progressives", + "links": [ + "https://web.dev/progressive-web-apps/", + "https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" + ] } ] } diff --git a/data/skills/mobile.json b/data/skills/mobile.json index cf1d130..43f1918 100644 --- a/data/skills/mobile.json +++ b/data/skills/mobile.json @@ -51,6 +51,105 @@ "https://docs.expo.dev/", "https://github.com/expo/expo" ] + }, + { + "id": "ionic", + "name": "Ionic", + "description": "Framework pour applications mobiles hybrides", + "links": [ + "https://ionicframework.com/", + "https://ionicframework.com/docs" + ] + }, + { + "id": "xamarin", + "name": "Xamarin", + "description": "Plateforme de développement mobile Microsoft", + "links": [ + "https://dotnet.microsoft.com/apps/xamarin", + "https://docs.microsoft.com/xamarin/" + ] + }, + { + "id": "unity", + "name": "Unity", + "description": "Moteur de jeu pour applications mobiles", + "links": [ + "https://unity.com/", + "https://docs.unity3d.com/" + ] + }, + { + "id": "cordova", + "name": "Apache Cordova", + "description": "Plateforme pour applications mobiles hybrides", + "links": [ + "https://cordova.apache.org/", + "https://cordova.apache.org/docs/" + ] + }, + { + "id": "capacitor", + "name": "Capacitor", + "description": "Runtime natif pour applications web", + "links": [ + "https://capacitorjs.com/", + "https://capacitorjs.com/docs" + ] + }, + { + "id": "fastlane", + "name": "Fastlane", + "description": "Automatisation pour développement mobile", + "links": [ + "https://fastlane.tools/", + "https://docs.fastlane.tools/" + ] + }, + { + "id": "firebase", + "name": "Firebase", + "description": "Plateforme de développement mobile Google", + "links": [ + "https://firebase.google.com/", + "https://firebase.google.com/docs" + ] + }, + { + "id": "app-store-optimization", + "name": "App Store Optimization", + "description": "Optimisation pour stores d'applications", + "links": [ + "https://developer.apple.com/app-store/", + "https://play.google.com/console/" + ] + }, + { + "id": "mobile-testing", + "name": "Tests Mobile", + "description": "Frameworks de tests pour applications mobiles", + "links": [ + "https://appium.io/", + "https://detox.js.org/" + ] + }, + { + "id": "mobile-performance", + "name": "Performance Mobile", + "description": "Optimisation des performances mobiles", + "links": [ + "https://developers.google.com/web/tools/lighthouse", + "https://developer.android.com/topic/performance" + ] + }, + { + "id": "push-notifications", + "name": "Push Notifications", + "description": "Notifications push pour applications mobiles", + "links": [ + "https://firebase.google.com/docs/cloud-messaging", + "https://developer.apple.com/notifications/" + ] } ] } diff --git a/data/skills/security.json b/data/skills/security.json new file mode 100644 index 0000000..4c68394 --- /dev/null +++ b/data/skills/security.json @@ -0,0 +1,96 @@ +{ + "category": "Security", + "icon": "shield", + "skills": [ + { + "id": "oauth", + "name": "OAuth 2.0", + "description": "Framework d'autorisation pour APIs", + "links": [ + "https://oauth.net/2/", + "https://tools.ietf.org/html/rfc6749" + ] + }, + { + "id": "jwt", + "name": "JSON Web Tokens", + "description": "Standard pour transmettre des informations de façon sécurisée", + "links": [ + "https://jwt.io/", + "https://tools.ietf.org/html/rfc7519" + ] + }, + { + "id": "https-ssl", + "name": "HTTPS/SSL", + "description": "Protocoles de sécurisation des communications web", + "links": [ + "https://developer.mozilla.org/en-US/docs/Web/Security", + "https://letsencrypt.org/" + ] + }, + { + "id": "owasp", + "name": "OWASP", + "description": "Bonnes pratiques de sécurité des applications web", + "links": [ + "https://owasp.org/", + "https://owasp.org/www-project-top-ten/" + ] + }, + { + "id": "csrf-xss", + "name": "CSRF/XSS Protection", + "description": "Protection contre les attaques CSRF et XSS", + "links": [ + "https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html", + "https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html" + ] + }, + { + "id": "penetration-testing", + "name": "Tests de pénétration", + "description": "Tests de sécurité offensifs", + "links": [ + "https://owasp.org/www-community/Penetration_Testing_Methodologies", + "https://www.kali.org/" + ] + }, + { + "id": "cryptography", + "name": "Cryptographie", + "description": "Chiffrement et hachage des données", + "links": [ + "https://cryptography.io/", + "https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API" + ] + }, + { + "id": "auth0", + "name": "Auth0", + "description": "Plateforme d'authentification et d'autorisation", + "links": [ + "https://auth0.com/", + "https://auth0.com/docs" + ] + }, + { + "id": "keycloak", + "name": "Keycloak", + "description": "Solution open source de gestion d'identité", + "links": [ + "https://www.keycloak.org/", + "https://www.keycloak.org/documentation" + ] + }, + { + "id": "vault", + "name": "HashiCorp Vault", + "description": "Outil de gestion des secrets", + "links": [ + "https://www.vaultproject.io/", + "https://learn.hashicorp.com/vault" + ] + } + ] +} diff --git a/lib/category-icons.ts b/lib/category-icons.ts index 137d7bf..70ca1e2 100644 --- a/lib/category-icons.ts +++ b/lib/category-icons.ts @@ -2,7 +2,11 @@ import { Monitor, Server, Settings, - Smartphone, + Smartphone, + Database, + Cloud, + Shield, + Palette, LucideIcon } from "lucide-react"; @@ -11,6 +15,10 @@ const CATEGORY_ICON_MAP: Record = { server: Server, settings: Settings, smartphone: Smartphone, + database: Database, + cloud: Cloud, + shield: Shield, + palette: Palette, }; export function getCategoryIcon(iconName: string): LucideIcon { diff --git a/lib/data-loader.ts b/lib/data-loader.ts index 8ad4285..f6273a9 100644 --- a/lib/data-loader.ts +++ b/lib/data-loader.ts @@ -1,7 +1,16 @@ import { SkillCategory, Team } from "./types"; export async function loadSkillCategories(): Promise { - const categories = ["frontend", "backend", "devops", "mobile"]; + const categories = [ + "frontend", + "backend", + "devops", + "mobile", + "data", + "cloud", + "security", + "design", + ]; const skillCategories: SkillCategory[] = []; for (const category of categories) { diff --git a/public/data/skills/backend.json b/public/data/skills/backend.json index 07f9bdd..23e98c8 100644 --- a/public/data/skills/backend.json +++ b/public/data/skills/backend.json @@ -61,6 +61,132 @@ "https://redis.io/documentation", "https://github.com/redis/redis" ] + }, + { + "id": "golang", + "name": "Go", + "description": "Langage de programmation développé par Google", + "links": [ + "https://golang.org/", + "https://golang.org/doc/" + ] + }, + { + "id": "rust", + "name": "Rust", + "description": "Langage de programmation système sûr et performant", + "links": [ + "https://www.rust-lang.org/", + "https://doc.rust-lang.org/" + ] + }, + { + "id": "java-spring", + "name": "Java Spring", + "description": "Framework Java pour applications d'entreprise", + "links": [ + "https://spring.io/", + "https://docs.spring.io/" + ] + }, + { + "id": "csharp-dotnet", + "name": "C# .NET", + "description": "Plateforme de développement Microsoft", + "links": [ + "https://dotnet.microsoft.com/", + "https://docs.microsoft.com/dotnet/" + ] + }, + { + "id": "php-laravel", + "name": "PHP Laravel", + "description": "Framework PHP moderne pour applications web", + "links": [ + "https://laravel.com/", + "https://laravel.com/docs" + ] + }, + { + "id": "ruby-rails", + "name": "Ruby on Rails", + "description": "Framework web en Ruby", + "links": [ + "https://rubyonrails.org/", + "https://guides.rubyonrails.org/" + ] + }, + { + "id": "graphql", + "name": "GraphQL", + "description": "Langage de requête pour APIs", + "links": [ + "https://graphql.org/", + "https://graphql.org/learn/" + ] + }, + { + "id": "prisma", + "name": "Prisma", + "description": "ORM moderne pour Node.js et TypeScript", + "links": [ + "https://www.prisma.io/", + "https://www.prisma.io/docs" + ] + }, + { + "id": "trpc", + "name": "tRPC", + "description": "Framework TypeScript pour APIs type-safe", + "links": [ + "https://trpc.io/", + "https://trpc.io/docs" + ] + }, + { + "id": "nest-js", + "name": "NestJS", + "description": "Framework Node.js pour applications scalables", + "links": [ + "https://nestjs.com/", + "https://docs.nestjs.com/" + ] + }, + { + "id": "fastify", + "name": "Fastify", + "description": "Framework web rapide pour Node.js", + "links": [ + "https://www.fastify.io/", + "https://www.fastify.io/docs/" + ] + }, + { + "id": "rabbitmq", + "name": "RabbitMQ", + "description": "Broker de messages open source", + "links": [ + "https://www.rabbitmq.com/", + "https://www.rabbitmq.com/documentation.html" + ] + }, + { + "id": "apache-kafka", + "name": "Apache Kafka", + "description": "Plateforme de streaming distribuée", + "links": [ + "https://kafka.apache.org/", + "https://kafka.apache.org/documentation/" + ] + }, + { + "id": "microservices", + "name": "Microservices", + "description": "Architecture en microservices", + "links": [ + "https://microservices.io/", + "https://martinfowler.com/articles/microservices.html" + ] } ] } diff --git a/public/data/skills/cloud.json b/public/data/skills/cloud.json new file mode 100644 index 0000000..04915d4 --- /dev/null +++ b/public/data/skills/cloud.json @@ -0,0 +1,96 @@ +{ + "category": "Cloud", + "icon": "cloud", + "skills": [ + { + "id": "aws", + "name": "Amazon Web Services", + "description": "Plateforme de services cloud d'Amazon", + "links": [ + "https://aws.amazon.com/", + "https://docs.aws.amazon.com/" + ] + }, + { + "id": "azure", + "name": "Microsoft Azure", + "description": "Plateforme cloud de Microsoft", + "links": [ + "https://azure.microsoft.com/", + "https://docs.microsoft.com/azure/" + ] + }, + { + "id": "gcp", + "name": "Google Cloud Platform", + "description": "Services cloud de Google", + "links": [ + "https://cloud.google.com/", + "https://cloud.google.com/docs" + ] + }, + { + "id": "terraform", + "name": "Terraform", + "description": "Outil d'infrastructure as code", + "links": [ + "https://www.terraform.io/", + "https://learn.hashicorp.com/terraform" + ] + }, + { + "id": "serverless", + "name": "Serverless Framework", + "description": "Framework pour applications serverless", + "links": [ + "https://www.serverless.com/", + "https://www.serverless.com/framework/docs/" + ] + }, + { + "id": "lambda", + "name": "AWS Lambda", + "description": "Service de calcul serverless d'AWS", + "links": [ + "https://aws.amazon.com/lambda/", + "https://docs.aws.amazon.com/lambda/" + ] + }, + { + "id": "cloudformation", + "name": "CloudFormation", + "description": "Service d'infrastructure as code d'AWS", + "links": [ + "https://aws.amazon.com/cloudformation/", + "https://docs.aws.amazon.com/cloudformation/" + ] + }, + { + "id": "s3", + "name": "Amazon S3", + "description": "Service de stockage d'objets d'AWS", + "links": [ + "https://aws.amazon.com/s3/", + "https://docs.aws.amazon.com/s3/" + ] + }, + { + "id": "ec2", + "name": "Amazon EC2", + "description": "Service de calcul élastique d'AWS", + "links": [ + "https://aws.amazon.com/ec2/", + "https://docs.aws.amazon.com/ec2/" + ] + }, + { + "id": "cloudfront", + "name": "CloudFront", + "description": "Réseau de diffusion de contenu (CDN) d'AWS", + "links": [ + "https://aws.amazon.com/cloudfront/", + "https://docs.aws.amazon.com/cloudfront/" + ] + } + ] +} diff --git a/public/data/skills/data.json b/public/data/skills/data.json new file mode 100644 index 0000000..471f2c6 --- /dev/null +++ b/public/data/skills/data.json @@ -0,0 +1,96 @@ +{ + "category": "Data", + "icon": "database", + "skills": [ + { + "id": "sql", + "name": "SQL", + "description": "Langage de requête pour bases de données relationnelles", + "links": [ + "https://www.postgresql.org/docs/", + "https://dev.mysql.com/doc/" + ] + }, + { + "id": "postgresql", + "name": "PostgreSQL", + "description": "Base de données relationnelle open source avancée", + "links": [ + "https://www.postgresql.org/", + "https://www.postgresql.org/docs/" + ] + }, + { + "id": "mongodb", + "name": "MongoDB", + "description": "Base de données NoSQL orientée documents", + "links": [ + "https://www.mongodb.com/", + "https://docs.mongodb.com/" + ] + }, + { + "id": "redis", + "name": "Redis", + "description": "Base de données en mémoire, cache et courtier de messages", + "links": [ + "https://redis.io/", + "https://redis.io/docs/" + ] + }, + { + "id": "elasticsearch", + "name": "Elasticsearch", + "description": "Moteur de recherche et d'analyse distribué", + "links": [ + "https://www.elastic.co/elasticsearch/", + "https://www.elastic.co/guide/" + ] + }, + { + "id": "python-data", + "name": "Python (Data Science)", + "description": "Python pour l'analyse de données et machine learning", + "links": [ + "https://pandas.pydata.org/", + "https://scikit-learn.org/" + ] + }, + { + "id": "tableau", + "name": "Tableau", + "description": "Plateforme de visualisation de données", + "links": [ + "https://www.tableau.com/", + "https://help.tableau.com/" + ] + }, + { + "id": "powerbi", + "name": "Power BI", + "description": "Service d'analyse de données de Microsoft", + "links": [ + "https://powerbi.microsoft.com/", + "https://docs.microsoft.com/power-bi/" + ] + }, + { + "id": "spark", + "name": "Apache Spark", + "description": "Moteur de traitement de données distribuées", + "links": [ + "https://spark.apache.org/", + "https://spark.apache.org/docs/" + ] + }, + { + "id": "airflow", + "name": "Apache Airflow", + "description": "Plateforme d'orchestration de workflows", + "links": [ + "https://airflow.apache.org/", + "https://airflow.apache.org/docs/" + ] + } + ] +} diff --git a/public/data/skills/design.json b/public/data/skills/design.json new file mode 100644 index 0000000..6b9f94a --- /dev/null +++ b/public/data/skills/design.json @@ -0,0 +1,96 @@ +{ + "category": "Design", + "icon": "palette", + "skills": [ + { + "id": "figma", + "name": "Figma", + "description": "Outil de design d'interface collaboratif", + "links": [ + "https://www.figma.com/", + "https://help.figma.com/" + ] + }, + { + "id": "sketch", + "name": "Sketch", + "description": "Outil de design d'interface pour macOS", + "links": [ + "https://www.sketch.com/", + "https://www.sketch.com/docs/" + ] + }, + { + "id": "adobe-xd", + "name": "Adobe XD", + "description": "Outil de design et prototypage d'Adobe", + "links": [ + "https://www.adobe.com/products/xd.html", + "https://helpx.adobe.com/xd/" + ] + }, + { + "id": "ux-ui", + "name": "UX/UI Design", + "description": "Conception d'expérience et d'interface utilisateur", + "links": [ + "https://www.nngroup.com/", + "https://material.io/design/" + ] + }, + { + "id": "design-system", + "name": "Design System", + "description": "Systèmes de design et composants réutilisables", + "links": [ + "https://designsystemsrepo.com/", + "https://www.designbetter.co/design-systems-handbook" + ] + }, + { + "id": "prototyping", + "name": "Prototypage", + "description": "Création de prototypes interactifs", + "links": [ + "https://www.prototypr.io/", + "https://www.invisionapp.com/" + ] + }, + { + "id": "user-research", + "name": "Recherche utilisateur", + "description": "Méthodologies de recherche UX", + "links": [ + "https://www.nngroup.com/articles/", + "https://www.usability.gov/" + ] + }, + { + "id": "accessibility", + "name": "Accessibilité", + "description": "Design accessible et inclusive", + "links": [ + "https://www.w3.org/WAI/", + "https://webaim.org/" + ] + }, + { + "id": "responsive-design", + "name": "Design Responsive", + "description": "Conception adaptative multi-dispositifs", + "links": [ + "https://developers.google.com/web/fundamentals/design-and-ux/responsive", + "https://responsivedesign.is/" + ] + }, + { + "id": "motion-design", + "name": "Motion Design", + "description": "Animation et transitions d'interface", + "links": [ + "https://material.io/design/motion/", + "https://www.framer.com/" + ] + } + ] +} diff --git a/public/data/skills/devops.json b/public/data/skills/devops.json index c94161b..fd5ae1d 100644 --- a/public/data/skills/devops.json +++ b/public/data/skills/devops.json @@ -61,6 +61,132 @@ "https://docs.github.com/en/actions", "https://github.com/actions" ] + }, + { + "id": "ansible", + "name": "Ansible", + "description": "Outil d'automatisation IT et de gestion de configuration", + "links": [ + "https://www.ansible.com/", + "https://docs.ansible.com/" + ] + }, + { + "id": "jenkins", + "name": "Jenkins", + "description": "Serveur d'automatisation open source", + "links": [ + "https://www.jenkins.io/", + "https://www.jenkins.io/doc/" + ] + }, + { + "id": "gitlab-ci", + "name": "GitLab CI/CD", + "description": "Pipeline d'intégration continue de GitLab", + "links": [ + "https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/", + "https://docs.gitlab.com/ee/ci/" + ] + }, + { + "id": "prometheus", + "name": "Prometheus", + "description": "Système de monitoring et d'alerting", + "links": [ + "https://prometheus.io/", + "https://prometheus.io/docs/" + ] + }, + { + "id": "grafana", + "name": "Grafana", + "description": "Plateforme de visualisation et monitoring", + "links": [ + "https://grafana.com/", + "https://grafana.com/docs/" + ] + }, + { + "id": "elk-stack", + "name": "ELK Stack", + "description": "Elasticsearch, Logstash, et Kibana pour logs", + "links": [ + "https://www.elastic.co/what-is/elk-stack", + "https://www.elastic.co/guide/" + ] + }, + { + "id": "nginx", + "name": "Nginx", + "description": "Serveur web et proxy inverse", + "links": [ + "https://nginx.org/", + "https://nginx.org/en/docs/" + ] + }, + { + "id": "apache", + "name": "Apache HTTP Server", + "description": "Serveur web open source", + "links": [ + "https://httpd.apache.org/", + "https://httpd.apache.org/docs/" + ] + }, + { + "id": "traefik", + "name": "Traefik", + "description": "Proxy inverse moderne et load balancer", + "links": [ + "https://traefik.io/", + "https://doc.traefik.io/" + ] + }, + { + "id": "helm", + "name": "Helm", + "description": "Gestionnaire de packages pour Kubernetes", + "links": [ + "https://helm.sh/", + "https://helm.sh/docs/" + ] + }, + { + "id": "istio", + "name": "Istio", + "description": "Service mesh pour microservices", + "links": [ + "https://istio.io/", + "https://istio.io/latest/docs/" + ] + }, + { + "id": "vault", + "name": "HashiCorp Vault", + "description": "Gestion des secrets et chiffrement", + "links": [ + "https://www.vaultproject.io/", + "https://learn.hashicorp.com/vault" + ] + }, + { + "id": "consul", + "name": "HashiCorp Consul", + "description": "Service discovery et configuration", + "links": [ + "https://www.consul.io/", + "https://learn.hashicorp.com/consul" + ] + }, + { + "id": "nomad", + "name": "HashiCorp Nomad", + "description": "Orchestrateur de workloads", + "links": [ + "https://www.nomadproject.io/", + "https://learn.hashicorp.com/nomad" + ] } ] } diff --git a/public/data/skills/frontend.json b/public/data/skills/frontend.json index 349fa21..56599bc 100644 --- a/public/data/skills/frontend.json +++ b/public/data/skills/frontend.json @@ -61,6 +61,123 @@ "https://webpack.js.org/concepts/", "https://github.com/webpack/webpack" ] + }, + { + "id": "vite", + "name": "Vite", + "description": "Outil de build rapide pour applications modernes", + "links": [ + "https://vitejs.dev/", + "https://vitejs.dev/guide/" + ] + }, + { + "id": "svelte", + "name": "Svelte", + "description": "Framework de compilation pour interfaces utilisateur", + "links": [ + "https://svelte.dev/", + "https://svelte.dev/docs" + ] + }, + { + "id": "solidjs", + "name": "SolidJS", + "description": "Framework JavaScript réactif et performant", + "links": [ + "https://www.solidjs.com/", + "https://www.solidjs.com/docs" + ] + }, + { + "id": "astro", + "name": "Astro", + "description": "Framework statique multi-framework", + "links": [ + "https://astro.build/", + "https://docs.astro.build/" + ] + }, + { + "id": "remix", + "name": "Remix", + "description": "Framework full-stack centré sur les standards web", + "links": [ + "https://remix.run/", + "https://remix.run/docs" + ] + }, + { + "id": "storybook", + "name": "Storybook", + "description": "Outil de développement pour composants UI", + "links": [ + "https://storybook.js.org/", + "https://storybook.js.org/docs" + ] + }, + { + "id": "cypress", + "name": "Cypress", + "description": "Framework de tests end-to-end", + "links": [ + "https://www.cypress.io/", + "https://docs.cypress.io/" + ] + }, + { + "id": "playwright", + "name": "Playwright", + "description": "Framework de tests pour applications web", + "links": [ + "https://playwright.dev/", + "https://playwright.dev/docs/" + ] + }, + { + "id": "three-js", + "name": "Three.js", + "description": "Bibliothèque JavaScript pour 3D dans le navigateur", + "links": [ + "https://threejs.org/", + "https://threejs.org/docs/" + ] + }, + { + "id": "d3", + "name": "D3.js", + "description": "Bibliothèque de visualisation de données", + "links": [ + "https://d3js.org/", + "https://github.com/d3/d3/wiki" + ] + }, + { + "id": "gsap", + "name": "GSAP", + "description": "Bibliothèque d'animations web performantes", + "links": [ + "https://greensock.com/gsap/", + "https://greensock.com/docs/" + ] + }, + { + "id": "web-components", + "name": "Web Components", + "description": "Standards natifs pour composants réutilisables", + "links": [ + "https://developer.mozilla.org/en-US/docs/Web/Web_Components", + "https://web.dev/web-components/" + ] + }, + { + "id": "pwa", + "name": "Progressive Web Apps", + "description": "Applications web progressives", + "links": [ + "https://web.dev/progressive-web-apps/", + "https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps" + ] } ] } diff --git a/public/data/skills/mobile.json b/public/data/skills/mobile.json index cf1d130..43f1918 100644 --- a/public/data/skills/mobile.json +++ b/public/data/skills/mobile.json @@ -51,6 +51,105 @@ "https://docs.expo.dev/", "https://github.com/expo/expo" ] + }, + { + "id": "ionic", + "name": "Ionic", + "description": "Framework pour applications mobiles hybrides", + "links": [ + "https://ionicframework.com/", + "https://ionicframework.com/docs" + ] + }, + { + "id": "xamarin", + "name": "Xamarin", + "description": "Plateforme de développement mobile Microsoft", + "links": [ + "https://dotnet.microsoft.com/apps/xamarin", + "https://docs.microsoft.com/xamarin/" + ] + }, + { + "id": "unity", + "name": "Unity", + "description": "Moteur de jeu pour applications mobiles", + "links": [ + "https://unity.com/", + "https://docs.unity3d.com/" + ] + }, + { + "id": "cordova", + "name": "Apache Cordova", + "description": "Plateforme pour applications mobiles hybrides", + "links": [ + "https://cordova.apache.org/", + "https://cordova.apache.org/docs/" + ] + }, + { + "id": "capacitor", + "name": "Capacitor", + "description": "Runtime natif pour applications web", + "links": [ + "https://capacitorjs.com/", + "https://capacitorjs.com/docs" + ] + }, + { + "id": "fastlane", + "name": "Fastlane", + "description": "Automatisation pour développement mobile", + "links": [ + "https://fastlane.tools/", + "https://docs.fastlane.tools/" + ] + }, + { + "id": "firebase", + "name": "Firebase", + "description": "Plateforme de développement mobile Google", + "links": [ + "https://firebase.google.com/", + "https://firebase.google.com/docs" + ] + }, + { + "id": "app-store-optimization", + "name": "App Store Optimization", + "description": "Optimisation pour stores d'applications", + "links": [ + "https://developer.apple.com/app-store/", + "https://play.google.com/console/" + ] + }, + { + "id": "mobile-testing", + "name": "Tests Mobile", + "description": "Frameworks de tests pour applications mobiles", + "links": [ + "https://appium.io/", + "https://detox.js.org/" + ] + }, + { + "id": "mobile-performance", + "name": "Performance Mobile", + "description": "Optimisation des performances mobiles", + "links": [ + "https://developers.google.com/web/tools/lighthouse", + "https://developer.android.com/topic/performance" + ] + }, + { + "id": "push-notifications", + "name": "Push Notifications", + "description": "Notifications push pour applications mobiles", + "links": [ + "https://firebase.google.com/docs/cloud-messaging", + "https://developer.apple.com/notifications/" + ] } ] } diff --git a/public/data/skills/security.json b/public/data/skills/security.json new file mode 100644 index 0000000..4c68394 --- /dev/null +++ b/public/data/skills/security.json @@ -0,0 +1,96 @@ +{ + "category": "Security", + "icon": "shield", + "skills": [ + { + "id": "oauth", + "name": "OAuth 2.0", + "description": "Framework d'autorisation pour APIs", + "links": [ + "https://oauth.net/2/", + "https://tools.ietf.org/html/rfc6749" + ] + }, + { + "id": "jwt", + "name": "JSON Web Tokens", + "description": "Standard pour transmettre des informations de façon sécurisée", + "links": [ + "https://jwt.io/", + "https://tools.ietf.org/html/rfc7519" + ] + }, + { + "id": "https-ssl", + "name": "HTTPS/SSL", + "description": "Protocoles de sécurisation des communications web", + "links": [ + "https://developer.mozilla.org/en-US/docs/Web/Security", + "https://letsencrypt.org/" + ] + }, + { + "id": "owasp", + "name": "OWASP", + "description": "Bonnes pratiques de sécurité des applications web", + "links": [ + "https://owasp.org/", + "https://owasp.org/www-project-top-ten/" + ] + }, + { + "id": "csrf-xss", + "name": "CSRF/XSS Protection", + "description": "Protection contre les attaques CSRF et XSS", + "links": [ + "https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html", + "https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html" + ] + }, + { + "id": "penetration-testing", + "name": "Tests de pénétration", + "description": "Tests de sécurité offensifs", + "links": [ + "https://owasp.org/www-community/Penetration_Testing_Methodologies", + "https://www.kali.org/" + ] + }, + { + "id": "cryptography", + "name": "Cryptographie", + "description": "Chiffrement et hachage des données", + "links": [ + "https://cryptography.io/", + "https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API" + ] + }, + { + "id": "auth0", + "name": "Auth0", + "description": "Plateforme d'authentification et d'autorisation", + "links": [ + "https://auth0.com/", + "https://auth0.com/docs" + ] + }, + { + "id": "keycloak", + "name": "Keycloak", + "description": "Solution open source de gestion d'identité", + "links": [ + "https://www.keycloak.org/", + "https://www.keycloak.org/documentation" + ] + }, + { + "id": "vault", + "name": "HashiCorp Vault", + "description": "Outil de gestion des secrets", + "links": [ + "https://www.vaultproject.io/", + "https://learn.hashicorp.com/vault" + ] + } + ] +}