Skip to content

Commit 635b585

Browse files
fix: improve media layout and video player responsiveness
1 parent 0d0cb87 commit 635b585

3 files changed

Lines changed: 24 additions & 15 deletions

File tree

app/components/tweet/MediaItem.vue

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
11
<script setup lang="ts">
22
import type { TweetMedia } from '~~/shared/types/tweets';
33
import { computed } from 'vue';
4-
5-
// Import your new Video.js wrapper
64
import VideoPlayer from '~/components/ui/VideoPlayer.vue';
75
86
interface Props {
97
media: TweetMedia;
108
}
11-
129
const props = defineProps<Props>();
1310
1411
const isVideo = computed(() => props.media.type === 'VIDEO');
1512
const isGif = computed(() => props.media.type === 'GIF');
1613
const isImage = computed(() => props.media.type === 'IMAGE' || isGif.value);
1714
1815
const aspectStyle = computed(() => {
16+
if (!isImage.value) return {}; // no aspect ratio for videos
17+
1918
const { width, height } = props.media;
20-
if (width > 10 && height > 10 && width < 10000 && height < 10000) {
21-
return { aspectRatio: `${width} / ${height}` };
22-
}
19+
if (width && height) return { aspectRatio: `${width} / ${height}` };
2320
return {};
2421
});
2522
</script>
@@ -33,10 +30,9 @@ const aspectStyle = computed(() => {
3330
class="h-full w-full object-cover"
3431
:style="aspectStyle"
3532
format="webp"
36-
loading="lazy"
3733
/>
3834

39-
<div v-else-if="isVideo" class="w-full overflow-hidden rounded-xl" :style="aspectStyle">
35+
<div v-else-if="isVideo" class="h-full w-full overflow-hidden rounded-xl">
4036
<VideoPlayer :src="props.media.url" :poster="props.media.altText" />
4137
</div>
4238
</div>

app/components/tweet/TweetMedia.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,23 @@ const media = ref(props.media || []);
1212

1313
<template>
1414
<div class="w-full pt-2">
15-
<!-- 0 media: placeholder 2x2 grid -->
16-
1715
<!-- 1 media -->
1816
<div v-if="media.length === 1" class="grid overflow-hidden rounded-xl">
1917
<MediaItem :media="media[0]!" />
2018
</div>
2119

2220
<!-- 2 media: side by side -->
23-
<div v-else-if="media.length === 2" class="grid grid-cols-2 gap-0.5 overflow-hidden rounded-xl">
21+
<div
22+
v-else-if="media.length === 2"
23+
class="border-border grid grid-cols-2 gap-0.5 overflow-hidden rounded-xl border-1"
24+
>
2425
<MediaItem v-for="(m, i) in media" :key="i" :media="m" />
2526
</div>
2627

2728
<!-- 3 media: first spans full height on left -->
2829
<div
2930
v-else-if="media.length === 3"
30-
class="grid grid-cols-2 grid-rows-2 gap-0.5 overflow-hidden rounded-xl"
31+
class="border-border grid grid-cols-2 grid-rows-2 gap-0.5 overflow-hidden rounded-xl border-1"
3132
>
3233
<div class="col-span-1 row-span-2"><MediaItem :media="media[0]!" /></div>
3334
<MediaItem :media="media[1]!" />
@@ -37,7 +38,7 @@ const media = ref(props.media || []);
3738
<!-- 4 media: uniform grid -->
3839
<div
3940
v-else-if="media.length === 4"
40-
class="grid grid-cols-2 grid-rows-2 gap-0.5 overflow-hidden rounded-xl"
41+
class="border-border grid grid-cols-2 grid-rows-2 gap-0.5 overflow-hidden rounded-xl border-1"
4142
>
4243
<MediaItem v-for="(m, i) in media" :key="i" :media="m!" />
4344
</div>

app/components/ui/VideoPlayer.vue

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ const props = defineProps<Props>();
1111

1212
<template>
1313
<VideoPlayer
14-
class="video-js vjs-default-skin overflow-hidden rounded-xl"
14+
class="video-js vjs-default-skin h-full w-full overflow-hidden rounded-xl"
1515
:options="{
1616
controls: true,
1717
autoplay: false,
1818
preload: 'metadata',
1919
responsive: true,
20-
fluid: true,
20+
fluid: false,
2121
poster: props.poster,
2222
controlBar: { autoHide: false },
2323
sources: [
@@ -29,3 +29,15 @@ const props = defineProps<Props>();
2929
}"
3030
/>
3131
</template>
32+
33+
<style scoped>
34+
.video-js {
35+
width: 100%;
36+
height: 100%;
37+
}
38+
.video-js .vjs-tech {
39+
width: 100%;
40+
height: 100%;
41+
object-fit: cover;
42+
}
43+
</style>

0 commit comments

Comments
 (0)