feat: add skills
This commit is contained in:
parent
8c4f510c12
commit
3a946fa4c3
|
@ -0,0 +1,175 @@
|
||||||
|
<template>
|
||||||
|
<div id='skills'>
|
||||||
|
|
||||||
|
<div class='skillset' v-for='(skillset, si) of skills' :key='si'>
|
||||||
|
|
||||||
|
<div class='title'>
|
||||||
|
{{ skillset.title.toUpperCase() }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class='subtitle'>
|
||||||
|
<span v-for='keyword of skillset.keywords' :key='keyword'>{{ keyword }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class='stack'>
|
||||||
|
<template v-for='(skill,i) of skillset.skills'>
|
||||||
|
<span class='label' :key='i' v-html='skill.label'></span>
|
||||||
|
<span class='level' :key='i'>
|
||||||
|
<span :style='{ width: (skill.level*100)+"%" }'></span>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Component, Vue } from 'vue-property-decorator';
|
||||||
|
import SkillsModel from '../model/skills';
|
||||||
|
|
||||||
|
@Component
|
||||||
|
export default class Skills extends Vue {
|
||||||
|
private skills = SkillsModel;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||||
|
<style scoped lang="scss">
|
||||||
|
@import '../global';
|
||||||
|
|
||||||
|
#skills {
|
||||||
|
flex: auto 0 1;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
margin: 0 5%;
|
||||||
|
|
||||||
|
flex-flow: row wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.skillset {
|
||||||
|
flex: 30%-(2*3%);
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
margin: 0 3%;
|
||||||
|
|
||||||
|
flex-flow: column nowrap;
|
||||||
|
justify-content: flex-start;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
flex: auto 0 1;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
padding: .2em 1em;
|
||||||
|
margin-bottom: .2em;
|
||||||
|
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: normal;
|
||||||
|
|
||||||
|
border-bottom: 2px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
flex: auto 0 1;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
color: #ccc;
|
||||||
|
font-size: .8rem;
|
||||||
|
font-weight: normal;
|
||||||
|
|
||||||
|
span{
|
||||||
|
padding-left: .5em;
|
||||||
|
|
||||||
|
&:not(:last-child):after{
|
||||||
|
content: ' / ';
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.stack {
|
||||||
|
flex: auto;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
margin: 1rem;
|
||||||
|
|
||||||
|
flex-flow: row wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
|
||||||
|
.label{
|
||||||
|
flex: 60%;
|
||||||
|
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
padding: .2rem 0;
|
||||||
|
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: normal;
|
||||||
|
|
||||||
|
}
|
||||||
|
.level{
|
||||||
|
flex: 40%;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
padding: .2rem 0;
|
||||||
|
height: .5rem;
|
||||||
|
|
||||||
|
border-radius: .25rem / .25rem;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #e6e6e6;
|
||||||
|
|
||||||
|
@keyframes fillIn {
|
||||||
|
from { width: 50%; }
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 0;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
background-size: 100% 100%;
|
||||||
|
|
||||||
|
animation: 1s ease fillIn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.skillset:nth-of-type(3n+1) .stack .level span{
|
||||||
|
@include gradient1;
|
||||||
|
}
|
||||||
|
.skillset:nth-of-type(3n+2) .stack .level span{
|
||||||
|
@include gradient2;
|
||||||
|
}
|
||||||
|
.skillset:nth-of-type(3n+3) .stack .level span{
|
||||||
|
@include gradient3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss">
|
||||||
|
#skills .skillset .stack .label i {
|
||||||
|
font-style: normal;
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,9 @@
|
||||||
|
@mixin gradient1{
|
||||||
|
background-image: linear-gradient(to right, #7d82ff, #51a8fc);
|
||||||
|
}
|
||||||
|
@mixin gradient2{
|
||||||
|
background-image: linear-gradient(to right, #51bafc, #00dfa3);
|
||||||
|
}
|
||||||
|
@mixin gradient3{
|
||||||
|
background-image: linear-gradient(to right, #8f93ff, #ec7fef);
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
title: 'Web',
|
||||||
|
keywords: [ 'languages', 'technologies' ],
|
||||||
|
skills: [
|
||||||
|
{ label: 'MariaDB', level: 0.7 },
|
||||||
|
{ label: 'Postgres', level: 0.5 },
|
||||||
|
{ label: 'MongoDB', level: 0.5 },
|
||||||
|
{ label: 'Vue <i>(.js)</i>', level: 0.8 },
|
||||||
|
{ label: 'Angular <i>(7+)</i>', level: 0.5 },
|
||||||
|
{ label: 'WebGL', level: 0.3 },
|
||||||
|
{ label: 'Audio API', level: 0.5 },
|
||||||
|
{ label: 'Websocket', level: 1 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Sys',
|
||||||
|
keywords: ['languages', 'technologies'],
|
||||||
|
skills: [
|
||||||
|
{ label: 'Linux/bash', level: 1 },
|
||||||
|
{ label: 'docker', level: 0.8 },
|
||||||
|
{ label: 'systemd', level: 1 },
|
||||||
|
{ label: 'git', level: 0.8 },
|
||||||
|
{ label: 'raspberry', level: 0.8 },
|
||||||
|
{ label: 'arduino', level: 0.5 },
|
||||||
|
{ label: 'RPM packaging', level: 0.7 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Misc',
|
||||||
|
keywords: ['frameworks', 'api', 'dependencies'],
|
||||||
|
skills: [
|
||||||
|
{ label: 'PHP', level: 0.9 },
|
||||||
|
{ label: 'HTML<i>/</i>CSS', level: 1 },
|
||||||
|
{ label: 'Javascript', level: 1 },
|
||||||
|
{ label: 'Typescript', level: 0.9 },
|
||||||
|
{ label: 'C<i>/</i>C++', level: 0.6 },
|
||||||
|
{ label: 'Python', level: 0.3 },
|
||||||
|
{ label: 'go', level: 1 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
Loading…
Reference in New Issue