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.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { ExternalLink, BookOpen, Target, Info } from "lucide-react";
|
import { ExternalLink, Info, X } from "lucide-react";
|
||||||
import {
|
import {
|
||||||
Tooltip,
|
Tooltip,
|
||||||
TooltipContent,
|
TooltipContent,
|
||||||
@@ -11,6 +11,7 @@ interface SkillEvaluationCardProps {
|
|||||||
skill: Skill;
|
skill: Skill;
|
||||||
currentLevel: SkillLevel;
|
currentLevel: SkillLevel;
|
||||||
onUpdateSkill: (skillId: string, level: SkillLevel) => void;
|
onUpdateSkill: (skillId: string, level: SkillLevel) => void;
|
||||||
|
onRemoveSkill: (skillId: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLevelColor(level: Exclude<SkillLevel, null>) {
|
function getLevelColor(level: Exclude<SkillLevel, null>) {
|
||||||
@@ -43,6 +44,7 @@ export function SkillEvaluationCard({
|
|||||||
skill,
|
skill,
|
||||||
currentLevel,
|
currentLevel,
|
||||||
onUpdateSkill,
|
onUpdateSkill,
|
||||||
|
onRemoveSkill,
|
||||||
}: SkillEvaluationCardProps) {
|
}: SkillEvaluationCardProps) {
|
||||||
const TechIcon = getTechIcon(skill.id);
|
const TechIcon = getTechIcon(skill.id);
|
||||||
|
|
||||||
@@ -131,27 +133,19 @@ export function SkillEvaluationCard({
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
||||||
{/* Goal buttons */}
|
{/* Remove button */}
|
||||||
<div className="flex items-center gap-1 ml-2 border-l border-white/10 pl-2">
|
<div className="flex items-center ml-2 border-l border-white/10 pl-2">
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<button className="p-1 rounded-lg hover:bg-white/10 transition-colors">
|
<button
|
||||||
<BookOpen className="h-3 w-3 text-slate-400 hover:text-blue-400" />
|
onClick={() => onRemoveSkill(skill.id)}
|
||||||
|
className="p-1 rounded-lg hover:bg-red-500/20 transition-colors"
|
||||||
|
>
|
||||||
|
<X className="h-3 w-3 text-slate-400 hover:text-red-400" />
|
||||||
</button>
|
</button>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
<TooltipContent>
|
<TooltipContent>
|
||||||
<p className="text-xs">Envie d'apprendre</p>
|
<p className="text-xs">Supprimer cette technologie</p>
|
||||||
</TooltipContent>
|
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<Tooltip>
|
|
||||||
<TooltipTrigger asChild>
|
|
||||||
<button className="p-1 rounded-lg hover:bg-white/10 transition-colors">
|
|
||||||
<Target className="h-3 w-3 text-slate-400 hover:text-green-400" />
|
|
||||||
</button>
|
|
||||||
</TooltipTrigger>
|
|
||||||
<TooltipContent>
|
|
||||||
<p className="text-xs">Peut encadrer</p>
|
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ interface SkillEvaluationGridProps {
|
|||||||
currentCategory: SkillCategory;
|
currentCategory: SkillCategory;
|
||||||
currentEvaluation: CategoryEvaluation;
|
currentEvaluation: CategoryEvaluation;
|
||||||
onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void;
|
onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void;
|
||||||
|
onRemoveSkill: (category: string, skillId: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function SkillEvaluationGrid({
|
export function SkillEvaluationGrid({
|
||||||
currentCategory,
|
currentCategory,
|
||||||
currentEvaluation,
|
currentEvaluation,
|
||||||
onUpdateSkill,
|
onUpdateSkill,
|
||||||
|
onRemoveSkill,
|
||||||
}: SkillEvaluationGridProps) {
|
}: SkillEvaluationGridProps) {
|
||||||
const getSkillLevel = (skillId: string): SkillLevel => {
|
const getSkillLevel = (skillId: string): SkillLevel => {
|
||||||
const skillEval = currentEvaluation?.skills.find(
|
const skillEval = currentEvaluation?.skills.find(
|
||||||
@@ -52,6 +54,9 @@ export function SkillEvaluationGrid({
|
|||||||
onUpdateSkill={(skillId, level) =>
|
onUpdateSkill={(skillId, level) =>
|
||||||
onUpdateSkill(currentCategory.category, skillId, level)
|
onUpdateSkill(currentCategory.category, skillId, level)
|
||||||
}
|
}
|
||||||
|
onRemoveSkill={(skillId) =>
|
||||||
|
onRemoveSkill(currentCategory.category, skillId)
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ export function SkillEvaluation({
|
|||||||
currentCategory={currentCategory}
|
currentCategory={currentCategory}
|
||||||
currentEvaluation={currentEvaluation}
|
currentEvaluation={currentEvaluation}
|
||||||
onUpdateSkill={onUpdateSkill}
|
onUpdateSkill={onUpdateSkill}
|
||||||
|
onRemoveSkill={onRemoveSkill}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,8 +11,7 @@ import {
|
|||||||
DialogTrigger,
|
DialogTrigger,
|
||||||
} from "@/components/ui/dialog";
|
} from "@/components/ui/dialog";
|
||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { Badge } from "@/components/ui/badge";
|
import { Plus, Search } from "lucide-react";
|
||||||
import { Plus, Search, X } from "lucide-react";
|
|
||||||
import { SkillCategory, CategoryEvaluation } from "@/lib/types";
|
import { SkillCategory, CategoryEvaluation } from "@/lib/types";
|
||||||
import { getTechIcon } from "./icons/tech-icons";
|
import { getTechIcon } from "./icons/tech-icons";
|
||||||
|
|
||||||
@@ -41,9 +40,9 @@ export function SkillSelector({
|
|||||||
(evaluation) => evaluation.category === selectedCategory
|
(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(
|
const filteredSkills = currentCategory.skills.filter(
|
||||||
(skill) =>
|
(skill) =>
|
||||||
@@ -67,7 +66,10 @@ export function SkillSelector({
|
|||||||
<h4 className="text-lg font-medium">Mes compétences sélectionnées</h4>
|
<h4 className="text-lg font-medium">Mes compétences sélectionnées</h4>
|
||||||
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
||||||
<DialogTrigger asChild>
|
<DialogTrigger asChild>
|
||||||
<Button size="sm" className="gap-2">
|
<Button
|
||||||
|
size="sm"
|
||||||
|
className="gap-2 bg-blue-500 hover:bg-blue-600 text-white shadow-lg"
|
||||||
|
>
|
||||||
<Plus className="h-4 w-4" />
|
<Plus className="h-4 w-4" />
|
||||||
Ajouter une compétence
|
Ajouter une compétence
|
||||||
</Button>
|
</Button>
|
||||||
@@ -147,24 +149,17 @@ export function SkillSelector({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{selectedSkills.length > 0 ? (
|
{selectedSkills.length > 0 ? (
|
||||||
<div className="flex flex-wrap gap-2">
|
<div className="bg-muted/30 rounded-lg p-4">
|
||||||
{selectedSkills.map((skill) => (
|
<div className="flex items-center justify-between">
|
||||||
<Badge
|
<p className="text-sm text-muted-foreground">
|
||||||
key={skill.id}
|
{selectedSkills.length} compétence
|
||||||
variant="secondary"
|
{selectedSkills.length > 1 ? "s" : ""} sélectionnée
|
||||||
className="gap-2 pr-1 cursor-pointer hover:bg-destructive/10 transition-colors"
|
{selectedSkills.length > 1 ? "s" : ""}
|
||||||
>
|
</p>
|
||||||
{skill.name}
|
<div className="text-xs text-muted-foreground">
|
||||||
<Button
|
Supprimez directement depuis les lignes ci-dessous
|
||||||
variant="ghost"
|
</div>
|
||||||
size="sm"
|
</div>
|
||||||
className="h-auto p-0.5 hover:bg-destructive hover:text-destructive-foreground"
|
|
||||||
onClick={() => onRemoveSkill(selectedCategory, skill.id)}
|
|
||||||
>
|
|
||||||
<X className="h-3 w-3" />
|
|
||||||
</Button>
|
|
||||||
</Badge>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="text-center py-8 text-muted-foreground border-2 border-dashed border-muted rounded-lg">
|
<div className="text-center py-8 text-muted-foreground border-2 border-dashed border-muted rounded-lg">
|
||||||
|
|||||||
@@ -61,6 +61,132 @@
|
|||||||
"https://redis.io/documentation",
|
"https://redis.io/documentation",
|
||||||
"https://github.com/redis/redis"
|
"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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
96
data/skills/cloud.json
Normal file
96
data/skills/cloud.json
Normal file
@@ -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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
data/skills/data.json
Normal file
96
data/skills/data.json
Normal file
@@ -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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
data/skills/design.json
Normal file
96
data/skills/design.json
Normal file
@@ -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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -61,6 +61,132 @@
|
|||||||
"https://docs.github.com/en/actions",
|
"https://docs.github.com/en/actions",
|
||||||
"https://github.com/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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,123 @@
|
|||||||
"https://webpack.js.org/concepts/",
|
"https://webpack.js.org/concepts/",
|
||||||
"https://github.com/webpack/webpack"
|
"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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,105 @@
|
|||||||
"https://docs.expo.dev/",
|
"https://docs.expo.dev/",
|
||||||
"https://github.com/expo/expo"
|
"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/"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
96
data/skills/security.json
Normal file
96
data/skills/security.json
Normal file
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -3,6 +3,10 @@ import {
|
|||||||
Server,
|
Server,
|
||||||
Settings,
|
Settings,
|
||||||
Smartphone,
|
Smartphone,
|
||||||
|
Database,
|
||||||
|
Cloud,
|
||||||
|
Shield,
|
||||||
|
Palette,
|
||||||
LucideIcon
|
LucideIcon
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
@@ -11,6 +15,10 @@ const CATEGORY_ICON_MAP: Record<string, LucideIcon> = {
|
|||||||
server: Server,
|
server: Server,
|
||||||
settings: Settings,
|
settings: Settings,
|
||||||
smartphone: Smartphone,
|
smartphone: Smartphone,
|
||||||
|
database: Database,
|
||||||
|
cloud: Cloud,
|
||||||
|
shield: Shield,
|
||||||
|
palette: Palette,
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getCategoryIcon(iconName: string): LucideIcon {
|
export function getCategoryIcon(iconName: string): LucideIcon {
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
import { SkillCategory, Team } from "./types";
|
import { SkillCategory, Team } from "./types";
|
||||||
|
|
||||||
export async function loadSkillCategories(): Promise<SkillCategory[]> {
|
export async function loadSkillCategories(): Promise<SkillCategory[]> {
|
||||||
const categories = ["frontend", "backend", "devops", "mobile"];
|
const categories = [
|
||||||
|
"frontend",
|
||||||
|
"backend",
|
||||||
|
"devops",
|
||||||
|
"mobile",
|
||||||
|
"data",
|
||||||
|
"cloud",
|
||||||
|
"security",
|
||||||
|
"design",
|
||||||
|
];
|
||||||
const skillCategories: SkillCategory[] = [];
|
const skillCategories: SkillCategory[] = [];
|
||||||
|
|
||||||
for (const category of categories) {
|
for (const category of categories) {
|
||||||
|
|||||||
@@ -61,6 +61,132 @@
|
|||||||
"https://redis.io/documentation",
|
"https://redis.io/documentation",
|
||||||
"https://github.com/redis/redis"
|
"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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
96
public/data/skills/cloud.json
Normal file
96
public/data/skills/cloud.json
Normal file
@@ -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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
public/data/skills/data.json
Normal file
96
public/data/skills/data.json
Normal file
@@ -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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
96
public/data/skills/design.json
Normal file
96
public/data/skills/design.json
Normal file
@@ -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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -61,6 +61,132 @@
|
|||||||
"https://docs.github.com/en/actions",
|
"https://docs.github.com/en/actions",
|
||||||
"https://github.com/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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,123 @@
|
|||||||
"https://webpack.js.org/concepts/",
|
"https://webpack.js.org/concepts/",
|
||||||
"https://github.com/webpack/webpack"
|
"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"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,105 @@
|
|||||||
"https://docs.expo.dev/",
|
"https://docs.expo.dev/",
|
||||||
"https://github.com/expo/expo"
|
"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/"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
96
public/data/skills/security.json
Normal file
96
public/data/skills/security.json
Normal file
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user