frontend/src/components/project/partials/ProjectCardGrid.vue

77 lines
1.5 KiB
Vue
Raw Normal View History

2022-11-15 16:25:52 +00:00
<template>
<ul class="project-grid">
2022-11-15 16:25:52 +00:00
<li
v-for="(item, index) in filteredProjects"
:key="`project_${item.id}_${index}`"
class="project-grid-item"
2022-11-15 16:25:52 +00:00
>
<ProjectCard :project="item" />
2022-11-15 16:25:52 +00:00
</li>
</ul>
</template>
<script lang="ts" setup>
import {computed, type PropType} from 'vue'
import type {IProject} from '@/modelTypes/IProject'
2022-11-15 16:25:52 +00:00
import ProjectCard from './ProjectCard.vue'
2022-11-15 16:25:52 +00:00
const props = defineProps({
projects: {
type: Array as PropType<IProject[]>,
2022-11-15 16:25:52 +00:00
default: () => [],
},
showArchived: {
default: false,
type: Boolean,
},
itemLimit: {
type: Boolean,
default: false,
},
})
const filteredProjects = computed(() => {
2022-11-15 16:25:52 +00:00
return props.showArchived
? props.projects
: props.projects.filter(l => !l.isArchived)
2022-11-15 16:25:52 +00:00
})
</script>
<style lang="scss" scoped>
$project-height: 150px;
$project-spacing: 1rem;
2022-11-15 16:25:52 +00:00
.project-grid {
2022-11-15 16:25:52 +00:00
margin: 0; // reset li
project-style-type: none;
2022-11-15 16:25:52 +00:00
display: grid;
grid-template-columns: repeat(var(--project-columns), 1fr);
grid-auto-rows: $project-height;
gap: $project-spacing;
2022-11-15 16:25:52 +00:00
@media screen and (min-width: $mobile) {
--project-rows: 4;
--project-columns: 1;
2022-11-15 16:25:52 +00:00
}
@media screen and (min-width: $mobile) and (max-width: $tablet) {
--project-columns: 2;
2022-11-15 16:25:52 +00:00
}
@media screen and (min-width: $tablet) and (max-width: $widescreen) {
--project-columns: 3;
--project-rows: 3;
2022-11-15 16:25:52 +00:00
}
@media screen and (min-width: $widescreen) {
--project-columns: 5;
--project-rows: 2;
2022-11-15 16:25:52 +00:00
}
}
.project-grid-item {
2022-11-15 16:25:52 +00:00
display: grid;
margin-top: 0; // remove padding coming form .content li + li
}
</style>