@peng_kai/kit 0.2.18 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { computed, reactive, ref, toValue, watch } from 'vue';
|
|
3
|
+
import { useElementBounding, useMutationObserver } from '@vueuse/core';
|
|
4
|
+
import { useTemplateRefs } from '../../hooks/useTemplateRefs';
|
|
3
5
|
import { type IProvide as INavManagerProvide, useNavManagerRouter } from './useNavManager';
|
|
4
6
|
|
|
5
7
|
function useHistory(initialValue: string[] = []) {
|
|
@@ -49,10 +51,26 @@ const emits = defineEmits<{
|
|
|
49
51
|
(e: 'close'): void
|
|
50
52
|
}>();
|
|
51
53
|
|
|
54
|
+
const [refs, setRefs] = useTemplateRefs<{
|
|
55
|
+
header: HTMLDivElement
|
|
56
|
+
}>();
|
|
52
57
|
const viewMap = reactive<Record<string, Parameters<INavManagerProvide['addView']>[0]>>({});
|
|
53
58
|
const history = useHistory([props.indexName]);
|
|
54
59
|
const currentView = computed(() => viewMap[history.current]);
|
|
55
60
|
const transitionName = computed(() => `view-${history.lastOperation}`);
|
|
61
|
+
const { height: headerHeight } = useElementBounding(() => refs.header);
|
|
62
|
+
const cssVars = computed(() => ({
|
|
63
|
+
'--header-height-neg': `-${headerHeight.value}px`,
|
|
64
|
+
'--header-height': `${headerHeight.value}px`,
|
|
65
|
+
}));
|
|
66
|
+
// 检查 header 中是否从外部插入了DOM(例如通过Teleport),如果有插入则将header中的所有需要隐藏的本地DOM都隐藏
|
|
67
|
+
const isCoverHeader = ref(false);
|
|
68
|
+
const headerNeedCoverClasses = ['nav-back-btn', 'nav-title', 'nav-close-btn'].map(cls => `.${cls}.need-cover`);
|
|
69
|
+
const headerNeedCoverSelector = `:scope > :not(${headerNeedCoverClasses.join(',')})`;
|
|
70
|
+
useMutationObserver(() => refs.header, () => {
|
|
71
|
+
const children = refs.header?.querySelectorAll(headerNeedCoverSelector);
|
|
72
|
+
isCoverHeader.value = !!children?.length;
|
|
73
|
+
}, { childList: true });
|
|
56
74
|
|
|
57
75
|
watch(currentView, (view, oldView) => {
|
|
58
76
|
oldView?.hide();
|
|
@@ -71,33 +89,37 @@ useNavManagerRouter(navManager);
|
|
|
71
89
|
</script>
|
|
72
90
|
|
|
73
91
|
<template>
|
|
74
|
-
<div class="tt-nav-manager box-border
|
|
75
|
-
<div class="
|
|
76
|
-
<
|
|
77
|
-
<
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
92
|
+
<div class="tt-nav-manager box-border" :class="[currentView?.name]" :style="cssVars">
|
|
93
|
+
<div class="relative h-full overflow-x-hidden bg-inherit">
|
|
94
|
+
<div :ref="setRefs.header" class="nav-header min-h6 flex items-center sticky z-5 bg-inherit">
|
|
95
|
+
<slot name="header" />
|
|
96
|
+
<template v-if="!isCoverHeader || (!isCoverHeader && !$slots.header)">
|
|
97
|
+
<Transition name="back-btn">
|
|
98
|
+
<div
|
|
99
|
+
v-if="!history.isFirst"
|
|
100
|
+
class="nav-back-btn need-cover mr-2 size-6 flex cursor-pointer items-center justify-center"
|
|
101
|
+
@click="navManager.back()"
|
|
102
|
+
>
|
|
103
|
+
<i class="i-ri:arrow-left-s-line text-6" />
|
|
104
|
+
</div>
|
|
105
|
+
</Transition>
|
|
106
|
+
|
|
107
|
+
<div class="nav-title need-cover flex-1">
|
|
108
|
+
{{ toValue(currentView?.title) }}
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div
|
|
112
|
+
class="nav-close-btn need-cover size-6 flex cursor-pointer items-center justify-center"
|
|
113
|
+
@click="navManager.close()"
|
|
114
|
+
>
|
|
115
|
+
<i class="i-ri:close-line text-6" />
|
|
116
|
+
</div>
|
|
117
|
+
</template>
|
|
88
118
|
</div>
|
|
89
119
|
|
|
90
|
-
<div
|
|
91
|
-
class="nav-close-btn size-6 flex cursor-pointer items-center justify-center"
|
|
92
|
-
@click="navManager.close()"
|
|
93
|
-
>
|
|
94
|
-
<i class="i-ri:close-line text-6" />
|
|
95
|
-
</div>
|
|
96
|
-
</div>
|
|
97
|
-
|
|
98
|
-
<div class="relative flex-1 overflow-x-hidden">
|
|
99
120
|
<Transition :name="transitionName">
|
|
100
|
-
<div :key="currentView?.name" class="absolute left-0 top-0 h-full w-full overflow-
|
|
121
|
+
<div :key="currentView?.name" class="scroll-container absolute left-0 top-0 h-full w-full overflow-y-auto overflow-x-hidden" :class="$props.viewClass">
|
|
122
|
+
<div class="h-$header-height" />
|
|
101
123
|
<slot />
|
|
102
124
|
</div>
|
|
103
125
|
</Transition>
|