hexo-theme-shokax 0.0.3 → 0.0.4-alpha2

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/CONTRIBUTING.md CHANGED
@@ -25,6 +25,10 @@
25
25
  2. 您愿意接受长时间的等待(一般不超过15天)
26
26
  3. 您能够接受因代码质量等问题而提出的疑问,并愿意讨论是否接受更改
27
27
 
28
+ 有关issues的说明:
29
+ 1. 如果您愿意开发某 issues 的提议功能或修复 bug,建议在对应 issue 下评论说明一下,避免闭门造车和重复造轮子的惨剧
30
+ 2. 您应该在对应 PR 提交时绑定对应 issue,以便进行统计
31
+
28
32
  ## Github PR
29
33
  此处为在使用 Github PR 提交时应注意的事:
30
34
  - 默认你对 Git、GitHub 已经有了一定的了解,并且懂得使用 PR(此方面问题可以去讨论区发起 Q&A)
package/README.md CHANGED
@@ -9,16 +9,33 @@
9
9
  诞生原因是目前shoka已经两年没有更新了,积压了大量BUG和功能请求。\
10
10
  本项目处于高强度开发期,但github仓库版本已基本可用 \
11
11
  二次开发与常见问题请看wiki \
12
- `0.0.2-alpha2`开始,`lantern`和`qweather`已迁移为插件 \
13
- 插件系统已完工,食用方法见[awesome-shokaX](https://github.com/zkz098/awesome-shokaX)
12
+ `0.0.2-alpha2`开始,`lantern`和`qweather`已迁移为插件
14
13
 
15
- ## 和shoka的区别
14
+ shokaX的社区资源导航和插件仓库为[awesome-shokaX](https://github.com/zkz098/awesome-shokaX)
15
+
16
+ ## 💬 和shoka的区别
16
17
  原先shoka使用了javascript+Native+nunjucks的技术 \
17
18
  而shokaX则使用了typescript+Vue 3+Pug的技术搭配 \
18
19
  图标库可能会更换为Font Awesome 6 \
19
20
  更改了大量难以访问的CDN链接
20
21
 
21
- ## 如何安装?
22
+ ## ✨ 功能清单
23
+
24
+ | 功能名称 | 实现状态 | 功能名称 | 实现状态 |
25
+ |:--------:|:----:|:------------:|:----:|
26
+ | PWA支持 | ✅ | JSD拆分 | ✅ |
27
+ | 注入API | ✅ | 社区插件系统 | ✅ |
28
+ | 自定义字体 | ✅* | 自定义样式 | ✅* |
29
+ | 多种评论系统支持 | ✅ | 用户行为分析支持 | ✅ |
30
+ | 底部备案号 | ✅ | 自定义页尾 | ✅* |
31
+ | CSS渐变封面 | ✅ | typescript支持 | ✅^ |
32
+
33
+ 备注:
34
+ - *: 需要使用注入API实现
35
+ - ^: 仅page js部分,hexo script未实现
36
+
37
+
38
+ ## 🔧 如何安装?
22
39
  建议使用[ShokaX-CLI](https://github.com/zkz098/shokaX-CLI) ,执行下列命令即可:
23
40
  ```bash
24
41
  npm i shokax-cli --location=global
@@ -27,6 +44,15 @@ SXC install shokaX
27
44
  ```
28
45
  后续配置请点[这里](https://www.kaitaku.xyz/webbuild/shokaX/) 查看
29
46
 
47
+ releases及npm的版本号区别如下:
48
+ - x.x.x-alpha版本是早期测试版,部分未经测试环境测试,不能保证正常运行
49
+ - x.x.x-beta(目前还没有)是测试版,可以保证正常生成,但可能存在bug
50
+ - x.x.x是相对稳定的版本,基本上不存在严重BUG
51
+
52
+ github仓库建议通过右边的 releases 下载,步骤为:
53
+ - 点击 Releases 的 Latest 版本
54
+ - 下载 Assets 中的 `Source code(zip)`
55
+ - 解压即可作为主题使用
30
56
  # 许可证
31
57
  许可证: BSD-3-Clause \
32
58
  [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fzkz098%2Fhexo-theme-shokaX.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fzkz098%2Fhexo-theme-shokaX?ref=badge_large)
@@ -1,7 +1,7 @@
1
1
  mixin BCRender(post, home)
2
2
  if home
3
3
  != '<div class="breadcrumb" itemListElement itemscope itemtype="https://schema.org/BreadcrumbList">'
4
- i(class="ic i-home")
4
+ i(class="fa fa-solid fa-house")
5
5
  span
6
6
  a(href=url_for(site.path))
7
7
  != __('menu.home')
@@ -10,7 +10,7 @@ mixin BCRender(post, home)
10
10
  if post.categories && post.categories.length
11
11
  - var cat_length = post.categories.length
12
12
  if home
13
- i(class="ic i-angle-right")
13
+ i(class="fa fa-solid fa-angle-right")
14
14
  each cat,index in post.categories.toArray()
15
15
  if home
16
16
  if index===cat_length
@@ -29,5 +29,5 @@ mixin BCRender(post, home)
29
29
  a(href=url_for(cat.path) title=__('post.in')+cat.name)
30
30
  != cat.name
31
31
  if cat_length > 1 && index !== cat_length
32
- i(class="ic i-angle-right")
32
+ i(class="fa fa-solid fa-angle-right")
33
33
  != '</div>'
@@ -12,10 +12,11 @@ mixin CardRender(item)
12
12
  != item.top.name
13
13
  div(class="info")
14
14
  if item.link
15
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
15
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
16
16
  - var postText = itemname || item.link || __('post.untitled')
17
+ - var tempI = postText + (postTitleIcon || '')
17
18
  div(class="ribbon")
18
- != _url(item.link , postText + (postTitleIcon || ''), {itemprop: 'url', title: postText})
19
+ != _url(item.link , tempI , {itemprop: 'url', title: postText})
19
20
  div(class="inner")
20
21
  - var len = ''
21
22
  if item.child
@@ -30,8 +31,8 @@ mixin CardRender(item)
30
31
  div(class="meta footer")
31
32
  if item.top
32
33
  span
33
- != _url(item.top.path, '<i class="ic i-flag"></i>'+item.top.name, {itemprop: 'url', title: item.top.name})
34
+ != _url(item.top.path, '<i class="fa fa-solid fa-flag"></i>'+item.top.name, {itemprop: 'url', title: item.top.name})
34
35
  span
35
- i(class="ic i-file")
36
+ i(class="fa fa-solid fa-file")
36
37
  != len
37
38
  != _url(item.path, 'more...', {itemprop: 'url', title: itemname, class: 'btn'})
@@ -33,6 +33,7 @@ mixin CommentRender()
33
33
  else if gt
34
34
  div(class="warp" id="gtcomments")
35
35
  script(type="text/javascript" data-pjax).
36
+ const gproxy = theme.gitalk.proxy || undefined
36
37
  const gitalk = new Gitalk({
37
38
  clientID: '#{theme.gitalk.clientID}',
38
39
  clientSecret: '#{theme.gitalk.clientSecret}',
@@ -41,7 +42,7 @@ mixin CommentRender()
41
42
  admin: #{theme.gitalk.admin},
42
43
  id: location.pathname, // Ensure uniqueness and length less than 50
43
44
  distractionFreeMode: false, // Facebook-like distraction free mode
44
- proxy: "#{theme.gitalk.proxy || undefined}"
45
+ proxy: "#{gproxy}"
45
46
  });
46
47
  gitalk.render("gtcomments")
47
48
  else if gs
@@ -5,7 +5,7 @@ mixin PMRender(item, full)
5
5
  - var create_title = __('post.created') + __('symbol.colon') + full_date(item.date)
6
6
  span(class="item" title=create_title)
7
7
  span(class="icon")
8
- i(class="ic i-calendar")
8
+ i(class="fa fa-solid fa-calendar-days")
9
9
  if full
10
10
  span(class="text")
11
11
  != __('post.posted')
@@ -14,7 +14,7 @@ mixin PMRender(item, full)
14
14
  if theme.post.count
15
15
  span(class="item" title=__('symbols_count_time.count'))
16
16
  span(class="icon")
17
- i(class="ic i-pen")
17
+ i(class="fa fa-solid fa-pen-nib")
18
18
  if full
19
19
  span(class="text")
20
20
  != __('symbols_count_time.count')
@@ -23,7 +23,7 @@ mixin PMRender(item, full)
23
23
  != __('symbols_count_time.word')
24
24
  span(class="item" title=__('symbols_count_time.time'))
25
25
  span(class="icon")
26
- i(class="ic i-clock")
26
+ i(class="fa fa-solid fa-clock")
27
27
  if full
28
28
  span(class="text")
29
29
  != __('symbols_count_time.time')
@@ -4,7 +4,7 @@ mixin SMRender(item)
4
4
  - var link1 = item.link || item.path
5
5
  - var gradient = theme?.experiments?.gradient
6
6
  if item.link
7
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
7
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
8
8
  - var postText = item.title || item.link || __('post.untitled')
9
9
  article(class="item")
10
10
  if gradient
@@ -27,6 +27,6 @@ mixin SMRender(item)
27
27
  div(class="meta footer")
28
28
  span
29
29
  - var lastcat = item.categories.last()
30
- != _url(lastcat.path, '<i class="ic i-flag"></i>' + lastcat.name, {itemprop: 'url', title: lastcat.name})
30
+ != _url(lastcat.path, '<i class="fa fa-solid fa-flag"></i>' + lastcat.name, {itemprop: 'url', title: lastcat.name})
31
31
  != _url(link1, 'more...', {itemprop: 'url', title: postText, class: 'btn'})
32
32
 
@@ -25,12 +25,12 @@ mixin sidebarRender(display_toc)
25
25
  li(class="prev pjax")
26
26
  if page && page.prev
27
27
  if prevlink
28
- != _url(prevlink, '<i class="ic i-chevron-left"></i>', {rel: 'prev', title: __('post.prev')})
28
+ != _url(prevlink, '<i class="fa fa-solid fa-chevron-left"></i>', {rel: 'prev', title: __('post.prev')})
29
29
  li(class="up")
30
- i(class="ic i-arrow-up")
30
+ i(class="fa fa-solid fa-arrow-up")
31
31
  li(class="down")
32
- i(class="ic i-arrow-down")
32
+ i(class="fa fa-solid fa-arrow-down")
33
33
  li(class="next pjax")
34
34
  if nextlink
35
- != _url(nextlink, '<i class="ic i-chevron-right"></i>', {rel: 'next', title: __('post.next')})
35
+ != _url(nextlink, '<i class="fa fa-solid fa-chevron-right"></i>', {rel: 'next', title: __('post.next')})
36
36
  li(class="percent")
@@ -1,6 +1,6 @@
1
1
  mixin field(item)
2
2
  if item.link
3
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
3
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
4
4
  li(class="item")
5
5
  +BCRender(item, false)
6
6
  - var postText = item.title || item.link || __('post.untitled')
@@ -5,18 +5,18 @@ div(class="status")
5
5
  span(itemprop="copyrightYear")
6
6
  != copyright_year
7
7
  span(class="with-love")
8
- i(class=`ic i-${ theme.footer.icon.name }`)
8
+ i(class=`fa fa-solid fa-${ theme.footer.icon.name }`)
9
9
  span(class="author" itemprop="copyrightHolder")
10
10
  != `${author} @ ${ alternate?alternate:title}`
11
11
  if theme.footer.count
12
12
  div(class="count")
13
13
  span(class="post-meta-item-icon")
14
- i(class="ic i-chart-area")
14
+ i(class="fa fa-solid fa-chart-area")
15
15
  span(title=__('symbols_count_time.count_total'))
16
16
  != `${ symbolsCountTotal(site) } ${__('symbols_count_time.word')}`
17
17
  span(class="post-meta-divider") |
18
18
  span(class="post-meta-item-icon")
19
- i(class="ic i-coffee")
19
+ i(class="fa fa-solid fa-coffee")
20
20
  span(title=__('symbols_count_time.time_total'))
21
21
  != symbolsTimeTotal(site, config.symbols_count_time.awl, config.symbols_count_time.wpm, __('symbols_count_time.time_minutes'))
22
22
  //- span(id="timeDate")
@@ -33,6 +33,7 @@ link(rel="alternate" type="application/json" title=siteTitle href=feedLink)
33
33
  if fontConfig
34
34
  != _vendor_font()
35
35
  != _css('app.css')
36
+ link(rel="stylesheet" type="text/css" href="https://cdn.staticfile.org/font-awesome/6.2.1/css/all.min.css")
36
37
  - var debugVue = theme?.experiments?.debug
37
38
  if debugVue
38
39
  script(src="https://cdn.staticfile.org/vue/3.2.45/vue.global.js")
@@ -11,8 +11,8 @@ nav(id="nav")
11
11
  != alternate || title
12
12
  ul(class="right" id="rightNav")
13
13
  li(class="item theme" @click="changeThemeByBtn")
14
- i(class="ic" :class="{'i-sun': !themeStatus,'i-moon': themeStatus}")
14
+ i(class="fa fa-solid fa-sunrise")
15
15
  li(class="item search")
16
- i(class="ic i-search")
16
+ i(class="fa fa-solid fa-magnifying-glass")
17
17
  != shokax_inject('rightNav')
18
18
 
@@ -65,7 +65,7 @@ html(lang=page.language?page.language:config.language, style=theme.grayMode ? 'f
65
65
  div(class="widgets")
66
66
  +WRender
67
67
  != partial('_partials/footer.pug', {}, {cache: true})
68
- - var ccIcon = '<i class="ic i-creative-commons"></i>'
68
+ - var ccIcon = '<i class="fa fa-solid fa-creative-commons"></i>'
69
69
  - var ccText = theme.creative_commons.license.toUpperCase()
70
70
  <script data-config type="text/javascript" >
71
71
  | var LOCAL = {
@@ -1,4 +1,4 @@
1
1
  if page.prev || page.next
2
2
  nav(class="pagination")
3
3
  div(class="inner")
4
- != paginator({prev_text: '<i class="ic i-angle-left" aria-label="' + __('accessibility.prev_page') + '"></i>',next_text: '<i class="ic i-angle-right" aria-label="' + __('accessibility.next_page') + '"></i>',mid_size : 1,escape : false})
4
+ != paginator({prev_text: '<i class="fa fa-solid fa-angle-left" aria-label="' + __('accessibility.prev_page') + '"></i>',next_text: '<i class="fa fa-solid fa-angle-right" aria-label="' + __('accessibility.next_page') + '"></i>',mid_size : 1,escape : false})
@@ -1,5 +1,5 @@
1
1
  if page.copyright !== false
2
- - var ccIcon = '<i class="ic i-creative-commons"><em>(CC)</em></i>'
2
+ - var ccIcon = '<i class="fa fa-brands fa-creative-commons"><em>(CC)</em></i>'
3
3
  - var ccText = theme.creative_commons.license.toUpperCase()
4
4
  div(id="copyright")
5
5
  ul
@@ -7,7 +7,7 @@ if page.copyright !== false
7
7
  strong
8
8
  != __('post.copyright.author') + __('symbol.colon')
9
9
  != page.author || author
10
- i(class="ic i-at")
10
+ i(class="fa fa-solid fa-at")
11
11
  em @
12
12
  != title
13
13
  li(class="link")
@@ -1,12 +1,12 @@
1
1
  div(class="meta")
2
2
  if date(post.date) != date(post.updated) || time(post.date) != time(post.updated)
3
3
  span(class="icon")
4
- i(class="ic i-eye")
4
+ i(class="fa fa-solid fa-eye")
5
5
  span 此文章已被阅读次数:
6
6
  span(id="twikoo_visitors" class="waline-pageview-count" data-path=post.path) 正在加载...
7
7
  span(class="item")
8
8
  span(class="icon")
9
- i(class="ic i-calendar-check")
9
+ i(class="fa fa-solid fa-calendar-check")
10
10
  span(class="text")
11
11
  != __('post.edited')
12
12
  time(title=__('post.modified') + __('symbol.colon') + full_date(post.updated) itemprop="dateModified" datetime=moment(post.updated).format())
@@ -1,7 +1,7 @@
1
1
  mixin navpost(item, type)
2
2
  - var postText = item.title || item.link || __('post.untitled')
3
3
  - var lastcat = item.categories.last()
4
- - var itemlink=`<span class="type">${__('post.' + type)}</span><span class="category"><i class="ic i-flag"></i>${lastcat?.name}</span><h3>${ postText }</h3>`
4
+ - var itemlink=`<span class="type">${__('post.' + type)}</span><span class="category"><i class="fa fa-solid fa-flag"></i>${lastcat?.name}</span><h3>${ postText }</h3>`
5
5
  != _url(item.path, itemlink, {itemprop: 'url', rel: type, 'data-background-image': _cover(item), title: postText})
6
6
 
7
7
  div(class="post-nav")
@@ -17,7 +17,7 @@ article(itemscope itemtype="http://schema.org/Article" class="post block" lang=t
17
17
  div(class="tags")
18
18
  each tag in post.tags.toArray()
19
19
  a(href!=url_for(tag.path) rel="tag")
20
- i(class="ic i-tag")
20
+ i(class="fa fa-solid fa-tag")
21
21
  != tag.name
22
22
  footer
23
23
  != partial('_partials/post/footer.pug')
@@ -1,7 +1,7 @@
1
1
  if page.reward !== false
2
2
  div(class="reward")
3
3
  button
4
- i(class="ic i-heartbeat")
4
+ i(class="fa fa-solid fa-heart-pulse")
5
5
  != __('reward.donate')
6
6
  p
7
7
  != __('reward.text')
@@ -3,7 +3,7 @@ mixin item(name, path, parent, dropdown, sublist)
3
3
  - var path = path.split('||')
4
4
  - var itemURL = path[0].trim()
5
5
  - if (!itemURL.startsWith('http')){ itemURL = itemURL.replace('//', '/') }
6
- - var menuIcon = '<i class="ic i-' + trimn(path[1]) + '"></i>'
6
+ - var menuIcon = '<i class="fa fa-solid fa-' + trimn(path[1]) + '"></i>'
7
7
  - var menuText = __('menu.' + name).replace('menu.', '')
8
8
  if parent
9
9
  li(class="item dropdown")
@@ -21,7 +21,7 @@ mixin item(name, path, parent, dropdown, sublist)
21
21
  - var menuText = __('menu.' + subname).replace('menu.', '')
22
22
  if subname == 'default'
23
23
  - var menuText = __('menu.' + name).replace('menu.', '')
24
- - var menuIcon = '<i class="ic i-' + trimn(path[1]) + '"></i>'
24
+ - var menuIcon = '<i class="fa fa-solid fa-' + trimn(path[1]) + '"></i>'
25
25
  li(class="item")
26
26
  != _url(itemURL, menuIcon + menuText, {rel: 'section'})
27
27
  else
@@ -32,7 +32,7 @@ nav(class="state")
32
32
  div(class="social")
33
33
  each link, name in theme.social
34
34
  - var sidebarURL = link.split('||')[0].trim()
35
- - var sidebarIcon = '<i class="ic i-' + link.split('||')[1].trim() + '"></i>'
35
+ - var sidebarIcon = '<i class="fa fa-solid fa-' + link.split('||')[1].trim() + '"></i>'
36
36
  != _url(sidebarURL, sidebarIcon, {title: sidebarURL, class: 'item ' + name})
37
37
 
38
38
  != shokax_inject('sidebar')
@@ -103,7 +103,7 @@ block content
103
103
  a(href=url_for(cat.path)) #{cat.name}
104
104
  div(class="title")
105
105
  if post.link
106
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
106
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
107
107
  - var postText = post.title || post.link
108
108
  != _url(post.link, postText + postTitleIcon, {class: 'external', itemprop: 'url'})
109
109
  else
@@ -53,7 +53,7 @@ block content
53
53
  ) #{date(post.date, 'MM-DD')}
54
54
  div(class="title")
55
55
  if post.link
56
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
56
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
57
57
  - var postText = post.title || post.link
58
58
  != _url(post.link, postText + postTitleIcon, {class: 'external', itemprop: 'url'})
59
59
  else
package/layout/page.pug CHANGED
@@ -16,7 +16,7 @@ block title
16
16
  block header
17
17
  h1(itemprop="name headline")
18
18
  if page.link
19
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
19
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
20
20
  - var postText = page.title || page.link
21
21
  != _url(page.link, postText + postTitleIcon, {class: 'link external', itemprop: 'url'})
22
22
  else
package/layout/post.pug CHANGED
@@ -17,7 +17,7 @@ block title
17
17
  block header
18
18
  h1(itemprop="name headline")
19
19
  if page.link
20
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
20
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
21
21
  - var postText = page.title || page.link
22
22
  != _url(page.link, postText + postTitleIcon, {class: 'link external', itemprop: 'url'})
23
23
  else
package/layout/tag.pug CHANGED
@@ -33,7 +33,7 @@ block content
33
33
  != cat.name
34
34
  div(class="title")
35
35
  if post.link
36
- - var postTitleIcon = '<i class="ic i-link-alt"></i>'
36
+ - var postTitleIcon = '<i class="fa fa-solid fa-up-right-from-square"></i>'
37
37
  - var postText = post.title || post.link
38
38
  != _url(post.link, postText + postTitleIcon, {class: 'external', itemprop: 'url'})
39
39
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hexo-theme-shokax",
3
- "version": "0.0.3",
3
+ "version": "0.0.4-alpha2",
4
4
  "description": "a hexo theme based on shoka",
5
5
  "main": "index.js",
6
6
  "repository": "https://github.com/zkz098/hexo-theme-shokaX",
@@ -11,6 +11,11 @@
11
11
  margin-left: .25rem;
12
12
  }
13
13
 
14
+ .exturl .fa {
15
+ font-size: $font-size-small;
16
+ margin-left: .25rem;
17
+ }
18
+
14
19
  .button {
15
20
  margin-top: 2.5rem;
16
21
  text-align: center;
@@ -191,6 +191,10 @@
191
191
  color: var(--primary-color);
192
192
  }
193
193
 
194
+ &.actived .fa {
195
+ color: var(--primary-color);
196
+ }
197
+
194
198
  .ic {
195
199
  color: var(--grey-6);
196
200
  transition: all .25s ease;
@@ -145,6 +145,7 @@ input, textarea {
145
145
  src: url("https://cdn.jsdelivr.net/gh/JetBrains/JetBrainsMono@2.242/fonts/webfonts/JetBrainsMono-Regular.woff2") format("woff2");
146
146
  }
147
147
 
148
+ // TODO
148
149
  .ic {
149
150
  font-family: "ic" !important;
150
151
  -webkit-font-smoothing: antialiased;
@@ -158,15 +159,39 @@ input, textarea {
158
159
  line-height: 1;
159
160
  }
160
161
 
162
+ .fa {
163
+ -webkit-font-smoothing: antialiased;
164
+ -moz-osx-font-smoothing: grayscale;
165
+ text-align: center;
166
+ width: 1.25em;
167
+ display: inline-block;
168
+ font-style: normal;
169
+ font-variant: normal;
170
+ text-rendering: auto;
171
+ line-height: 1;
172
+ }
173
+
174
+ // TODO
161
175
  .ic em {
162
176
  font-size: 0;
163
177
  }
164
178
 
179
+ .fa em {
180
+ font-size: 0;
181
+ }
182
+
183
+ // TODO
165
184
  .ic-lg {
166
185
  font-size: 1.33333em;
167
186
  line-height: .75em;
168
187
  vertical-align: -.0667em;
169
188
  }
189
+
190
+ .fa-lg {
191
+ font-size: 1.33333em;
192
+ line-height: .75em;
193
+ vertical-align: -.0667em;
194
+ }
170
195
  //.weather {
171
196
  // color: var(--text-color) !important;
172
197
  //}
@@ -25,16 +25,16 @@ let LOCAL_HASH = 0;
25
25
  let LOCAL_URL = window.location.href;
26
26
  let pjax;
27
27
  const changeTheme = function (type) {
28
- const btn = $dom('.theme .ic');
28
+ const btn = $dom('.theme .fa');
29
29
  if (type === 'dark') {
30
30
  HTML.attr('data-theme', type);
31
- btn.removeClass('i-sun');
32
- btn.addClass('i-moon');
31
+ btn.removeClass('fa-sunrise');
32
+ btn.addClass('fa-moon-stars');
33
33
  }
34
34
  else {
35
35
  HTML.attr('data-theme', null);
36
- btn.removeClass('i-moon');
37
- btn.addClass('i-sun');
36
+ btn.removeClass('fa-moon-stars');
37
+ btn.addClass('fa-sunrise');
38
38
  }
39
39
  };
40
40
  const autoDarkmode = function () {
@@ -43,12 +43,7 @@ const autoDarkmode = function () {
43
43
  changeTheme('dark');
44
44
  }
45
45
  else {
46
- if (window.matchMedia('(prefers-color-scheme:dark)').matches) {
47
- changeTheme('dark');
48
- }
49
- else {
50
- changeTheme();
51
- }
46
+ changeTheme();
52
47
  }
53
48
  }
54
49
  };
@@ -149,7 +149,7 @@ const getScript = function (url, callback, condition) {
149
149
  else {
150
150
  let script = document.createElement('script');
151
151
  script.onload = function (_, isAbort) {
152
- if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
152
+ if (isAbort || !script.readyState) {
153
153
  console.log("abort!");
154
154
  script.onload = null;
155
155
  script = undefined;
@@ -288,15 +288,27 @@ const pjaxScript = function (element) {
288
288
  }
289
289
  parent.appendChild(script);
290
290
  };
291
- const pageScroll = function (target, offset, complete) {
291
+ const pageScroll = (target, offset, complete) => {
292
292
  const opt = {
293
- targets: typeof offset === 'number' ? target.parentNode : document.scrollingElement,
294
- duration: 500,
295
- easing: 'easeInOutQuad',
296
- scrollTop: offset || (typeof target === 'number' ? target : (target ? target.top() + document.documentElement.scrollTop - siteNavHeight : 0)),
297
- complete: function () {
298
- complete && complete();
299
- }
293
+ left: 0,
294
+ behavior: "smooth"
300
295
  };
301
- anime(opt);
296
+ if (typeof target === "number") {
297
+ opt.top = target;
298
+ }
299
+ else {
300
+ if (typeof target === 'number') {
301
+ opt.top = offset || target;
302
+ }
303
+ else {
304
+ if (offset || target) {
305
+ opt.top = target.top() + document.documentElement.scrollTop - siteNavHeight;
306
+ }
307
+ else {
308
+ opt.top = 0;
309
+ }
310
+ }
311
+ }
312
+ scrollTo(opt);
313
+ complete && complete();
302
314
  };
@@ -175,7 +175,7 @@ const postBeauty = function () {
175
175
  $dom.each('figure.highlight', function (element) {
176
176
  const code_container = element.child('.code-container');
177
177
  const caption = element.child('figcaption');
178
- element.insertAdjacentHTML('beforeend', '<div class="operation"><span class="breakline-btn"><i class="ic i-align-left"></i></span><span class="copy-btn"><i class="ic i-clipboard"></i></span><span class="fullscreen-btn"><i class="ic i-expand"></i></span></div>');
178
+ element.insertAdjacentHTML('beforeend', '<div class="operation"><span class="breakline-btn"><i class="fa fa-solid fa-align-left"></i></span><span class="copy-btn"><i class="fa fa-solid fa-clipboard"></i></span><span class="fullscreen-btn"><i class="fa fa-solid fa-expand"></i></span></div>');
179
179
  const copyBtn = element.child('.copy-btn');
180
180
  if (LOCAL.nocopy) {
181
181
  copyBtn.remove();
@@ -190,14 +190,14 @@ const postBeauty = function () {
190
190
  comma = '\n';
191
191
  });
192
192
  clipBoard(code, function (result) {
193
- target.child('.ic').className = result ? 'ic i-check' : 'ic i-times';
193
+ target.child('.fa').className = result ? 'fa fa-solid fa-check' : 'fa fa-solid fa-times';
194
194
  target.blur();
195
195
  showtip(LOCAL.copyright);
196
196
  });
197
197
  }, { passive: true });
198
198
  copyBtn.addEventListener('mouseleave', function (event) {
199
199
  setTimeout(function () {
200
- event.target.child('.ic').className = 'ic i-clipboard';
200
+ event.target.child('.fa').className = 'fa fa-solid fa-clipboard';
201
201
  }, 1000);
202
202
  });
203
203
  }
@@ -206,11 +206,11 @@ const postBeauty = function () {
206
206
  const target = event.currentTarget;
207
207
  if (element.hasClass('breakline')) {
208
208
  element.removeClass('breakline');
209
- target.child('.ic').className = 'ic i-align-left';
209
+ target.child('.fa').className = 'fa fa-solid fa-align-left';
210
210
  }
211
211
  else {
212
212
  element.addClass('breakline');
213
- target.child('.ic').className = 'ic i-align-justify';
213
+ target.child('.fa').className = 'fa fa-solid fa-align-justify';
214
214
  }
215
215
  });
216
216
  const fullscreenBtn = element.child('.fullscreen-btn');
@@ -218,7 +218,7 @@ const postBeauty = function () {
218
218
  element.removeClass('fullscreen');
219
219
  element.scrollTop = 0;
220
220
  BODY.removeClass('fullscreen');
221
- fullscreenBtn.child('.ic').className = 'ic i-expand';
221
+ fullscreenBtn.child('.fa').className = 'fa fa-solid fa-expand';
222
222
  };
223
223
  const fullscreenHandle = function (event) {
224
224
  const target = event.currentTarget;
@@ -234,7 +234,7 @@ const postBeauty = function () {
234
234
  else {
235
235
  element.addClass('fullscreen');
236
236
  BODY.addClass('fullscreen');
237
- fullscreenBtn.child('.ic').className = 'ic i-compress';
237
+ fullscreenBtn.child('.fa').className = 'fa fa-solid fa-compress';
238
238
  if (code_container && code_container.find('tr').length > 15) {
239
239
  const showBtn = code_container.child('.show-btn');
240
240
  code_container.style.maxHeight = '';
@@ -246,7 +246,7 @@ const postBeauty = function () {
246
246
  caption && caption.addEventListener('click', fullscreenHandle);
247
247
  if (code_container && code_container.find('tr').length > 15) {
248
248
  code_container.style.maxHeight = '300px';
249
- code_container.insertAdjacentHTML('beforeend', '<div class="show-btn"><i class="ic i-angle-down"></i></div>');
249
+ code_container.insertAdjacentHTML('beforeend', '<div class="show-btn"><i class="fa fa-solid fa-angle-down"></i></div>');
250
250
  const showBtn = code_container.child('.show-btn');
251
251
  const hideCode = function () {
252
252
  code_container.style.maxHeight = '300px';
@@ -414,7 +414,7 @@ const algoliaSearch = function (pjax) {
414
414
  if (!siteSearch) {
415
415
  siteSearch = BODY.createChild('div', {
416
416
  id: 'search',
417
- innerHTML: '<div class="inner"><div class="header"><span class="icon"><i class="ic i-search"></i></span><div class="search-input-container"></div><span class="close-btn"><i class="ic i-times-circle"></i></span></div><div class="results"><div class="inner"><div id="search-stats"></div><div id="search-hits"></div><div id="search-pagination"></div></div></div></div>'
417
+ innerHTML: '<div class="inner"><div class="header"><span class="icon"><i class="fa fa-solid fa-magnifying-glass"></i></span><div class="search-input-container"></div><span class="close-btn"><i class="fa fa-solid fa-times-circle"></i></span></div><div class="results"><div class="inner"><div id="search-stats"></div><div id="search-hits"></div><div id="search-pagination"></div></div></div></div>'
418
418
  });
419
419
  }
420
420
  const search = instantsearch({
@@ -459,7 +459,7 @@ const algoliaSearch = function (pjax) {
459
459
  container: '#search-hits',
460
460
  templates: {
461
461
  item: function (data) {
462
- const cats = data.categories ? '<span>' + data.categories.join('<i class="ic i-angle-right"></i>') + '</span>' : '';
462
+ const cats = data.categories ? '<span>' + data.categories.join('<i class="fa fa-solid fa-angle-right"></i>') + '</span>' : '';
463
463
  return '<a href="' + CONFIG.root + data.path + '">' + cats + data._highlightResult.title.value + '</a>';
464
464
  },
465
465
  empty: function (data) {
@@ -478,10 +478,10 @@ const algoliaSearch = function (pjax) {
478
478
  showFirst: false,
479
479
  showLast: false,
480
480
  templates: {
481
- first: '<i class="ic i-angle-double-left"></i>',
482
- last: '<i class="ic i-angle-double-right"></i>',
483
- previous: '<i class="ic i-angle-left"></i>',
484
- next: '<i class="ic i-angle-right"></i>'
481
+ first: '<i class="fa fa=solid fa-angle-double-left"></i>',
482
+ last: '<i class="fa fa-solid fa-angle-double-right"></i>',
483
+ previous: '<i class="fa fa-solid fa-angle-left"></i>',
484
+ next: '<i class="fa fa-solid fa-angle-right"></i>'
485
485
  },
486
486
  cssClasses: {
487
487
  root: 'pagination',
@@ -530,7 +530,7 @@ const domInit = function () {
530
530
  if (!toolBtn) {
531
531
  toolBtn = siteHeader.createChild('div', {
532
532
  id: 'tool',
533
- innerHTML: '<div class="item player"></div><div class="item contents"><i class="ic i-list-ol"></i></div><div class="item chat"><i class="ic i-comments"></i></div><div class="item back-to-top"><i class="ic i-arrow-up"></i><span>0%</span></div>'
533
+ innerHTML: '<div class="item player"></div><div class="item contents"><i class="fa fa-solid fa-list-ol"></i></div><div class="item chat"><i class="fa fa-solid fa-comments"></i></div><div class="item back-to-top"><i class="fa fa-solid fa-arrow-up"></i><span>0%</span></div>'
534
534
  });
535
535
  }
536
536
  toolPlayer = toolBtn.child('.player');
@@ -618,6 +618,8 @@ const siteInit = function () {
618
618
  });
619
619
  siteRefresh(1);
620
620
  };
621
- window.addEventListener('DOMContentLoaded', siteInit);
621
+ window.addEventListener('DOMContentLoaded', siteInit, {
622
+ passive: true
623
+ });
622
624
  console.log('%c Theme.ShokaX v' + CONFIG.version + ' %c https://github.com/zkz098/hexo-theme-shokaX ', 'color: white; background: #e9546b; padding:5px 0;', 'padding:4px;border:1px solid #e9546b;');
623
625
  console.log('%c by kaitaku ' + '%c https://www.kaitaku.xyz', 'color: white; background: #00bfff; padding: 5px 3px;', 'padding: 4px;border:1px solid #00bfff');
@@ -5,7 +5,7 @@ Vue.createApp({
5
5
  methods: {
6
6
  changeThemeByBtn() {
7
7
  let c;
8
- const btn = $dom('.theme').child('.ic');
8
+ const btn = $dom('.theme').child('.fa');
9
9
  const neko = BODY.createChild('div', {
10
10
  id: 'neko',
11
11
  innerHTML: '<div class="planet"><div class="sun"></div><div class="moon"></div></div><div class="body"><div class="face"><section class="eyes left"><span class="pupil"></span></section><section class="eyes right"><span class="pupil"></span></section><span class="nose"></span></div></div>'