hexo-theme-shokax 0.4.5 → 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.
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +58 -58
- package/LICENSE +660 -660
- package/LICENSE-shoka +21 -21
- package/README.md +99 -98
- package/README_en.MD +91 -90
- package/UsageRestrictions.md +25 -25
- package/_config.yml +381 -388
- package/_images.yml +9 -9
- package/eslint.config.mjs +55 -55
- package/index.html +231 -0
- package/languages/README.md +19 -19
- package/languages/default.yml +1 -1
- package/languages/en.yml +153 -153
- package/languages/ja.yml +153 -153
- package/languages/zh-CN.yml +153 -153
- package/languages/zh-HK.yml +153 -153
- package/languages/zh-TW.yml +153 -153
- package/layout/_alternate/atom.ejs +30 -30
- package/layout/_alternate/json.ejs +16 -16
- package/layout/_alternate/rss.ejs +34 -34
- package/layout/_mixin/breadcrumb.pug +33 -33
- package/layout/_mixin/card.pug +38 -38
- package/layout/_mixin/comment.pug +6 -6
- package/layout/_mixin/postmeta.pug +29 -29
- package/layout/_mixin/segment.pug +35 -35
- package/layout/_mixin/sidebar.pug +40 -40
- package/layout/_mixin/widgets.pug +28 -28
- package/layout/_partials/footer.pug +43 -43
- package/layout/_partials/head/head.pug +55 -56
- package/layout/_partials/head/head_com.pug +24 -24
- package/layout/_partials/head/pwa.pug +18 -18
- package/layout/_partials/header.pug +18 -18
- package/layout/_partials/layout.pug +140 -140
- package/layout/_partials/loading.pug +13 -13
- package/layout/_partials/pagination.pug +4 -4
- package/layout/_partials/post/copyright.pug +20 -20
- package/layout/_partials/post/footer.pug +17 -17
- package/layout/_partials/post/nav.pug +13 -13
- package/layout/_partials/post/post.pug +41 -41
- package/layout/_partials/post/reward.pug +18 -18
- package/layout/_partials/sidebar/menu.pug +37 -37
- package/layout/_partials/sidebar/overview.pug +42 -42
- package/layout/_partials/third-party/baidu-analytics.pug +11 -11
- package/layout/_partials/third-party/clarity.pug +8 -8
- package/layout/_partials/third-party/google-analytics.pug +9 -9
- package/layout/archive.pug +118 -118
- package/layout/category.pug +59 -59
- package/layout/index.pug +33 -33
- package/layout/page.pug +55 -55
- package/layout/post.pug +36 -36
- package/layout/tag.pug +43 -43
- package/meta.json +6431 -0
- package/package.json +72 -70
- package/scripts/helpers/engine.js +10 -0
- package/scripts/plugin/check.js +2 -2
- package/scripts/tags/links.js +4 -4
- package/source/assets/algolia_logo.svg +9 -9
- package/source/assets/logo.svg +16 -16
- package/source/css/_colors.styl +207 -207
- package/source/css/_common/components/components.styl +6 -6
- package/source/css/_common/components/highlight/highlight.styl +357 -357
- package/source/css/_common/components/highlight/operation.styl +21 -21
- package/source/css/_common/components/pages/collapse.styl +119 -119
- package/source/css/_common/components/pages/home.styl +391 -391
- package/source/css/_common/components/pages/pages.styl +56 -56
- package/source/css/_common/components/pages/tag-cloud.styl +12 -12
- package/source/css/_common/components/post/breadcrumb.styl +39 -39
- package/source/css/_common/components/post/copyright.styl +41 -41
- package/source/css/_common/components/post/expand.styl +263 -263
- package/source/css/_common/components/post/footer.styl +11 -11
- package/source/css/_common/components/post/header.styl +79 -79
- package/source/css/_common/components/post/nav.styl +64 -64
- package/source/css/_common/components/post/post.styl +29 -29
- package/source/css/_common/components/post/reward.styl +50 -50
- package/source/css/_common/components/post/rtl.styl +12 -12
- package/source/css/_common/components/post/tags.styl +39 -39
- package/source/css/_common/components/tags/collapse.styl +72 -72
- package/source/css/_common/components/tags/container.styl +49 -49
- package/source/css/_common/components/tags/label.styl +12 -12
- package/source/css/_common/components/tags/links.styl +77 -77
- package/source/css/_common/components/tags/list.styl +131 -131
- package/source/css/_common/components/tags/note.styl +70 -70
- package/source/css/_common/components/tags/player.styl +361 -361
- package/source/css/_common/components/tags/quiz.styl +200 -200
- package/source/css/_common/components/tags/tabs.styl +89 -89
- package/source/css/_common/components/tags/tags.styl +9 -9
- package/source/css/_common/components/third-party/loading.styl +222 -222
- package/source/css/_common/components/third-party/mermaid/class.styl +90 -90
- package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -72
- package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -251
- package/source/css/_common/components/third-party/mermaid/git.styl +7 -7
- package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -37
- package/source/css/_common/components/third-party/mermaid/pie.styl +9 -9
- package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -95
- package/source/css/_common/components/third-party/mermaid/state.styl +130 -130
- package/source/css/_common/components/third-party/pace.styl +18 -18
- package/source/css/_common/components/third-party/search.styl +167 -167
- package/source/css/_common/components/third-party/theme.styl +151 -151
- package/source/css/_common/components/third-party/third-party.styl +22 -22
- package/source/css/_common/components/third-party/widgets.styl +57 -57
- package/source/css/_common/outline/footer/footer.styl +67 -67
- package/source/css/_common/outline/header/brand.styl +77 -77
- package/source/css/_common/outline/header/header.styl +20 -20
- package/source/css/_common/outline/header/image.styl +85 -85
- package/source/css/_common/outline/header/menu.styl +117 -117
- package/source/css/_common/outline/header/nav.styl +81 -81
- package/source/css/_common/outline/header/right.styl +15 -15
- package/source/css/_common/outline/header/tool.styl +207 -207
- package/source/css/_common/outline/header/waves.styl +57 -57
- package/source/css/_common/outline/mobile.styl +46 -46
- package/source/css/_common/outline/outline.styl +78 -78
- package/source/css/_common/outline/sidebar/author.styl +59 -59
- package/source/css/_common/outline/sidebar/dimmer.styl +23 -23
- package/source/css/_common/outline/sidebar/menu.styl +63 -63
- package/source/css/_common/outline/sidebar/quick.styl +43 -43
- package/source/css/_common/outline/sidebar/related.styl +56 -56
- package/source/css/_common/outline/sidebar/sidebar.styl +80 -80
- package/source/css/_common/outline/sidebar/social.styl +69 -69
- package/source/css/_common/outline/sidebar/state.styl +37 -37
- package/source/css/_common/outline/sidebar/tab.styl +71 -71
- package/source/css/_common/outline/sidebar/toc.styl +47 -47
- package/source/css/_common/scaffolding/animate.styl +322 -322
- package/source/css/_common/scaffolding/base.styl +190 -190
- package/source/css/_common/scaffolding/buttons.styl +48 -48
- package/source/css/_common/scaffolding/divider.styl +36 -36
- package/source/css/_common/scaffolding/iconfont.styl +443 -443
- package/source/css/_common/scaffolding/normalize.styl +273 -273
- package/source/css/_common/scaffolding/pagination.styl +81 -81
- package/source/css/_common/scaffolding/ribbon.styl +38 -38
- package/source/css/_common/scaffolding/scaffolding.styl +14 -14
- package/source/css/_common/scaffolding/scrollbar.styl +37 -37
- package/source/css/_common/scaffolding/tables.styl +50 -50
- package/source/css/_common/scaffolding/tip.styl +19 -19
- package/source/css/_common/scaffolding/toggles.styl +59 -59
- package/source/css/_iconfont.styl +455 -455
- package/source/css/_mixins.styl +148 -148
- package/source/css/_variables.styl +89 -89
- package/source/css/app.styl +41 -41
- package/source/css/mermaid.styl +5 -5
- package/source/css/optimize.styl +5 -5
- package/source/js/_app/components/comments.js +59 -0
- package/source/js/_app/components/comments.ts +88 -89
- package/source/js/_app/components/sidebar.js +244 -0
- package/source/js/_app/components/sidebar.ts +239 -239
- package/source/js/_app/components/tcomments.js +47 -0
- package/source/js/_app/components/tcomments.ts +54 -54
- package/source/js/_app/globals/globalVars.ts +99 -99
- package/source/js/_app/globals/handles.js +105 -0
- package/source/js/_app/globals/handles.ts +124 -124
- package/source/js/_app/globals/themeColor.ts +63 -63
- package/source/js/_app/globals/thirdparty.ts +63 -63
- package/source/js/_app/globals/tools.ts +75 -75
- package/source/js/_app/library/anime.ts +110 -110
- package/source/js/_app/library/declare.d.ts +128 -130
- package/source/js/_app/library/dom.ts +28 -28
- package/source/js/_app/library/loadFile.js +43 -0
- package/source/js/_app/library/loadFile.ts +47 -50
- package/source/js/_app/library/proto.ts +137 -137
- package/source/js/_app/library/scriptPjax.ts +72 -72
- package/source/js/_app/library/storage.ts +12 -12
- package/source/js/_app/library/vue.js +52 -0
- package/source/js/_app/library/vue.ts +49 -49
- package/source/js/_app/page/common.js +45 -0
- package/source/js/_app/page/common.ts +43 -43
- package/source/js/_app/page/fancybox.js +70 -0
- package/source/js/_app/page/fancybox.ts +72 -72
- package/source/js/_app/page/post.js +253 -0
- package/source/js/_app/page/post.ts +266 -266
- package/source/js/_app/page/search.js +111 -0
- package/source/js/_app/page/search.ts +115 -115
- package/source/js/_app/page/tab.ts +60 -60
- package/source/js/_app/pjax/domInit.js +80 -0
- package/source/js/_app/pjax/domInit.ts +97 -97
- package/source/js/_app/pjax/refresh.js +137 -0
- package/source/js/_app/pjax/refresh.ts +140 -138
- package/source/js/_app/pjax/siteInit.js +115 -0
- package/source/js/_app/pjax/siteInit.ts +106 -104
- package/source/js/_app/player.js +777 -0
- package/source/js/_app/player.ts +798 -798
- package/toolbox/compiler.mjs +73 -0
- package/toolbox/hoistdep.mjs +6 -0
- package/toolbox/lib.mjs +40 -0
@@ -1,239 +1,239 @@
|
|
1
|
-
/* 边栏分区 */
|
2
|
-
|
3
|
-
import { CONFIG, Container, diffY, menuToggle, showContents, sideBar } from '../globals/globalVars'
|
4
|
-
import { clipBoard } from '../globals/tools'
|
5
|
-
import { pageScroll, transition } from '../library/anime'
|
6
|
-
import { $dom } from '../library/dom'
|
7
|
-
import initProto, { getHeight, setDisplay } from '../library/proto'
|
8
|
-
|
9
|
-
initProto()
|
10
|
-
export const sideBarToggleHandle = (event:Event, force?:number) => {
|
11
|
-
if (sideBar.hasClass('on')) {
|
12
|
-
sideBar.removeClass('on')
|
13
|
-
menuToggle.removeClass('close')
|
14
|
-
if (force) {
|
15
|
-
// @ts-ignore
|
16
|
-
// noinspection JSConstantReassignment
|
17
|
-
sideBar.style = ''
|
18
|
-
} else {
|
19
|
-
transition(sideBar, 'slideRightOut')
|
20
|
-
}
|
21
|
-
} else {
|
22
|
-
if (force) {
|
23
|
-
// @ts-ignore
|
24
|
-
// noinspection JSConstantReassignment
|
25
|
-
sideBar.style = ''
|
26
|
-
} else {
|
27
|
-
transition(sideBar, 'slideRightIn', () => {
|
28
|
-
sideBar.addClass('on')
|
29
|
-
menuToggle.addClass('close')
|
30
|
-
})
|
31
|
-
}
|
32
|
-
}
|
33
|
-
}
|
34
|
-
|
35
|
-
export const sideBarTab = () => {
|
36
|
-
const sideBarInner = sideBar.querySelector('.inner')
|
37
|
-
|
38
|
-
if (sideBar.querySelector('.tab')) {
|
39
|
-
sideBarInner.removeChild(sideBar.querySelector('.tab'))
|
40
|
-
}
|
41
|
-
|
42
|
-
const list = document.createElement('ul'); let active = 'active'
|
43
|
-
list.className = 'tab';
|
44
|
-
|
45
|
-
['contents', 'related', 'overview'].forEach((item) => {
|
46
|
-
const element = sideBar.querySelector('.panel.' + item)
|
47
|
-
|
48
|
-
if (element.innerHTML.trim().length < 1) {
|
49
|
-
if (item === 'contents') {
|
50
|
-
setDisplay(showContents, 'none')
|
51
|
-
}
|
52
|
-
return
|
53
|
-
}
|
54
|
-
|
55
|
-
if (item === 'contents') {
|
56
|
-
setDisplay(showContents, '')
|
57
|
-
}
|
58
|
-
|
59
|
-
const tab = document.createElement('li')
|
60
|
-
const span = document.createElement('span')
|
61
|
-
const text = document.createTextNode(element.getAttribute('data-title'))
|
62
|
-
span.appendChild(text)
|
63
|
-
tab.appendChild(span)
|
64
|
-
tab.addClass(item + ' item')
|
65
|
-
|
66
|
-
if (active) {
|
67
|
-
element.addClass(active)
|
68
|
-
tab.addClass(active)
|
69
|
-
} else {
|
70
|
-
element.removeClass('active')
|
71
|
-
}
|
72
|
-
tab.addEventListener('click', (event) => {
|
73
|
-
const target = event.currentTarget as HTMLElement
|
74
|
-
if (target.hasClass('active')) return
|
75
|
-
|
76
|
-
sideBar.find('.tab .item').forEach((element) => {
|
77
|
-
element.removeClass('active')
|
78
|
-
})
|
79
|
-
|
80
|
-
sideBar.find('.panel').forEach((element) => {
|
81
|
-
element.removeClass('active')
|
82
|
-
})
|
83
|
-
|
84
|
-
sideBar.querySelector('.panel.' + target.className.replace(' item', '')).addClass('active')
|
85
|
-
|
86
|
-
target.addClass('active')
|
87
|
-
})
|
88
|
-
|
89
|
-
list.appendChild(tab)
|
90
|
-
active = ''
|
91
|
-
})
|
92
|
-
|
93
|
-
if (list.childNodes.length > 1) {
|
94
|
-
sideBarInner.insertBefore(list, sideBarInner.childNodes[0]);
|
95
|
-
(sideBar.querySelector('.panels') as HTMLElement).style.paddingTop = ''
|
96
|
-
} else {
|
97
|
-
(sideBar.querySelector('.panels') as HTMLElement).style.paddingTop = '.625rem'
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
export const sidebarTOC = () => {
|
102
|
-
const activateNavByIndex = (index:number): void => {
|
103
|
-
const target = navItems[index]
|
104
|
-
|
105
|
-
if (!target) return
|
106
|
-
|
107
|
-
if (target.hasClass('current')) {
|
108
|
-
return
|
109
|
-
}
|
110
|
-
|
111
|
-
$dom.each('.toc .active', (element) => {
|
112
|
-
element && element.removeClass('active current')
|
113
|
-
})
|
114
|
-
|
115
|
-
sections.forEach((element) => {
|
116
|
-
element && element.removeClass('active')
|
117
|
-
})
|
118
|
-
|
119
|
-
target.addClass('active current')
|
120
|
-
sections[index] && sections[index].addClass('active')
|
121
|
-
|
122
|
-
let parent = <Element> target.parentNode
|
123
|
-
|
124
|
-
while (!parent.matches('.contents')) {
|
125
|
-
if (parent.matches('li')) {
|
126
|
-
parent.addClass('active')
|
127
|
-
const t = document.querySelector(parent.querySelector('a.toc-link').getAttribute('href'))
|
128
|
-
if (t) {
|
129
|
-
t.addClass('active')
|
130
|
-
}
|
131
|
-
}
|
132
|
-
parent = <Element> parent.parentNode
|
133
|
-
}
|
134
|
-
// Scrolling to center active TOC element if TOC content is taller than viewport.
|
135
|
-
if (getComputedStyle(sideBar).display !== 'none' && tocElement.hasClass('active')) {
|
136
|
-
pageScroll((tocElement as HTMLElement), target.offsetTop - ((tocElement as HTMLElement).offsetHeight / 4))
|
137
|
-
}
|
138
|
-
}
|
139
|
-
const navItems = $dom.all('.contents li')
|
140
|
-
|
141
|
-
if (navItems.length < 1) {
|
142
|
-
return
|
143
|
-
}
|
144
|
-
|
145
|
-
let sections = [...navItems] as HTMLElement[]
|
146
|
-
let activeLock = null
|
147
|
-
|
148
|
-
sections = sections.map((element, index) => {
|
149
|
-
const link = element.querySelector('a.toc-link')
|
150
|
-
const anchor = document.querySelector(decodeURI(link.getAttribute('href')))
|
151
|
-
if (!anchor) return null
|
152
|
-
const alink = anchor.querySelector('a.anchor')
|
153
|
-
|
154
|
-
const anchorScroll = (event:MouseEvent) => {
|
155
|
-
event.preventDefault()
|
156
|
-
const target = document.querySelector(decodeURI((event.currentTarget as HTMLElement).getAttribute('href')))
|
157
|
-
|
158
|
-
activeLock = index
|
159
|
-
pageScroll((target as HTMLElement), null, () => {
|
160
|
-
activateNavByIndex(index)
|
161
|
-
activeLock = null
|
162
|
-
})
|
163
|
-
}
|
164
|
-
|
165
|
-
// TOC item animation navigate.
|
166
|
-
link.addEventListener('click', anchorScroll)
|
167
|
-
alink && alink.addEventListener('click', (event) => {
|
168
|
-
anchorScroll(<MouseEvent>event)
|
169
|
-
clipBoard(CONFIG.hostname + '/' + LOCAL.path + (event.currentTarget as HTMLElement).getAttribute('href'))
|
170
|
-
})
|
171
|
-
return (anchor as HTMLElement)
|
172
|
-
})
|
173
|
-
|
174
|
-
const tocElement = sideBar.querySelector('.contents.panel')
|
175
|
-
|
176
|
-
const findIndex = (entries: IntersectionObserverEntry[]) => {
|
177
|
-
let index = 0
|
178
|
-
let entry = entries[index]
|
179
|
-
|
180
|
-
if (entry.boundingClientRect.top > 0) {
|
181
|
-
index = sections.indexOf(entry.target as HTMLElement)
|
182
|
-
return index === 0 ? 0 : index - 1
|
183
|
-
}
|
184
|
-
for (; index < entries.length; index++) {
|
185
|
-
if (entries[index].boundingClientRect.top <= 0) {
|
186
|
-
entry = entries[index]
|
187
|
-
} else {
|
188
|
-
return sections.indexOf(entry.target as HTMLElement)
|
189
|
-
}
|
190
|
-
}
|
191
|
-
return sections.indexOf(entry.target as HTMLElement)
|
192
|
-
}
|
193
|
-
|
194
|
-
const createIntersectionObserver = () => {
|
195
|
-
const observer = new IntersectionObserver((entries) => {
|
196
|
-
const index = findIndex(entries) + (diffY < 0 ? 1 : 0)
|
197
|
-
if (activeLock === null) {
|
198
|
-
activateNavByIndex(index)
|
199
|
-
}
|
200
|
-
}, {
|
201
|
-
rootMargin: '0px 0px -100% 0px', threshold: 0
|
202
|
-
})
|
203
|
-
|
204
|
-
sections.forEach((element) => {
|
205
|
-
element && observer.observe(element)
|
206
|
-
})
|
207
|
-
}
|
208
|
-
|
209
|
-
createIntersectionObserver()
|
210
|
-
}
|
211
|
-
|
212
|
-
export const backToTopHandle = () => {
|
213
|
-
pageScroll(0)
|
214
|
-
}
|
215
|
-
|
216
|
-
export const goToBottomHandle = () => {
|
217
|
-
pageScroll(parseInt(String(getHeight(Container))))
|
218
|
-
}
|
219
|
-
|
220
|
-
export const goToCommentHandle = () => {
|
221
|
-
pageScroll(document.getElementById('comments'))
|
222
|
-
}
|
223
|
-
|
224
|
-
export const menuActive = () => {
|
225
|
-
$dom.each('.menu .item:not(.title)', (element) => {
|
226
|
-
const target = <HTMLAnchorElement> element.querySelector('a[href]')
|
227
|
-
const parentItem = element.parentNode.parentNode
|
228
|
-
if (!target) return
|
229
|
-
const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', '')
|
230
|
-
const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname)
|
231
|
-
const active = !target.onclick && target.hostname === location.hostname && (isSamePath || isSubPath)
|
232
|
-
element.toggleClass('active', active)
|
233
|
-
if (element.parentNode.querySelector('.active') && parentItem.hasClass('dropdown')) {
|
234
|
-
parentItem.removeClass('active').addClass('expand')
|
235
|
-
} else {
|
236
|
-
parentItem.removeClass('expand')
|
237
|
-
}
|
238
|
-
})
|
239
|
-
}
|
1
|
+
/* 边栏分区 */
|
2
|
+
|
3
|
+
import { CONFIG, Container, diffY, menuToggle, showContents, sideBar } from '../globals/globalVars'
|
4
|
+
import { clipBoard } from '../globals/tools'
|
5
|
+
import { pageScroll, transition } from '../library/anime'
|
6
|
+
import { $dom } from '../library/dom'
|
7
|
+
import initProto, { getHeight, setDisplay } from '../library/proto'
|
8
|
+
|
9
|
+
initProto()
|
10
|
+
export const sideBarToggleHandle = (event:Event, force?:number) => {
|
11
|
+
if (sideBar.hasClass('on')) {
|
12
|
+
sideBar.removeClass('on')
|
13
|
+
menuToggle.removeClass('close')
|
14
|
+
if (force) {
|
15
|
+
// @ts-ignore
|
16
|
+
// noinspection JSConstantReassignment
|
17
|
+
sideBar.style = ''
|
18
|
+
} else {
|
19
|
+
transition(sideBar, 'slideRightOut')
|
20
|
+
}
|
21
|
+
} else {
|
22
|
+
if (force) {
|
23
|
+
// @ts-ignore
|
24
|
+
// noinspection JSConstantReassignment
|
25
|
+
sideBar.style = ''
|
26
|
+
} else {
|
27
|
+
transition(sideBar, 'slideRightIn', () => {
|
28
|
+
sideBar.addClass('on')
|
29
|
+
menuToggle.addClass('close')
|
30
|
+
})
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
export const sideBarTab = () => {
|
36
|
+
const sideBarInner = sideBar.querySelector('.inner')
|
37
|
+
|
38
|
+
if (sideBar.querySelector('.tab')) {
|
39
|
+
sideBarInner.removeChild(sideBar.querySelector('.tab'))
|
40
|
+
}
|
41
|
+
|
42
|
+
const list = document.createElement('ul'); let active = 'active'
|
43
|
+
list.className = 'tab';
|
44
|
+
|
45
|
+
['contents', 'related', 'overview'].forEach((item) => {
|
46
|
+
const element = sideBar.querySelector('.panel.' + item)
|
47
|
+
|
48
|
+
if (element.innerHTML.trim().length < 1) {
|
49
|
+
if (item === 'contents') {
|
50
|
+
setDisplay(showContents, 'none')
|
51
|
+
}
|
52
|
+
return
|
53
|
+
}
|
54
|
+
|
55
|
+
if (item === 'contents') {
|
56
|
+
setDisplay(showContents, '')
|
57
|
+
}
|
58
|
+
|
59
|
+
const tab = document.createElement('li')
|
60
|
+
const span = document.createElement('span')
|
61
|
+
const text = document.createTextNode(element.getAttribute('data-title'))
|
62
|
+
span.appendChild(text)
|
63
|
+
tab.appendChild(span)
|
64
|
+
tab.addClass(item + ' item')
|
65
|
+
|
66
|
+
if (active) {
|
67
|
+
element.addClass(active)
|
68
|
+
tab.addClass(active)
|
69
|
+
} else {
|
70
|
+
element.removeClass('active')
|
71
|
+
}
|
72
|
+
tab.addEventListener('click', (event) => {
|
73
|
+
const target = event.currentTarget as HTMLElement
|
74
|
+
if (target.hasClass('active')) return
|
75
|
+
|
76
|
+
sideBar.find('.tab .item').forEach((element) => {
|
77
|
+
element.removeClass('active')
|
78
|
+
})
|
79
|
+
|
80
|
+
sideBar.find('.panel').forEach((element) => {
|
81
|
+
element.removeClass('active')
|
82
|
+
})
|
83
|
+
|
84
|
+
sideBar.querySelector('.panel.' + target.className.replace(' item', '')).addClass('active')
|
85
|
+
|
86
|
+
target.addClass('active')
|
87
|
+
})
|
88
|
+
|
89
|
+
list.appendChild(tab)
|
90
|
+
active = ''
|
91
|
+
})
|
92
|
+
|
93
|
+
if (list.childNodes.length > 1) {
|
94
|
+
sideBarInner.insertBefore(list, sideBarInner.childNodes[0]);
|
95
|
+
(sideBar.querySelector('.panels') as HTMLElement).style.paddingTop = ''
|
96
|
+
} else {
|
97
|
+
(sideBar.querySelector('.panels') as HTMLElement).style.paddingTop = '.625rem'
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
export const sidebarTOC = () => {
|
102
|
+
const activateNavByIndex = (index:number): void => {
|
103
|
+
const target = navItems[index]
|
104
|
+
|
105
|
+
if (!target) return
|
106
|
+
|
107
|
+
if (target.hasClass('current')) {
|
108
|
+
return
|
109
|
+
}
|
110
|
+
|
111
|
+
$dom.each('.toc .active', (element) => {
|
112
|
+
element && element.removeClass('active current')
|
113
|
+
})
|
114
|
+
|
115
|
+
sections.forEach((element) => {
|
116
|
+
element && element.removeClass('active')
|
117
|
+
})
|
118
|
+
|
119
|
+
target.addClass('active current')
|
120
|
+
sections[index] && sections[index].addClass('active')
|
121
|
+
|
122
|
+
let parent = <Element> target.parentNode
|
123
|
+
|
124
|
+
while (!parent.matches('.contents')) {
|
125
|
+
if (parent.matches('li')) {
|
126
|
+
parent.addClass('active')
|
127
|
+
const t = document.querySelector(parent.querySelector('a.toc-link').getAttribute('href'))
|
128
|
+
if (t) {
|
129
|
+
t.addClass('active')
|
130
|
+
}
|
131
|
+
}
|
132
|
+
parent = <Element> parent.parentNode
|
133
|
+
}
|
134
|
+
// Scrolling to center active TOC element if TOC content is taller than viewport.
|
135
|
+
if (getComputedStyle(sideBar).display !== 'none' && tocElement.hasClass('active')) {
|
136
|
+
pageScroll((tocElement as HTMLElement), target.offsetTop - ((tocElement as HTMLElement).offsetHeight / 4))
|
137
|
+
}
|
138
|
+
}
|
139
|
+
const navItems = $dom.all('.contents li')
|
140
|
+
|
141
|
+
if (navItems.length < 1) {
|
142
|
+
return
|
143
|
+
}
|
144
|
+
|
145
|
+
let sections = [...navItems] as HTMLElement[]
|
146
|
+
let activeLock = null
|
147
|
+
|
148
|
+
sections = sections.map((element, index) => {
|
149
|
+
const link = element.querySelector('a.toc-link')
|
150
|
+
const anchor = document.querySelector(decodeURI(link.getAttribute('href')))
|
151
|
+
if (!anchor) return null
|
152
|
+
const alink = anchor.querySelector('a.anchor')
|
153
|
+
|
154
|
+
const anchorScroll = (event:MouseEvent) => {
|
155
|
+
event.preventDefault()
|
156
|
+
const target = document.querySelector(decodeURI((event.currentTarget as HTMLElement).getAttribute('href')))
|
157
|
+
|
158
|
+
activeLock = index
|
159
|
+
pageScroll((target as HTMLElement), null, () => {
|
160
|
+
activateNavByIndex(index)
|
161
|
+
activeLock = null
|
162
|
+
})
|
163
|
+
}
|
164
|
+
|
165
|
+
// TOC item animation navigate.
|
166
|
+
link.addEventListener('click', anchorScroll)
|
167
|
+
alink && alink.addEventListener('click', (event) => {
|
168
|
+
anchorScroll(<MouseEvent>event)
|
169
|
+
clipBoard(CONFIG.hostname + '/' + LOCAL.path + (event.currentTarget as HTMLElement).getAttribute('href'))
|
170
|
+
})
|
171
|
+
return (anchor as HTMLElement)
|
172
|
+
})
|
173
|
+
|
174
|
+
const tocElement = sideBar.querySelector('.contents.panel')
|
175
|
+
|
176
|
+
const findIndex = (entries: IntersectionObserverEntry[]) => {
|
177
|
+
let index = 0
|
178
|
+
let entry = entries[index]
|
179
|
+
|
180
|
+
if (entry.boundingClientRect.top > 0) {
|
181
|
+
index = sections.indexOf(entry.target as HTMLElement)
|
182
|
+
return index === 0 ? 0 : index - 1
|
183
|
+
}
|
184
|
+
for (; index < entries.length; index++) {
|
185
|
+
if (entries[index].boundingClientRect.top <= 0) {
|
186
|
+
entry = entries[index]
|
187
|
+
} else {
|
188
|
+
return sections.indexOf(entry.target as HTMLElement)
|
189
|
+
}
|
190
|
+
}
|
191
|
+
return sections.indexOf(entry.target as HTMLElement)
|
192
|
+
}
|
193
|
+
|
194
|
+
const createIntersectionObserver = () => {
|
195
|
+
const observer = new IntersectionObserver((entries) => {
|
196
|
+
const index = findIndex(entries) + (diffY < 0 ? 1 : 0)
|
197
|
+
if (activeLock === null) {
|
198
|
+
activateNavByIndex(index)
|
199
|
+
}
|
200
|
+
}, {
|
201
|
+
rootMargin: '0px 0px -100% 0px', threshold: 0
|
202
|
+
})
|
203
|
+
|
204
|
+
sections.forEach((element) => {
|
205
|
+
element && observer.observe(element)
|
206
|
+
})
|
207
|
+
}
|
208
|
+
|
209
|
+
createIntersectionObserver()
|
210
|
+
}
|
211
|
+
|
212
|
+
export const backToTopHandle = () => {
|
213
|
+
pageScroll(0)
|
214
|
+
}
|
215
|
+
|
216
|
+
export const goToBottomHandle = () => {
|
217
|
+
pageScroll(parseInt(String(getHeight(Container))))
|
218
|
+
}
|
219
|
+
|
220
|
+
export const goToCommentHandle = () => {
|
221
|
+
pageScroll(document.getElementById('comments'))
|
222
|
+
}
|
223
|
+
|
224
|
+
export const menuActive = () => {
|
225
|
+
$dom.each('.menu .item:not(.title)', (element) => {
|
226
|
+
const target = <HTMLAnchorElement> element.querySelector('a[href]')
|
227
|
+
const parentItem = element.parentNode.parentNode
|
228
|
+
if (!target) return
|
229
|
+
const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', '')
|
230
|
+
const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname)
|
231
|
+
const active = !target.onclick && target.hostname === location.hostname && (isSamePath || isSubPath)
|
232
|
+
element.toggleClass('active', active)
|
233
|
+
if (element.parentNode.querySelector('.active') && parentItem.hasClass('dropdown')) {
|
234
|
+
parentItem.removeClass('active').addClass('expand')
|
235
|
+
} else {
|
236
|
+
parentItem.removeClass('expand')
|
237
|
+
}
|
238
|
+
})
|
239
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.twikooRecentComments = exports.twikooComment = void 0;
|
7
|
+
const twikoo_1 = __importDefault(require("twikoo"));
|
8
|
+
const globalVars_1 = require("../globals/globalVars");
|
9
|
+
const vue_1 = require("vue");
|
10
|
+
const twikooComment = function () {
|
11
|
+
twikoo_1.default.init({
|
12
|
+
envId: globalVars_1.CONFIG.twikoo.envId,
|
13
|
+
el: '#comments',
|
14
|
+
region: globalVars_1.CONFIG.twikoo.region
|
15
|
+
});
|
16
|
+
};
|
17
|
+
exports.twikooComment = twikooComment;
|
18
|
+
const twikooRecentComments = async function () {
|
19
|
+
let comments = [];
|
20
|
+
const root = shokax_siteURL.replace(/^(https?:\/\/)?[^/]*/, '');
|
21
|
+
const res = await twikoo_1.default.getRecentComments({
|
22
|
+
envId: globalVars_1.CONFIG.twikoo.envId,
|
23
|
+
pageSize: 10
|
24
|
+
});
|
25
|
+
res.forEach(function (item) {
|
26
|
+
let cText = item.commentText;
|
27
|
+
if (item.commentText.length > 50) {
|
28
|
+
cText = item.commentText.substring(0, 50) + '...';
|
29
|
+
}
|
30
|
+
const siteLink = item.url + '#' + item.id;
|
31
|
+
comments.push({
|
32
|
+
href: siteLink,
|
33
|
+
nick: item.nick,
|
34
|
+
time: item.relativeTime,
|
35
|
+
text: cText
|
36
|
+
});
|
37
|
+
});
|
38
|
+
(0, vue_1.createApp)({
|
39
|
+
data() {
|
40
|
+
return {
|
41
|
+
coms: comments,
|
42
|
+
root
|
43
|
+
};
|
44
|
+
}
|
45
|
+
}).mount('#new-comment');
|
46
|
+
};
|
47
|
+
exports.twikooRecentComments = twikooRecentComments;
|
@@ -1,54 +1,54 @@
|
|
1
|
-
import * as twikoo from 'twikoo'
|
2
|
-
import { CONFIG } from '../globals/globalVars'
|
3
|
-
|
4
|
-
export const twikooComment = function () {
|
5
|
-
twikoo.init({
|
6
|
-
envId: CONFIG.twikoo.envId,
|
7
|
-
el: '#comments',
|
8
|
-
region: CONFIG.twikoo.region
|
9
|
-
})
|
10
|
-
}
|
11
|
-
|
12
|
-
export const twikooRecentComments = async function () {
|
13
|
-
let comments = []
|
14
|
-
const root = shokax_siteURL.replace(/^(https?:\/\/)?[^/]*/, '')
|
15
|
-
const res = await twikoo.getRecentComments({
|
16
|
-
envId: CONFIG.twikoo.envId,
|
17
|
-
pageSize: 10
|
18
|
-
})
|
19
|
-
res.forEach(function (item) {
|
20
|
-
let cText = item.commentText
|
21
|
-
if (item.commentText.length > 50) {
|
22
|
-
cText = item.commentText.substring(0, 50) + '...'
|
23
|
-
}
|
24
|
-
const siteLink = item.url + '#' + item.id
|
25
|
-
comments.push({
|
26
|
-
href: siteLink,
|
27
|
-
nick: item.nick,
|
28
|
-
time: item.relativeTime,
|
29
|
-
text: cText
|
30
|
-
})
|
31
|
-
})
|
32
|
-
const newComments = new DocumentFragment()
|
33
|
-
comments.forEach(function (item) {
|
34
|
-
const commentEl = document.createElement('li')
|
35
|
-
const commentLink = document.createElement('a')
|
36
|
-
const commentTime = document.createElement('span')
|
37
|
-
const commentText = document.createElement('span')
|
38
|
-
|
39
|
-
commentText.innerText = item.text
|
40
|
-
commentTime.className = 'breadcrumb'
|
41
|
-
commentTime.innerText = `${item.nick} @ ${item.time}`
|
42
|
-
commentLink.href = root + item.href
|
43
|
-
commentLink['data-pjax-state'] = 'data-pjax-state'
|
44
|
-
commentEl.className = 'item'
|
45
|
-
|
46
|
-
commentText.appendChild(document.createElement('br'))
|
47
|
-
commentLink.appendChild(commentTime)
|
48
|
-
commentLink.appendChild(commentText)
|
49
|
-
commentEl.appendChild(commentLink)
|
50
|
-
newComments.appendChild(commentEl)
|
51
|
-
})
|
52
|
-
|
53
|
-
document.getElementById('new-comment').appendChild(newComments)
|
54
|
-
}
|
1
|
+
import * as twikoo from 'twikoo'
|
2
|
+
import { CONFIG } from '../globals/globalVars'
|
3
|
+
|
4
|
+
export const twikooComment = function () {
|
5
|
+
twikoo.init({
|
6
|
+
envId: CONFIG.twikoo.envId,
|
7
|
+
el: '#comments',
|
8
|
+
region: CONFIG.twikoo.region
|
9
|
+
})
|
10
|
+
}
|
11
|
+
|
12
|
+
export const twikooRecentComments = async function () {
|
13
|
+
let comments = []
|
14
|
+
const root = shokax_siteURL.replace(/^(https?:\/\/)?[^/]*/, '')
|
15
|
+
const res = await twikoo.getRecentComments({
|
16
|
+
envId: CONFIG.twikoo.envId,
|
17
|
+
pageSize: 10
|
18
|
+
})
|
19
|
+
res.forEach(function (item) {
|
20
|
+
let cText = item.commentText
|
21
|
+
if (item.commentText.length > 50) {
|
22
|
+
cText = item.commentText.substring(0, 50) + '...'
|
23
|
+
}
|
24
|
+
const siteLink = item.url + '#' + item.id
|
25
|
+
comments.push({
|
26
|
+
href: siteLink,
|
27
|
+
nick: item.nick,
|
28
|
+
time: item.relativeTime,
|
29
|
+
text: cText
|
30
|
+
})
|
31
|
+
})
|
32
|
+
const newComments = new DocumentFragment()
|
33
|
+
comments.forEach(function (item) {
|
34
|
+
const commentEl = document.createElement('li')
|
35
|
+
const commentLink = document.createElement('a')
|
36
|
+
const commentTime = document.createElement('span')
|
37
|
+
const commentText = document.createElement('span')
|
38
|
+
|
39
|
+
commentText.innerText = item.text
|
40
|
+
commentTime.className = 'breadcrumb'
|
41
|
+
commentTime.innerText = `${item.nick} @ ${item.time}`
|
42
|
+
commentLink.href = root + item.href
|
43
|
+
commentLink['data-pjax-state'] = 'data-pjax-state'
|
44
|
+
commentEl.className = 'item'
|
45
|
+
|
46
|
+
commentText.appendChild(document.createElement('br'))
|
47
|
+
commentLink.appendChild(commentTime)
|
48
|
+
commentLink.appendChild(commentText)
|
49
|
+
commentEl.appendChild(commentLink)
|
50
|
+
newComments.appendChild(commentEl)
|
51
|
+
})
|
52
|
+
|
53
|
+
document.getElementById('new-comment').appendChild(newComments)
|
54
|
+
}
|