kamilcraft.com/src/views/Project.vue
2021-10-18 10:27:58 +02:00

164 lines
3.6 KiB
Vue

<template>
<section class="project" v-if="project">
<header class="project-header">
<h1>{{ project.title }}</h1>
<ul class="project-info">
<li class="info-text">
<font-awesome-icon class="icon" :icon="['far', 'clock']"/>
<span>{{ project.release_data }}</span>
</li>
<li class="info-text">
<font-awesome-icon class="icon" :icon="['far', 'user']"/>
<span>{{ project.author }}</span>
</li>
<li class="info-text">
<font-awesome-icon class="icon" :icon="['far', 'folder']"/>
<span>{{ getCategoryName(project.categories)[0] }}</span>
</li>
<li class="info-text">
<font-awesome-icon class="icon" :icon="['fas', 'code-branch']"/>
<span>{{ project.version }}</span>
</li>
</ul>
</header>
<div class="container">
<component :is="`figure`" class="project-photo">
<img :src="`${publicPath}${project.image}`" :alt="project.title">
</component>
<div class="content">
<p v-for="(description, key) in project.description.split('\n')" :key="key">
{{ description }}
</p>
</div>
</div>
</section>
<div v-else class="loading">
<div class="loading-animation"></div>
</div>
</template>
<script>
export default {
name: 'Project',
data () {
return {
publicPath: process.env.BASE_URL,
project: null
}
},
mounted () {
if (this.getCategories.length === 0) {
this.$store.dispatch('fetchCategories')
}
this.loadProject(this.$route.params.id)
},
computed: {
getCategories () {
return this.$store.getters.getCategories
}
},
methods: {
getCategoryName (categories) {
const categoriesText = []
categories.forEach(categoryElement => {
const cat = this.getCategories.find(category => category.slug === categoryElement)
if (cat) {
categoriesText.push(cat.name)
}
})
return categoriesText
},
loadProject (id) {
fetch('https://api.kamilcraft.com/projects/' + id)
.then(response => response.json())
.then(data => {
this.project = data
})
}
}
}
</script>
<style lang="scss" scoped>
@import "scss/default";
.project {
.project-header {
@extend .container;
text-align: center;
margin-bottom: 25px;
h1 {
font-size: 2.2em;
font-weight: lighter;
line-height: 2.4em;
}
.project-info {
display: flex;
list-style: none;
justify-content: center;
.info-text {
display: flex;
align-items: center;
.icon {
width: 2em;
}
span {
font-weight: lighter;
}
&:not(&:last-child) {
margin-right: 15px;
}
}
@media screen and (max-width: 560px) {
display: grid;
grid-template-columns: repeat(2, 1fr);
row-gap: 15px;
.info-text {
&:not(&:last-child) {
margin-right: 0;
}
}
}
}
}
.container {
.project-photo {
box-shadow: 5px 5px 10px rgba(0, 0, 0, .3);
}
.project-photo, .project-photo img {
width: 100%;
}
.project-photo img {
display: block;
object-fit: cover;
max-height: 500px;
}
.content {
margin: 35px 0;
p {
text-align: justify;
text-indent: 1.5em;
line-height: 1.8em;
@media screen and (max-width: 600px) {
font-size: 1em;
line-height: 1.5em;
}
}
}
}
}
</style>