@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,7 +1,7 @@
1
1
  {
2
2
  "name": "@peng_kai/kit",
3
3
  "type": "module",
4
- "version": "0.2.18",
4
+ "version": "0.2.19",
5
5
  "description": "",
6
6
  "author": "",
7
7
  "license": "ISC",
@@ -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 flex flex-col px-3 py-5">
75
- <div class="nav-header mb-3 min-h6 flex items-center">
76
- <Transition name="back-btn">
77
- <div
78
- v-if="!history.isFirst"
79
- class="nav-back-btn mr-2 size-6 flex cursor-pointer items-center justify-center"
80
- @click="navManager.back()"
81
- >
82
- <i class="i-ri:arrow-left-s-line text-6" />
83
- </div>
84
- </Transition>
85
-
86
- <div class="nav-title flex-1">
87
- {{ toValue(currentView?.title) }}
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-x-hidden overflow-y-auto" :class="$props.viewClass">
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>