@@ -5,20 +5,34 @@ import Home from "../components/Home.vue"
55
66import GithubRepo from " ../components/GithubRepo.vue"
77import Copyright from " ../components/Copyright.vue"
8+ import ReadingLine from " ../components/ReadingLine.vue"
89
9- import { usePageData , usePageFrontmatter , useSiteData } from " vuepress/client"
10- import { computed } from " vue"
1110import {
12- DefaultThemeData ,
13- DefaultThemeNormalPageFrontmatter ,
14- DefaultThemePageData ,
15- } from " ../../shared"
11+ usePageData ,
12+ usePageFrontmatter ,
13+ useSiteData ,
14+ useRoute ,
15+ } from " vuepress/client"
16+ import { computed , onMounted , ref } from " vue"
1617import { useThemeData } from " @vuepress/plugin-theme-data/client"
18+ import { Hook } from " ../composables/useHook"
19+ import {
20+ useElementSrcolled ,
21+ usePluginState ,
22+ } from " ../composables/useComponentUtils"
23+
24+ import {
25+ defaultConstants ,
26+ type DefaultThemeData ,
27+ type DefaultThemeNormalPageFrontmatter ,
28+ type DefaultThemePageData ,
29+ } from " ../../shared"
1730
1831const pageData = usePageData <DefaultThemePageData >()
1932const pageFrontmatter = usePageFrontmatter <DefaultThemeNormalPageFrontmatter >()
2033const themeLocale = useThemeData <DefaultThemeData >()
2134const siteData = useSiteData ()
35+ const $route = useRoute ()
2236
2337// repo info
2438const githubRepoData = computed (() => {
@@ -44,50 +58,81 @@ const originalUrl = computed(() => {
4458 )
4559})
4660const copyrightTips = [" " ]
61+
62+ // Scroll listener
63+ const readingLineProgress = ref (0 )
64+ onMounted (() => {
65+ Hook .onRoute (() => {
66+ const scrollUtils = useElementSrcolled (" .v-nc-content" )
67+ if (scrollUtils )
68+ scrollUtils .onScroll ((total , scrolled ) => {
69+ readingLineProgress .value = parseFloat (
70+ ((scrolled / total ) * 100 ).toFixed (2 )
71+ )
72+ })
73+ }, $route )
74+ })
75+
76+ const isNotFound = computed (() => pageFrontmatter .value .layout === " NotFound" )
77+ const computedStateSource = computed (() =>
78+ isNotFound .value
79+ ? defaultConstants .notFoundPluginState
80+ : pageFrontmatter .value
81+ )
82+ const isReadingLineActive = computed (() =>
83+ usePluginState (" readingLine" , computedStateSource .value )
84+ )
4785 </script >
4886
4987<template >
5088 <Base >
5189 <template #page >
52- <Home v-if =" pageFrontmatter.home" />
53- <Page v-else >
54- <template #page-side-left >
55- <slot name =" page-side-left" />
56- </template >
57- <template #page-side-right >
58- <GithubRepo
59- :owner =" githubRepoData.owner"
60- :repo =" githubRepoData.repo"
61- v-if =" githubRepoData"
62- />
63- <slot name =" page-side-right" />
64- </template >
65- <template #before-page-head >
66- <slot name =" before-page-head" />
67- </template >
68- <template #after-page-head >
69- <slot name =" after-page-head" />
70- </template >
71- <template #before-content >
72- <slot name =" before-content" />
73- </template >
74- <template #before-comment >
75- <Copyright
76- :isOriginal =" isOriginal"
77- :originalUrl =" originalUrl"
78- :tips =" copyrightTips"
79- />
80- </template >
81- <template #after-content >
82- <slot name =" after-content" />
83- </template >
84- <template #before-page-foot >
85- <slot name =" before-page-foot" />
86- </template >
87- <template #after-page-foot >
88- <slot name =" after-page-foot" />
89- </template >
90- </Page >
90+ <div class =" page-wrapper" :key =" pageData.path" >
91+ <ReadingLine
92+ :reading-progress =" readingLineProgress"
93+ v-if =" isReadingLineActive"
94+ />
95+ <Home v-if =" pageFrontmatter.home" />
96+ <Page v-else >
97+ <template #before-page > </template >
98+ <template #page-side-left >
99+ <slot name =" page-side-left" />
100+ </template >
101+ <template #page-side-right >
102+ <GithubRepo
103+ :owner =" githubRepoData.owner"
104+ :repo =" githubRepoData.repo"
105+ v-if =" githubRepoData"
106+ />
107+ <slot name =" page-side-right" />
108+ </template >
109+ <template #before-page-head >
110+ <slot name =" before-page-head" />
111+ </template >
112+ <template #after-page-head >
113+ <slot name =" after-page-head" />
114+ </template >
115+ <template #before-content >
116+ <slot name =" before-content" />
117+ </template >
118+ <template #before-comment >
119+ <Copyright
120+ :isOriginal =" isOriginal"
121+ :originalUrl =" originalUrl"
122+ :tips =" copyrightTips"
123+ />
124+ </template >
125+ <template #after-content >
126+ <slot name =" after-content" />
127+ </template >
128+ <template #before-page-foot >
129+ <slot name =" before-page-foot" />
130+ </template >
131+ <template #after-page-foot >
132+ <slot name =" after-page-foot" />
133+ </template >
134+ </Page >
135+ </div >
91136 </template >
92137 </Base >
93138</template >
0 commit comments