hexo-theme-shokax 0.4.4 → 0.4.6-beta1

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 (183) hide show
  1. package/CODE_OF_CONDUCT.md +128 -128
  2. package/CONTRIBUTING.md +58 -58
  3. package/LICENSE +660 -660
  4. package/LICENSE-shoka +21 -21
  5. package/README.md +99 -98
  6. package/README_en.MD +91 -90
  7. package/UsageRestrictions.md +25 -25
  8. package/_config.yml +381 -388
  9. package/_images.yml +9 -9
  10. package/eslint.config.mjs +55 -55
  11. package/index.html +231 -0
  12. package/languages/README.md +19 -19
  13. package/languages/default.yml +1 -1
  14. package/languages/en.yml +153 -153
  15. package/languages/ja.yml +153 -153
  16. package/languages/zh-CN.yml +153 -153
  17. package/languages/zh-HK.yml +153 -153
  18. package/languages/zh-TW.yml +153 -153
  19. package/layout/_alternate/atom.ejs +30 -30
  20. package/layout/_alternate/json.ejs +16 -16
  21. package/layout/_alternate/rss.ejs +34 -34
  22. package/layout/_mixin/breadcrumb.pug +33 -33
  23. package/layout/_mixin/card.pug +38 -38
  24. package/layout/_mixin/comment.pug +6 -6
  25. package/layout/_mixin/postmeta.pug +29 -29
  26. package/layout/_mixin/segment.pug +35 -35
  27. package/layout/_mixin/sidebar.pug +40 -40
  28. package/layout/_mixin/widgets.pug +28 -28
  29. package/layout/_partials/footer.pug +43 -43
  30. package/layout/_partials/head/head.pug +55 -56
  31. package/layout/_partials/head/head_com.pug +24 -24
  32. package/layout/_partials/head/pwa.pug +18 -18
  33. package/layout/_partials/header.pug +18 -18
  34. package/layout/_partials/layout.pug +140 -140
  35. package/layout/_partials/loading.pug +13 -13
  36. package/layout/_partials/pagination.pug +4 -4
  37. package/layout/_partials/post/copyright.pug +20 -20
  38. package/layout/_partials/post/footer.pug +17 -17
  39. package/layout/_partials/post/nav.pug +13 -13
  40. package/layout/_partials/post/post.pug +41 -41
  41. package/layout/_partials/post/reward.pug +18 -18
  42. package/layout/_partials/sidebar/menu.pug +37 -37
  43. package/layout/_partials/sidebar/overview.pug +42 -42
  44. package/layout/_partials/third-party/baidu-analytics.pug +11 -11
  45. package/layout/_partials/third-party/clarity.pug +8 -8
  46. package/layout/_partials/third-party/google-analytics.pug +9 -9
  47. package/layout/archive.pug +118 -118
  48. package/layout/category.pug +59 -59
  49. package/layout/index.pug +33 -33
  50. package/layout/page.pug +55 -55
  51. package/layout/post.pug +36 -36
  52. package/layout/tag.pug +43 -43
  53. package/meta.json +6431 -0
  54. package/package.json +72 -70
  55. package/scripts/helpers/engine.js +10 -0
  56. package/scripts/plugin/check.js +2 -2
  57. package/scripts/tags/links.js +4 -4
  58. package/source/assets/algolia_logo.svg +9 -9
  59. package/source/assets/logo.svg +16 -16
  60. package/source/css/_colors.styl +207 -207
  61. package/source/css/_common/components/components.styl +6 -6
  62. package/source/css/_common/components/highlight/highlight.styl +357 -357
  63. package/source/css/_common/components/highlight/operation.styl +21 -21
  64. package/source/css/_common/components/pages/collapse.styl +119 -119
  65. package/source/css/_common/components/pages/home.styl +391 -391
  66. package/source/css/_common/components/pages/pages.styl +56 -56
  67. package/source/css/_common/components/pages/tag-cloud.styl +12 -12
  68. package/source/css/_common/components/post/breadcrumb.styl +39 -39
  69. package/source/css/_common/components/post/copyright.styl +41 -41
  70. package/source/css/_common/components/post/expand.styl +263 -263
  71. package/source/css/_common/components/post/footer.styl +11 -11
  72. package/source/css/_common/components/post/header.styl +79 -79
  73. package/source/css/_common/components/post/nav.styl +64 -64
  74. package/source/css/_common/components/post/post.styl +29 -29
  75. package/source/css/_common/components/post/reward.styl +50 -50
  76. package/source/css/_common/components/post/rtl.styl +12 -12
  77. package/source/css/_common/components/post/tags.styl +39 -39
  78. package/source/css/_common/components/tags/collapse.styl +72 -72
  79. package/source/css/_common/components/tags/container.styl +49 -49
  80. package/source/css/_common/components/tags/label.styl +12 -12
  81. package/source/css/_common/components/tags/links.styl +77 -77
  82. package/source/css/_common/components/tags/list.styl +131 -131
  83. package/source/css/_common/components/tags/note.styl +70 -70
  84. package/source/css/_common/components/tags/player.styl +361 -361
  85. package/source/css/_common/components/tags/quiz.styl +200 -200
  86. package/source/css/_common/components/tags/tabs.styl +89 -89
  87. package/source/css/_common/components/tags/tags.styl +9 -9
  88. package/source/css/_common/components/third-party/loading.styl +222 -222
  89. package/source/css/_common/components/third-party/mermaid/class.styl +90 -90
  90. package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -72
  91. package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -251
  92. package/source/css/_common/components/third-party/mermaid/git.styl +7 -7
  93. package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -37
  94. package/source/css/_common/components/third-party/mermaid/pie.styl +9 -9
  95. package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -95
  96. package/source/css/_common/components/third-party/mermaid/state.styl +130 -130
  97. package/source/css/_common/components/third-party/pace.styl +18 -18
  98. package/source/css/_common/components/third-party/search.styl +167 -167
  99. package/source/css/_common/components/third-party/theme.styl +151 -151
  100. package/source/css/_common/components/third-party/third-party.styl +22 -22
  101. package/source/css/_common/components/third-party/widgets.styl +57 -57
  102. package/source/css/_common/outline/footer/footer.styl +67 -67
  103. package/source/css/_common/outline/header/brand.styl +77 -77
  104. package/source/css/_common/outline/header/header.styl +20 -20
  105. package/source/css/_common/outline/header/image.styl +85 -85
  106. package/source/css/_common/outline/header/menu.styl +117 -117
  107. package/source/css/_common/outline/header/nav.styl +81 -81
  108. package/source/css/_common/outline/header/right.styl +15 -15
  109. package/source/css/_common/outline/header/tool.styl +207 -207
  110. package/source/css/_common/outline/header/waves.styl +57 -57
  111. package/source/css/_common/outline/mobile.styl +46 -46
  112. package/source/css/_common/outline/outline.styl +78 -78
  113. package/source/css/_common/outline/sidebar/author.styl +59 -59
  114. package/source/css/_common/outline/sidebar/dimmer.styl +23 -23
  115. package/source/css/_common/outline/sidebar/menu.styl +63 -63
  116. package/source/css/_common/outline/sidebar/quick.styl +43 -43
  117. package/source/css/_common/outline/sidebar/related.styl +56 -56
  118. package/source/css/_common/outline/sidebar/sidebar.styl +80 -80
  119. package/source/css/_common/outline/sidebar/social.styl +69 -69
  120. package/source/css/_common/outline/sidebar/state.styl +37 -37
  121. package/source/css/_common/outline/sidebar/tab.styl +71 -71
  122. package/source/css/_common/outline/sidebar/toc.styl +47 -47
  123. package/source/css/_common/scaffolding/animate.styl +322 -322
  124. package/source/css/_common/scaffolding/base.styl +190 -190
  125. package/source/css/_common/scaffolding/buttons.styl +48 -48
  126. package/source/css/_common/scaffolding/divider.styl +36 -36
  127. package/source/css/_common/scaffolding/iconfont.styl +443 -443
  128. package/source/css/_common/scaffolding/normalize.styl +273 -273
  129. package/source/css/_common/scaffolding/pagination.styl +81 -81
  130. package/source/css/_common/scaffolding/ribbon.styl +38 -38
  131. package/source/css/_common/scaffolding/scaffolding.styl +14 -14
  132. package/source/css/_common/scaffolding/scrollbar.styl +37 -37
  133. package/source/css/_common/scaffolding/tables.styl +50 -50
  134. package/source/css/_common/scaffolding/tip.styl +19 -19
  135. package/source/css/_common/scaffolding/toggles.styl +59 -59
  136. package/source/css/_iconfont.styl +455 -455
  137. package/source/css/_mixins.styl +148 -148
  138. package/source/css/_variables.styl +89 -89
  139. package/source/css/app.styl +41 -41
  140. package/source/css/mermaid.styl +5 -5
  141. package/source/css/optimize.styl +5 -5
  142. package/source/js/_app/components/comments.js +59 -0
  143. package/source/js/_app/components/comments.ts +88 -89
  144. package/source/js/_app/components/sidebar.js +244 -0
  145. package/source/js/_app/components/sidebar.ts +239 -239
  146. package/source/js/_app/components/tcomments.js +47 -0
  147. package/source/js/_app/components/tcomments.ts +54 -55
  148. package/source/js/_app/globals/globalVars.ts +99 -99
  149. package/source/js/_app/globals/handles.js +105 -0
  150. package/source/js/_app/globals/handles.ts +124 -123
  151. package/source/js/_app/globals/themeColor.ts +63 -64
  152. package/source/js/_app/globals/thirdparty.ts +63 -63
  153. package/source/js/_app/globals/tools.ts +75 -75
  154. package/source/js/_app/library/anime.ts +110 -110
  155. package/source/js/_app/library/declare.d.ts +128 -133
  156. package/source/js/_app/library/dom.ts +28 -26
  157. package/source/js/_app/library/loadFile.js +43 -0
  158. package/source/js/_app/library/loadFile.ts +47 -43
  159. package/source/js/_app/library/proto.ts +137 -141
  160. package/source/js/_app/library/scriptPjax.ts +72 -72
  161. package/source/js/_app/library/storage.ts +12 -12
  162. package/source/js/_app/library/vue.js +52 -0
  163. package/source/js/_app/library/vue.ts +49 -50
  164. package/source/js/_app/page/common.js +45 -0
  165. package/source/js/_app/page/common.ts +43 -42
  166. package/source/js/_app/page/fancybox.js +70 -0
  167. package/source/js/_app/page/fancybox.ts +72 -71
  168. package/source/js/_app/page/post.js +253 -0
  169. package/source/js/_app/page/post.ts +266 -266
  170. package/source/js/_app/page/search.js +111 -0
  171. package/source/js/_app/page/search.ts +115 -115
  172. package/source/js/_app/page/tab.ts +60 -60
  173. package/source/js/_app/pjax/domInit.js +80 -0
  174. package/source/js/_app/pjax/domInit.ts +97 -97
  175. package/source/js/_app/pjax/refresh.js +137 -0
  176. package/source/js/_app/pjax/refresh.ts +140 -138
  177. package/source/js/_app/pjax/siteInit.js +115 -0
  178. package/source/js/_app/pjax/siteInit.ts +106 -104
  179. package/source/js/_app/player.js +777 -0
  180. package/source/js/_app/player.ts +798 -799
  181. package/toolbox/compiler.mjs +73 -0
  182. package/toolbox/hoistdep.mjs +6 -0
  183. package/toolbox/lib.mjs +40 -0
@@ -1,64 +1,63 @@
1
- import { $storage } from '../library/storage'
2
- import { $dom } from '../library/dom'
3
- import { CONFIG, HTML } from './globalVars'
4
-
5
- /**
6
- * 更改日夜模式
7
- */
8
- export const changeTheme = (type?: string) => {
9
- const btn = <HTMLElement>$dom('.theme .ic')
10
- if (type === 'dark') {
11
- HTML.setAttribute('data-theme', type)
12
- btn.removeClass('i-sun')
13
- btn.addClass('i-moon')
14
- } else {
15
- HTML.removeAttribute('data-theme')
16
- btn.removeClass('i-moon')
17
- btn.addClass('i-sun')
18
- }
19
- }
20
-
21
- /**
22
- * 自动调整黑夜白天
23
- * 优先级: 手动选择>时间>跟随系统
24
- */
25
- export const autoDarkmode = () => {
26
- if (CONFIG.auto_dark.enable) {
27
- if (new Date().getHours() >= CONFIG.auto_dark.start || new Date().getHours() <= CONFIG.auto_dark.end) {
28
- changeTheme('dark')
29
- } else {
30
- changeTheme()
31
- }
32
- }
33
- }
34
-
35
- /**
36
- * 更改主题的meta
37
- */
38
- export const changeMetaTheme = (color: string): void => {
39
- if (HTML.getAttribute('data-theme') === 'dark') {
40
- color = '#222'
41
- }
42
-
43
- $dom('meta[name="theme-color"]').setAttribute('content', color)
44
- }
45
-
46
- // 记忆日夜模式切换和系统亮暗模式监听
47
- export const themeColorListener = () => {
48
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (mediaQueryList) => {
49
- if (mediaQueryList.matches) {
50
- changeTheme('dark')
51
- } else {
52
- changeTheme()
53
- }
54
- })
55
-
56
- const t = $storage.get('theme')
57
- if (t) {
58
- changeTheme(t)
59
- } else {
60
- if (CONFIG.darkmode) {
61
- changeTheme('dark')
62
- }
63
- }
64
- }
1
+ import { $storage } from '../library/storage'
2
+ import { CONFIG, HTML } from './globalVars'
3
+
4
+ /**
5
+ * 更改日夜模式
6
+ */
7
+ export const changeTheme = (type?: string) => {
8
+ const btn = document.querySelector('.theme .ic')
9
+ if (type === 'dark') {
10
+ HTML.setAttribute('data-theme', type)
11
+ btn.removeClass('i-sun')
12
+ btn.addClass('i-moon')
13
+ } else {
14
+ HTML.removeAttribute('data-theme')
15
+ btn.removeClass('i-moon')
16
+ btn.addClass('i-sun')
17
+ }
18
+ }
19
+
20
+ /**
21
+ * 自动调整黑夜白天
22
+ * 优先级: 手动选择>时间>跟随系统
23
+ */
24
+ export const autoDarkmode = () => {
25
+ if (CONFIG.auto_dark.enable) {
26
+ if (new Date().getHours() >= CONFIG.auto_dark.start || new Date().getHours() <= CONFIG.auto_dark.end) {
27
+ changeTheme('dark')
28
+ } else {
29
+ changeTheme()
30
+ }
31
+ }
32
+ }
33
+
34
+ /**
35
+ * 更改主题的meta
36
+ */
37
+ export const changeMetaTheme = (color: string): void => {
38
+ if (HTML.getAttribute('data-theme') === 'dark') {
39
+ color = '#222'
40
+ }
41
+
42
+ document.querySelector('meta[name="theme-color"]').setAttribute('content', color)
43
+ }
44
+
45
+ // 记忆日夜模式切换和系统亮暗模式监听
46
+ export const themeColorListener = () => {
47
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (mediaQueryList) => {
48
+ if (mediaQueryList.matches) {
49
+ changeTheme('dark')
50
+ } else {
51
+ changeTheme()
52
+ }
53
+ })
54
+
55
+ const t = $storage.get('theme')
56
+ if (t) {
57
+ changeTheme(t)
58
+ } else {
59
+ if (CONFIG.darkmode) {
60
+ changeTheme('dark')
61
+ }
62
+ }
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.removeClass('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.addClass('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.removeClass('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.addClass('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,75 +1,75 @@
1
- import { pageScroll } from '../library/anime'
2
- import { $dom } from '../library/dom'
3
- import { $storage } from '../library/storage'
4
- import { BODY, CONFIG, LOCAL_HASH, LOCAL_URL, scrollAction, setLocalHash } from './globalVars'
5
- import { createChild } from '../library/proto'
6
-
7
- // 显示提示(现阶段用于版权及复制结果提示)
8
- export const showtip = (msg: string): void | never => {
9
- if (!msg) {
10
- return
11
- }
12
-
13
- const tipbox = createChild(BODY, 'div', {
14
- innerHTML: msg,
15
- className: 'tip'
16
- })
17
-
18
- setTimeout(() => {
19
- tipbox.addClass('hide')
20
- setTimeout(() => {
21
- BODY.removeChild(tipbox)
22
- }, 300)
23
- }, 3000)
24
- }
25
-
26
- export const pagePosition = () => {
27
- // 判断配置项是否开启了自动记录滚动位置
28
- if (CONFIG.auto_scroll) {
29
- // 将当前页面的滚动位置存入本地缓存
30
- $storage.set(LOCAL_URL, String(scrollAction.y))
31
- }
32
- }
33
-
34
- export const positionInit = (comment?: boolean) => {
35
- // 获取页面锚点
36
- const anchor = window.location.hash
37
-
38
- let target = null
39
- if (LOCAL_HASH) {
40
- $storage.del(LOCAL_URL)
41
- return
42
- }
43
-
44
- if (anchor) {
45
- target = $dom(decodeURI(anchor))
46
- } else {
47
- target = CONFIG.auto_scroll ? parseInt($storage.get(LOCAL_URL)) : 0
48
- }
49
-
50
- if (target) {
51
- pageScroll(target)
52
- setLocalHash(1)
53
- }
54
-
55
- if (comment && anchor && !LOCAL_HASH) {
56
- pageScroll(target)
57
- setLocalHash(1)
58
- }
59
- }
60
-
61
- /*
62
- 基于clipboard API的复制功能,仅在https环境下有效
63
- */
64
- export const clipBoard = (str: string, callback?: (result:boolean) => void) => {
65
- if (navigator.clipboard && window.isSecureContext) {
66
- navigator.clipboard.writeText(str).then(() => {
67
- callback && callback(true)
68
- }, () => {
69
- callback && callback(false)
70
- })
71
- } else {
72
- console.error('Too old browser, clipborad API not supported.')
73
- callback && callback(false)
74
- }
75
- }
1
+ import { pageScroll } from '../library/anime'
2
+ import { $dom } from '../library/dom'
3
+ import { $storage } from '../library/storage'
4
+ import { BODY, CONFIG, LOCAL_HASH, LOCAL_URL, scrollAction, setLocalHash } from './globalVars'
5
+ import { createChild } from '../library/proto'
6
+
7
+ // 显示提示(现阶段用于版权及复制结果提示)
8
+ export const showtip = (msg: string): void | never => {
9
+ if (!msg) {
10
+ return
11
+ }
12
+
13
+ const tipbox = createChild(BODY, 'div', {
14
+ innerHTML: msg,
15
+ className: 'tip'
16
+ })
17
+
18
+ setTimeout(() => {
19
+ tipbox.addClass('hide')
20
+ setTimeout(() => {
21
+ BODY.removeChild(tipbox)
22
+ }, 300)
23
+ }, 3000)
24
+ }
25
+
26
+ export const pagePosition = () => {
27
+ // 判断配置项是否开启了自动记录滚动位置
28
+ if (CONFIG.auto_scroll) {
29
+ // 将当前页面的滚动位置存入本地缓存
30
+ $storage.set(LOCAL_URL, String(scrollAction.y))
31
+ }
32
+ }
33
+
34
+ export const positionInit = (comment?: boolean) => {
35
+ // 获取页面锚点
36
+ const anchor = window.location.hash
37
+
38
+ let target = null
39
+ if (LOCAL_HASH) {
40
+ $storage.del(LOCAL_URL)
41
+ return
42
+ }
43
+
44
+ if (anchor) {
45
+ target = document.querySelector(decodeURI(anchor))
46
+ } else {
47
+ target = CONFIG.auto_scroll ? parseInt($storage.get(LOCAL_URL)) : 0
48
+ }
49
+
50
+ if (target) {
51
+ pageScroll(target)
52
+ setLocalHash(1)
53
+ }
54
+
55
+ if (comment && anchor && !LOCAL_HASH) {
56
+ pageScroll(target)
57
+ setLocalHash(1)
58
+ }
59
+ }
60
+
61
+ /*
62
+ 基于clipboard API的复制功能,仅在https环境下有效
63
+ */
64
+ export const clipBoard = (str: string, callback?: (result:boolean) => void) => {
65
+ if (navigator.clipboard && window.isSecureContext) {
66
+ navigator.clipboard.writeText(str).then(() => {
67
+ callback && callback(true)
68
+ }, () => {
69
+ callback && callback(false)
70
+ })
71
+ } else {
72
+ console.error('Too old browser, clipborad API not supported.')
73
+ callback && callback(false)
74
+ }
75
+ }
@@ -1,110 +1,110 @@
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
- // target: 滚动到的目标元素或坐标(number)
94
- // offset: 可选的偏移量
95
- // complete: 可选的回调函数,在动画完成时调用
96
- anime({
97
- // 动画目标
98
- targets: typeof offset === 'number' && typeof target !== 'number' ? target.parentNode : document.scrollingElement,
99
- // 动画持续时间
100
- duration: 500,
101
- // 动画缓动函数
102
- easing: 'easeInOutQuad',
103
- // 如果 offset 存在,则滚动到 offset,如果 target 是数字,则滚动到 target,如果 target 是 DOM 元素,则滚动到下述表达式
104
- scrollTop: offset || (typeof target === 'number' ? target : (target ? getTop(target) + document.documentElement.scrollTop - siteNavHeight : 0)),
105
- // 完成回调函数
106
- complete () {
107
- complete && complete()
108
- }
109
- }).play()
110
- }
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
+ // target: 滚动到的目标元素或坐标(number)
94
+ // offset: 可选的偏移量
95
+ // complete: 可选的回调函数,在动画完成时调用
96
+ anime({
97
+ // 动画目标
98
+ targets: typeof offset === 'number' && typeof target !== 'number' ? target.parentNode : document.scrollingElement,
99
+ // 动画持续时间
100
+ duration: 500,
101
+ // 动画缓动函数
102
+ easing: 'easeInOutQuad',
103
+ // 如果 offset 存在,则滚动到 offset,如果 target 是数字,则滚动到 target,如果 target 是 DOM 元素,则滚动到下述表达式
104
+ scrollTop: offset || (typeof target === 'number' ? target : (target ? getTop(target) + document.documentElement.scrollTop - siteNavHeight : 0)),
105
+ // 完成回调函数
106
+ complete () {
107
+ complete && complete()
108
+ }
109
+ }).play()
110
+ }