Skip to content

Commit 881749f

Browse files
committed
fix(pwa): add offset to list-scroll padding
1 parent 421fcf5 commit 881749f

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

src/components/common/list/ListScroll.vue

+21-5
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ defineExpose({
105105
list: listRef,
106106
});
107107
108-
const { items, loading, pagination, scrollThreshold } = toRefs(props);
108+
const { items, loading, pagination, scrollThreshold, listOptions } = toRefs(props);
109109
110110
const scrolled = ref(false);
111111
@@ -141,7 +141,23 @@ const onHover = ({ item, hover }: { item: ListScrollItem; hover: boolean }) => {
141141
const onLoadMore = (payload: { page: number; pageCount: number; pageSize: number }) => {
142142
emits('onloadMore', { listRef, ...payload });
143143
};
144+
144145
const isEmpty = computed(() => !items.value.length && !loading.value);
146+
const listItemSize = computed(() => listOptions?.value?.itemSize ?? 145);
147+
148+
const topInset = computed(() => {
149+
const listElementRef = listRef.value?.$el;
150+
if (!listElementRef) return 0;
151+
const inset = getComputedStyle(listElementRef).getPropertyValue(
152+
'--safe-area-inset-top',
153+
);
154+
if (!inset) return 0;
155+
return parseInt(inset, 10);
156+
});
157+
const listPaddingTop = computed(
158+
() => topInset.value + (listOptions?.value?.paddingTop ?? 60),
159+
);
160+
const listPaddingBottom = computed(() => listOptions?.value?.paddingBottom ?? 32);
145161
</script>
146162

147163
<template>
@@ -152,7 +168,7 @@ const isEmpty = computed(() => !items.value.length && !loading.value);
152168
class="list-scroll"
153169
:data-length="items.length"
154170
:data-page-size="pageSize"
155-
:item-size="listOptions?.itemSize ?? 145"
171+
:item-size="listItemSize"
156172
:items="items"
157173
:item-resizable="false"
158174
ignore-item-resize
@@ -161,8 +177,8 @@ const isEmpty = computed(() => !items.value.length && !loading.value);
161177
size: 'large',
162178
...listOptions?.visibleItemsProps,
163179
}"
164-
:padding-top="listOptions?.paddingTop ?? 60"
165-
:padding-bottom="listOptions?.paddingBottom ?? 32"
180+
:padding-top="listPaddingTop"
181+
:padding-bottom="listPaddingBottom"
166182
:key-field="'key'"
167183
@scroll="onScrollHandler"
168184
@vue:updated="onUpdatedHandler"
@@ -228,7 +244,7 @@ const isEmpty = computed(() => !items.value.length && !loading.value);
228244
@include animation.fade-in;
229245
230246
.list-scroll {
231-
height: calc(var(--full-height-absolute) - 8px);
247+
height: calc(var(--full-height) - 8px);
232248
margin-top: calc(0% - #{layout.$safe-navbar-height});
233249
margin-bottom: 8px;
234250

src/models/list-scroll.model.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ export type VirtualListProps = {
2323
itemSize?: number;
2424
visibleItemsTag?: string | ObjectConstructor;
2525
visibleItemsProps?: ObjectConstructor;
26-
paddingTop?: string | number;
27-
paddingBottom?: string | number;
26+
paddingTop?: number;
27+
paddingBottom?: number;
2828
};
2929
export type VirtualListScrollToOptions = Parameters<VirtualListInst['scrollTo']>[0];
3030

src/styles/base.scss

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
:host {
33
/* height */
44
--full-height: 100dvh;
5-
--full-height-absolute: 100vh;
65
--half-height: 50dvh;
76
--height-40-dvh: 40dvh;
87
--height-70-dvh: 70dvh;
98

9+
/** safe area */
10+
--safe-area-inset-top: env(safe-area-inset-top);
11+
--safe-area-inset-right: env(safe-area-inset-right);
12+
--safe-area-inset-bottom: env(safe-area-inset-bottom);
13+
--safe-area-inset-left: env(safe-area-inset-left);
14+
1015
/** width */
1116
--full-width: 100dvw;
1217
--half-width: 50dvw;

src/styles/layout.scss

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Pwa safe areas
2-
$safe-area-inset-top: env(safe-area-inset-top);
3-
$safe-area-inset-right: env(safe-area-inset-right);
4-
$safe-area-inset-bottom: env(safe-area-inset-bottom);
5-
$safe-area-inset-left: env(safe-area-inset-left);
2+
$safe-area-inset-top: var(--safe-area-inset-top);
3+
$safe-area-inset-right: var(--safe-area-inset-right);
4+
$safe-area-inset-bottom: var(--safe-area-inset-bottom);
5+
$safe-area-inset-left: var(--safe-area-inset-left);
66

77
// Element heights
88
$header-navbar-height: 2.75rem;

0 commit comments

Comments
 (0)