@@ -12,10 +12,12 @@ import {
12
12
watch ,
13
13
} from ' vue' ;
14
14
15
- import type { ListScrollItem } from ' ~/components/common/list/ListScroll.model' ;
16
-
17
15
import PosterPlaceholder from ' ~/assets/images/poster-placholder.webp' ;
18
16
import ListItemPanel from ' ~/components/common/list/ListItemPanel.vue' ;
17
+ import {
18
+ type ListScrollItem ,
19
+ ListScrollItemType ,
20
+ } from ' ~/components/common/list/ListScroll.model' ;
19
21
20
22
import { useImageStore } from ' ~/stores/data/image.store' ;
21
23
import { Colors } from ' ~/styles/colors.style' ;
@@ -25,9 +27,9 @@ const props = defineProps({
25
27
type: Object as PropType <ListScrollItem >,
26
28
required: true ,
27
29
},
28
- index : {
30
+ height : {
29
31
type: Number ,
30
- required: true ,
32
+ required: false ,
31
33
},
32
34
poster: {
33
35
type: String ,
@@ -70,30 +72,16 @@ const props = defineProps({
70
72
});
71
73
72
74
const emit = defineEmits <{
73
- (e : ' onHover' , event : { index: number ; item: ListScrollItem ; hover: boolean }): void ;
74
- (
75
- e : ' onScrollIntoView' ,
76
- event : { item: ListScrollItem ; index: number ; ref? : HTMLDivElement },
77
- ): void ;
78
- (
79
- e : ' onScrollOutOfView' ,
80
- event : { item: ListScrollItem ; index: number ; ref? : HTMLDivElement },
81
- ): void ;
75
+ (e : ' onHover' , event : { item: ListScrollItem ; hover: boolean }): void ;
76
+ (e : ' onScrollIntoView' , event : { item: ListScrollItem ; ref? : HTMLDivElement }): void ;
77
+ (e : ' onScrollOutOfView' , event : { item: ListScrollItem ; ref? : HTMLDivElement }): void ;
82
78
}>();
83
79
84
- const {
85
- item,
86
- index,
87
- noHeader,
88
- nextHasHeader,
89
- poster,
90
- episode,
91
- hideDate,
92
- scrollIntoView,
93
- } = toRefs (props );
80
+ const { item, noHeader, nextHasHeader, poster, episode, hideDate, scrollIntoView } =
81
+ toRefs (props );
94
82
95
83
const onHover = (_hover : boolean ) => {
96
- emit (' onHover' , { index: index ?. value , item: item ?.value , hover: _hover });
84
+ emit (' onHover' , { item: item ?.value , hover: _hover });
97
85
};
98
86
99
87
const noHead = computed (
@@ -142,7 +130,6 @@ onMounted(() => {
142
130
if (! scrollIntoView .value ) return ;
143
131
emit (' onScrollIntoView' , {
144
132
item: item ?.value ,
145
- index: index .value ,
146
133
ref: itemRef .value ?.$el ,
147
134
});
148
135
});
@@ -151,10 +138,11 @@ onBeforeUnmount(() => {
151
138
if (! scrollIntoView .value ) return ;
152
139
emit (' onScrollOutOfView' , {
153
140
item: item ?.value ,
154
- index: index .value ,
155
141
ref: itemRef .value ?.$el ,
156
142
});
157
143
});
144
+
145
+ const ListScrollItemTypeLocal = ListScrollItemType ;
158
146
</script >
159
147
160
148
<template >
@@ -167,8 +155,10 @@ onBeforeUnmount(() => {
167
155
'next-has-header': nextHasHead,
168
156
'show-date': !hideDate,
169
157
}"
158
+ :style =" {
159
+ '--list-item-height': height ? `${height}px` : undefined,
160
+ }"
170
161
:data-key =" item.id"
171
- :data-index =" index"
172
162
:line-type =" loading ? 'dashed' : lineType"
173
163
:color =" loading ? 'grey' : color"
174
164
@mouseenter =" onHover(true)"
@@ -210,7 +200,11 @@ onBeforeUnmount(() => {
210
200
<NSkeleton class =" loading week" text round />
211
201
</template >
212
202
</NFlex >
213
- <NFlex class =" tile" :wrap =" false" >
203
+
204
+ <slot v-if =" item.type === ListScrollItemTypeLocal.placeholder" >
205
+ // TODO default placeholder
206
+ </slot >
207
+ <NFlex v-else class =" tile" :wrap =" false" >
214
208
<NImage
215
209
alt =" poster-image"
216
210
class =" poster"
@@ -234,7 +228,7 @@ onBeforeUnmount(() => {
234
228
:fallback-src =" PosterPlaceholder"
235
229
/>
236
230
<ListItemPanel :item =" item" :loading =" loading" :hide-date =" hideDate" >
237
- <slot :item =" item" :index = " index " : loading =" loading" />
231
+ <slot :item =" item" :loading =" loading" />
238
232
</ListItemPanel >
239
233
</NFlex >
240
234
</NFlex >
@@ -250,6 +244,7 @@ onBeforeUnmount(() => {
250
244
@use ' ~/styles/z-index' as layers ;
251
245
252
246
.timeline-item {
247
+ height : var (--list-item-height , 145px );
253
248
margin : 0 1rem ;
254
249
255
250
& .show-date {
@@ -336,7 +331,7 @@ onBeforeUnmount(() => {
336
331
337
332
& .loading {
338
333
opacity : 0 ;
339
- transition : opacity 0 s ;
334
+ transition : opacity 0.1 s ;
340
335
}
341
336
342
337
& .episode {
0 commit comments