hexo-theme-shokax 0.3.13 → 0.4.0-alpha.1

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 (90) hide show
  1. package/_config.yml +11 -5
  2. package/layout/_mixin/comment.pug +4 -4
  3. package/package.json +4 -4
  4. package/scripts/filters/locals.d.ts +1 -0
  5. package/scripts/filters/locals.ts +59 -0
  6. package/scripts/filters/post.d.ts +0 -0
  7. package/scripts/filters/post.ts +6 -0
  8. package/scripts/generaters/archive.d.ts +1 -0
  9. package/scripts/generaters/archive.ts +144 -0
  10. package/scripts/generaters/config.d.ts +1 -0
  11. package/scripts/generaters/config.ts +52 -0
  12. package/scripts/generaters/images.d.ts +1 -0
  13. package/scripts/generaters/images.ts +26 -0
  14. package/scripts/generaters/index.d.ts +1 -0
  15. package/scripts/generaters/index.ts +110 -0
  16. package/scripts/generaters/pages.d.ts +0 -0
  17. package/scripts/generaters/pages.ts +16 -0
  18. package/scripts/generaters/script.d.ts +1 -0
  19. package/scripts/generaters/script.js +22 -6
  20. package/scripts/generaters/script.ts +110 -0
  21. package/scripts/helpers/asset.d.ts +1 -0
  22. package/scripts/helpers/asset.ts +158 -0
  23. package/scripts/helpers/engine.d.ts +1 -0
  24. package/scripts/helpers/engine.ts +171 -0
  25. package/scripts/helpers/list_categories.d.ts +1 -0
  26. package/scripts/helpers/list_categories.ts +104 -0
  27. package/scripts/helpers/summary_ai.d.ts +1 -0
  28. package/scripts/helpers/summary_ai.ts +100 -0
  29. package/scripts/helpers/symbols_count_time.d.ts +1 -0
  30. package/scripts/helpers/symbols_count_time.ts +76 -0
  31. package/scripts/plugin/check.d.ts +1 -0
  32. package/scripts/plugin/check.ts +35 -0
  33. package/scripts/plugin/index.d.ts +6 -0
  34. package/scripts/plugin/index.ts +52 -0
  35. package/scripts/plugin/lib/injects-point.d.ts +5 -0
  36. package/scripts/plugin/lib/injects-point.ts +20 -0
  37. package/scripts/plugin/lib/injects.d.ts +2 -0
  38. package/scripts/plugin/lib/injects.ts +101 -0
  39. package/scripts/tags/links.d.ts +1 -0
  40. package/scripts/tags/links.ts +75 -0
  41. package/scripts/tags/media.d.ts +1 -0
  42. package/scripts/tags/media.ts +19 -0
  43. package/source/js/_app/components/sidebar.ts +237 -0
  44. package/source/js/_app/globals/globalVars.ts +98 -0
  45. package/source/js/_app/globals/handles.ts +122 -0
  46. package/source/js/_app/globals/themeColor.ts +64 -0
  47. package/source/js/_app/globals/thirdparty.ts +63 -0
  48. package/source/js/_app/globals/tools.ts +74 -0
  49. package/source/js/_app/library/anime.ts +109 -0
  50. package/source/js/_app/library/declare.d.ts +117 -0
  51. package/source/js/_app/library/dom.ts +26 -0
  52. package/source/js/_app/library/libtype.d.ts +4 -0
  53. package/source/js/_app/library/loadFile.ts +41 -0
  54. package/source/js/_app/library/proto.ts +143 -0
  55. package/source/js/_app/library/scriptPjax.ts +72 -0
  56. package/source/js/_app/library/storage.ts +12 -0
  57. package/source/js/_app/library/vue.ts +60 -0
  58. package/source/js/_app/page/common.ts +42 -0
  59. package/source/js/_app/page/fancybox.ts +70 -0
  60. package/source/js/_app/page/post.ts +265 -0
  61. package/source/js/_app/page/search.ts +129 -0
  62. package/source/js/_app/page/tab.ts +59 -0
  63. package/source/js/_app/pjax/domInit.ts +95 -0
  64. package/source/js/_app/pjax/refresh.ts +75 -0
  65. package/source/js/_app/pjax/siteInit.ts +67 -0
  66. package/source/js/_app/player.ts +798 -0
  67. package/source/js/_app/components/sidebar.js +0 -209
  68. package/source/js/_app/fireworks.js +0 -10
  69. package/source/js/_app/globals/globalVars.js +0 -80
  70. package/source/js/_app/globals/handles.js +0 -98
  71. package/source/js/_app/globals/themeColor.js +0 -62
  72. package/source/js/_app/globals/thirdparty.js +0 -62
  73. package/source/js/_app/globals/tools.js +0 -66
  74. package/source/js/_app/library/anime.js +0 -106
  75. package/source/js/_app/library/dom.js +0 -34
  76. package/source/js/_app/library/loadFile.js +0 -36
  77. package/source/js/_app/library/proto.js +0 -163
  78. package/source/js/_app/library/scriptPjax.js +0 -70
  79. package/source/js/_app/library/storage.js +0 -12
  80. package/source/js/_app/library/vue.js +0 -53
  81. package/source/js/_app/page/comment.js +0 -23
  82. package/source/js/_app/page/common.js +0 -41
  83. package/source/js/_app/page/fancybox.js +0 -65
  84. package/source/js/_app/page/post.js +0 -244
  85. package/source/js/_app/page/search.js +0 -118
  86. package/source/js/_app/page/tab.js +0 -53
  87. package/source/js/_app/pjax/domInit.js +0 -76
  88. package/source/js/_app/pjax/refresh.js +0 -52
  89. package/source/js/_app/pjax/siteInit.js +0 -51
  90. package/source/js/_app/player.js +0 -771
@@ -0,0 +1,98 @@
1
+ import { $dom } from '../library/dom'
2
+ import Pjax from 'theme-shokax-pjax'
3
+ import initProto from '../library/proto'
4
+
5
+ initProto()
6
+ export const statics = CONFIG.statics.indexOf('//') > 0 ? CONFIG.statics : CONFIG.root
7
+ export const scrollAction: { x: number, y: number } = { x: 0, y: 0 }
8
+ export let diffY = 0
9
+ export let originTitle: string, titleTime: NodeJS.Timeout
10
+ export const BODY = document.getElementsByTagName('body')[0]
11
+ export const HTML = document.documentElement
12
+ export const Container = $dom('#container')
13
+ export const loadCat = $dom('#loading')
14
+ export const siteNav = $dom('#nav')
15
+ export const siteHeader = $dom('#header')
16
+ export const menuToggle = siteNav.child('.toggle')
17
+ export const quickBtn = $dom('#quick')
18
+ export const sideBar = $dom('#sidebar')
19
+ export const siteBrand = $dom('#brand')
20
+ export let toolBtn = $dom('#tool')
21
+ export let toolPlayer
22
+ export let backToTop: HTMLElement
23
+ export let goToComment
24
+ export let showContents
25
+ export let siteSearch = $dom('#search')
26
+ export let siteNavHeight: number, headerHightInner: number, headerHight: number
27
+ export let oWinHeight = window.innerHeight
28
+ export let oWinWidth = window.innerWidth
29
+ export let LOCAL_HASH = 0
30
+ export let LOCAL_URL = window.location.href
31
+ export let pjax:Pjax
32
+
33
+ export function setSiteNavHeight (value:number):void {
34
+ siteNavHeight = value
35
+ }
36
+ export function setHeaderHightInner (value:number):void {
37
+ headerHightInner = value
38
+ }
39
+
40
+ export function setHeaderHight (value:number):void {
41
+ headerHight = value
42
+ }
43
+
44
+ export function setOWinHeight (value:number):void {
45
+ oWinHeight = value
46
+ }
47
+
48
+ export function setOWinWidth (value:number):void {
49
+ oWinWidth = value
50
+ }
51
+
52
+ export function setDiffY (value:number):void {
53
+ diffY = value
54
+ }
55
+
56
+ export function setTitleTime (value:NodeJS.Timeout):void {
57
+ titleTime = value
58
+ }
59
+
60
+ export function setLocalHash (value:number):void {
61
+ LOCAL_HASH = value
62
+ }
63
+
64
+ export function setLocalUrl (value:string):void {
65
+ LOCAL_URL = value
66
+ }
67
+
68
+ export function setPjax (value:Pjax):void {
69
+ pjax = value
70
+ }
71
+
72
+ export function setOriginTitle (value:string):void {
73
+ originTitle = value
74
+ }
75
+
76
+ export function setToolPlayer (value:any):void {
77
+ toolPlayer = value
78
+ }
79
+
80
+ export function setBackToTop (value:HTMLElement):void {
81
+ backToTop = value
82
+ }
83
+
84
+ export function setGoToComment (value:any):void {
85
+ goToComment = value
86
+ }
87
+
88
+ export function setShowContents (value:any):void {
89
+ showContents = value
90
+ }
91
+
92
+ export function setToolBtn (value:HTMLElement):void {
93
+ toolBtn = value
94
+ }
95
+
96
+ export function setSiteSearch (value:HTMLElement):void {
97
+ siteSearch = value
98
+ }
@@ -0,0 +1,122 @@
1
+ import { sideBarToggleHandle } from '../components/sidebar'
2
+ import { $dom, getDocHeight } from '../library/dom'
3
+ import {
4
+ backToTop,
5
+ diffY,
6
+ headerHight,
7
+ headerHightInner,
8
+ oWinWidth,
9
+ originTitle,
10
+ scrollAction,
11
+ sideBar,
12
+ siteBrand,
13
+ siteHeader,
14
+ siteNav,
15
+ statics,
16
+ titleTime,
17
+ toolBtn,
18
+ setSiteNavHeight,
19
+ setHeaderHightInner,
20
+ setHeaderHight,
21
+ setOWinHeight, setOWinWidth, setDiffY, setTitleTime
22
+ } from './globalVars'
23
+ import { changeMetaTheme } from './themeColor'
24
+ import { Loader } from './thirdparty'
25
+
26
+ export const resizeHandle = () => {
27
+ // 获取 siteNav 的高度
28
+ setSiteNavHeight(siteNav.changeOrGetHeight())
29
+ // 获取 siteHeader 的高度
30
+ setHeaderHightInner(siteHeader.changeOrGetHeight())
31
+ // 获取 #waves 的高度
32
+ setHeaderHight(headerHightInner + $dom('#waves').changeOrGetHeight())
33
+
34
+ // 判断窗口宽度是否改变
35
+ if (oWinWidth !== window.innerWidth) {
36
+ sideBarToggleHandle(null, 1)
37
+ }
38
+
39
+ // 记录窗口高度和宽度
40
+ setOWinHeight(window.innerHeight)
41
+ setOWinWidth(window.innerWidth)
42
+ }
43
+
44
+ export const scrollHandle = () => {
45
+ // 获取窗口高度
46
+ const winHeight = window.innerHeight
47
+ // 获取文档高度
48
+ const docHeight = getDocHeight()
49
+ // 计算可见内容高度
50
+ const contentVisibilityHeight = docHeight > winHeight ? docHeight - winHeight : document.body.scrollHeight - winHeight
51
+ // 判断页面是否滚动超过 headerHightInner
52
+ const SHOW = window.scrollY > headerHightInner
53
+ // 判断页面是否开始滚动
54
+ const startScroll = window.scrollY > 0
55
+
56
+ // 根据条件修改 meta theme
57
+ if (SHOW) {
58
+ changeMetaTheme('#FFF')
59
+ } else {
60
+ changeMetaTheme('#222')
61
+ }
62
+
63
+ // 控制导航栏的显示隐藏
64
+ siteNav.toggleClass('show', SHOW)
65
+ // 控制网站 logo 的显示隐藏
66
+ toolBtn.toggleClass('affix', startScroll)
67
+ // 控制侧边栏的显示隐藏,当滚动高度大于 headerHight 且窗口宽度大于 991px 时显示
68
+ siteBrand.toggleClass('affix', startScroll)
69
+ sideBar.toggleClass('affix', window.scrollY > headerHight && document.body.offsetWidth > 991)
70
+ // 初始化滚动时导航栏的显示方向
71
+ if (typeof scrollAction.y === 'undefined') {
72
+ scrollAction.y = window.scrollY
73
+ }
74
+ setDiffY(scrollAction.y - window.scrollY)
75
+
76
+ // 控制滑动时导航栏显示
77
+ if (diffY < 0) {
78
+ siteNav.removeClass('up')
79
+ siteNav.toggleClass('down', SHOW)
80
+ } else if (diffY > 0) {
81
+ siteNav.removeClass('down')
82
+ siteNav.toggleClass('up', SHOW)
83
+ } else { /* empty */ }
84
+ scrollAction.y = window.scrollY
85
+ // 计算滚动百分比
86
+ const scrollPercent = Math.round(Math.min(100 * window.scrollY / contentVisibilityHeight, 100)) + '%'
87
+ // 更新回到顶部按钮的文字
88
+ if (backToTop.child('span').innerText !== scrollPercent) {
89
+ backToTop.child('span').innerText = scrollPercent
90
+ }
91
+ // 更新百分比进度条的宽度
92
+ if ($dom('#sidebar').hasClass('affix') || $dom('#sidebar').hasClass('on')) {
93
+ $dom('.percent').changeOrGetWidth(scrollPercent)
94
+ }
95
+ }
96
+
97
+ // 可见度监听(离开页面和返回时更改document的title)
98
+ export const visibilityListener = () => {
99
+ const iconNode = $dom('[rel="icon"]')
100
+ document.addEventListener('visibilitychange', () => {
101
+ switch (document.visibilityState) {
102
+ case 'hidden':
103
+ iconNode.setAttribute('href', statics + CONFIG.favicon.hidden)
104
+ document.title = LOCAL.favicon.hide
105
+ if (CONFIG.loader.switch) {
106
+ Loader.show()
107
+ }
108
+ clearTimeout(titleTime)
109
+ break
110
+ case 'visible':
111
+ iconNode.setAttribute('href', statics + CONFIG.favicon.normal)
112
+ document.title = LOCAL.favicon.show
113
+ if (CONFIG.loader.switch) {
114
+ Loader.hide(1000)
115
+ }
116
+ setTitleTime(setTimeout(() => {
117
+ document.title = originTitle
118
+ }, 2000))
119
+ break
120
+ }
121
+ })
122
+ }
@@ -0,0 +1,64 @@
1
+ import { $storage } from '../library/storage'
2
+ import { $dom } from '../library/dom'
3
+ import { 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
+ }
@@ -0,0 +1,63 @@
1
+ // 与第三方js的交互或第三方嵌入js
2
+
3
+ import { 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
+ }
@@ -0,0 +1,74 @@
1
+ import { pageScroll } from '../library/anime'
2
+ import { $dom } from '../library/dom'
3
+ import { $storage } from '../library/storage'
4
+ import { BODY, LOCAL_HASH, LOCAL_URL, scrollAction, setLocalHash } from './globalVars'
5
+
6
+ // 显示提示(现阶段用于版权及复制结果提示)
7
+ export const showtip = (msg: string): void | never => {
8
+ if (!msg) {
9
+ return
10
+ }
11
+
12
+ const tipbox = BODY.createChild('div', {
13
+ innerHTML: msg,
14
+ className: 'tip'
15
+ })
16
+
17
+ setTimeout(() => {
18
+ tipbox.addClass('hide')
19
+ setTimeout(() => {
20
+ BODY.removeChild(tipbox)
21
+ }, 300)
22
+ }, 3000)
23
+ }
24
+
25
+ export const pagePosition = () => {
26
+ // 判断配置项是否开启了自动记录滚动位置
27
+ if (CONFIG.auto_scroll) {
28
+ // 将当前页面的滚动位置存入本地缓存
29
+ $storage.set(LOCAL_URL, String(scrollAction.y))
30
+ }
31
+ }
32
+
33
+ export const positionInit = (comment?: boolean) => {
34
+ // 获取页面锚点
35
+ const anchor = window.location.hash
36
+
37
+ let target = null
38
+ if (LOCAL_HASH) {
39
+ $storage.del(LOCAL_URL)
40
+ return
41
+ }
42
+
43
+ if (anchor) {
44
+ target = $dom(decodeURI(anchor))
45
+ } else {
46
+ target = CONFIG.auto_scroll ? parseInt($storage.get(LOCAL_URL)) : 0
47
+ }
48
+
49
+ if (target) {
50
+ pageScroll(target)
51
+ setLocalHash(1)
52
+ }
53
+
54
+ if (comment && anchor && !LOCAL_HASH) {
55
+ pageScroll(target)
56
+ setLocalHash(1)
57
+ }
58
+ }
59
+
60
+ /*
61
+ 基于clipboard API的复制功能,仅在https环境下有效
62
+ */
63
+ export const clipBoard = (str: string, callback?: (result:boolean) => void) => {
64
+ if (navigator.clipboard && window.isSecureContext) {
65
+ navigator.clipboard.writeText(str).then(() => {
66
+ callback && callback(true)
67
+ }, () => {
68
+ callback && callback(false)
69
+ })
70
+ } else {
71
+ console.error('Too old browser, clipborad API not supported.')
72
+ callback && callback(false)
73
+ }
74
+ }
@@ -0,0 +1,109 @@
1
+ import anime from 'theme-shokax-anime'
2
+ import { siteNavHeight } from '../globals/globalVars'
3
+ import type { AnimeOptions } from 'theme-shokax-anime/dist/types'
4
+
5
+ /**
6
+ * 参数 动画效果
7
+ * 0 元素逐渐消失
8
+ * 1 元素逐渐出现
9
+ * bounceUpIn 元素从下方弹跳出现
10
+ * shrinkIn 元素从放大到正常大小出现
11
+ * slideRightIn 元素从右侧滑入
12
+ * slideRightOut 元素向右侧滑出
13
+ * TODO 函数功能过于复杂,需要拆分
14
+ */
15
+ export const transition = (target: HTMLElement, type: number|string|Function, complete?: Function, begin?: Function): void => {
16
+ let animation:Partial<AnimeOptions>
17
+ let display = 'none'
18
+ switch (type) {
19
+ case 0:
20
+ animation = { opacity: [1, 0] }
21
+ break
22
+ case 1:
23
+ animation = { opacity: [0, 1] }
24
+ display = 'block'
25
+ break
26
+ case 'bounceUpIn':
27
+ animation = {
28
+ begin (anim) {
29
+ target.display('block')
30
+ },
31
+ translateY: [
32
+ { value: -60, duration: 200 },
33
+ { value: 10, duration: 200 },
34
+ { value: -5, duration: 200 },
35
+ { value: 0, duration: 200 }
36
+ ],
37
+ opacity: [0, 1]
38
+ }
39
+ display = 'block'
40
+ break
41
+ case 'shrinkIn':
42
+ animation = {
43
+ begin (anim) {
44
+ target.display('block')
45
+ },
46
+ scale: [
47
+ { value: 1.1, duration: 300 },
48
+ { value: 1, duration: 200 }
49
+ ],
50
+ opacity: 1
51
+ }
52
+ display = 'block'
53
+ break
54
+ case 'slideRightIn':
55
+ animation = {
56
+ begin (anim) {
57
+ target.display('block')
58
+ },
59
+ translateX: ['100%', '0%'],
60
+ opacity: [0, 1]
61
+ }
62
+ display = 'block'
63
+ break
64
+ case 'slideRightOut':
65
+ animation = {
66
+ translateX: ['0%', '100%'],
67
+ opacity: [1, 0]
68
+ }
69
+ break
70
+ default:
71
+ // @ts-ignore
72
+ animation = type
73
+ // @ts-ignore
74
+ display = type.display
75
+ break
76
+ }
77
+ anime(Object.assign({
78
+ targets: target,
79
+ duration: 200,
80
+ easing: 'linear',
81
+ begin () {
82
+ begin && begin()
83
+ },
84
+ complete () {
85
+ target.display(display)
86
+ complete && complete()
87
+ }
88
+ }, animation)).play()
89
+ }
90
+
91
+ export const pageScroll = (target: HTMLElement|number, offset?: number, complete?: Function) => {
92
+ // target: 滚动到的目标元素或坐标(number)
93
+ // offset: 可选的偏移量
94
+ // complete: 可选的回调函数,在动画完成时调用
95
+ anime({
96
+ // 动画目标
97
+ targets: typeof offset === 'number' && typeof target !== 'number' ? target.parentNode : document.scrollingElement,
98
+ // 动画持续时间
99
+ duration: 500,
100
+ // 动画缓动函数
101
+ easing: 'easeInOutQuad',
102
+ // 如果 offset 存在,则滚动到 offset,如果 target 是数字,则滚动到 target,如果 target 是 DOM 元素,则滚动到下述表达式
103
+ scrollTop: offset || (typeof target === 'number' ? target : (target ? target.getTop() + document.documentElement.scrollTop - siteNavHeight : 0)),
104
+ // 完成回调函数
105
+ complete () {
106
+ complete && complete()
107
+ }
108
+ }).play()
109
+ }
@@ -0,0 +1,117 @@
1
+ /*
2
+ 对注释的说明: 部分注释为openai-chatgpt生成的注释,可能存在描述或语义的问题
3
+ */
4
+ interface AudioItem {
5
+ title: string;
6
+ list: string[];
7
+ }
8
+
9
+ declare interface EventTarget {
10
+ createChild(tag: string, obj: Object, positon?: string): HTMLElement;
11
+ wrapObject(obj: Object): void;
12
+ changeOrGetHeight(h: number | string): void;
13
+ changeOrGetHeight(): number;
14
+ changeOrGetWidth(w: number | string): void;
15
+ changeOrGetWidth(): number;
16
+ getTop(): number;
17
+ left(): number;
18
+ insertAfter(element: HTMLElement): void;
19
+ display(d: string): EventTarget;
20
+ display():string
21
+ child(selector: string): HTMLElement;
22
+ find(selector: string): NodeListOf<HTMLElement>;
23
+ _class(type: string, className: string, display?: boolean): void;
24
+ addClass(className: string): EventTarget;
25
+ removeClass(className: string): EventTarget;
26
+ toggleClass(className: string, display?: boolean): EventTarget;
27
+ hasClass(className: string): boolean;
28
+ }
29
+
30
+ declare const LOCAL: {
31
+ path: string;
32
+ ignores: Array<(uri:string)=>boolean>;
33
+ audio: string[];
34
+ search: {
35
+ placeholder: string,
36
+ empty: string,
37
+ stats: string
38
+ };
39
+ quiz: {
40
+ choice: string,
41
+ multiple: string,
42
+ true_false: string,
43
+ essay: string,
44
+ gap_fill: string,
45
+ mistake: string
46
+ };
47
+ nocopy: boolean;
48
+ copyright: string;
49
+ outime: boolean
50
+ template: string
51
+ favicon: {
52
+ hide: string
53
+ show: string
54
+ }
55
+ }
56
+ declare const CONFIG: {
57
+ hostname: string;
58
+ fireworks: any;
59
+ audio: AudioItem[];
60
+ version: number
61
+ root: string
62
+ statics: string
63
+ outime: {
64
+ enable: boolean
65
+ days: number
66
+ }
67
+ favicon: {
68
+ normal: string,
69
+ hidden: string
70
+ }
71
+ darkmode: boolean
72
+ auto_dark: {
73
+ enable: boolean
74
+ start: number
75
+ end: number
76
+ }
77
+ auto_scroll: boolean
78
+ loader: {
79
+ start: boolean
80
+ switch: boolean
81
+ }
82
+ js: {
83
+ chart: string
84
+ copy_tex: string
85
+ fancybox: string
86
+ echarts: string
87
+ }
88
+ css: {
89
+ valine: string
90
+ katex: string
91
+ mermaid: string
92
+ fancybox: string
93
+ }
94
+ search: any,
95
+ valine: string
96
+ quicklink: {
97
+ ignores: any
98
+ timeout: number
99
+ priority: string
100
+ }
101
+ playerAPI: string
102
+ }
103
+ declare const instantsearch: any
104
+
105
+ declare function algoliasearch(appID: string, apiKey: string): any;
106
+
107
+ declare const quicklink: any
108
+
109
+ // esbuild 静态常量
110
+ declare const __shokax_player__:boolean
111
+ declare const __shokax_fireworks__:boolean
112
+ declare const __shokax_search__:boolean
113
+ declare const __shokax_VL__:boolean
114
+ declare const __shokax_outime__:boolean
115
+ declare const __shokax_tabs__: boolean
116
+ declare const __shokax_quiz__: boolean
117
+ declare const __shokax_fancybox__: boolean
@@ -0,0 +1,26 @@
1
+ const getDocHeight = () => $dom('main > .inner').offsetHeight
2
+ /**
3
+ * 获取一个dom选择器对应的元素
4
+ */
5
+ const $dom = (selector: string, element: Document = document): HTMLElement => {
6
+ // 在测试环境中这能优化0.01-0.02ms左右
7
+ if (selector[0] === '#') {
8
+ return <HTMLElement> element.getElementById(selector.substring(1))
9
+ }
10
+ return <HTMLElement> element.querySelector(selector)
11
+ }
12
+
13
+ /**
14
+ * 获取具有此选择器的所有dom节点
15
+ */
16
+ $dom.all = (selector: string, element: Document = document): NodeListOf<HTMLElement> => {
17
+ return element.querySelectorAll(selector)
18
+ }
19
+ /**
20
+ * 获取具有此选择器的所有dom节点,并依次执行callback函数
21
+ */
22
+ $dom.each = (selector: string, callback: (value: HTMLElement, key: number, parent: NodeListOf<Element>) => void, element?: Document): void => {
23
+ $dom.all(selector, element).forEach(callback)
24
+ }
25
+
26
+ export { $dom, getDocHeight }
@@ -0,0 +1,4 @@
1
+ export {}
2
+ declare global {
3
+ const Vue: typeof import('vue')
4
+ }