@@ -32,12 +32,6 @@ const props = defineProps({
32
32
33
33
const { backdrop, poster, item, size } = toRefs (props );
34
34
35
- const imgLoaded = ref (true );
36
-
37
- const onLoad = () => {
38
- imgLoaded .value = true ;
39
- };
40
-
41
35
// Local poster is used when the item has no poster ref of its own.
42
36
const localPoster = ref <ImageStoreMedias >();
43
37
@@ -63,22 +57,30 @@ const objectFit = computed(() =>
63
57
);
64
58
65
59
const transition = ref (false );
66
- const timeout = ref ();
60
+
61
+ const imgLoaded = ref (false );
62
+ const loading = computed (() => ! imgLoaded .value || ! resolvedPoster .value );
63
+
64
+ const onLoad = () => {
65
+ imgLoaded .value = true ;
66
+ };
67
67
68
68
const { getImageUrl } = useImageStore ();
69
69
70
+ const timeout = ref ();
70
71
const getPosters = async (_item : PosterItem ) => {
71
72
if (resolvedPoster .value ) return ;
72
73
73
- imgLoaded .value = false ;
74
74
const query = _item .getPosterQuery ?.();
75
75
if (! query ) return ;
76
76
if (! backdrop .value && _item .type === ' episode' ) {
77
77
query .type = ' show' ;
78
78
delete query .episode ;
79
79
}
80
- setTimeout (() => {
81
- if (imgLoaded .value ) return ;
80
+ // If the image is not loaded after 100ms, show transition
81
+ clearTimeout (timeout .value );
82
+ timeout .value = setTimeout (() => {
83
+ if (! loading .value ) return ;
82
84
transition .value = true ;
83
85
}, 100 );
84
86
try {
@@ -105,7 +107,7 @@ onBeforeUnmount(() => {
105
107
class =" poster"
106
108
:class =" {
107
109
backdrop,
108
- loading: !imgLoaded ,
110
+ loading,
109
111
transition,
110
112
}"
111
113
:object-fit =" objectFit"
@@ -139,18 +141,13 @@ onBeforeUnmount(() => {
139
141
height : var (--poster-height , 8rem );
140
142
border-radius : var (--poster-radius , 8px );
141
143
opacity : 1 ;
142
- will-change : opacity ;
143
144
144
145
& .loading {
145
146
opacity : 0 ;
146
147
}
147
148
148
149
& .transition {
149
- transition : opacity 0.5s var (--n-bezier );
150
-
151
- & .loading {
152
- transition : opacity 0.1s ;
153
- }
150
+ transition : opacity 0.3s var (--n-bezier );
154
151
}
155
152
156
153
& .backdrop {
0 commit comments