pleroma-fe/src/components/gallery/gallery.vue

95 lines
1.7 KiB
Vue
Raw Normal View History

2019-01-27 02:45:03 +11:00
<template>
2019-07-05 17:17:44 +10:00
<div
ref="galleryContainer"
style="width: 100%;"
>
<div
2019-07-07 07:54:17 +10:00
v-for="(row, index) in rows"
:key="index"
2019-07-05 17:17:44 +10:00
class="gallery-row"
:style="rowStyle(row.length)"
2019-07-05 17:17:44 +10:00
:class="{ 'contain-fit': useContainFit, 'cover-fit': !useContainFit }"
>
<div class="gallery-row-inner">
<attachment
v-for="attachment in row"
:key="attachment.id"
:set-media="setMedia"
:nsfw="nsfw"
:attachment="attachment"
:allow-play="false"
:natural-size-load="onNaturalSizeLoad.bind(null, attachment.id)"
2019-10-22 06:13:11 +11:00
:style="itemStyle(attachment.id, row)"
/>
</div>
2019-01-27 02:45:03 +11:00
</div>
</div>
</template>
<script src='./gallery.js'></script>
<style lang="scss">
@import '../../_variables.scss';
.gallery-row {
position: relative;
height: 0;
2019-01-27 02:45:03 +11:00
width: 100%;
flex-grow: 1;
margin-top: 0.5em;
.gallery-row-inner {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
align-content: stretch;
}
// FIXME: specificity problem with this and .attachments.attachment
// we shouldn't have the need for .image here
.attachment.image {
2019-01-27 02:45:03 +11:00
margin: 0 0.5em 0 0;
flex-grow: 1;
height: 100%;
box-sizing: border-box;
// to make failed images a bit more noticeable on chromium
min-width: 2em;
&:last-child {
margin: 0;
}
2019-01-27 02:45:03 +11:00
}
.image-attachment {
width: 100%;
height: 100%;
}
.video-container {
height: 100%;
}
&.contain-fit {
img,
video,
canvas {
2019-01-27 02:45:03 +11:00
object-fit: contain;
2020-06-11 21:27:36 +10:00
height: 100%;
2019-01-27 02:45:03 +11:00
}
}
&.cover-fit {
img,
video,
canvas {
2019-01-27 02:45:03 +11:00
object-fit: cover;
}
}
}
</style>