You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
315 lines
6.1 KiB
315 lines
6.1 KiB
import Assets from './assets';
|
|
import type { Skill, SkillCategory } from '../types';
|
|
import svelte from '../md/svelte.md?raw';
|
|
import { omit, type StringWithAutoComplete } from '@riadh-adrani/utils';
|
|
|
|
const defineSkillCategory = <S extends string>(data: SkillCategory<S>): SkillCategory<S> => data;
|
|
|
|
const categories = [
|
|
defineSkillCategory({ name: 'Langages de programmation', slug: 'pro-lang' }),
|
|
defineSkillCategory({ name: 'Frameworks', slug: 'framework' }),
|
|
defineSkillCategory({ name: 'Bibliothèques', slug: 'library' }),
|
|
defineSkillCategory({ name: 'Langages', slug: 'lang' }),
|
|
defineSkillCategory({ name: 'Bases de données', slug: 'db' }),
|
|
defineSkillCategory({ name: 'ORMs', slug: 'orm' }),
|
|
defineSkillCategory({ name: 'DevOps', slug: 'devops' }),
|
|
defineSkillCategory({ name: 'Testing', slug: 'test' }),
|
|
defineSkillCategory({ name: 'Outils', slug: 'devtools' }),
|
|
defineSkillCategory({ name: 'Balisage & Style', slug: 'markup-style' }),
|
|
defineSkillCategory({ name: 'Design', slug: 'design' }),
|
|
defineSkillCategory({ name: 'Soft Skills', slug: 'soft' })
|
|
] as const;
|
|
|
|
const defineSkill = <S extends string>(
|
|
skill: Omit<Skill<S>, 'category'> & {
|
|
category?: StringWithAutoComplete<(typeof categories)[number]['slug']>;
|
|
}
|
|
): Skill<S> => {
|
|
const out: Skill<S> = omit(skill, 'category');
|
|
|
|
if (skill.category) {
|
|
out.category = categories.find((it) => it.slug === skill.category);
|
|
}
|
|
|
|
return out;
|
|
};
|
|
|
|
export const items = [
|
|
defineSkill({
|
|
slug: 'js',
|
|
color: 'yellow',
|
|
description:
|
|
'',
|
|
logo: Assets.JavaScript,
|
|
name: 'Javascript',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'ts',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.TypeScript,
|
|
name: 'Typescript',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'dart',
|
|
color: 'cyan',
|
|
description:
|
|
'',
|
|
logo: Assets.Dart,
|
|
name: 'Dart',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'java',
|
|
color: 'orange',
|
|
description:
|
|
'',
|
|
logo: Assets.Java,
|
|
name: 'Java',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'csharp',
|
|
color: 'purple',
|
|
description:
|
|
'',
|
|
logo: Assets.CSharp,
|
|
name: 'C#',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'python',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.Python,
|
|
name: 'Python',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'c',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.C,
|
|
name: 'C',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'cpp',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.Cpp,
|
|
name: 'C++',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'php',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.PHP,
|
|
name: 'PHP',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'kotlin',
|
|
color: 'purple',
|
|
description:
|
|
'',
|
|
logo: Assets.Kotlin,
|
|
name: 'Kotlin',
|
|
category: 'pro-lang'
|
|
}),
|
|
defineSkill({
|
|
slug: 'css',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.CSS,
|
|
name: 'CSS',
|
|
category: 'markup-style'
|
|
}),
|
|
defineSkill({
|
|
slug: 'html',
|
|
color: 'orange',
|
|
description:
|
|
'',
|
|
logo: Assets.HTML,
|
|
name: 'HTML',
|
|
category: 'markup-style'
|
|
}),
|
|
defineSkill({
|
|
slug: 'sass',
|
|
color: 'pink',
|
|
description:
|
|
'',
|
|
logo: Assets.Sass,
|
|
name: 'Sass',
|
|
category: 'markup-style'
|
|
}),
|
|
defineSkill({
|
|
slug: 'flutter',
|
|
color: 'cyan',
|
|
description:
|
|
'',
|
|
logo: Assets.Flutter,
|
|
name: 'Flutter',
|
|
category: 'framework'
|
|
}),
|
|
defineSkill({
|
|
slug: 'vuejs',
|
|
color: 'green',
|
|
description:
|
|
'',
|
|
logo: Assets.VueJs,
|
|
name: 'VueJS',
|
|
category: 'framework'
|
|
}),
|
|
defineSkill({
|
|
slug: 'react-native',
|
|
color: 'cyan',
|
|
description:
|
|
'',
|
|
logo: Assets.ReactJs,
|
|
name: 'React Native',
|
|
category: 'framework'
|
|
}),
|
|
defineSkill({
|
|
slug: 'quasar-framework',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.Quasar,
|
|
name: 'Quasar Framework',
|
|
category: 'framework'
|
|
}),
|
|
defineSkill({
|
|
slug: 'reactjs',
|
|
color: 'cyan',
|
|
description:
|
|
'',
|
|
logo: Assets.ReactJs,
|
|
name: 'React Js',
|
|
category: 'library'
|
|
}),
|
|
defineSkill({
|
|
slug: 'postgresql',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.PostgreSQL,
|
|
name: 'PostgreSQL',
|
|
category: 'db'
|
|
}),
|
|
defineSkill({
|
|
slug: 'mongodb',
|
|
color: 'green',
|
|
description:
|
|
'',
|
|
logo: Assets.MongoDB,
|
|
name: 'MongoDB',
|
|
category: 'db'
|
|
}),
|
|
defineSkill({
|
|
slug: 'vscode',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.VisualStudioCode,
|
|
name: 'Visual Studio Code',
|
|
category: 'tools'
|
|
}),
|
|
defineSkill({
|
|
slug: 'visualstudio',
|
|
color: 'purple',
|
|
description:
|
|
'',
|
|
logo: Assets.VisualStudio,
|
|
name: 'Visual Studio',
|
|
category: 'tools'
|
|
}),
|
|
defineSkill({
|
|
slug: 'jetbrains',
|
|
color: 'black',
|
|
description:
|
|
'',
|
|
logo: Assets.JetBrains,
|
|
name: 'Suite JetBrains',
|
|
category: 'tools'
|
|
}),
|
|
defineSkill({
|
|
slug: 'git',
|
|
color: 'orange',
|
|
description:
|
|
'',
|
|
logo: Assets.Git,
|
|
name: 'Git',
|
|
category: 'tools'
|
|
}),
|
|
defineSkill({
|
|
slug: 'docker',
|
|
color: 'blue',
|
|
description:
|
|
'',
|
|
logo: Assets.Docker,
|
|
name: 'Docker',
|
|
category: 'tools'
|
|
}),
|
|
defineSkill({
|
|
slug: 'photoshop',
|
|
color: 'cyan',
|
|
description:
|
|
'',
|
|
logo: Assets.Photoshop,
|
|
name: 'Photoshop',
|
|
category: 'tools'
|
|
}),
|
|
] as const;
|
|
|
|
export const title = 'Compétences';
|
|
|
|
export const getSkills = (
|
|
...slugs: Array<StringWithAutoComplete<(typeof items)[number]['slug']>>
|
|
): Array<Skill> => items.filter((it) => slugs.includes(it.slug));
|
|
|
|
export const groupByCategory = (
|
|
query: string
|
|
): Array<{ category: SkillCategory; items: Array<Skill> }> => {
|
|
const out: ReturnType<typeof groupByCategory> = [];
|
|
|
|
const others: Array<Skill> = [];
|
|
|
|
items.forEach((item) => {
|
|
if (query.trim() && !item.name.toLowerCase().includes(query.trim().toLowerCase())) return;
|
|
|
|
// push to others if item does not have a category
|
|
if (!item.category) {
|
|
console.log(item.category);
|
|
others.push(item);
|
|
return;
|
|
}
|
|
|
|
// check if category exists
|
|
let category = out.find((it) => it.category.slug === item.category?.slug);
|
|
|
|
if (!category) {
|
|
category = { items: [], category: item.category };
|
|
|
|
out.push(category);
|
|
}
|
|
|
|
category.items.push(item);
|
|
});
|
|
|
|
if (others.length !== 0) {
|
|
out.push({ category: { name: 'Others', slug: 'others' }, items: others });
|
|
}
|
|
|
|
return out;
|
|
};
|