hexo-theme-shokax 0.5.2 → 0.5.3

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.
Files changed (161) hide show
  1. package/.vscode/settings.json +6 -0
  2. package/CODE_OF_CONDUCT.md +128 -128
  3. package/LICENSE +660 -660
  4. package/LICENSE-shoka +21 -21
  5. package/README.md +74 -74
  6. package/UsageRestrictions.md +25 -25
  7. package/_config.yml +359 -352
  8. package/languages/README.md +19 -19
  9. package/languages/default.yml +1 -1
  10. package/languages/en.yml +155 -155
  11. package/languages/ja.yml +155 -155
  12. package/languages/zh-CN.yml +155 -155
  13. package/languages/zh-HK.yml +155 -155
  14. package/languages/zh-TW.yml +155 -155
  15. package/layout/_alternate/atom.ejs +30 -30
  16. package/layout/_alternate/json.ejs +16 -16
  17. package/layout/_alternate/rss.ejs +34 -34
  18. package/layout/_mixin/breadcrumb.pug +33 -33
  19. package/layout/_mixin/card.pug +37 -37
  20. package/layout/_mixin/comment.pug +6 -6
  21. package/layout/_mixin/postmeta.pug +29 -29
  22. package/layout/_mixin/segment.pug +35 -35
  23. package/layout/_mixin/sidebar.pug +40 -40
  24. package/layout/_mixin/widgets.pug +28 -28
  25. package/layout/_partials/footer.pug +43 -43
  26. package/layout/_partials/head/head.pug +50 -50
  27. package/layout/_partials/head/head_com.pug +24 -24
  28. package/layout/_partials/head/pwa.pug +18 -18
  29. package/layout/_partials/header.pug +18 -18
  30. package/layout/_partials/layout.pug +138 -137
  31. package/layout/_partials/loading.pug +13 -13
  32. package/layout/_partials/pagination.pug +4 -4
  33. package/layout/_partials/post/copyright.pug +20 -20
  34. package/layout/_partials/post/footer.pug +20 -20
  35. package/layout/_partials/post/nav.pug +17 -17
  36. package/layout/_partials/post/post.pug +42 -42
  37. package/layout/_partials/post/reward.pug +18 -18
  38. package/layout/_partials/sidebar/menu.pug +37 -37
  39. package/layout/_partials/sidebar/overview.pug +42 -42
  40. package/layout/_partials/third-party/baidu-analytics.pug +11 -11
  41. package/layout/_partials/third-party/clarity.pug +8 -8
  42. package/layout/_partials/third-party/google-analytics.pug +9 -9
  43. package/layout/archive.pug +121 -121
  44. package/layout/category.pug +62 -62
  45. package/layout/index.pug +36 -36
  46. package/layout/page.pug +60 -60
  47. package/layout/post.pug +42 -42
  48. package/layout/tag.pug +46 -46
  49. package/package.json +6 -5
  50. package/scripts/generaters/script.js +2 -1
  51. package/scripts/plugin/check.js +2 -2
  52. package/source/assets/algolia_logo.svg +9 -9
  53. package/source/assets/logo.svg +16 -16
  54. package/source/css/_colors.styl +207 -207
  55. package/source/css/_common/components/components.styl +5 -5
  56. package/source/css/_common/components/pages/collapse.styl +119 -119
  57. package/source/css/_common/components/pages/home.styl +391 -391
  58. package/source/css/_common/components/pages/pages.styl +56 -56
  59. package/source/css/_common/components/pages/tag-cloud.styl +12 -12
  60. package/source/css/_common/components/post/breadcrumb.styl +39 -39
  61. package/source/css/_common/components/post/copyright.styl +41 -41
  62. package/source/css/_common/components/post/expand.styl +263 -263
  63. package/source/css/_common/components/post/footer.styl +11 -11
  64. package/source/css/_common/components/post/header.styl +79 -79
  65. package/source/css/_common/components/post/nav.styl +64 -64
  66. package/source/css/_common/components/post/post.styl +29 -29
  67. package/source/css/_common/components/post/reward.styl +50 -50
  68. package/source/css/_common/components/post/rtl.styl +12 -12
  69. package/source/css/_common/components/post/tags.styl +39 -39
  70. package/source/css/_common/components/tags/collapse.styl +72 -72
  71. package/source/css/_common/components/tags/container.styl +49 -49
  72. package/source/css/_common/components/tags/label.styl +12 -12
  73. package/source/css/_common/components/tags/links.styl +77 -77
  74. package/source/css/_common/components/tags/list.styl +131 -131
  75. package/source/css/_common/components/tags/note.styl +70 -70
  76. package/source/css/_common/components/tags/player.styl +361 -361
  77. package/source/css/_common/components/tags/quiz.styl +200 -200
  78. package/source/css/_common/components/tags/tabs.styl +89 -89
  79. package/source/css/_common/components/tags/tags.styl +9 -9
  80. package/source/css/_common/components/third-party/loading.styl +222 -222
  81. package/source/css/_common/components/third-party/mermaid/class.styl +90 -90
  82. package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -72
  83. package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -251
  84. package/source/css/_common/components/third-party/mermaid/git.styl +7 -7
  85. package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -37
  86. package/source/css/_common/components/third-party/mermaid/pie.styl +9 -9
  87. package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -95
  88. package/source/css/_common/components/third-party/mermaid/state.styl +130 -130
  89. package/source/css/_common/components/third-party/pace.styl +18 -18
  90. package/source/css/_common/components/third-party/search.styl +167 -167
  91. package/source/css/_common/components/third-party/theme.styl +151 -151
  92. package/source/css/_common/components/third-party/third-party.styl +22 -22
  93. package/source/css/_common/components/third-party/widgets.styl +57 -57
  94. package/source/css/_common/outline/footer/footer.styl +67 -67
  95. package/source/css/_common/outline/header/brand.styl +77 -77
  96. package/source/css/_common/outline/header/header.styl +20 -20
  97. package/source/css/_common/outline/header/image.styl +85 -85
  98. package/source/css/_common/outline/header/menu.styl +117 -117
  99. package/source/css/_common/outline/header/nav.styl +81 -81
  100. package/source/css/_common/outline/header/right.styl +15 -15
  101. package/source/css/_common/outline/header/tool.styl +207 -207
  102. package/source/css/_common/outline/header/waves.styl +57 -57
  103. package/source/css/_common/outline/mobile.styl +46 -46
  104. package/source/css/_common/outline/outline.styl +78 -78
  105. package/source/css/_common/outline/sidebar/author.styl +59 -59
  106. package/source/css/_common/outline/sidebar/dimmer.styl +23 -23
  107. package/source/css/_common/outline/sidebar/menu.styl +63 -63
  108. package/source/css/_common/outline/sidebar/quick.styl +43 -43
  109. package/source/css/_common/outline/sidebar/related.styl +56 -56
  110. package/source/css/_common/outline/sidebar/sidebar.styl +82 -82
  111. package/source/css/_common/outline/sidebar/social.styl +69 -69
  112. package/source/css/_common/outline/sidebar/state.styl +37 -37
  113. package/source/css/_common/outline/sidebar/tab.styl +71 -71
  114. package/source/css/_common/outline/sidebar/toc.styl +47 -47
  115. package/source/css/_common/scaffolding/animate.styl +322 -322
  116. package/source/css/_common/scaffolding/base.styl +192 -192
  117. package/source/css/_common/scaffolding/buttons.styl +48 -48
  118. package/source/css/_common/scaffolding/divider.styl +36 -36
  119. package/source/css/_common/scaffolding/iconfont.styl +443 -443
  120. package/source/css/_common/scaffolding/normalize.styl +273 -273
  121. package/source/css/_common/scaffolding/pagination.styl +81 -81
  122. package/source/css/_common/scaffolding/ribbon.styl +38 -38
  123. package/source/css/_common/scaffolding/scaffolding.styl +14 -14
  124. package/source/css/_common/scaffolding/scrollbar.styl +37 -37
  125. package/source/css/_common/scaffolding/tables.styl +50 -50
  126. package/source/css/_common/scaffolding/tip.styl +19 -19
  127. package/source/css/_common/scaffolding/toggles.styl +59 -59
  128. package/source/css/_iconfont.styl +455 -455
  129. package/source/css/_mixins.styl +148 -148
  130. package/source/css/_variables.styl +89 -89
  131. package/source/css/app.styl +25 -25
  132. package/source/css/mermaid.styl +5 -5
  133. package/source/css/page.styl +2 -2
  134. package/source/css/post.styl +4 -5
  135. package/source/css/scaffolding.styl +4 -4
  136. package/source/js/_app/components/cloudflare.ts +18 -18
  137. package/source/js/_app/components/comments.ts +88 -88
  138. package/source/js/_app/components/sidebar.ts +243 -243
  139. package/source/js/_app/components/tcomments.ts +53 -53
  140. package/source/js/_app/globals/globalVars.ts +84 -84
  141. package/source/js/_app/globals/handles.ts +124 -124
  142. package/source/js/_app/globals/themeColor.ts +62 -62
  143. package/source/js/_app/globals/thirdparty.ts +63 -63
  144. package/source/js/_app/globals/tools.ts +73 -73
  145. package/source/js/_app/library/anime.ts +121 -121
  146. package/source/js/_app/library/declare.d.ts +129 -128
  147. package/source/js/_app/library/proto.ts +70 -70
  148. package/source/js/_app/library/vue.ts +49 -49
  149. package/source/js/_app/page/common.ts +41 -41
  150. package/source/js/_app/page/imageviewer.ts +15 -15
  151. package/source/js/_app/page/post.ts +251 -252
  152. package/source/js/_app/page/search.ts +109 -109
  153. package/source/js/_app/page/tab.ts +59 -59
  154. package/source/js/_app/pjax/domInit.ts +102 -102
  155. package/source/js/_app/pjax/refresh.ts +117 -117
  156. package/source/js/_app/pjax/siteInit.ts +93 -90
  157. package/source/js/_app/player.ts +13 -13
  158. package/toolbox/compiler.mjs +49 -49
  159. package/toolbox/dev-version.mjs +14 -14
  160. package/toolbox/hoistdep.mjs +5 -5
  161. package/toolbox/lib.mjs +63 -63
@@ -1,63 +1,63 @@
1
- // 与第三方js的交互或第三方嵌入js
2
-
3
- import { CONFIG, loadCat } from './globalVars'
4
- import { transition } from '../library/anime'
5
-
6
- // 加载动画
7
- export const Loader = {
8
- timer: undefined,
9
- lock: false,
10
- show () {
11
- clearTimeout(this.timer)
12
- document.body.classList.remove('loaded')
13
- loadCat.setAttribute('style', 'display:block')
14
- Loader.lock = false
15
- },
16
- hide (sec?: number) {
17
- if (!CONFIG.loader.start) {
18
- sec = -1
19
- }
20
- this.timer = setTimeout(this.vanish, sec || 3000)
21
- },
22
- vanish (): void {
23
- if (Loader.lock) {
24
- return
25
- }
26
- if (CONFIG.loader.start) {
27
- transition(loadCat, 0)
28
- }
29
- document.body.classList.add('loaded')
30
- Loader.lock = true
31
- }
32
- }
33
-
34
- export const isOutime = (): void => {
35
- let updateTime: Date
36
- const times = document.getElementsByTagName('time')
37
- if (times.length === 0) {
38
- return
39
- }
40
- const posts = document.getElementsByClassName('body md')
41
- if (posts.length === 0) {
42
- return
43
- }
44
-
45
- const now = Date.now() // 当前时间戳
46
- const pubTime = new Date(times[0].dateTime) // 文章发布时间戳
47
- if (times.length === 1) {
48
- updateTime = pubTime // 文章发布时间亦是最后更新时间
49
- } else {
50
- updateTime = new Date(times[1].dateTime) // 文章最后更新时间戳
51
- }
52
- // @ts-ignore
53
- const interval = parseInt(String(now - updateTime)) // 时间差
54
- const days = parseInt(String(CONFIG.outime.days)) || 30 // 设置时效,默认硬编码 30 天
55
- // 最后一次更新时间超过 days 天(毫秒)
56
- if (interval > (days * 86400000)) {
57
- // @ts-ignore
58
- const publish = parseInt(String((now - pubTime) / 86400000))
59
- const updated = parseInt(String(interval / 86400000))
60
- const template = LOCAL.template.replace('{{publish}}', String(publish)).replace('{{updated}}', String(updated))
61
- posts[0].insertAdjacentHTML('afterbegin', template)
62
- }
63
- }
1
+ // 与第三方js的交互或第三方嵌入js
2
+
3
+ import { CONFIG, loadCat } from './globalVars'
4
+ import { transition } from '../library/anime'
5
+
6
+ // 加载动画
7
+ export const Loader = {
8
+ timer: undefined,
9
+ lock: false,
10
+ show () {
11
+ clearTimeout(this.timer)
12
+ document.body.classList.remove('loaded')
13
+ loadCat.setAttribute('style', 'display:block')
14
+ Loader.lock = false
15
+ },
16
+ hide (sec?: number) {
17
+ if (!CONFIG.loader.start) {
18
+ sec = -1
19
+ }
20
+ this.timer = setTimeout(this.vanish, sec || 3000)
21
+ },
22
+ vanish (): void {
23
+ if (Loader.lock) {
24
+ return
25
+ }
26
+ if (CONFIG.loader.start) {
27
+ transition(loadCat, 0)
28
+ }
29
+ document.body.classList.add('loaded')
30
+ Loader.lock = true
31
+ }
32
+ }
33
+
34
+ export const isOutime = (): void => {
35
+ let updateTime: Date
36
+ const times = document.getElementsByTagName('time')
37
+ if (times.length === 0) {
38
+ return
39
+ }
40
+ const posts = document.getElementsByClassName('body md')
41
+ if (posts.length === 0) {
42
+ return
43
+ }
44
+
45
+ const now = Date.now() // 当前时间戳
46
+ const pubTime = new Date(times[0].dateTime) // 文章发布时间戳
47
+ if (times.length === 1) {
48
+ updateTime = pubTime // 文章发布时间亦是最后更新时间
49
+ } else {
50
+ updateTime = new Date(times[1].dateTime) // 文章最后更新时间戳
51
+ }
52
+ // @ts-ignore
53
+ const interval = parseInt(String(now - updateTime)) // 时间差
54
+ const days = parseInt(String(CONFIG.outime.days)) || 30 // 设置时效,默认硬编码 30 天
55
+ // 最后一次更新时间超过 days 天(毫秒)
56
+ if (interval > (days * 86400000)) {
57
+ // @ts-ignore
58
+ const publish = parseInt(String((now - pubTime) / 86400000))
59
+ const updated = parseInt(String(interval / 86400000))
60
+ const template = LOCAL.template.replace('{{publish}}', String(publish)).replace('{{updated}}', String(updated))
61
+ posts[0].insertAdjacentHTML('afterbegin', template)
62
+ }
63
+ }
@@ -1,73 +1,73 @@
1
- import { pageScroll } from '../library/anime'
2
- import { BODY, CONFIG, LOCAL_HASH, LOCAL_URL, scrollAction, setLocalHash } from './globalVars'
3
- import { createChild } from '../library/proto'
4
-
5
- // 显示提示(现阶段用于版权及复制结果提示)
6
- export const showtip = (msg: string): void | never => {
7
- if (!msg) {
8
- return
9
- }
10
-
11
- const tipbox = createChild(BODY, 'div', {
12
- innerHTML: msg,
13
- className: 'tip'
14
- })
15
-
16
- setTimeout(() => {
17
- tipbox.classList.add('hide')
18
- setTimeout(() => {
19
- BODY.removeChild(tipbox)
20
- }, 300)
21
- }, 3000)
22
- }
23
-
24
- export const pagePosition = () => {
25
- // 判断配置项是否开启了自动记录滚动位置
26
- if (CONFIG.auto_scroll) {
27
- // 将当前页面的滚动位置存入本地缓存
28
- localStorage.setItem(LOCAL_URL, String(scrollAction.y))
29
- }
30
- }
31
-
32
- export const positionInit = (comment?: boolean) => {
33
- // 获取页面锚点
34
- const anchor = window.location.hash
35
-
36
- let target = null
37
- if (LOCAL_HASH) {
38
- localStorage.removeItem(LOCAL_URL)
39
- return
40
- }
41
-
42
- if (anchor) {
43
- target = document.querySelector(decodeURI(anchor))
44
- } else {
45
- target = CONFIG.auto_scroll ? parseInt(localStorage.getItem(LOCAL_URL)) : 0
46
- }
47
-
48
- if (target) {
49
- pageScroll(target)
50
- setLocalHash(1)
51
- }
52
-
53
- if (comment && anchor && !LOCAL_HASH) {
54
- pageScroll(target)
55
- setLocalHash(1)
56
- }
57
- }
58
-
59
- /*
60
- 基于clipboard API的复制功能,仅在https环境下有效
61
- */
62
- export const clipBoard = (str: string, callback?: (result:boolean) => void) => {
63
- if (navigator.clipboard && window.isSecureContext) {
64
- navigator.clipboard.writeText(str).then(() => {
65
- callback && callback(true)
66
- }, () => {
67
- callback && callback(false)
68
- })
69
- } else {
70
- console.error('Too old browser, clipborad API not supported.')
71
- callback && callback(false)
72
- }
73
- }
1
+ import { pageScroll } from '../library/anime'
2
+ import { BODY, CONFIG, LOCAL_HASH, LOCAL_URL, scrollAction, setLocalHash } from './globalVars'
3
+ import { createChild } from '../library/proto'
4
+
5
+ // 显示提示(现阶段用于版权及复制结果提示)
6
+ export const showtip = (msg: string): void | never => {
7
+ if (!msg) {
8
+ return
9
+ }
10
+
11
+ const tipbox = createChild(BODY, 'div', {
12
+ innerHTML: msg,
13
+ className: 'tip'
14
+ })
15
+
16
+ setTimeout(() => {
17
+ tipbox.classList.add('hide')
18
+ setTimeout(() => {
19
+ BODY.removeChild(tipbox)
20
+ }, 300)
21
+ }, 3000)
22
+ }
23
+
24
+ export const pagePosition = () => {
25
+ // 判断配置项是否开启了自动记录滚动位置
26
+ if (CONFIG.auto_scroll) {
27
+ // 将当前页面的滚动位置存入本地缓存
28
+ localStorage.setItem(LOCAL_URL, String(scrollAction.y))
29
+ }
30
+ }
31
+
32
+ export const positionInit = (comment?: boolean) => {
33
+ // 获取页面锚点
34
+ const anchor = window.location.hash
35
+
36
+ let target = null
37
+ if (LOCAL_HASH) {
38
+ localStorage.removeItem(LOCAL_URL)
39
+ return
40
+ }
41
+
42
+ if (anchor) {
43
+ target = document.querySelector(decodeURI(anchor))
44
+ } else {
45
+ target = CONFIG.auto_scroll ? parseInt(localStorage.getItem(LOCAL_URL)) : 0
46
+ }
47
+
48
+ if (target) {
49
+ pageScroll(target)
50
+ setLocalHash(1)
51
+ }
52
+
53
+ if (comment && anchor && !LOCAL_HASH) {
54
+ pageScroll(target)
55
+ setLocalHash(1)
56
+ }
57
+ }
58
+
59
+ /*
60
+ 基于clipboard API的复制功能,仅在https环境下有效
61
+ */
62
+ export const clipBoard = (str: string, callback?: (result:boolean) => void) => {
63
+ if (navigator.clipboard && window.isSecureContext) {
64
+ navigator.clipboard.writeText(str).then(() => {
65
+ callback && callback(true)
66
+ }, () => {
67
+ callback && callback(false)
68
+ })
69
+ } else {
70
+ console.error('Too old browser, clipborad API not supported.')
71
+ callback && callback(false)
72
+ }
73
+ }
@@ -1,121 +1,121 @@
1
- import anime from 'theme-shokax-anime'
2
- import { siteNavHeight } from '../globals/globalVars'
3
- import type { AnimeOptions } from 'theme-shokax-anime/dist/types'
4
- import {getTop, setDisplay} from './proto'
5
-
6
- /**
7
- * 参数 动画效果
8
- * 0 元素逐渐消失
9
- * 1 元素逐渐出现
10
- * bounceUpIn 元素从下方弹跳出现
11
- * shrinkIn 元素从放大到正常大小出现
12
- * slideRightIn 元素从右侧滑入
13
- * slideRightOut 元素向右侧滑出
14
- * TODO 函数功能过于复杂,需要拆分
15
- */
16
- export const transition = (target: HTMLElement, type: number|string|Function, complete?: Function, begin?: Function): void => {
17
- let animation:Partial<AnimeOptions>
18
- let display = 'none'
19
- switch (type) {
20
- case 0:
21
- animation = { opacity: [1, 0] }
22
- break
23
- case 1:
24
- animation = { opacity: [0, 1] }
25
- display = 'block'
26
- break
27
- case 'bounceUpIn':
28
- animation = {
29
- begin (anim) {
30
- setDisplay(target, 'block')
31
- },
32
- translateY: [
33
- { value: -60, duration: 200 },
34
- { value: 10, duration: 200 },
35
- { value: -5, duration: 200 },
36
- { value: 0, duration: 200 }
37
- ],
38
- opacity: [0, 1]
39
- }
40
- display = 'block'
41
- break
42
- case 'shrinkIn':
43
- animation = {
44
- begin (anim) {
45
- setDisplay(target, 'block')
46
- },
47
- scale: [
48
- { value: 1.1, duration: 300 },
49
- { value: 1, duration: 200 }
50
- ],
51
- opacity: 1
52
- }
53
- display = 'block'
54
- break
55
- case 'slideRightIn':
56
- animation = {
57
- begin (anim) {
58
- setDisplay(target, 'block')
59
- },
60
- translateX: ['100%', '0%'],
61
- opacity: [0, 1]
62
- }
63
- display = 'block'
64
- break
65
- case 'slideRightOut':
66
- animation = {
67
- translateX: ['0%', '100%'],
68
- opacity: [1, 0]
69
- }
70
- break
71
- default:
72
- // @ts-ignore
73
- animation = type
74
- // @ts-ignore
75
- display = type.display
76
- break
77
- }
78
- anime(Object.assign({
79
- targets: target,
80
- duration: 200,
81
- easing: 'linear',
82
- begin () {
83
- begin && begin()
84
- },
85
- complete () {
86
- setDisplay(target, display)
87
- complete && complete()
88
- }
89
- }, animation)).play()
90
- }
91
-
92
- export const pageScroll = (target: HTMLElement | number, offset?: number, complete?: Function) => {
93
- // 确定滚动容器
94
- const scrollContainer = (typeof offset === 'number' && typeof target !== 'number')
95
- ? target.parentNode as HTMLElement
96
- : document.scrollingElement || document.documentElement;
97
-
98
- // 计算目标滚动位置
99
- let scrollTop: number;
100
- if (typeof offset !== 'undefined') {
101
- scrollTop = offset;
102
- } else if (typeof target === 'number') {
103
- scrollTop = target;
104
- } else if (target) {
105
- const rect = target.getBoundingClientRect();
106
- scrollTop = rect.top + window.scrollY - siteNavHeight;
107
- } else {
108
- scrollTop = 0;
109
- }
110
-
111
- // 执行平滑滚动
112
- scrollContainer.scrollTo({
113
- top: scrollTop,
114
- behavior: 'smooth'
115
- });
116
-
117
- // 处理完成回调(模拟动画持续时间)
118
- if (complete) {
119
- setTimeout(() => complete(), 500); // 与原动画持续时间保持一致
120
- }
121
- };
1
+ import anime from 'theme-shokax-anime'
2
+ import { siteNavHeight } from '../globals/globalVars'
3
+ import type { AnimeOptions } from 'theme-shokax-anime/dist/types'
4
+ import {getTop, setDisplay} from './proto'
5
+
6
+ /**
7
+ * 参数 动画效果
8
+ * 0 元素逐渐消失
9
+ * 1 元素逐渐出现
10
+ * bounceUpIn 元素从下方弹跳出现
11
+ * shrinkIn 元素从放大到正常大小出现
12
+ * slideRightIn 元素从右侧滑入
13
+ * slideRightOut 元素向右侧滑出
14
+ * TODO 函数功能过于复杂,需要拆分
15
+ */
16
+ export const transition = (target: HTMLElement, type: number|string|Function, complete?: Function, begin?: Function): void => {
17
+ let animation:Partial<AnimeOptions>
18
+ let display = 'none'
19
+ switch (type) {
20
+ case 0:
21
+ animation = { opacity: [1, 0] }
22
+ break
23
+ case 1:
24
+ animation = { opacity: [0, 1] }
25
+ display = 'block'
26
+ break
27
+ case 'bounceUpIn':
28
+ animation = {
29
+ begin (anim) {
30
+ setDisplay(target, 'block')
31
+ },
32
+ translateY: [
33
+ { value: -60, duration: 200 },
34
+ { value: 10, duration: 200 },
35
+ { value: -5, duration: 200 },
36
+ { value: 0, duration: 200 }
37
+ ],
38
+ opacity: [0, 1]
39
+ }
40
+ display = 'block'
41
+ break
42
+ case 'shrinkIn':
43
+ animation = {
44
+ begin (anim) {
45
+ setDisplay(target, 'block')
46
+ },
47
+ scale: [
48
+ { value: 1.1, duration: 300 },
49
+ { value: 1, duration: 200 }
50
+ ],
51
+ opacity: 1
52
+ }
53
+ display = 'block'
54
+ break
55
+ case 'slideRightIn':
56
+ animation = {
57
+ begin (anim) {
58
+ setDisplay(target, 'block')
59
+ },
60
+ translateX: ['100%', '0%'],
61
+ opacity: [0, 1]
62
+ }
63
+ display = 'block'
64
+ break
65
+ case 'slideRightOut':
66
+ animation = {
67
+ translateX: ['0%', '100%'],
68
+ opacity: [1, 0]
69
+ }
70
+ break
71
+ default:
72
+ // @ts-ignore
73
+ animation = type
74
+ // @ts-ignore
75
+ display = type.display
76
+ break
77
+ }
78
+ anime(Object.assign({
79
+ targets: target,
80
+ duration: 200,
81
+ easing: 'linear',
82
+ begin () {
83
+ begin && begin()
84
+ },
85
+ complete () {
86
+ setDisplay(target, display)
87
+ complete && complete()
88
+ }
89
+ }, animation)).play()
90
+ }
91
+
92
+ export const pageScroll = (target: HTMLElement | number, offset?: number, complete?: Function) => {
93
+ // 确定滚动容器
94
+ const scrollContainer = (typeof offset === 'number' && typeof target !== 'number')
95
+ ? target.parentNode as HTMLElement
96
+ : document.scrollingElement || document.documentElement;
97
+
98
+ // 计算目标滚动位置
99
+ let scrollTop: number;
100
+ if (typeof offset !== 'undefined') {
101
+ scrollTop = offset;
102
+ } else if (typeof target === 'number') {
103
+ scrollTop = target;
104
+ } else if (target) {
105
+ const rect = target.getBoundingClientRect();
106
+ scrollTop = rect.top + window.scrollY - siteNavHeight;
107
+ } else {
108
+ scrollTop = 0;
109
+ }
110
+
111
+ // 执行平滑滚动
112
+ scrollContainer.scrollTo({
113
+ top: scrollTop,
114
+ behavior: 'smooth'
115
+ });
116
+
117
+ // 处理完成回调(模拟动画持续时间)
118
+ if (complete) {
119
+ setTimeout(() => complete(), 500); // 与原动画持续时间保持一致
120
+ }
121
+ };