Full Code of Lemonreds/hexo-theme-nayo for AI

master ed59e2950830 cached
73 files
97.5 KB
30.4k tokens
39 symbols
1 requests
Download .txt
Repository: Lemonreds/hexo-theme-nayo
Branch: master
Commit: ed59e2950830
Files: 73
Total size: 97.5 KB

Directory structure:
gitextract_7jie21nk/

├── .babelrc
├── .gitignore
├── .postcssrc.js
├── README.md
├── _config.yml
├── languages/
│   ├── en.yml
│   ├── zh-CN.yml
│   └── zh-TW.yml
├── layout/
│   ├── _partial/
│   │   ├── _post/
│   │   │   ├── comment.ejs
│   │   │   ├── donate.ejs
│   │   │   ├── footer.ejs
│   │   │   ├── gallery.ejs
│   │   │   ├── header.ejs
│   │   │   ├── mathjax.ejs
│   │   │   ├── mob_share.ejs
│   │   │   └── toc.ejs
│   │   ├── after-footer.ejs
│   │   ├── article.ejs
│   │   ├── footer.ejs
│   │   ├── head.ejs
│   │   ├── header.ejs
│   │   ├── item.ejs
│   │   ├── page-name.ejs
│   │   ├── paginator.ejs
│   │   ├── search.ejs
│   │   └── slide-menu.ejs
│   ├── about.ejs
│   ├── archive.ejs
│   ├── category.ejs
│   ├── index.ejs
│   ├── layout.ejs
│   ├── post.ejs
│   └── tag.ejs
├── package.json
├── scripts/
│   ├── raw_length.js
│   └── render_img.js
├── source/
│   └── nayo.bundle.js
├── src/
│   ├── scripts/
│   │   ├── activeNav.js
│   │   ├── dom.js
│   │   ├── extends.js
│   │   ├── header.js
│   │   ├── lazyload.js
│   │   ├── main.js
│   │   ├── mask.js
│   │   ├── mobile.js
│   │   ├── scroll.js
│   │   ├── search.js
│   │   ├── totop.js
│   │   └── util.js
│   └── styles/
│       ├── base.scss
│       ├── code/
│       │   ├── hightlight.scss
│       │   └── theme.scss
│       ├── iconfont.scss
│       ├── mobile/
│       │   └── mobile.scss
│       ├── partial/
│       │   ├── archive.scss
│       │   ├── footer.scss
│       │   ├── header.scss
│       │   ├── index.scss
│       │   ├── item.scss
│       │   ├── page-name.scss
│       │   ├── paginator.scss
│       │   ├── post.scss
│       │   ├── search.scss
│       │   ├── tag.scss
│       │   └── toc.scss
│       ├── styles.scss
│       ├── three/
│       │   ├── hover.scss
│       │   └── valine.scss
│       └── utils/
│           ├── ani.scss
│           ├── reset.scss
│           ├── typo.scss
│           └── vars.scss
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
    "presets": [
        [
            "env",
            {
                "targets": {
                    "browsers": ["last 2 versions"]
                }
            }
        ]
    ],
    "plugins": ["transform-runtime"]
}

================================================
FILE: .gitignore
================================================
node_modules/
npm-debug.log
.vscode/
package-lock.json
.temp

================================================
FILE: .postcssrc.js
================================================
module.exports = {
    plugins: {
        "autoprefixer": {}
    }
}

================================================
FILE: README.md
================================================
## hexo-theme-nayo

a concise theme for hexo[3.7.0].

在线预览 [preview](https://lemonreds.github.io/) | 常见问题 [common issues](https://lemonreds.github.io/2018/10/01/hexo-theme-nayo/) 

## 效果图

![Where is my image?](https://github.com/Lemonreds/hexo-theme-nayo/blob/master/src/nayo.png)

## 安装说明 

1. 从github上clone项目下来,放到目录  **yourhexoblog/themes/** 下。
```
$ git clone https://github.com/Lemonreds/hexo-theme-Nayo themes/nayo
```

或者直接download下来重名为nayo,并放到目录  **yourhexoblog/themes/** 下。

2.修改hexo的配置文件,**yourhexoblog/_config.yml** ,切换主题。

```
theme: Nayo
```

## 关于主题名字 

主题名来自歌曲 <东京不太热> -封茗囧菌

## 修改主题

主题基于 hexoAPI、webpack4.0、Sass、Ejs 开发。

修改Ejs不需要安装依赖即可生效,修改js或css则需要webpack启动服务:

0. 启动hexo,本地预览主题的修改。
```
hexo s
```

1. 安装Node依赖
```
$ npm install 
```

2. 运行开发环境
```
$ npm run dev
```

3. 生产环境打包
```
$ npm run build
```


================================================
FILE: _config.yml
================================================
# header navigation
# 导航菜单路径
# 默认不需要修改

menu:
  home: /
  archives: archives
  tags: tags
  about: about
  search: search
  

# site title 
# 网站的标题
title: Lemon

# author profile
# 图片放置于主题目录下: source/images/
# author为空时 Hexo/_config.yml 配置有效
profile: 
  author: Lemon
  logo: /images/logo.png
  avatar: /images/avatar.jpg  

# site favicon
# 图片放置于主题目录下: source/images/
# 站点图标
favicon: /images/favicon.png

# social link
social:  
  Github: https://github.com/Lemonreds/hexo-theme-nayo 
  Weibo: 
  # Zhihu:
  # Facebook:
  Twitter:
  instagram:
  # LinkedIn:
  Neteasemusic:
  Telegram: /

# site analytics 
# 站点访问统计
# 填入百度/谷歌的[ analytics id ]
baidu_analytics:
 #636802045446222199ae541e32c8133e 
google_analytics: 

# comment
# 评论系统

# disqus(https://disqus.com/)
# 填入注册好的shortname即可
disqus:
  comment: false
  shortname: lemonreds

# 基于 valine(https://github.com/xCss/Valine)
# 创建 leancloud 应用 获取 id|key 填入即可
leancloud:  
  comment: true
  app_id: cFM0eCo0CQ9xmBXmHi1eltol-gzGzoHsz
  app_key: oh9tizsnvV2vNvWgqEvoNtQO


# 基于 mob(http://www.mob.com)
# 文章分享功能
mob_share:
  true

# 文章分享链接
share_item:
- qq
- weixin
- weibo
#- douban
#- tumblr
#- facebook
#- twitter
#- google



# mathjax 
# 渲染LateX公式
# 全局开启后,在你需要显示LateX公式的文章头部增加配置 
# mathjax: true (参见下方说明)
mathjax:
  enable: true
  
  # 文章头部支持的配置有:
  # example:
  # ---
  # title: hexo-theme-nayo
  # date: 2018-02-08 21:44:25
  #
  # hide_toc: true | false
  # hide_excerpt: true | false
  # banner: /assets/05.jpg
  # mathjax: true
  # photos:
  # - /assets/01.jpg
  # - /assets/02.jpg
  # - /assets/03.jpg
  # - /assets/04.jpg
# ---

# 文章详情页面生效的配置
# hide_toc [boolean] 是否隐藏此文章的[TOC],默认为false
# hide_excerpt [boolean] 是否隐藏此[文章摘要](摘要只显示在首页,不显示在文章页),默认为false
# mathjax [boolean] 是否在此文章[渲染LateX公式]
# photos [array] 文章画廊展示图片

# footer
# 网站底部信息
footer:
  author: Lemon
  since: 2019

================================================
FILE: languages/en.yml
================================================
Menu:
  home: Home
  categories: Categories
  tags: Tags
  archives: Archives
  about: About
  search: Search
Page:
  Archives: Archives
  Categories: Categories
  Tags: Tags
  About: About

Post:
  Donate: Donate
  Share: Share
  Prev: older
  Next: newer
 
Archive:
  count: "%d"
  
  
Paginator: 
  Prev: Prev
  Next: Next


Contents: Contents
ReadMore: Continue
Untitled: Untitled

Search:
  Sidebar_words: Search
  input_words: Typing Something here.

================================================
FILE: languages/zh-CN.yml
================================================
Menu:
  home: 首页
  categories: 分类
  tags: 标签
  archives: 归档
  about: 关于
  search: 搜索
Page:
  Archives: 归档
  Categories: 分类
  Tags: 标签
  About: 关于

Post: 
  Donate: 赞赏
  Share: 分享
  Prev: older
  Next: newer

Archive:
  count: "%d"
  
Paginator: 
  Prev: 上一页
  Next: 下一页

Contents: CONTENT
ReadMore: 阅读更多
Untitled: 无标题
 
Search:
  Sidebar_words: 搜索
  input_words: 输入你想搜索的

================================================
FILE: languages/zh-TW.yml
================================================
Menu:
  home: 首頁
  categories: 分類
  tags: 標籤
  archives: 歸檔
  about: 關於
  search: 搜索
Page:
  Archives: 歸檔
  Categories: 分類
  Tags: 標籤
  About: 關於

Post: 
  Donate: 讚賞
  Share: 分享
  Prev: older
  Next: newer
 
Archive:
  count: "%d"
   
Paginator: 
  Prev: 上一頁
  Next: 下一頁

Contents: 目錄
ReadMore: 閱讀更多
Untitled: 無標題
 
Search:
  Sidebar_words: 搜索
  input_words: 输入你想搜索的



================================================
FILE: layout/_partial/_post/comment.ejs
================================================
<%# 评论%>
<div class="comment">

    <% if(theme.disqus.comment && theme.disqus.shortname ){ %>
    <div id="disqus_thread"></div>
    <script>
        (function () {
            var d = document,
                s = d.createElement('script');
            s.src = 'https://' + '<%- theme.disqus.shortname %>' + '.disqus.com/embed.js';
            s.setAttribute('data-timestamp', +new Date());
            (d.head || d.body).appendChild(s);
        })();
    </script>


    <% } else if (theme.leancloud.comment && theme.leancloud.app_id && theme.leancloud.app_key ){ %>

    <div id="comment">
    </div>

    <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>

    <script src='//unpkg.com/valine@v1.1.8-beta/dist/Valine.min.js'></script>

    <script>
        new Valine({
            el: '#comment',
            notify: false,
            verify: false,
            app_id: '<%- theme.leancloud.app_id %>',
            app_key: '<%- theme.leancloud.app_key %>',
            path: window.location.pathname,
            avatar: 'mm',
            guest_info: ['nick', 'mail']
        });
    </script>
    <% } %>
</div>

================================================
FILE: layout/_partial/_post/donate.ejs
================================================
<div class="donate-button">
	<i class="iconfont icon-donate"></i>
</div>

<% var donate = theme.donate %>


<div id="donate-box" class="none" >

	<span class="donate-cancel iconfont icon-cancel"></span>

	<div class="donate-img-box">
		<img id="donate-qr-wechat" class="noLazyLoad donate-img" src="<%- url_for( donate.wechat ) %>"  alt="No Donate Image!">	
		<img id="donate-qr-alipay" class="noLazyLoad donate-img" src="<%- url_for( donate.alipay ) %>"  alt="No Donate Image!">	
	</div>

	<span class="donate-word"><%- donate.word %></span>

	<div class="donate-list">
		<span class="iconfont icon-donate-wechat"></span>
		<span class="iconfont icon-donate-alipay"></span>
	</div>

</div>


================================================
FILE: layout/_partial/_post/footer.ejs
================================================
<div class="bottom">
  <div class="other">
    <div class="meta">
      <% if( page.categories && page.categories.length > 0 ) {%>
      <i class="iconfont icon-category"></i>
      <%-  list_categories( page.categories ,{
            show_count:false,
            style:'none',
            separator:" "    
          }) %>

      <% }%>

      <% if( page.tags &&  page.tags.length > 0 ) {%>
      <i class="iconfont icon-tag"></i>
      <%- list_tags( page.tags ,{
            show_count:false,
            style:'none',
            separator:" "      
            }) %>
      <% }%>
    </div>

    <div class="operate">
      <% if(theme.mob_share){%>
      <span class="text">Share</span>
      <%- partial('_partial/_post/mob_share') %>
      <% } %>
    </div>
  </div>


  <% if (page.prev || page.next){ %>
  <nav class="nav">
    <div class="link">
      <% if (page.next){ %>
      <a href="<%- url_for(page.next.path) %>" class="link-wrap">
        <strong class="caption"><%= __('Post.Prev') %></strong>
        <% var title = truncate(page.next.title, {length:60}) %>
        <span class="title">
          <%= title ||  __('Untitled') %>
        </span>
      </a>
      <% } %>
    </div>
    <div class="link">
      <% if (page.prev){ %>
      <a href="<%- url_for(post.prev.path) %>" class="link-wrap">
        <strong class="caption"><%= __('Post.Next') %></strong>
        <% var title = truncate(page.prev.title , {length:60}) %>
        <span class="title">
          <%= title ||  __('Untitled') %>
        </span>
      </a>
      <% } %>
    </div>
  </nav>
  <% } %>
</div>

================================================
FILE: layout/_partial/_post/gallery.ejs
================================================

<% if (post.photos && post.photos.length){ %>
	
	<div class="gallery">
		<% for( i in post.photos){%>
			<div class="image" 	
			style="background-image: url(<%- url_for(post.photos[i])%>);"></div>
		<%}%>  
	</div>
<%}%>

================================================
FILE: layout/_partial/_post/header.ejs
================================================
<%# 文章页面头部 %>
<div class="header">
		<p class="title">	
			<%= page.title|| __('Untitled') %>
		</p>
		<div class="info">	
			<time>
				<%= date(page.date,  "MMM DD, YYYY") %>
			</time>

			<%  var length = raw_length(post.content) %>
			<% if ( length > 0 ){%>
				<i class="iconfont icon-words"></i>
				<span class="words"><%= length %>
				</span>
			<% }%>
		</div>
</div>

================================================
FILE: layout/_partial/_post/mathjax.ejs
================================================
<%# mathjax %>
<% if(theme.mathjax.enable || post.mathjax ){%>
    <script type="text/x-mathjax-config">
        var post = document.getElementsByClassName("post")[0];  
        MathJax.Hub.Config({
            showProcessingMessages: false,
            messageStyle: "none",    
            tex2jax: {
                inlineMath:  [ ["$", "$"] , ["\\(","\\)"]],
                displayMath: [ ["$$","$$"] , ["\\[","\\]"]],
                skipTags: ['script', 'noscript', 'style', 'textarea', 'pre','code','a'],
            },
            "HTML-CSS": {            
                showMathMenu: false
            }
        });
        MathJax.Hub.Queue(["Typeset",MathJax.Hub,post]);
    </script>
    <style>.MathJax{outline:0;}</style>

    <script type="text/javascript" src="//cdn.bootcss.com/mathjax/2.7.2/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<%}%>

================================================
FILE: layout/_partial/_post/mob_share.ejs
================================================
<ul class="share">
	<% for ( i in theme.share_item){ %>   			             
        <li class="iconfont 
		icon-share-<%-theme.share_item[i]%> 
		-mob-share-<%-theme.share_item[i]%> 
		item"
		></li>		
   	<% } %>   
</ul>	

<script id="-mob-share" 
src="https://f1.webshare.mob.com/code/mob-share.js?appkey=21d601593a1de"></script>

================================================
FILE: layout/_partial/_post/toc.ejs
================================================
<% if(theme.toc && !page.hide_toc ){  %>
<div class="toc">
	<p class="toc-title">
		<%= __('Contents')%>
	</p>
	<div class="toc-list">
		<%- toc(page.content,{class:'toc-inner' , list_number:false}) %>
	</div>
</div>
<% } %>

================================================
FILE: layout/_partial/after-footer.ejs
================================================
<% if (theme.baidu_analytics){ %>


<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?<%- theme.baidu_analytics %>"; 
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<%}%>


<% if (theme.google_analytics){ %>

<script>
(function(i,s,o,g,r,a,m){
	i['GoogleAnalyticsObject']=r;
	i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', '<%= theme.google_analytics %>', 'auto');
ga('send', 'pageview');

</script>
<% } %>


================================================
FILE: layout/_partial/article.ejs
================================================
<%# post%>

<article class="article">		
	   
	<div class="article-header">
	    
		<a  class="title" href="<%- url_for(post.path) %>"><%= post.title || __('Untitled') %></a>  
	       
		 <%	var date_format = config.date_format %>

		<div class='meta'>
			<time><%= date(post.date,  "MMM DD, YYYY") %></time>			
		</div>
	</div>


	<% if (post.banner){ %>
		<div class="thumb">
			<div class="banner"  data-origin="<%- url_for(post.banner) %>"></div>
		</div>
	<% } %>

    
	<div class="typo article-excerpt">	
		<% if (post.excerpt) { %>
			<%- post.excerpt %>
		<% } else { %> 
			<%- post.content %>
		<%}%>  	  
	</div>



	<div class="article-categories">
	 <% if( post.categories && post.categories.length) {%>
      <i class="iconfont icon-category" style="margin-right:4px"></i>
	  	<% post.categories.sort('date',-1).each(function (cate){%>            
				<a class="link" href="<%- url_for(cate.path) %>"><%- cate.name %></a>           
		<% })%>
      <% }%>
	</div>
	

	<div class="article-tags">
		<%if(post.tags && post.tags.length){%>
			<i class="iconfont icon-tags" style="margin-right:4px"></i>
			<% post.tags.sort('date',-1).each(function (tag){%>            
				<a class="link" href="<%- url_for(tag.path) %>"><%- tag.name %></a>           
			<% })%>
		<%}%>
	</div>

	<div class='article-bottom'>
		<a class="readmore" href="<%- url_for(post.path) %>"><%= __('ReadMore') %></a> 	
	</div>	
    
</article>


================================================
FILE: layout/_partial/footer.ejs
================================================
<% var since = theme.footer.since %>
<% var year = date(new Date(), 'YYYY') %>

<footer class="footer">
	<div class="inner">
		<div class="copyright">
			&copy;
			<% if (since < year){%>
			<%= since %> -
			<% }%>
			<%= year %>
			<%= theme.footer.author || theme.profile.author || config.author %>

			<br/>
			By <a href="https://hexo.io" target="_blank">Hexo</a> Theme <a href="https://github.com/Lemonreds/hexo-theme-Nayo" target="_blank">Nayo</a>
		</div>
	</div>
</footer>

================================================
FILE: layout/_partial/head.ejs
================================================
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="viewport"content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes"/>
  <%
    var title = titlecase(page.title);

    if (is_archive()){
      title = __('Page.Archives');   
    } else if (is_category()){
      title = __('Page.Categories') + ': ' + page.category;
    } else if (is_tag()){
      title = __('Page.Tags') + ': ' + page.tag;
  }
  %>
  
  <title><% if (title){ %>  <%= title %> | <% } %>  <%= theme.title || config.title %> </title>

 
  <% if (theme.favicon){ %>
    <link rel="icon" href="<%- url_for(  theme.favicon ) %>">
  <% } %>


  <%- css('nayo.min') %> 
</head>

================================================
FILE: layout/_partial/header.ejs
================================================
<header class="header-wrapper">

  <nav class="inner">
    <div class="title">
      <a href="/">
        <img class="logo" src="<%- url_for(theme.profile.logo) %>" />
      </a>
    </div>

    <ul class="menu">
      <% for (var i in theme.menu){ %>
      <% if ( i  == 'search' ){%>
      <li class="item">
        <a class="link" id="menu-search">
          <i class="iconfont icon-<%-i %>" />
        </a>
        </l>

        <% } else {%>
      <li class="item">
        <a class="link" id="menu-<%-i%>" href="<%- url_for(theme.menu[i]) %>">
          <i class="iconfont icon-<%-i %>" />
        </a>
      </li>
      <% } %>
      <% } %>
    </ul>
  </nav>
</header>

<header class="mobile-header-wrapper">
  <i id="mobile-toggle" class="iconfont icon-menu mobile-toggle"></i>
</header>

================================================
FILE: layout/_partial/item.ejs
================================================
<% if(post) {%>	

	   <% var  date_format = config.date_format  %>

	   <article class="item slideDownMin">   	

        <time class="time"> <%= date(post.date, date_format || 'MMM Do, YYYY' ) %></time>    

        <a class="title" href="<%- url_for(post.path) %>"><%= post.title || __('Untitled')%></a>

      </article>

<% } %>

================================================
FILE: layout/_partial/page-name.ejs
================================================

<div class="page-name">
    <i class="iconfont <%- icon %>"></i>
    <span class="name"><%- name %></span>
</div>


================================================
FILE: layout/_partial/paginator.ejs
================================================

<% if (page.total > 1){ %> 
   <nav class="paginator">
    <% if (page.prev) { %>
        <a class="prev" href="<%- url_for(page.prev_link) %>"> 
            <i class="iconfont icon-left"></i>
            <%= __('Paginator.Prev') %>
        </a>
    <% } %>

   <span class="page-number"> Page <strong><%= page.current %></strong>, Posts <strong><%=__('Archive.count',site.posts.length)%></strong>. </span>

    <% if (page.next) { %>
        <a class="next" href="<%- url_for(page.next_link) %>"> 
            <%= __('Paginator.Next') %>
            <i class="iconfont icon-right"></i>
        </a>
    <% } %>
  </nav> 
<% } %>

================================================
FILE: layout/_partial/search.ejs
================================================
<div class="none" id="search">
    <div class="header">
        <input type="text" 
        placeholder="<%= __('Search.input_words') %>" 
        id="search-input" 
        class="input" />
        
        <i id="search-cancel" class="iconfont icon-cancel"></i>
    </div>

    <div id="search-result" class="result"></div>
</div>

================================================
FILE: layout/_partial/slide-menu.ejs
================================================
 <div class="mobile-menu">      

      <% if ( theme.favicon){ %>
      <img class="mobile-menu-icon" src= "<%- url_for(  theme.favicon ) %>" >  
      <% } %>

      <% for (var i in theme.menu){ %>   
            <% if ( i  == 'search' ){%>              

            <a class="mobile-menu-link mobile-menu-search" href="#"><%=__('Menu.search')%> </a>                 
            <% } else {%>

            <a class="mobile-menu-link" href="<%- url_for(theme.menu[i]) %>"><%= __('Menu.'+i) %>
            </a>
            <% } %>
      <% } %>   
      
</div>


================================================
FILE: layout/about.ejs
================================================
<section class="fadeIn slideDownMin">

	<% var name =  __('Page.About') %>
  	<%- partial('_partial/page-name',{icon:'icon-page-about',name: name }) %>


	<div class="typo">
		<%- page.content %>
	</div>

</section>

================================================
FILE: layout/archive.ejs
================================================
<section class="slideDownMin">

  <% var name =  __('Page.Archives') %>
  <%- partial('_partial/page-name',{icon:'icon-page-archive',name: name }) %>


  <% var  date_format = config.date_format  %>
  <% var last %>

  <div class="archive">
    <ul class="archive-post">
      <% page.posts.each(function (post) { %>

      <% var year = post.date.year() %>

      <%if(last != year ){%>

      <%# var posts = postsCount(site.posts , year) %>
      <li class="archive-year">
        <span class="year">
          <span><%= year %></span>
        </span>
      </li>
      <% last = year %>
      <% }%>
      <li class="archive-item">
        <time class="time"> <%= date(post.date,  "MMM Do") %> </time>
        <span class="title"> <a href="<%- url_for(post.path) %>"><%= post.title || __('Untitled')%></a></span>
      </li>

      <% }) %>
    </ul>
  </div>

</section>

<%- partial('_partial/paginator') %>

================================================
FILE: layout/category.ejs
================================================
<section>


  <% var name =  __('Page.Categories') %>

  <% if( is_category()){ %>

      <%- partial('_partial/page-name',{icon:'icon-category',name: page.category }) %>

  	   <div class="items">
          <% page.posts.each(function (post) { %>     

            <%- partial('_partial/item',{post: post}) %>       

          <% })%>
      </div>	
  <%}%>	    
</section>

================================================
FILE: layout/index.ejs
================================================
<%# profile %>


<div class="index slideDownMin">
	<% var profile = theme.profile %>

	<div class="profile">

		<img class="avatar" src="<%- url_for(profile.avatar) %>">

		<p class="author"><%= profile.author || config.author %></p>

		<div class="social">
			<% var index = 0 %>
			<% for ( i in theme.social) { %>
			<a target="_blank" class="links" href="<%- (theme.social[i]) %>">
				<i class="iconfont icon-<%= i %>" />
			</a>
			<% ++index %>
			<% } %>
		</div>
	</div>


	<%# article %>

	<% page.posts.sort('date', -1).each(function (post) { %>
	<% if (post.raw.length > 0 ) {%>
	<%- partial('_partial/article',{post:post}) %>
	<% }%>
	<% }) %>

	<%# paginator %>
	<%- partial('_partial/paginator') %>
	<%- partial('_partial/_post/mathjax',{}) %> 
</div>

================================================
FILE: layout/layout.ejs
================================================
<!DOCTYPE html>
<html>
  <%- partial('_partial/head') %>  
  <body>   
    
      <%- partial('_partial/header', null, {cache: !config.relative_link}) %>   

      <div class="container">       
          
          <% if (is_post() || is_home()) { %>
            <div class="container-inner">  
          <% } else{ %>
            <div class="container-inner slideDownMin">
          <% }%>

          <%-body%>
          </div> 
      </div>            
    
        <i id="toTop" class="iconfont icon-backtotop"></i>

  
    <%- partial('_partial/search') %>
    <%- partial('_partial/slide-menu') %>        
    <%- partial('_partial/after-footer') %>     
    <%- partial('_partial/footer') %>   

    <%- js('nayo.bundle')%>           
  </body>        
</html>

================================================
FILE: layout/post.ejs
================================================
<article class="post slideDownMin">
  
	<%- partial('_partial/_post/header',{post: page}) %> 
	<%- partial('_partial/_post/mathjax',{post: page}) %> 

	  <div class="typo post-content ">

		<% if (page.banner){ %>
			
				<div class="banner" 
				src="<%- url_for(page.banner) %>" 
				style="background-image:url(<%- url_for(page.banner) %>)"> </div>	

		<% } else if (page.photos && page.photos.length){ %> 	
				<%- partial('_partial/_post/gallery',{post:page}) %>			
		<%}%>

			<% if (page.excerpt && page.hide_excerpt ){ %>
					<%- page.more %>  					
			<%} else{%>
					<%- page.content %>  	
			<%}%>		
	  </div>     
	  

	<%- partial('_partial/_post/footer',{post: page}) %> 
	<%- partial('_partial/_post/comment') %>	
</article>
<%- partial('_partial/_post/toc',{post:page}) %>

================================================
FILE: layout/tag.ejs
================================================
<section>

  <% var name =  __('Page.Tags') %>
  

  <% if( is_tag()){ %>

  
        <%- partial('_partial/page-name',{icon:'icon-page-tags',name: page.tag }) %>

        <div class="items">
            <% page.posts.each(function (post) { %>     

                <%- partial('_partial/item',{post: post}) %>       

            <% })%>
        </div>


    <%} else {%>    

        <%- partial('_partial/page-name',{icon:'icon-page-tags',name: name }) %>

        <ul class="tag">
        <% site.tags.sort('date',-1).each( function (tag){%>
            <li class="tag-item">
                <a class="tag-wrap slideDownMin" href="<%- url_for(tag.path) %>">    
                    <span class="iconfont icon-tag-inner"></span>           
                    <span class="tag-name"> <%- tag.name %> </span>
                    <span class="tag-count"><%- tag.length %></span>  
                </a>
            </li>
        <% })%>

        </ul>

    <%}%>
</section>

================================================
FILE: package.json
================================================
{
  "name": "hexo-theme-nayo",
  "version": "0.4.0",
  "description": "a concise theme for hexo.",
  "scripts": {
    "build": "webpack --config webpack.config.js --mode production",
    "dev": "webpack --config webpack.config.js --watch --progress"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Lemonreds/hexo-theme-nayo.git"
  },
  "author": "lemonreds",
  "license": "MIT",
  "homepage": "https://github.com/Lemonreds/hexo-theme-nayo#readme",
  "devDependencies": {
    "autoprefixer": "^9.5.0",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.2",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.7.0",
    "clean-webpack-plugin": "^2.0.1",
    "css-loader": "^2.1.1",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "file-loader": "^3.0.1",
    "node-sass": "^4.11.0",
    "optimize-css-assets-webpack-plugin": "^5.0.1",
    "postcss-loader": "^3.0.0",
    "sass-loader": "^7.1.0",
    "style-loader": "^0.23.1",
    "url-loader": "^1.1.2",
    "webpack": "^4.29.6",
    "webpack-cli": "^3.3.0"
  }
}


================================================
FILE: scripts/raw_length.js
================================================

/**
 * 
 * POST LENGTH
 * 
 */

hexo.extend.helper.register('raw_length', function (string) {
    
    if( Object.prototype.toString.call(string) ==='[object String]'){
        return string.replace(/<\/?[^>]*>/g, "").replace(/ /g, '').length
    }else{
        return 0
    }

})

================================================
FILE: scripts/render_img.js
================================================
let cheerio = require('cheerio'),
    loadedImage = 4,
    placeHolder = '/images/placeholder.png';


/**
 * 
 * 
 * LAZYLOAD
 * 
 */
function renderImg(source) {

    let $ = cheerio.load(source, {
            decodeEntities: false
        }),
        gallery = $('.gallery,.banner'),
        img = $('img');


    gallery.each((idx, element) => {

        let origin = $(element).attr('data-origin')

        if (origin && origin !== placeHolder) {

            $(element).attr({
                'data-src': origin
            });
            $(element).css('background-image', `url("${placeHolder}")`)
            $(element).addClass('lazyload')
        }
    });

    img.each((idx, element) => {

        if (idx > loadedImage) {
            let src = $(element).attr('src')

            if (src && src !== placeHolder) {
                $(element).attr({
                    'data-src': src,
                    'src': placeHolder
                });
            }
            $(element).addClass('lazyload')
        }

    });

    return $.html()
}

hexo.extend.filter.register('after_render:html', renderImg)

================================================
FILE: source/nayo.bundle.js
================================================
!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=38)}([function(t,e,n){var r=n(27)("wks"),o=n(28),i=n(2).Symbol,u="function"==typeof i;(t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))}).store=r},function(t,e){var n=t.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e,n){"use strict";var r=i(n(60)),o=i(n(4));function i(t){return t&&t.__esModule?t:{default:t}}var u={query:function(t){if(!o.default.isStr(t))return(0,r.default)(null);var e=document.querySelectorAll(t);return 1===e.length?e[0]:e},addLoadEvent:function(t){var e=window.onload;"function"!=typeof window.onload?window.onload=t:window.onload=function(){e(),t()}},moveSmooth:function(t){var e=0;o.default.isNode(t)&&(e=t.offsetTop),window.scrollTo({top:e,behavior:"smooth"})}};t.exports=u},function(t,e,n){"use strict";t.exports={isMobile:function(){for(var t=navigator.userAgent,e=["Android","iPhone","SymbianOS","Windows Phone","iPad","iPod"],n=0;n<e.length;n++){var r=e[n];if(t.indexOf(r)>0)return!0}return!1},isFunc:function(t){return"function"==typeof t},isStr:function(t){return"string"==typeof t},isNode:function(t){return t.nodeType===Node.ELEMENT_NODE},isArray:function(t){return Array.isArray(t)},filterHTML:function(t){return t=(t=(t=t.replace(/<\/?[^>]*>/g,"")).replace(/[|]*\n/,"")).replace(/&npsp;/gi,"")}}},function(t,e){t.exports={}},function(t,e,n){var r=n(7),o=n(15);t.exports=n(9)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(8),o=n(46),i=n(47),u=Object.defineProperty;e.f=n(9)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return u(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(14);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e,n){t.exports=!n(23)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(2),o=n(1),i=n(22),u=n(6),a=n(11),s=function(t,e,n){var c,f,l,d=t&s.F,p=t&s.G,v=t&s.S,h=t&s.P,y=t&s.B,m=t&s.W,g=p?o:o[e]||(o[e]={}),b=g.prototype,x=p?r:v?r[e]:(r[e]||{}).prototype;for(c in p&&(n=e),n)(f=!d&&x&&void 0!==x[c])&&a(g,c)||(l=f?x[c]:n[c],g[c]=p&&"function"!=typeof x[c]?n[c]:y&&f?i(l,r):m&&x[c]==l?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(l):h&&"function"==typeof l?i(Function.call,l):l,h&&((g.virtual||(g.virtual={}))[c]=l,t&s.R&&b&&!b[c]&&u(b,c,l)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,t.exports=s},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(44),o=n(13);t.exports=function(t){return r(o(t))}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on  "+t);return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(27)("keys"),o=n(28);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){t.exports={default:n(39),__esModule:!0}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){"use strict";var r=n(21),o=n(10),i=n(48),u=n(6),a=n(5),s=n(49),c=n(30),f=n(56),l=n(0)("iterator"),d=!([].keys&&"next"in[].keys()),p=function(){return this};t.exports=function(t,e,n,v,h,y,m){s(n,e,v);var g,b,x,w=function(t){if(!d&&t in S)return S[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},_=e+" Iterator",C="values"==h,L=!1,S=t.prototype,M=S[l]||S["@@iterator"]||h&&S[h],O=M||w(h),E=h?C?w("entries"):O:void 0,T="Array"==e&&S.entries||M;if(T&&(x=f(T.call(new t)))!==Object.prototype&&x.next&&(c(x,_,!0),r||"function"==typeof x[l]||u(x,l,p)),C&&M&&"values"!==M.name&&(L=!0,O=function(){return M.call(this)}),r&&!m||!d&&!L&&S[l]||u(S,l,O),a[e]=O,a[_]=p,h)if(g={values:C?O:w("values"),keys:y?O:w("keys"),entries:E},m)for(b in g)b in S||i(S,b,g[b]);else o(o.P+o.F*(d||L),e,g);return g}},function(t,e){t.exports=!0},function(t,e,n){var r=n(45);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(14),o=n(2).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){var r=n(8),o=n(50),i=n(29),u=n(17)("IE_PROTO"),a=function(){},s=function(){var t,e=n(24)("iframe"),r=i.length;for(e.style.display="none",n(55).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),s=t.F;r--;)delete s.prototype[i[r]];return s()};t.exports=Object.create||function(t,e){var n;return null!==t?(a.prototype=r(t),n=new a,a.prototype=null,n[u]=t):n=s(),void 0===e?n:o(n,e)}},function(t,e,n){var r=n(16),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(1),o=n(2),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(21)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(7).f,o=n(11),i=n(0)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(13);t.exports=function(t){return Object(r(t))}},function(t,e,n){"use strict";var r=n(57)(!0);n(20)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(59),o=n(0)("iterator"),i=n(5);t.exports=n(1).getIteratorMethod=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},function(t,e,n){"use strict";e.__esModule=!0,e.default=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e,n){"use strict";e.__esModule=!0;var r,o=n(64),i=(r=o)&&r.__esModule?r:{default:r};e.default=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),(0,i.default)(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}()},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=u(n(34)),o=u(n(35)),i=u(n(4));function u(t){return t&&t.__esModule?t:{default:t}}var a=function(){function t(){(0,r.default)(this,t),this.listener=[],this.time=null,this._init()}return(0,o.default)(t,[{key:"_init",value:function(){var t=this;window.addEventListener("scroll",function(e){t.time&&clearTimeout(t.time),t.time=setTimeout(t._dispatch,0,t.listener,e)})}},{key:"_dispatch",value:function(t,e){t.forEach(function(t){return t(e)})}},{key:"addEvent",value:function(t){if(!i.default.isFunc(t))throw new Error("params error.");this.listener.push(t)}}]),t}();e.default=new a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){var t=document.createElement("div");t.className="mask none",document.body.appendChild(t);var e=[];return t.addEventListener("click",function(){e.forEach(function(t){t&&t()})}),{show:function(){return t.addClass("block").removeClass("none"),this},hide:function(){return t.addClass("none").removeClass("block"),this},addHideEvent:function(t){return e.push(t)-1},clear:function(){e=[]}}}()},function(t,e,n){"use strict";var r=l(n(18)),o=n(3),i=l(n(63)),u=l(n(67)),a=l(n(68)),s=l(n(69)),c=l(n(70)),f=l(n(71));function l(t){return t&&t.__esModule?t:{default:t}}n(72),n(81),(0,o.addLoadEvent)(function(){var t=[a.default,s.default,i.default,u.default,c.default,f.default],e=!0,n=!1,o=void 0;try{for(var l,d=(0,r.default)(t);!(e=(l=d.next()).done);e=!0){l.value.init()}}catch(t){n=!0,o=t}finally{try{!e&&d.return&&d.return()}finally{if(n)throw o}}}),console.log("Hexo Theme Nayo, By Lemonreds."),console.log("@see [https://github.com/Lemonreds/hexo-theme-nayo]")},function(t,e,n){n(40),n(32),t.exports=n(58)},function(t,e,n){n(41);for(var r=n(2),o=n(6),i=n(5),u=n(0)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),s=0;s<a.length;s++){var c=a[s],f=r[c],l=f&&f.prototype;l&&!l[u]&&o(l,u,c),i[c]=i.Array}},function(t,e,n){"use strict";var r=n(42),o=n(43),i=n(5),u=n(12);t.exports=n(20)(Array,"Array",function(t,e){this._t=u(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var r=n(19);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){t.exports=!n(9)&&!n(23)(function(){return 7!=Object.defineProperty(n(24)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(14);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){t.exports=n(6)},function(t,e,n){"use strict";var r=n(25),o=n(15),i=n(30),u={};n(6)(u,n(0)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(u,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e,n){var r=n(7),o=n(8),i=n(51);t.exports=n(9)?Object.defineProperties:function(t,e){o(t);for(var n,u=i(e),a=u.length,s=0;a>s;)r.f(t,n=u[s++],e[n]);return t}},function(t,e,n){var r=n(52),o=n(29);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(11),o=n(12),i=n(53)(!1),u=n(17)("IE_PROTO");t.exports=function(t,e){var n,a=o(t),s=0,c=[];for(n in a)n!=u&&r(a,n)&&c.push(n);for(;e.length>s;)r(a,n=e[s++])&&(~i(c,n)||c.push(n));return c}},function(t,e,n){var r=n(12),o=n(26),i=n(54);t.exports=function(t){return function(e,n,u){var a,s=r(e),c=o(s.length),f=i(u,c);if(t&&n!=n){for(;c>f;)if((a=s[f++])!=a)return!0}else for(;c>f;f++)if((t||f in s)&&s[f]===n)return t||f||0;return!t&&-1}}},function(t,e,n){var r=n(16),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},function(t,e,n){var r=n(2).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(11),o=n(31),i=n(17)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,e,n){var r=n(16),o=n(13);t.exports=function(t){return function(e,n){var i,u,a=String(o(e)),s=r(n),c=a.length;return s<0||s>=c?t?"":void 0:(i=a.charCodeAt(s))<55296||i>56319||s+1===c||(u=a.charCodeAt(s+1))<56320||u>57343?t?a.charAt(s):i:t?a.slice(s,s+2):u-56320+(i-55296<<10)+65536}}},function(t,e,n){var r=n(8),o=n(33);t.exports=n(1).getIterator=function(t){var e=o(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return r(e.call(t))}},function(t,e,n){var r=n(19),o=n(0)("toStringTag"),i="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),o))?n:i?r(e):"Object"==(u=r(e))&&"function"==typeof e.callee?"Arguments":u}},function(t,e,n){t.exports={default:n(61),__esModule:!0}},function(t,e,n){n(62);var r=n(1).Object;t.exports=function(t,e){return r.create(t,e)}},function(t,e,n){var r=n(10);r(r.S,"Object",{create:n(25)})},function(t,e,n){"use strict";var r=i(n(34)),o=i(n(35));function i(t){return t&&t.__esModule?t:{default:t}}var u=function(){function t(e){(0,r.default)(this,t),this.settings={src:"data-src",nolazy:"noLazyLoad"},this.root=window,this.images=e,this.observer=null,this.init()}return(0,o.default)(t,[{key:"init",value:function(){var t=this;if(this.root.IntersectionObserver){var e=this;this.observer=new IntersectionObserver(function(t){t.forEach(function(t){if(t.intersectionRatio>0){e.observer.unobserve(t.target);var n=t.target.getAttribute(e.settings.src);n&&("img"===t.target.tagName.toLowerCase()?(t.target.src=n,t.target.removeAttribute(e.settings.src)):(t.target.style.backgroundImage="url("+n+")",t.target.removeAttribute(e.settings.src)))}})},{root:null,rootMargin:"0px",threshold:[0]}),this.images.forEach(function(n){if(t.isNolazy(n)){var r=n.getAttribute(e.settings.src);r&&("img"===n.tagName.toLowerCase()?(n.src=r,n.removeAttribute(e.settings.src)):(n.style.backgroundImage="url("+r+")",n.removeAttribute(e.settings.src)))}else e.observer.observe(n)})}else this.loadImages()}},{key:"loadImages",value:function(){if(this.settings){var t=this;this.images.forEach(function(e){var n=e.getAttribute(t.settings.src);n&&("img"===e.tagName.toLowerCase()?(e.src=n,e.removeAttribute(t.settings.src)):(e.style.backgroundImage="url("+n+")",e.removeAttribute(t.settings.src)))})}}},{key:"isNolazy",value:function(t){return-1!==t.className.split(" ").indexOf(this.settings.nolazy)}}]),t}();e.init=function(){var t=document.getElementsByClassName("lazyload");HTMLCollection.prototype.forEach||(HTMLCollection.prototype.forEach=function(t){Array.prototype.slice.call(this).forEach(t)}),new u(t)}},function(t,e,n){t.exports={default:n(65),__esModule:!0}},function(t,e,n){n(66);var r=n(1).Object;t.exports=function(t,e,n){return r.defineProperty(t,e,n)}},function(t,e,n){var r=n(10);r(r.S+r.F*!n(9),"Object",{defineProperty:n(7).f})},function(t,e,n){"use strict";var r=i(n(3)),o=i(n(36));function i(t){return t&&t.__esModule?t:{default:t}}e.init=function(){var t="#toTop",e="leftIn",n="rightOut",i=r.default.query(t);i.addEventListener("click",r.default.moveSmooth),o.default.addEvent(function(){document.documentElement.scrollTop>800?i.addClass(e).removeClass(n):i.addClass(n).removeClass(e)})}},function(t,e,n){"use strict";var r=u(n(18)),o=u(n(3)),i=u(n(4));function u(t){return t&&t.__esModule?t:{default:t}}e.init=function(){if(!i.default.isMobile()){var t={pages:["home","archives","categories","tags","about"],acitveClass:"menu-active",activeCurrent:"home",prefixer:"#menu-"},e=window.location.href,n=!0,u=!1,a=void 0;try{for(var s,c=(0,r.default)(t.pages);!(n=(s=c.next()).done);n=!0){var f=s.value;if(-1!==e.indexOf(f)){t.activeCurrent=f;break}}}catch(t){u=!0,a=t}finally{try{!n&&c.return&&c.return()}finally{if(u)throw a}}var l=o.default.query(t.prefixer.concat(t.activeCurrent));try{l.addClass(t.acitveClass)}catch(e){o.default.query(t.prefixer.concat("home")).addClass(t.acitveClass)}}}},function(t,e,n){"use strict";var r=u(n(3)),o=u(n(36)),i=u(n(4));function u(t){return t&&t.__esModule?t:{default:t}}e.init=function(){if(!i.default.isMobile()){var t=r.default.query(".header-wrapper"),e=0,n=0;o.default.addEvent(function(r){0===(n=window.pageYOffset)?t.addClass("header-static").removeClass(["header-fixed","slideUp","slideDown"]):n-e>0?t.addClass(["header-fixed","slideUp"]).removeClass(["header-static","slideDown"]):t.addClass(["header-fixed","slideDown"]).removeClass(["header-static","slideUp"]),e=n})}}},function(t,e,n){"use strict";var r=u(n(3)),o=u(n(4)),i=u(n(37));function u(t){return t&&t.__esModule?t:{default:t}}e.init=function(){var t,e,n,u,a="#search",s="#menu-search",c=".mobile-menu-search",f="#search-cancel",l="#search-input",d="#search-result",p=["show"],v=["none"],h=r.default.query(a),y=r.default.query(f),m=function(){i.default.show(),h.addClass(p).removeClass(v)};r.default.query(s).addEventListener("click",m),y.addEventListener("click",function(){i.default.hide(),h.addClass(v).removeClass(p)}),o.default.isMobile()&&r.default.query(c).addEventListener("click",m),t=l,e=d,n={url:"/search.xml",success:function(n){var i=n.querySelectorAll("entry").map(function(t){var e=t.children[0].textContent,n=o.default.filterHTML(t.children[2].textContent),r=t.children[1].attributes[0].nodeValue;return{title:e,content:n,href:r}}),u=r.default.query(t),a=r.default.query(e);u.addEventListener("input",function(){var t="",e=this.value.trim().toLowerCase().split(/[\s\-]+/);if(a.innerHTML="",!(e.length<=0)){var n=!0;i.forEach(function(r){r.title&&""!==r.title.trim()||(r.title="Untitled");var o=r.title.trim().toLowerCase(),i=r.content.trim().toLowerCase(),u=r.href,a=-1,s=-1,c=-1;if(""!==i?e.forEach(function(t,e){a=o.indexOf(t),s=i.indexOf(t),a<0&&s<0?n=!1:(s<0&&(s=0),0==e&&(c=s))}):n=!1,n){t+="<div class='search-item'>",t+="<a href='"+u+"' class='search-title'>"+o+"</a>";var f=r.content;if(c>=0){var l=c-40,d=c+60;l<0&&(l=0),0==l&&(d=100),d>f.length&&(d=f.length);var p=f.substr(l,d);e.forEach(function(t){var e=new RegExp(t,"gi");p=p.replace(e,'<span class="search-keyword">'+t+"</span>")}),t+='<p class="search-content">'+p+"</p>"}t+="</div>"}}),-1===t.indexOf("<div")?a.innerHTML="<div class='iconfont icon-nofound search-empty'></div>":a.innerHTML=t}})}},(u=new XMLHttpRequest).onreadystatechange=function(){4===u.readyState&&(200==u.status?n.success&&n.success(u.responseXML):n.fail&&n.fail(status))},u.open("GET",n.url,!0),u.send(null)}},function(t,e,n){"use strict";var r=u(n(3)),o=u(n(4)),i=u(n(37));function u(t){return t&&t.__esModule?t:{default:t}}e.init=function(){if(o.default.isMobile()){var t={isShow:!1,toggle:"#mobile-toggle",mobileMenu:".mobile-menu",header:".mobile-header-wrapper",container:".container",footer:".footer",menuShowClass:"menuIn",menuHideClass:"menuOut",pageShowClass:"slideIn",pageHideClass:"slideOut",hideToggleClass:"icon-no-menu",showToggleClass:"icon-menu"},e=r.default.query(t.toggle),n=r.default.query(t.mobileMenu),u=[r.default.query(t.header),r.default.query(t.container),r.default.query(t.footer)];n.addEventListener("click",a),e.addEventListener("click",function(){t.isShow?a():(i.default.show(),e.addClass(t.hideToggleClass).removeClass(t.showToggleClass),u.forEach(function(e){e.addClass(t.pageHideClass).removeClass(t.pageShowClass)}),n.addClass(t.menuShowClass).removeClass(t.menuHideClass),t.isShow=!0)})}function a(){i.default.hide(),e.addClass(t.showToggleClass).removeClass(t.hideToggleClass),u.forEach(function(e){e.addClass(t.pageShowClass).removeClass(t.pageHideClass)}),n.addClass(t.menuHideClass).removeClass(t.menuShowClass),t.isShow=!1}}},function(t,e,n){"use strict";var r,o=n(73),i=(r=o)&&r.__esModule?r:{default:r};NodeList.prototype.forEach=function(t){Array.prototype.slice.call(this).forEach(t)},NodeList.prototype.map=function(t){return Array.prototype.slice.call(this).map(t)},NodeList.prototype.filter=function(t){return Array.prototype.slice.call(this).filter(t)},Node.prototype.addClass=function(t){var e;Array.isArray(t)?(e=this.classList).add.apply(e,(0,i.default)(t)):this.classList.add(t);return this},Node.prototype.removeClass=function(t){var e;Array.isArray(t)?(e=this.classList).remove.apply(e,(0,i.default)(t)):this.classList.remove(t);return this}},function(t,e,n){"use strict";e.__esModule=!0;var r,o=n(74),i=(r=o)&&r.__esModule?r:{default:r};e.default=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return(0,i.default)(t)}},function(t,e,n){t.exports={default:n(75),__esModule:!0}},function(t,e,n){n(32),n(76),t.exports=n(1).Array.from},function(t,e,n){"use strict";var r=n(22),o=n(10),i=n(31),u=n(77),a=n(78),s=n(26),c=n(79),f=n(33);o(o.S+o.F*!n(80)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,o,l,d=i(t),p="function"==typeof this?this:Array,v=arguments.length,h=v>1?arguments[1]:void 0,y=void 0!==h,m=0,g=f(d);if(y&&(h=r(h,v>2?arguments[2]:void 0,2)),null==g||p==Array&&a(g))for(n=new p(e=s(d.length));e>m;m++)c(n,m,y?h(d[m],m):d[m]);else for(l=g.call(d),n=new p;!(o=l.next()).done;m++)c(n,m,y?u(l,h,[o.value,m],!0):o.value);return n.length=m,n}})},function(t,e,n){var r=n(8);t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(e){var i=t.return;throw void 0!==i&&r(i.call(t)),e}}},function(t,e,n){var r=n(5),o=n(0)("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},function(t,e,n){"use strict";var r=n(7),o=n(15);t.exports=function(t,e,n){e in t?r.f(t,e,o(0,n)):t[e]=n}},function(t,e,n){var r=n(0)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],u=i[r]();u.next=function(){return{done:n=!0}},i[r]=function(){return u},t(i)}catch(t){}return n}},function(t,e){}]);

================================================
FILE: src/scripts/activeNav.js
================================================
import dom from '@scripts/dom'
import Util from '@scripts/util'

exports.init = () => {

    if (Util.isMobile()) return;

    const _ = {
        pages: ['home', 'archives', 'categories', 'tags', 'about'],
        acitveClass: 'menu-active',
        activeCurrent: 'home',
        prefixer: '#menu-'
    }

    let href = window.location.href

    for (let type of _.pages) {
        if (href.indexOf(type) !== -1) {
            _.activeCurrent = type
            break
        }
    }

    let activeItem = dom.query(_.prefixer.concat(_.activeCurrent))

    try {
        activeItem.addClass(_.acitveClass)
    } catch (err) {
        dom.query(_.prefixer.concat('home')).addClass(_.acitveClass)
    }
}

================================================
FILE: src/scripts/dom.js
================================================
/**
 * 
 * DOM helper
 * 
 */

import Util from '@scripts/util'

const dom = {
    query(selector) {
        if (!Util.isStr(selector)) return Object.create(null)
        const res = document.querySelectorAll(selector)

        if (res.length === 1) return res[0]
        return res
    },
    addLoadEvent(fun) {
        var old = window.onload
        if (typeof window.onload != "function") {
            window.onload = fun
        } else {
            window.onload = function () {
                old()
                fun()
            }
        }
    },
    moveSmooth(node) {

        let offsetTop = 0

        if (Util.isNode(node)) {
            offsetTop = node.offsetTop
        }

        window.scrollTo({
            top: offsetTop,
            behavior: "smooth"
        })
    }
}


module.exports = dom

================================================
FILE: src/scripts/extends.js
================================================
/**
 *  扩展了原生DOM集合方法
 *  使得其支持 forEach,map,filter
 */

NodeList.prototype.forEach = function (cb) {
    Array.prototype.slice.call(this).forEach(cb)
}

NodeList.prototype.map = function (cb) {
    return Array.prototype.slice.call(this).map(cb)
}

NodeList.prototype.filter = function (cb) {
    return Array.prototype.slice.call(this).filter(cb)
}


/**
 * 
 *扩展了原生NODE方法
 * 
 */

Node.prototype.addClass = function (className) {
    if (Array.isArray(className)) {
        this.classList.add(...className)
    } else {
        this.classList.add(className)
    }
    return this
}

Node.prototype.removeClass = function (className) {
    if (Array.isArray(className)) {
        this.classList.remove(...className)
    } else {
        this.classList.remove(className)
    }
    return this
}

================================================
FILE: src/scripts/header.js
================================================
import dom from '@scripts/dom'
import scroll from '@scripts/scroll'
import Util from '@scripts/util'

exports.init = () => {

    if (Util.isMobile()) return;

    const _ = {
        dom: '.header-wrapper'
    }

    let node = dom.query(_.dom)
    let last = 0,
        current = 0

    scroll.addEvent(e => {

        current = window.pageYOffset
        if (current === 0) {
            // 到达顶部
            node.addClass('header-static')
                .removeClass(['header-fixed', 'slideUp', 'slideDown'])
        } else if (current - last > 0) {
            // 下滑            
            node.addClass(['header-fixed', 'slideUp'])
                .removeClass(['header-static', 'slideDown'])
        } else {
            // 上滑           
            node.addClass(['header-fixed', 'slideDown'])
                .removeClass(['header-static', 'slideUp'])
        }

        last = current
    })
}

================================================
FILE: src/scripts/lazyload.js
================================================
/**
 * LazyLoad 图片懒加载
 */

class LazyLoad {

    constructor(images) {
        this.settings = {
            src: 'data-src',
            nolazy: 'noLazyLoad'
        }
        this.root = window
        this.images = images
        this.observer = null
        this.init()
    }

    init() {
        if (!this.root.IntersectionObserver) {
            this.loadImages()
            return
        }

        let self = this
        let observerConfig = {
            root: null,
            rootMargin: "0px",
            threshold: [0]
        }

        this.observer = new IntersectionObserver(function (entries) {
            entries.forEach(function (entry) {
                if (entry.intersectionRatio > 0) {
                    self.observer.unobserve(entry.target)

                    let src = entry.target.getAttribute(self.settings.src)

                    if (src) {
                        if ("img" === entry.target.tagName.toLowerCase()) {

                            entry.target.src = src
                            entry.target.removeAttribute(self.settings.src)
                        } else {
                            entry.target.style.backgroundImage = "url(" + src + ")"
                            entry.target.removeAttribute(self.settings.src)
                        }
                    }
                }
            })
        }, observerConfig)

        this.images.forEach(image => {

            if (this.isNolazy(image)) {

                let src = image.getAttribute(self.settings.src)
                if (src) {
                    if ("img" === image.tagName.toLowerCase()) {

                        image.src = src
                        image.removeAttribute(self.settings.src)
                    } else {
                        image.style.backgroundImage = "url(" + src + ")"
                        image.removeAttribute(self.settings.src)
                    }
                }
            } else {
                self.observer.observe(image)
            }
        })
    }


    loadImages() {
        if (!this.settings) {
            return
        }

        let self = this
        this.images.forEach(function (image) {
            let src = image.getAttribute(self.settings.src)
            if (src) {
                if ("img" === image.tagName.toLowerCase()) {

                    image.src = src
                    image.removeAttribute(self.settings.src)
                } else {
                    image.style.backgroundImage = "url(" + src + ")"
                    image.removeAttribute(self.settings.src)
                }
            }

        })
    }


    isNolazy(image) {
        return image.className.split(' ').indexOf(this.settings.nolazy) !== -1
    }
}


exports.init = () => {

    let imgs = document.getElementsByClassName('lazyload')

    if (!HTMLCollection.prototype.forEach) {
        HTMLCollection.prototype.forEach = function (cb) {
            Array.prototype.slice.call(this).forEach(cb)
        }
    }
    new LazyLoad(imgs)
}

================================================
FILE: src/scripts/main.js
================================================
require('@scripts/extends')
require('@styles/styles.scss')

import {
    addLoadEvent
} from '@scripts/dom'
import Lazyload from '@scripts/lazyload'
import Totop from '@scripts/totop'
import ActiveNav from '@scripts/activeNav'
import Header from '@scripts/header'
import Search from '@scripts/search'
import Mobile from '@scripts/mobile'


addLoadEvent(() => {

    const funcs = [ActiveNav, Header, Lazyload, Totop, Search, Mobile]

    for (let fn of funcs) {
        fn.init()
    }
})

// JUST SAY HELLO WORLD.
console.log('Hexo Theme Nayo, By Lemonreds.')
console.log('@see [https://github.com/Lemonreds/hexo-theme-nayo]')

================================================
FILE: src/scripts/mask.js
================================================
function mask() {

    let mask = document.createElement('div')
    mask.className = 'mask none'

    document.body.appendChild(mask)

    let event = []

    mask.addEventListener('click', () => {
        event.forEach(funs => {
            funs && funs()
        })
    })


    return {
        show() {
            mask.addClass('block').removeClass('none')
            return this
        },
        hide() {
            mask.addClass('none').removeClass('block')
            return this
        },
        addHideEvent(funs) {
            return event.push(funs) - 1
        },
        clear() {
            event = []
        }
    }
}

export default mask()

================================================
FILE: src/scripts/mobile.js
================================================
import dom from '@scripts/dom'
import Util from '@scripts/util'
import Mask from '@scripts/mask'

exports.init = () => {

    if (!Util.isMobile()) return;

    const _ = {
        isShow: false,
        toggle: '#mobile-toggle',
        mobileMenu: '.mobile-menu',

        header: '.mobile-header-wrapper',
        container: '.container',
        footer: '.footer',

        menuShowClass: 'menuIn',
        menuHideClass: 'menuOut',

        pageShowClass: 'slideIn',
        pageHideClass: 'slideOut',

        hideToggleClass: 'icon-no-menu',
        showToggleClass: 'icon-menu',
    }

    const toggle = dom.query(_.toggle)
    const mobileMenu = dom.query(_.mobileMenu)
    const pageNodes = [dom.query(_.header), dom.query(_.container), dom.query(_.footer)]



    mobileMenu.addEventListener('click', hideMobileMenu)

    toggle.addEventListener('click', () => {
        _.isShow ? hideMobileMenu() : showMobileMenu()
    })


    function hideMobileMenu() {
        Mask.hide()

        toggle.addClass(_.showToggleClass)
            .removeClass(_.hideToggleClass)


        pageNodes.forEach(node => {
            node.addClass(_.pageShowClass)
                .removeClass(_.pageHideClass)
        })


        mobileMenu.addClass(_.menuHideClass)
            .removeClass(_.menuShowClass)

        _.isShow = false
    }


    function showMobileMenu() {
        Mask.show()


        toggle.addClass(_.hideToggleClass)
            .removeClass(_.showToggleClass)

        pageNodes.forEach(node => {
            node.addClass(_.pageHideClass)
                .removeClass(_.pageShowClass)
        })


        mobileMenu.addClass(_.menuShowClass)
            .removeClass(_.menuHideClass)

        _.isShow = true
    }

}

================================================
FILE: src/scripts/scroll.js
================================================
/**
 * 
 * 
 * window scroll handler
 * 
 * 
 */
import Util from '@scripts/util'

class Scroll {

    constructor() {
        this.listener = []
        this.time = null
        this._init()
    }

    _init() {

        window.addEventListener('scroll', event => {
            if (this.time) {
                clearTimeout(this.time)
            }
            this.time = setTimeout(this._dispatch, 0, this.listener, event)
        })
    }


    _dispatch(listener, event) {
        listener.forEach(item => (item(event)))
    }


    addEvent(func) {

        if (!Util.isFunc(func)) throw new Error('params error.')


        this.listener.push(func)
    }

}

export default new Scroll()

================================================
FILE: src/scripts/search.js
================================================
function ajax(options) {

    const xhr = new XMLHttpRequest()

    xhr.onreadystatechange = () => {
        if (xhr.readyState === 4) {
            if (xhr.status == 200) {
                options.success && options.success(xhr.responseXML)
            } else {
                options.fail && options.fail(status)
            }
        }
    }

    xhr.open('GET', options.url, true)
    xhr.send(null)
}


import dom from '@scripts/dom'
import Util from '@scripts/util'
import Mask from '@scripts/mask'


exports.init = () => {

    const _ = {
        search: '#search',
        menuLink: '#menu-search',
        moblieLink: '.mobile-menu-search',
        cancel: '#search-cancel',
        input: '#search-input',
        result: '#search-result',
        showClass: ['show'],
        hideClass: ['none']
    }

    const search = dom.query(_.search),
        cancel = dom.query(_.cancel),
        menuLink = dom.query(_.menuLink)

    const showSearch = () => {
        Mask.show()

        search.addClass(_.showClass)
            .removeClass(_.hideClass)
    }

    const hideSeach = () => {
        Mask.hide()

        search.addClass(_.hideClass)
            .removeClass(_.showClass)
    }

    menuLink.addEventListener('click', showSearch)
    cancel.addEventListener('click', hideSeach)

    if (Util.isMobile()) {
        dom.query(_.moblieLink).addEventListener('click', showSearch)
    }

    fetch('/search.xml', _.input, _.result)
}



/**
 * 发起AJAX请求
 * 获取文档
 */
function fetch(path, input, result) {
    ajax({
        url: path,
        success: xml => {

            /**
             * 对数据进行过滤
             */
            const data = xml.querySelectorAll('entry').map(entry => {
                let title = entry.children[0].textContent,
                    content = Util.filterHTML(entry.children[2].textContent),
                    href = entry.children[1].attributes[0].nodeValue
                return {
                    title,
                    content,
                    href
                }
            })

            /**
             * 插入数据
             */

            const $input = dom.query(input)
            const $result = dom.query(result)

            $input.addEventListener('input', function () {


                let str = ''
                let key = this.value.trim().toLowerCase().split(/[\s\-]+/)


                $result.innerHTML = ''

                if (key.length <= 0) return;

                let isMatch = true

                data.forEach(data => {


                    if (!data.title || data.title.trim() === '') {
                        data.title = 'Untitled'
                    }

                    let data_title = data.title.trim().toLowerCase()
                    let data_content = data.content.trim().toLowerCase()
                    let data_href = data.href

                    let index_title = -1
                    let index_content = -1
                    let first_occur = -1

                    if (data_content !== '') {
                        key.forEach(function (keyword, i) {

                            index_title = data_title.indexOf(keyword)
                            index_content = data_content.indexOf(keyword)

                            if (index_title < 0 && index_content < 0) {
                                isMatch = false
                            } else {
                                if (index_content < 0) {
                                    index_content = 0
                                }
                                if (i == 0) {
                                    first_occur = index_content
                                }
                            }
                        })
                    } else {
                        isMatch = false
                    }



                    if (isMatch) {
                        str += '<div class=\'search-item\'>'
                        str += '<a href=\'' + data_href + '\' class=\'search-title\'>' + data_title + '</a>'
                        let content = data.content
                        if (first_occur >= 0) {
                            let start = first_occur - 40
                            let end = first_occur + 60

                            if (start < 0) {
                                start = 0
                            }
                            if (start == 0) {
                                end = 100
                            }
                            if (end > content.length) {
                                end = content.length
                            }

                            let match_content = content.substr(start, end)
                            key.forEach(function (keyword) {
                                let regS = new RegExp(keyword, 'gi')
                                match_content = match_content.replace(regS, '<span class="search-keyword">' + keyword + '</span>')
                            })

                            str += '<p class="search-content">' + match_content + '</p>'
                        }
                        str += '</div>'
                    }
                })


                if (str.indexOf('<div') === -1) $result.innerHTML = '<div class=\'iconfont icon-nofound search-empty\'>' + '</div>'
                else $result.innerHTML = str
            })
        }
    })
}

================================================
FILE: src/scripts/totop.js
================================================
import dom from '@scripts/dom'
import scroll from '@scripts/scroll'

exports.init = () => {

    const _ = {
        dom: '#toTop',
        showClass: 'leftIn',
        hideClass: 'rightOut'
    }

    const toTop = dom.query(_.dom)
    toTop.addEventListener('click', dom.moveSmooth)

    scroll.addEvent(() => {

        if (document.documentElement.scrollTop > 800) {
            toTop.addClass(_.showClass).removeClass(_.hideClass)
        } else {
            toTop.addClass(_.hideClass).removeClass(_.showClass)
        }
    })

}

================================================
FILE: src/scripts/util.js
================================================
module.exports = {
    isMobile() {
        const userAgentInfo = navigator.userAgent
        for (let agent of ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']) {
            if (userAgentInfo.indexOf(agent) > 0) return true
        }
        return false
    },
    isFunc(func) {
        return typeof func === 'function'
    },
    isStr(str) {
        return typeof str === 'string'
    },
    isNode(node) {
        return node.nodeType === Node.ELEMENT_NODE
    },
    isArray(arr) {
        return Array.isArray(arr)
    },
    filterHTML(str) {
        str = str.replace(/<\/?[^>]*>/g, '')
        str = str.replace(/[|]*\n/, '')
        str = str.replace(/&npsp;/ig, '')
        return str
    }

}

================================================
FILE: src/styles/base.scss
================================================
::selection {
    background: #EBEBEB
}

.container {
    width: 980px;
    min-height: 60vh;
    margin: 2.5rem auto;
    color: #555;
    box-sizing: border-box;
    z-index: 1;
    overflow: hidden;
}

.none {
    display: none;
}

.block {
    display: block;
}

#toTop {
    @extend .hoverReverse;
    position: fixed;
    opacity: 0;
    z-index: 101;
    bottom: 10%;
    right: 2%;
    padding: 2px 8px;
    width: 2.4rem;
    height: 2.4rem;
    font-size: 2.5rem;
    cursor: pointer;
}

.mask {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 99;
    background-color: rgba(0, 0, 0, 0.04)
}

================================================
FILE: src/styles/code/hightlight.scss
================================================
@import "./theme.scss";

.codeBlock {
    overflow: auto;
    margin: 20px 0;
    padding: 0;
    font-size: $code-font-size;
    color: $highlight-foreground;
    background: $highlight-background;
    line-height: $line-height-code-block;
    letter-spacing: $code-letter-spacing;
}

pre,
code {
    font-family: $code-font-family;
}

code {
    padding: 4px 6px;
    word-wrap: break-word;
    color: $code-foreground;
    background: $highlight-background;
    border-radius: 2px;
    font-size: $code-font-size;
}

pre {
    @extend .codeBlock;
    padding: 10px;

    code {
        padding: 0;
        color: $highlight-foreground;
        background: none;
        text-shadow: none;
    }
}

.highlight {
    @extend .codeBlock;
    // Read values from NexT config and set they as local variables to use as string variables (in any CSS section). 
    border-radius: 4px;
    border: .5px solid $highlight-border-color;

    pre {
        border: none;
        margin: 0;
        padding: 10px 0;
    }

    table {
        margin: 0;
        width: auto;
        border: none;
    }

    td {
        border: none;
        padding: 0;
    }

    figcaption {
        @extend .clearfix;
        font-size: 1em;
        color: $highlight-foreground;
        line-height: 1em;
        margin-bottom: 1em;
        margin: 0em;
        padding: 0.5em;
        background: $highlight-background;
        border-bottom: 1px solid #e9e9e9;

        a {
            float: right;
            color: $highlight-foreground;

            &:hover {
                border-bottom-color: $highlight-foreground;
            }
        }
    }

    .gutter pre {
        padding-left: 10px;
        padding-right: 10px;
        color: $highlight-gutter-color;
        text-align: right;
        background-color: $highlight-gutter-bgcolor;
    }

    .code pre {
        width: 100%;
        padding-left: 10px;
        padding-right: 10px;
        background-color: $highlight-background
    }

    .line {
        line-height: 23px;
    }
}


.gutter {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

.gist table {
    width: auto;

    td {
        border: none;
    }
}

// For diff highlight
pre .deletion {
    background: $highlight-deletion;
}

pre .addition {
    background: $highlight-addition;
}

pre .meta {
    color: $highlight-purple;
}

.code pre {

    .comment {
        color: $highlight-comment;
    }

    .variable,
    .attribute,
    .tag,
    .regexp,
    .ruby,
    .constant,
    .xml,
    .tag,
    .title,
    .xml,
    .pi,
    .xml,
    .doctype,
    .html,
    .doctype,
    .css,
    .id,
    .css,
    .class,
    .css,
    .pseudo {
        color: $highlight-red;
    }

    .number,
    .preprocessor,
    .built_in,
    .literal,
    .params,
    .constant,
    .command {
        color: $highlight-orange;
    }

    .ruby,
    .class,
    .title,
    .css,
    .rules,
    .attribute,
    .string,
    .value,
    .inheritance,
    .header,
    .ruby,
    .symbol,
    .xml,
    .cdata,
    .special,
    .number,
    .formula {
        color: $highlight-green;
    }

    .title,
    .css,
    .hexcolor {
        color: $highlight-aqua;
    }

    .function,
    .python,
    .decorator,
    .python,
    .title,
    .ruby,
    .function,
    .title,
    .ruby,
    .title,
    .keyword,
    .perl,
    .sub,
    .javascript,
    .title,
    .coffeescript,
    .title {
        color: $highlight-blue;
    }

    .keyword,
    .javascript,
    .function {
        color: $highlight-purple;
    }
}


.highlight {
    position: relative;
    width: 100%;

    &:after {
        position: absolute;
        top: 0;
        right: 0;
        color: #ccc;
        content: "Code";
        font-size: 12px;
        padding: 5px 10px 0;
        height: 15px;
        ;
    }
}

.html:after {
    content: "HTML"
}

.javascript:after {
    content: "Javascript"
}

.js:after {
    content: "Javascript"
}

.shell:after {
    content: "Shell"
}

.css:after {
    content: "CSS"
}

.vue:after {
    content: "Vue"
}

.sass:after {
    content: "SASS"
}

.less:after {
    content: "LESS"
}

.styl:after {
    content: "Styl"
}

.java:after {
    content: "Java"
}


.c:after {
    content: "C"
}

.yml:after {
    content: 'YML'
}

.php:after {
    content: 'PHP'
}

p code {
    padding: 4px;
    font-size: $code-font-size;
    color: $highlight-foreground;
    background: $highlight-background;
    border: .5px solid $highlight-border-color;
    border-radius: 2px;
    -webkit-border-radius: 2px;
    -moz-border-radius: 2px;
    -ms-border-radius: 2px;
    -o-border-radius: 2px;
}

================================================
FILE: src/styles/code/theme.scss
================================================
// from hexo-theme-next

$code-font-size : 13.5px;
$number-font-size : 12px;
$code-letter-spacing : .5px;
$line-height-code-block : 1.75;

$code-font-family : 'consolas','Arial';
$number-font-family : 'Trebuchet MS','sans-serif','Arial';

$highlight-foreground : #ffffff;
$highlight-marked : #727272;

$highlight-deletion : #fdd;
$highlight-addition : #dfd;
$highlight-background : #fcfcfc;
$highlight-current-line : #ebebeb;
$highlight-selection : #d6d6d6;
$highlight-foreground : #262626;
$highlight-comment : #8e908c;

$highlight-red : #E24C38;
$highlight-orange : #e78c45;
$highlight-yellow : #e7c547;
$highlight-green : #718c00;
$highlight-aqua : #3e999f;
$highlight-blue : #4271ae;
$highlight-purple : #8959a8;
$highlight-gray : #a6a6a6;

$highlight-border-color : #fff;
$highlight-gutter-color : #949da0;
$highlight-gutter-bgcolor : #F7F8FA;

$code-foreground : #F7F8FA;

================================================
FILE: src/styles/iconfont.scss
================================================
/**
* @see http://www.iconfont.cn
*/


@font-face {
  font-family: 'iconfont';
  src: url('./iconfonts/iconfont.eot');
  src: url('./iconfonts/iconfont.eot?#iefix') format('embedded-opentype'),
    url('./iconfonts/iconfont.woff') format('woff'),
    url('./iconfonts/iconfont.ttf') format('truetype'),
    url('./iconfonts/iconfont.svg#iconfont') format('svg')
}




.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.icon-Zhihu:before {
  content: "\e6d1";
}

.icon-tags:before {
  content: "\e64d";
}

.icon-share-google:before {
  content: "\e611";
}

.icon-menu:before {
  content: "\e6ab";
}

.icon-share-weixin:before {
  content: "\e63e";
}

.icon-share-douban:before {
  content: "\e7a1";
}

.icon-home:before {
  content: "\e7a5";
}

.icon-about:before {
  content: "\e610";
}

.icon-LinkedIn:before {
  content: "\e64b";
}

.icon-right:before {
  content: "\e65f";
}

.icon-left:before {
  content: "\e660";
}

.icon-words:before {
  content: "\e696";
}

.icon-nofound:before {
  content: "\e67a";
}

.icon-Github:before {
  content: "\e667";
}

.icon-Facebook:before {
  content: "\e6e2";
}

.icon-archives:before {
  content: "\eb4d";
}

.icon-share-facebook:before {
  content: "\ee75";
}

.icon-backtotop:before {
  content: "\e697";
}

.icon-search:before {
  content: "\e60f";
}

.icon-instagram:before {
  content: "\e607";
}

.icon-page-tags:before {
  content: "\e672";
}

.icon-share-tumblr:before {
  content: "\e87b";
}

.icon-share-qq:before {
  content: "\e61e";
}

.icon-Weibo:before {
  content: "\e74c";
}

.icon-share-twitter:before {
  content: "\e606";
}

.icon-Neteasemusic:before {
  content: "\e600";
}

.icon-share-weibo:before {
  content: "\e74e";
}

.icon-tag-inner:before {
  content: "\e7a2";
}

.icon-cancel:before {
  content: "\e7a3";
}

.icon-no-menu:before {
  content: "\e7a4";
}

.icon-Telegram:before {
  content: "\e655";
}

.icon-page-about:before {
  content: "\eb4e";
}

.icon-page-archive:before {
  content: "\eb4f";
}

.icon-tag:before {
  content: "\eb50";
}

.icon-category:before {
  content: "\ee77";
}

================================================
FILE: src/styles/mobile/mobile.scss
================================================
.header-wrapper {
    display: none
}

.mobile-header-wrapper {
    width: 100%;
    min-height: 60px;
    transition: all 0.4s ease-in-out;
    box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
    display: flex;
    align-items: center;
    padding: 0 2rem;

    .iconfont {
        font-size: 1.5rem;

        &:hover {
            color: $c-hover;
        }
    }

    position: fixed;
    top: 0;
    left: 0;
    z-index: 101;
    background: #fff;
}

.container {
    margin: 70px 0 0;
    padding: 10px 16px;
    width: 100%;
    box-sizing: border-box;

    time {
        font-size: 12px;
    }

    .article {
        padding: 0;
        border-bottom: none;
        margin-bottom: 26px;

        .title {
            font-size: 16px;
            margin-bottom: 6px;
        }

        .thumb {
            height: 220px;

            .banner {
                margin: 0 auto;
                width: 98%;
                height: 100%;
            }
        }
    }

    .post {
        .title {
            margin: 0;
            font-size: 18px;
        }



        .other {
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column
        }

        .nav {
            padding: 0;

            .link {
                width: 100%;
                margin: 0;
                padding: 1rem 0;
                .title{
                    font-size: 14px;
                    margin: 0;
                }

                &:last-child {
                    border-bottom: none
                }
            }

        }
    }

    .typo {
        font-size: 13px;
        line-height: 2;
        color: #0d0d0d;

        h1,
        h2,
        h3,
        h4,
        h5,
        h6 {
            margin: 1rem 0 .5rem 0;
            padding: 0;
            font-weight: normal;
            color: #111;
        }

        h1 {
            font-size: 18px
        }

        h2 {
            font-size: 17px
        }

        h3 {
            font-size: 16px
        }

        h4 {
            font-size: 16px
        }

        h5,
        h6 {
            font-size: 15px
        }

        blockquote {
            margin: 10px 0;

            p {
                font-size: 13px;
            }
        }

    }

    .page-name {
        margin-bottom: 0;
    }
}


#search {
    width: 100%;
    height: 100%;
    margin: 0;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 101;
    background: #fff;

    .result {
        .search-item {
            margin: 10px 2px;

            .search-title {
                padding: 0;
                margin-bottom: 18px;
                font-size: 14px;
                color: $c-hover;
            }

            .search-content {
                font-size: 13px;
                padding: 10px 2px;
            }

            .search-keyword {
                font-size: 13px;
            }
        }
    }
}



.mobile-menu {
    display: block;
    position: fixed;
    left: 0;
    top: 0;
    width: 200px;
    height: 100%;
    z-index: 999;
    background: #fff;
    text-align: center;
    padding-top: 46px;
    border-right: 1px solid #f1f1f1;

    transform: translateX(-200px);

    .mobile-menu-link {
        display: block;
        padding: 18px 16px;
        font-size: 15px;
        color: #232729;
        line-height: 1
    }

    .mobile-menu-icon {
        margin: 30px auto;
        width: 40px;
        padding: 4px;
        border: 1px solid #f1f1f1;
        border-radius: 5px;
    }

}

================================================
FILE: src/styles/partial/archive.scss
================================================
.archive {
    text-align: center;

    .archive-post {
        margin-top: 1rem;

        .archive-year {
            margin: 1rem 0;

            .year {
                padding: 8px 10px;
                font-size: 1.05rem;
                color: #666;
                font-weight: 600;
                letter-spacing: 0.5px;
                font-family: Arial, Helvetica, sans-serif
            }
        }

        .archive-item {
            display: flex;
            align-items: center;
            padding: 1.3rem 0;
            position: relative;

            // &::after {
            //     content: "";
            //     position: absolute;
            //     left: 5%;
            //     bottom: 0;
            //     width: 90%;
            //     height: 1px;
            //     background-color: $c-shallow-line;
            // }

            .time {
                width: 30%;
                padding-left: 10px;
                font-size: 0.85rem;
                color: rgba(0, 0, 0, 0.65);
                text-align: center;
            }

            .title {
                @extend .hoverReverse;
                width: 70%;
                font-size: 1rem;
                text-align: left;
            }
        }
    }

}

================================================
FILE: src/styles/partial/footer.scss
================================================
.footer {
    width: 100%;
    margin: 10vh 0 5vh;
    color: #797f86;
    text-align: center;
    .inner {
        margin: 0 auto;
        height: 100%;

        .copyright {
            font-size: 12px;
            font-family: Arial, Helvetica, sans-serif;
            line-height: 2;
            a {
               @extend .hover
            }
        }
    }
}

================================================
FILE: src/styles/partial/header.scss
================================================
.header-wrapper {
    width: 100%;
    min-height: 70px;
    transition: all 0.4s ease-in-out;
    box-shadow: 0 1px 1px rgba(0, 0, 0, .04);

    .inner {
        margin: 0 auto;
        width: 980px;
        height: 70px;
        display: flex;
        align-items: center;
        justify-content: space-between;

        .title {
            .logo {
                width: 60px;
                height: 60px;
                padding: 4px 4px;
                border: none;
                opacity: 0.9;
                box-sizing: border-box;
                transition: opacity .4s ease-in-out;

                &:hover {
                    opacity: 0.8;
                }
            }
        }

        .menu {
            list-style: none;
            margin: 0;
            padding: 0;

            .item {
                display: inline-block;
                text-align: center;

                .link {
                    margin-right: 1.65rem;
                    cursor: pointer;

                    &:hover {
                        color: $c-hover;
                    }

                    .iconfont {
                        font-size: 1.3rem;
                        width: 44px;
                        height: 44px;
                    }

                }
            }

            .menu-active {
                color: $c-hover;
            }
        }
    }


}

/**
*  For JAVASCRIPT
* @see @scripts/header.js
*/

.header-static {
    position: static;
    background: #fff;
    box-shadow: 0 1px 1px rgba(0, 0, 0, .05)
}


.header-fixed {
    position: fixed;
    left: 0;
    top: 0;
    background: #fff;
    z-index: 9;
    opacity: 0.9;
    box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15)
}



/**
*
* mobile
*
*/



.mobile-menu {
    display: none;
}

.mobile-header-wrapper {
    display: none;
}

================================================
FILE: src/styles/partial/index.scss
================================================
// porfile

.profile {
    margin-bottom: 28px;
    text-align: center;
    border-bottom: 0.5px solid $c-shallow-line;

    .avatar {
        @extend .hoverOpacity;
        display: inline-block;
        width: 92px;
        height: 92px;
        padding: 3px;
        border: 1px solid $c-shallow-line;
        border-radius: 50%;
        transition: opacity .4s ease-in-out;

        &:hover {
            opacity: 0.8;
        }
    }

    .author {
        margin: 4px 0;
        font-size: 1rem;
        color: #4a4a4a;
    }

    .social {
        margin: 10px 0;

        .links {
            margin-right: 1.5px;
            font-size: 1.3rem;
            color: #101010;
            @extend .hoverReverse;

            .iconfont {
                font-size: inherit;
            }
        }

    }
}

// article

.article {
    margin-bottom: 48px;
    padding: 1.5rem 1.5rem;
    border-bottom: 1px solid $c-shallow-line;

    .article-header {
        .title {
            @extend .hoverReverse;
            display: block;
            font-size: 23px;
            font-weight: 400;
            line-height: 1.4;
            margin-bottom: 1rem;
            color: #333
        }

        .meta {
            margin: 10px 0 0;
            font-size: 0.85rem;
            color: #666
        }


    }

    .article-excerpt {
        margin: 2rem 0 1.5rem;
    }
    .article-tags,
    .article-categories {
        display: inline-block;
        .link {
            @extend .hover;
            margin-right: 6px;
            font-size: 0.85rem;
            text-decoration: underline;
        }

        .iconfont {
            color: #000;
        }
    }

    .article-bottom {
        text-align: center;
        margin: 2rem auto 0 auto;
        height: 44px;
        line-height: 44px;

        .readmore {
            font-size: 0.8rem;
            padding: 8px 12px;
            border-radius: 4px;
            border: 1px solid $c-deep-line;
            color: rgba(51, 51, 51, .7);
            font-weight: 700;
            @extend .hoverReverse;

            &:hover {
                border: 1px solid $c-hover;
            }

            transition: all 0.2s ease-in-out;
            -webkit-transition: all 0.2s ease-in-out;
            -moz-transition: all 0.2s ease-in-out;
            -ms-transition: all 0.2s ease-in-out;
            -o-transition: all 0.2s ease-in-out;
        }
    }


    .thumb {
        margin: 0.5rem 0;
        width: 104%;
        height: 24rem;
        position: relative;
        top: 0;
        left: -2%;

        .banner {
            position: relative;
            width: 100%;
            height: 100%;
            background-size: 100% 100%;
            background-position: center center;
            background-repeat: no-repeat;
            border-radius: 3px;
            -webkit-border-radius: 3px;
            -moz-border-radius: 3px;
            -ms-border-radius: 3px;
            -o-border-radius: 3px;
        }
    }
}

================================================
FILE: src/styles/partial/item.scss
================================================
.items {
    .item {
        display: flex;
        align-items: center;
        margin: 2rem 2rem;

        .time {
            width: 30%;
            padding-left: 36px;
            font-size: 0.9rem;
            color: rgba(0, 0, 0, 0.65);
            text-align: center;
        }

        .title {
            @extend .hoverReverse;
            width: 70%;
            font-size: 1.05rem;
            text-align: left;
        }
    }
}

================================================
FILE: src/styles/partial/page-name.scss
================================================
.page-name {
    margin-bottom: 1rem;
    text-align: center;

    .name {
        font-size: 1rem;
    }

    .iconfont {
        font-size: 1.25rem;
        margin-right: 12px;
        color: #333;
    }
}

================================================
FILE: src/styles/partial/paginator.scss
================================================
.paginator {
    margin: 8rem 0;
    padding: 0 1rem;
    text-align: center;
    color: $c-gray;
    font-size: 0.825rem;
    position: relative;
    height: 40px;
    line-height: 40px;

    .prev,
    .next {
        position: absolute;
        display: inline-block;
        padding: 4px 8px;
        border-radius: 4px;
        border: 1px solid $c-shallow-line;
        line-height: 2;
        &:hover {
            color: $c-hover;
            border: 1px solid $c-hover;
        }

        transition: all .2s ease-in-out;
        -webkit-transition: all .2s ease-in-out;
        -moz-transition: all .2s ease-in-out;
        -ms-transition: all .2s ease-in-out;
        -o-transition: all .2s ease-in-out;
    }

    .prev {
        left: 2px;
    }

    .next {
        right: 2px;
    }

    .page-number {
        font-size: 14px;
        padding: 6px 2px;
        height: 40px;
        line-height: 40px;

        strong {
            color: $c-hover;
            font-size: 1rem;
        }
    }
}

================================================
FILE: src/styles/partial/post.scss
================================================
@import "~@styles/three/valine.scss";

.post {    

    .header {
        padding-bottom: 12px;
        border-bottom: 1px solid $c-shallow-line;

        .title {
            margin-top: 10px;
            margin-bottom: 10px;
            font-size: 1.55rem;
            font-weight: 400;
            line-height: 1.4;
            color: #333
        }

        .info {
            margin-top: 10px;

            time,
            span {
                color: #666;
                margin-right: 12px;
                font-size: 0.9rem;
            }
        }
    }
    .post-content{
        margin: 2.5rem 0;
    }

    .bottom {

        .other {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 2rem 0;
            border-top: 1px solid $c-shallow-line;
            border-bottom: 1px solid $c-shallow-line;

            .meta {

                .category-link,
                .tag-link {
                    @extend .hover;
                    font-size: 0.95rem;
                    margin-right: 4px;
                    text-decoration: underline;
                }
            }

            .operate {
                display: flex;
                align-items: center;

                .text {
                    font-size: 12px;
                    color: gray;
                    margin: 0 10px;
                    text-transform: uppercase
                }


                .share {
                    list-style: none;

                    .item {
                        @extend .hoverReverse;
                        display: inline-block;
                        margin-right: 6px;
                        font-size: 1.2rem;
                        cursor: pointer;
                    }
                }
            }
        }



        .nav {
            @extend .clearfix;
            padding: 3rem 0;

            border-bottom: 0.5px solid $c-shallow-line;

            .link {
                width: 46%;
                margin: 0 2%;
                float: left;

                .link-wrap {
                    @extend .hoverReverse;
                    display: block;
                    padding: 14px 6px;
                    text-decoration: none;
                    text-shadow: 0 1px #fff;
                    text-align: center;

                    .caption {
                        text-transform: uppercase;
                        letter-spacing: 2px;
                        line-height: 1rem;
                        font-weight: blod;
                        color: gray;
                    }

                    .title {
                        display: block;
                        text-align: center;
                        font-size: 1rem;
                        margin-top: 1.5rem;
                    }
                }

            }
        }
    }



    .comment {
        margin-top: 2rem;
    }

    .gallery {
        margin: 0 2px;
        display: flex;

        .image {
            width: 230px;
            height: 220px;
            margin: 0 0.1rem;
            padding: 4px;
            border: 1px solid $c-shallow-line;
            background-size: cover;
            background-position: center;
            background-repeat: no-repeat;
            cursor: pointer;
        }
    }
}

================================================
FILE: src/styles/partial/search.scss
================================================
#search {
    width: 800px;
    height: 620px;
    position: fixed;
    left: 50%;
    top: 50%;
    margin-left: -400px;
    margin-top: -310px;
    overflow-y: auto;
    z-index: 100;
    border: 1px solid $c-shallow-line;
    background: #fefefe;
    border-radius: 4px;
    overflow-x: hidden;

    .header {
        margin: 0 16px;
        height: 60px;
        display: flex;
        align-items: center;
        border-bottom: 1px solid $c-shallow-line;

        .input {
            flex: 1;
            caret-color: #000;
            color: #333;
            padding: 8px 12px;
            font-size: 0.9rem;
            outline: none;
            background: #fff;
        }

        .iconfont {
            @extend .hoverReverse;
            font-size: 1.25rem;
            cursor: pointer;
        }
    }

    .result {
        width: 100%;
        min-height: 500px;
        padding: 1rem 0.8rem;
        box-sizing: border-box;
        overflow: hidden;

        .icon-nofound {
            font-size: 1.5rem;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -45%)
        }

        .search-item {
            margin: 14px 4px;
            border-bottom: 1px solid $c-shallow-line;

            .search-title {
                @extend .hoverReverse;
                @extend .textOverflow;
                font-size: 1.05rem;
                padding-left: 12px;
            }

            .search-content {
                @extend .textOverflow;

                margin: 0;
                padding: 20px 12px;
                font-size: 0.9rem;
                color: #333;
            }

            .search-keyword {
                font-size: 0.9rem;
                color: $c-hover;
            }
        }
    }
}

================================================
FILE: src/styles/partial/tag.scss
================================================
.tag {
    .tag-item {
        list-style: none;
        display: inline-block;
        margin-right: 1.8rem;

        .tag-wrap {
            @extend .hoverReverse;
            text-decoration: underline;

            .tag-name {
                font-size: 0.95rem;
            }

            .tag-count {
                color: $c-hover;
                font-size: 0.8rem;
            }
        }
    }
}

================================================
FILE: src/styles/partial/toc.scss
================================================
.toc {
    position: absolute;
    padding: 8px 10px;
    width: 250px;
    max-height: 600px;
    top: 140px;
    right: 120px;
    overflow-x: hidden;
    overflow-y: auto;
    border: 1px solid #f1f1f1;

    .toc-title {
        @extend .hoverReverse;
        display: block;
        margin: 0;
        padding: 0.8rem 0;
        text-align: center;
        font-size: 1rem;
        color: gray;
        cursor: pointer;
        font-size: 600;
        border-bottom: 1px solid #f1f1f1;
    }

    .toc-list {
        list-style: none;
        margin: 16px 0 0 15px;

        ol,
        ul {
            list-style-type: none;

            li {
                @extend .hoverReverse;
                padding-left: 8px
            }
        }
    }

    .toc-text {
        font-size: 0.75rem;
        color: rgba(0, 0, 0, .7)
    }

    .toc-child {
        .toc-text {
            font-size: 0.8rem;
            margin-left: 0.2rem;
            color: rgba(0, 0, 0, 0.65)
        }
    }

    .toc-inner-item {
        font-size: 0.8rem;
        padding-left: 0;
        margin-bottom: 0.8rem;

        .toc-inner-text {
            @extend .hoverReverse;
            display: inline-block;
            margin: 0.8rem 0;
        }

    }

    &::-webkit-scrollbar {
        width: 4px;
        height: 4px;
        background-color: #F5F5F5;
    }

    &::-webkit-scrollbar-track {
        box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.3);
        border-radius: 10px;
        background-color: #F5F5F5;
    }

    &::-webkit-scrollbar-thumb {
        border-radius: 10px;
        box-shadow: inset 0 0 1px rgba(0, 0, 0, .3);
        background-color: #555;
    }
}

================================================
FILE: src/styles/styles.scss
================================================
@import "~@styles/utils/reset.scss";
@import "~@styles/utils/vars.scss";
@import "~@styles/utils/typo.scss";
@import "~@styles/utils/ani.scss";
@import "~@styles/iconfont.scss";
@import "~@styles/base.scss";

// code themse
@import "~@styles/code/hightlight.scss";


@import '~@styles/partial/header.scss';
@import '~@styles/partial/footer.scss';
@import '~@styles/partial/index.scss';
@import '~@styles/partial/paginator.scss';
@import '~@styles/partial/archive.scss';
@import '~@styles/partial/tag.scss';
@import '~@styles/partial/item.scss';
@import '~@styles/partial/page-name.scss';
@import '~@styles/partial/post.scss';
@import '~@styles/partial/search.scss';
// @import '~@styles/partial/toc.scss';

@media screen and (max-width: 479px) {
    @import '~@styles/mobile/mobile.scss';
}

================================================
FILE: src/styles/three/hover.scss
================================================
$inactive-color : #747474;

.inactive-item {
    color: $inactive-color !important;

    &:link,
    &:visited,
    &:active {
        color: $inactive-color !important;
    }
}

================================================
FILE: src/styles/three/valine.scss
================================================
#comment {
    margin-bottom: 4rem;
    padding-bottom: 1rem;
    position: relative;
    border: none;
}


.power,
.vempty,
.col-60 {
    visibility: hidden
}

.vnick,
.veditor,
.vmail,
.vempty,
.vsubmit {
    font-size: 1rem;
    border: none !important;
}


.vsubmit {
    background-color: #F5F6FA !important;
    color: rgba(0, 0, 0, .5) !important;
    font-weight: 300 !important;
    letter-spacing: .3px;
    border: 1px solid transparent !important;

    &:hover {
        color: $c-hover !important;
        border: 1px solid $c-hover !important;
    }

    transition: all .2s ease-in-out;
    -webkit-transition: all .2s ease-in-out;
    -moz-transition: all .2s ease-in-out;
    -ms-transition: all .2s ease-in-out;
    -o-transition: all .2s ease-in-out;
}

.vcard {
    padding: 5px 0 0 20px !important
}

================================================
FILE: src/styles/utils/ani.scss
================================================
@keyframes leftIn {
    from {
        transform: translateX(100px);
        opacity: 0;
    }

    to {
        transform: translateX(0px);
        opacity: 1;
    }
}

.leftIn {
    animation: leftIn 0.6s ease-in-out forwards;
}

@keyframes rightOut {
    from {
        transform: translateX(0px);
        opacity: 1;
    }

    to {
        transform: translateX(100px);
        opacity: 0;
    }
}


.rightOut {
    animation: rightOut 0.6s ease-in-out forwards;
}


@keyframes slideUp {
    0% {
        transform: translateY(0);
    }

    100% {
        transform: translateY(-100px);
    }
}


.slideUp {
    animation: slideUp 0.5s ease-in-out forwards;
}



@keyframes slideDown {
    0% {
        transform: translateY(-100px);
    }

    100% {
        transform: translateY(0);
    }
}

.slideDown {
    animation: slideDown 0.5s ease-in-out forwards;
}




@keyframes slideDownMin {
    0% {
        transform: translateY(-10px);
        opacity: 0.1
    }

    100% {
        transform: translateY(0);
        opacity: 1
    }
}


.slideDownMin {
    animation: slideDownMin 0.5s ease-in-out forwards;
}



@keyframes sildeUpMin {
    0% {
        transform: translateY(10px);
        opacity: 0.1
    }

    100% {
        transform: translateY(0);
        opacity: 1
    }
}

.sildeUpMin {
    animation: sildeUpMin 0.5s ease-in-out forwards;
}






@keyframes menuIn {
    0% {
        transform: translateX(-200px)
    }

    100% {
        transform: translateX(0)
    }
}

.menuIn {
    animation: menuIn 0.5s ease-in-out forwards;
}


@keyframes menuOut {
    0% {
        transform: translateX(0)
    }

    100% {
        transform: translateX(-200px)
    }
}

.menuOut {
    animation: menuOut 0.5s ease-in-out forwards;
}




@keyframes slideIn {
    0% {
        transform: translateX(200px)
    }

    100% {
        transform: translateX(0)
    }
}

.slideIn {
    animation: slideIn 0.5s ease-in-out forwards;
}


@keyframes slideOut {
    0% {
        transform: translateX(0)
    }

    100% {
        transform: translateX(200px)
    }
}

.slideOut {
    animation: slideOut 0.5s ease-in-out forwards;
}

================================================
FILE: src/styles/utils/reset.scss
================================================
/**
*   重置css样式
*/

html {
    background: transparent;
    -webkit-text-size-adjust: 100%;
}

body {
    font-family: -apple-system,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,sans-serif;
    margin: 0px;
    padding: 0px;
    overflow-x: hidden;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
}

input,
select,
textarea {
    border: 0;
    -webkit-appearance: none;
    appearance: none;
}

ol,
ul {
    list-style: none;
    margin: 0;
    padding: 0;
}



a {

    &:link,
    &:visited,
    &:hover,
    &:active {
        text-decoration: none;
        color: inherit;
    }
}

img {
    display: block;
    max-width: 100%;
    padding: 4px;
    opacity: 0.95;
    border: 1px solid #eee;
    border-radius: 4px;
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    -ms-border-radius: 4px;
    -o-border-radius: 4px;
}

================================================
FILE: src/styles/utils/typo.scss
================================================
.typo {
    font-size: 15px;
    line-height: 2;
    color: #0d0d0d;

    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
        margin: 2rem 0 1.8rem 0;
        padding: 0;
        font-weight: 500;
        color: #101010;
    }

    h1 {
        font-size: 36px
    }

    h2 {
        font-size: 32px
    }

    h3 {
        font-size: 26px
    }

    h4 {
        font-size: 19px
    }

    h5,
    h6 {
        font-size: 16px
    }

    strong {
        font-weight: 500
    }

    hr {
        margin-top: 22px;
        border: none;
        border-top: 1px solid rgba(102, 130, 153, 0.1)
    }

    p {
        line-height: 30px;
        margin-bottom: 14px;
        color: #232323
    }

    img {
        box-sizing: border-box;
        margin: 1rem 0;
    }

    del {
        opacity: 0.5;
    }

    ul,
    ol {
        margin: 12px 0;
        padding-left: 22px;

        p {
            margin: 0;
        }

        & li {
            margin: 4px 0;
            padding-left: 8px;
        }
    }

    ul li {
        list-style: none;
        position: relative;

        &::before {
            position: absolute;
            content: "•";
            top: 0px;
            left: -16px;
            font-size: 17px;
            color: #333
        }
    }

    ol li {
        list-style: decimal
    }

    a {
        @extend .hover;
        font-size: 0.9rem;
        text-decoration: underline;
        font-family: Arial, Helvetica, sans-serif;
    }

    blockquote {
        display: block;
        letter-spacing: .4px;
        font-size: 15px;
        padding: 0 12px;
        margin: 2rem 0;

        p {
            margin: 0;
            padding-left: 10px;
            border-left: 3px solid #eee;
        }
    }



    table {
        margin: 16px 0;
        word-wrap: break-word;
        border-collapse: collapse;
        border-spacing: 0;
        border-radius: 2px;

        tr:nth-child(even) {
            background: #fafafa
        }

        th {
            font-weight: 500
        }

        th,
        td {
            border: 1px solid #f1f1f1;
            padding: 0.4rem 1rem;
            margin: 28px 0;
        }


        dt,
        dd {
            margin-bottom: 10px;
        }


    }

    figure th,
    figure td {
        border: none;
    }
}

================================================
FILE: src/styles/utils/vars.scss
================================================
$c-shallow-line: #f5f5f5;
$c-deep-line :#f1f1f1;
$c-hover: #e26d6d;
$c-black: #555;
$c-gray : #727272;

@mixin hover($beforeColor, $afterColor) {
    color: $beforeColor;

    &:hover {
        color: $afterColor;
    }

    transition: color 0.2s ease-in-out;
}

.hover {
    @include hover($c-hover, $c-black)
}

.hoverReverse {
    @include hover($c-black, $c-hover)
}

.hoverOpacity {
    opacity: 0.95;

    &:hover {
        color: 0.65;
    }

    cursor: pointer;
    transition: opacity 0.3s ease-in-out;
    -webkit-transition: opacity 0.3s ease-in-out;
    -moz-transition: opacity 0.3s ease-in-out;
    -ms-transition: opacity 0.3s ease-in-out;
    -o-transition: opacity 0.3s ease-in-out;
}


.clearfix {

    &:before,
    &:after {
        content: " ";
        display: table;
    }

    &:after {
        clear: both
    }
}

.textOverflow {
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
}

================================================
FILE: webpack.config.js
================================================
/**
 * 
 * webpack 4.0 配置文件
 * @time 2019-03-28
 */

const path = require('path')
const CleanPlugin = require('clean-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')

const extractSass = new ExtractTextPlugin({
    filename: "nayo.min.css"
});


module.exports = {
    mode: 'development',
    entry: './src/scripts/main.js',
    output: {
        path: path.resolve(__dirname, 'source'),
        filename: 'nayo.bundle.js'
    },
    module: {
        rules: [{
            // ES6 
            test: /\.js$/,
            exclude: /(node_modules)/,
            use: {
                loader: "babel-loader"
            }
        }, {
            // scss、sass
            test: /\.(sass|scss)$/,
            use: extractSass.extract({
                fallback: 'style-loader',
                use: ['css-loader', 'postcss-loader', 'sass-loader']
            })
        },  {
            // 图片
            test: /\.(png|jpg|gif)$/,
            use: [{
                loader: 'url-loader',
                options: {
                    name: 'img/[name].[hash:4].[ext]',
                    limit: 1024
                }
            }]
        }, {
            // 字体,图标文件
            test: /\.(woff|svg|eot|ttf)\??.*$/,
            use: {
                loader: 'url-loader',
                options: {
                    name: 'fonts/[name].[hash:2].[ext]',
                    limit: 8192
                }
            }
        }]
    },
    plugins: [       
        new OptimizeCssAssetsPlugin(),
        extractSass
    ],
    resolve: {
        alias: {
            '@scripts': path.resolve(__dirname, 'src/scripts/'),
            '@styles': path.resolve(__dirname, 'src/styles/')
        }
    }
}
Download .txt
gitextract_7jie21nk/

├── .babelrc
├── .gitignore
├── .postcssrc.js
├── README.md
├── _config.yml
├── languages/
│   ├── en.yml
│   ├── zh-CN.yml
│   └── zh-TW.yml
├── layout/
│   ├── _partial/
│   │   ├── _post/
│   │   │   ├── comment.ejs
│   │   │   ├── donate.ejs
│   │   │   ├── footer.ejs
│   │   │   ├── gallery.ejs
│   │   │   ├── header.ejs
│   │   │   ├── mathjax.ejs
│   │   │   ├── mob_share.ejs
│   │   │   └── toc.ejs
│   │   ├── after-footer.ejs
│   │   ├── article.ejs
│   │   ├── footer.ejs
│   │   ├── head.ejs
│   │   ├── header.ejs
│   │   ├── item.ejs
│   │   ├── page-name.ejs
│   │   ├── paginator.ejs
│   │   ├── search.ejs
│   │   └── slide-menu.ejs
│   ├── about.ejs
│   ├── archive.ejs
│   ├── category.ejs
│   ├── index.ejs
│   ├── layout.ejs
│   ├── post.ejs
│   └── tag.ejs
├── package.json
├── scripts/
│   ├── raw_length.js
│   └── render_img.js
├── source/
│   └── nayo.bundle.js
├── src/
│   ├── scripts/
│   │   ├── activeNav.js
│   │   ├── dom.js
│   │   ├── extends.js
│   │   ├── header.js
│   │   ├── lazyload.js
│   │   ├── main.js
│   │   ├── mask.js
│   │   ├── mobile.js
│   │   ├── scroll.js
│   │   ├── search.js
│   │   ├── totop.js
│   │   └── util.js
│   └── styles/
│       ├── base.scss
│       ├── code/
│       │   ├── hightlight.scss
│       │   └── theme.scss
│       ├── iconfont.scss
│       ├── mobile/
│       │   └── mobile.scss
│       ├── partial/
│       │   ├── archive.scss
│       │   ├── footer.scss
│       │   ├── header.scss
│       │   ├── index.scss
│       │   ├── item.scss
│       │   ├── page-name.scss
│       │   ├── paginator.scss
│       │   ├── post.scss
│       │   ├── search.scss
│       │   ├── tag.scss
│       │   └── toc.scss
│       ├── styles.scss
│       ├── three/
│       │   ├── hover.scss
│       │   └── valine.scss
│       └── utils/
│           ├── ani.scss
│           ├── reset.scss
│           ├── typo.scss
│           └── vars.scss
└── webpack.config.js
Download .txt
SYMBOL INDEX (39 symbols across 9 files)

FILE: scripts/render_img.js
  function renderImg (line 12) | function renderImg(source) {

FILE: source/nayo.bundle.js
  function n (line 1) | function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{...
  function i (line 1) | function i(t){return t&&t.__esModule?t:{default:t}}
  function t (line 1) | function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.en...
  function u (line 1) | function u(t){return t&&t.__esModule?t:{default:t}}
  function t (line 1) | function t(){(0,r.default)(this,t),this.listener=[],this.time=null,this....
  function l (line 1) | function l(t){return t&&t.__esModule?t:{default:t}}
  function i (line 1) | function i(t){return t&&t.__esModule?t:{default:t}}
  function t (line 1) | function t(e){(0,r.default)(this,t),this.settings={src:"data-src",nolazy...
  function i (line 1) | function i(t){return t&&t.__esModule?t:{default:t}}
  function u (line 1) | function u(t){return t&&t.__esModule?t:{default:t}}
  function u (line 1) | function u(t){return t&&t.__esModule?t:{default:t}}
  function u (line 1) | function u(t){return t&&t.__esModule?t:{default:t}}
  function u (line 1) | function u(t){return t&&t.__esModule?t:{default:t}}
  function a (line 1) | function a(){i.default.hide(),e.addClass(t.showToggleClass).removeClass(...

FILE: src/scripts/dom.js
  method query (line 10) | query(selector) {
  method addLoadEvent (line 17) | addLoadEvent(fun) {
  method moveSmooth (line 28) | moveSmooth(node) {

FILE: src/scripts/lazyload.js
  class LazyLoad (line 5) | class LazyLoad {
    method constructor (line 7) | constructor(images) {
    method init (line 18) | init() {
    method loadImages (line 74) | loadImages() {
    method isNolazy (line 97) | isNolazy(image) {

FILE: src/scripts/mask.js
  function mask (line 1) | function mask() {

FILE: src/scripts/mobile.js
  function hideMobileMenu (line 41) | function hideMobileMenu() {
  function showMobileMenu (line 61) | function showMobileMenu() {

FILE: src/scripts/scroll.js
  class Scroll (line 10) | class Scroll {
    method constructor (line 12) | constructor() {
    method _init (line 18) | _init() {
    method _dispatch (line 29) | _dispatch(listener, event) {
    method addEvent (line 34) | addEvent(func) {

FILE: src/scripts/search.js
  function ajax (line 1) | function ajax(options) {
  function fetch (line 72) | function fetch(path, input, result) {

FILE: src/scripts/util.js
  method isMobile (line 2) | isMobile() {
  method isFunc (line 9) | isFunc(func) {
  method isStr (line 12) | isStr(str) {
  method isNode (line 15) | isNode(node) {
  method isArray (line 18) | isArray(arr) {
  method filterHTML (line 21) | filterHTML(str) {
Condensed preview — 73 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (110K chars).
[
  {
    "path": ".babelrc",
    "chars": 230,
    "preview": "{\n    \"presets\": [\n        [\n            \"env\",\n            {\n                \"targets\": {\n                    \"browsers"
  },
  {
    "path": ".gitignore",
    "chars": 60,
    "preview": "node_modules/\nnpm-debug.log\n.vscode/\npackage-lock.json\n.temp"
  },
  {
    "path": ".postcssrc.js",
    "chars": 68,
    "preview": "module.exports = {\n    plugins: {\n        \"autoprefixer\": {}\n    }\n}"
  },
  {
    "path": "README.md",
    "chars": 820,
    "preview": "## hexo-theme-nayo\n\na concise theme for hexo[3.7.0].\n\n在线预览 [preview](https://lemonreds.github.io/) | 常见问题 [common issues"
  },
  {
    "path": "_config.yml",
    "chars": 1831,
    "preview": "# header navigation\n# 导航菜单路径\n# 默认不需要修改\n\nmenu:\n  home: /\n  archives: archives\n  tags: tags\n  about: about\n  search: searc"
  },
  {
    "path": "languages/en.yml",
    "chars": 455,
    "preview": "Menu:\n  home: Home\n  categories: Categories\n  tags: Tags\n  archives: Archives\n  about: About\n  search: Search\nPage:\n  Ar"
  },
  {
    "path": "languages/zh-CN.yml",
    "chars": 370,
    "preview": "Menu:\n  home: 首页\n  categories: 分类\n  tags: 标签\n  archives: 归档\n  about: 关于\n  search: 搜索\nPage:\n  Archives: 归档\n  Categories: "
  },
  {
    "path": "languages/zh-TW.yml",
    "chars": 369,
    "preview": "Menu:\n  home: 首頁\n  categories: 分類\n  tags: 標籤\n  archives: 歸檔\n  about: 關於\n  search: 搜索\nPage:\n  Archives: 歸檔\n  Categories: "
  },
  {
    "path": "layout/_partial/_post/comment.ejs",
    "chars": 1137,
    "preview": "<%# 评论%>\n<div class=\"comment\">\n\n    <% if(theme.disqus.comment && theme.disqus.shortname ){ %>\n    <div id=\"disqus_threa"
  },
  {
    "path": "layout/_partial/_post/donate.ejs",
    "chars": 690,
    "preview": "<div class=\"donate-button\">\n\t<i class=\"iconfont icon-donate\"></i>\n</div>\n\n<% var donate = theme.donate %>\n\n\n<div id=\"don"
  },
  {
    "path": "layout/_partial/_post/footer.ejs",
    "chars": 1601,
    "preview": "<div class=\"bottom\">\n  <div class=\"other\">\n    <div class=\"meta\">\n      <% if( page.categories && page.categories.length"
  },
  {
    "path": "layout/_partial/_post/gallery.ejs",
    "chars": 222,
    "preview": "\n<% if (post.photos && post.photos.length){ %>\n\t\n\t<div class=\"gallery\">\n\t\t<% for( i in post.photos){%>\n\t\t\t<div class=\"im"
  },
  {
    "path": "layout/_partial/_post/header.ejs",
    "chars": 379,
    "preview": "<%# 文章页面头部 %>\n<div class=\"header\">\n\t\t<p class=\"title\">\t\n\t\t\t<%= page.title|| __('Untitled') %>\n\t\t</p>\n\t\t<div class=\"info\""
  },
  {
    "path": "layout/_partial/_post/mathjax.ejs",
    "chars": 867,
    "preview": "<%# mathjax %>\n<% if(theme.mathjax.enable || post.mathjax ){%>\n    <script type=\"text/x-mathjax-config\">\n        var pos"
  },
  {
    "path": "layout/_partial/_post/mob_share.ejs",
    "chars": 331,
    "preview": "<ul class=\"share\">\n\t<% for ( i in theme.share_item){ %>   \t\t\t             \n        <li class=\"iconfont \n\t\ticon-share-<%-"
  },
  {
    "path": "layout/_partial/_post/toc.ejs",
    "chars": 224,
    "preview": "<% if(theme.toc && !page.hide_toc ){  %>\n<div class=\"toc\">\n\t<p class=\"toc-title\">\n\t\t<%= __('Contents')%>\n\t</p>\n\t<div cla"
  },
  {
    "path": "layout/_partial/after-footer.ejs",
    "chars": 775,
    "preview": "<% if (theme.baidu_analytics){ %>\n\n\n<script>\nvar _hmt = _hmt || [];\n(function() {\n  var hm = document.createElement(\"scr"
  },
  {
    "path": "layout/_partial/article.ejs",
    "chars": 1430,
    "preview": "<%# post%>\n\n<article class=\"article\">\t\t\n\t   \n\t<div class=\"article-header\">\n\t    \n\t\t<a  class=\"title\" href=\"<%- url_for(p"
  },
  {
    "path": "layout/_partial/footer.ejs",
    "chars": 481,
    "preview": "<% var since = theme.footer.since %>\n<% var year = date(new Date(), 'YYYY') %>\n\n<footer class=\"footer\">\n\t<div class=\"inn"
  },
  {
    "path": "layout/_partial/head.ejs",
    "chars": 725,
    "preview": "<head>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n  <meta name=\"viewport\"content=\"width=devic"
  },
  {
    "path": "layout/_partial/header.ejs",
    "chars": 797,
    "preview": "<header class=\"header-wrapper\">\n\n  <nav class=\"inner\">\n    <div class=\"title\">\n      <a href=\"/\">\n        <img class=\"lo"
  },
  {
    "path": "layout/_partial/item.ejs",
    "chars": 331,
    "preview": "<% if(post) {%>\t\n\n\t   <% var  date_format = config.date_format  %>\n\n\t   <article class=\"item slideDownMin\">   \t\n\n       "
  },
  {
    "path": "layout/_partial/page-name.ejs",
    "chars": 115,
    "preview": "\n<div class=\"page-name\">\n    <i class=\"iconfont <%- icon %>\"></i>\n    <span class=\"name\"><%- name %></span>\n</div>\n"
  },
  {
    "path": "layout/_partial/paginator.ejs",
    "chars": 630,
    "preview": "\n<% if (page.total > 1){ %> \n   <nav class=\"paginator\">\n    <% if (page.prev) { %>\n        <a class=\"prev\" href=\"<%- url"
  },
  {
    "path": "layout/_partial/search.ejs",
    "chars": 332,
    "preview": "<div class=\"none\" id=\"search\">\n    <div class=\"header\">\n        <input type=\"text\" \n        placeholder=\"<%= __('Search."
  },
  {
    "path": "layout/_partial/slide-menu.ejs",
    "chars": 565,
    "preview": " <div class=\"mobile-menu\">      \n\n      <% if ( theme.favicon){ %>\n      <img class=\"mobile-menu-icon\" src= \"<%- url_for"
  },
  {
    "path": "layout/about.ejs",
    "chars": 215,
    "preview": "<section class=\"fadeIn slideDownMin\">\n\n\t<% var name =  __('Page.About') %>\n  \t<%- partial('_partial/page-name',{icon:'ic"
  },
  {
    "path": "layout/archive.ejs",
    "chars": 913,
    "preview": "<section class=\"slideDownMin\">\n\n  <% var name =  __('Page.Archives') %>\n  <%- partial('_partial/page-name',{icon:'icon-p"
  },
  {
    "path": "layout/category.ejs",
    "chars": 374,
    "preview": "<section>\n\n\n  <% var name =  __('Page.Categories') %>\n\n  <% if( is_category()){ %>\n\n      <%- partial('_partial/page-nam"
  },
  {
    "path": "layout/index.ejs",
    "chars": 766,
    "preview": "<%# profile %>\n\n\n<div class=\"index slideDownMin\">\n\t<% var profile = theme.profile %>\n\n\t<div class=\"profile\">\n\n\t\t<img cla"
  },
  {
    "path": "layout/layout.ejs",
    "chars": 767,
    "preview": "<!DOCTYPE html>\n<html>\n  <%- partial('_partial/head') %>  \n  <body>   \n    \n      <%- partial('_partial/header', null, {"
  },
  {
    "path": "layout/post.ejs",
    "chars": 790,
    "preview": "<article class=\"post slideDownMin\">\n  \n\t<%- partial('_partial/_post/header',{post: page}) %> \n\t<%- partial('_partial/_po"
  },
  {
    "path": "layout/tag.ejs",
    "chars": 973,
    "preview": "<section>\n\n  <% var name =  __('Page.Tags') %>\n  \n\n  <% if( is_tag()){ %>\n\n  \n        <%- partial('_partial/page-name',{"
  },
  {
    "path": "package.json",
    "chars": 1079,
    "preview": "{\n  \"name\": \"hexo-theme-nayo\",\n  \"version\": \"0.4.0\",\n  \"description\": \"a concise theme for hexo.\",\n  \"scripts\": {\n    \"b"
  },
  {
    "path": "scripts/raw_length.js",
    "chars": 281,
    "preview": "\n/**\n * \n * POST LENGTH\n * \n */\n\nhexo.extend.helper.register('raw_length', function (string) {\n    \n    if( Object.proto"
  },
  {
    "path": "scripts/render_img.js",
    "chars": 1117,
    "preview": "let cheerio = require('cheerio'),\n    loadedImage = 4,\n    placeHolder = '/images/placeholder.png';\n\n\n/**\n * \n * \n * LAZ"
  },
  {
    "path": "source/nayo.bundle.js",
    "chars": 22904,
    "preview": "!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.expo"
  },
  {
    "path": "src/scripts/activeNav.js",
    "chars": 705,
    "preview": "import dom from '@scripts/dom'\nimport Util from '@scripts/util'\n\nexports.init = () => {\n\n    if (Util.isMobile()) return"
  },
  {
    "path": "src/scripts/dom.js",
    "chars": 822,
    "preview": "/**\n * \n * DOM helper\n * \n */\n\nimport Util from '@scripts/util'\n\nconst dom = {\n    query(selector) {\n        if (!Util.i"
  },
  {
    "path": "src/scripts/extends.js",
    "chars": 793,
    "preview": "/**\n *  扩展了原生DOM集合方法\n *  使得其支持 forEach,map,filter\n */\n\nNodeList.prototype.forEach = function (cb) {\n    Array.prototype."
  },
  {
    "path": "src/scripts/header.js",
    "chars": 904,
    "preview": "import dom from '@scripts/dom'\nimport scroll from '@scripts/scroll'\nimport Util from '@scripts/util'\n\nexports.init = () "
  },
  {
    "path": "src/scripts/lazyload.js",
    "chars": 3033,
    "preview": "/**\n * LazyLoad 图片懒加载\n */\n\nclass LazyLoad {\n\n    constructor(images) {\n        this.settings = {\n            src: 'data-"
  },
  {
    "path": "src/scripts/main.js",
    "chars": 627,
    "preview": "require('@scripts/extends')\nrequire('@styles/styles.scss')\n\nimport {\n    addLoadEvent\n} from '@scripts/dom'\nimport Lazyl"
  },
  {
    "path": "src/scripts/mask.js",
    "chars": 665,
    "preview": "function mask() {\n\n    let mask = document.createElement('div')\n    mask.className = 'mask none'\n\n    document.body.appe"
  },
  {
    "path": "src/scripts/mobile.js",
    "chars": 1740,
    "preview": "import dom from '@scripts/dom'\nimport Util from '@scripts/util'\nimport Mask from '@scripts/mask'\n\nexports.init = () => {"
  },
  {
    "path": "src/scripts/scroll.js",
    "chars": 693,
    "preview": "/**\n * \n * \n * window scroll handler\n * \n * \n */\nimport Util from '@scripts/util'\n\nclass Scroll {\n\n    constructor() {\n "
  },
  {
    "path": "src/scripts/search.js",
    "chars": 5395,
    "preview": "function ajax(options) {\n\n    const xhr = new XMLHttpRequest()\n\n    xhr.onreadystatechange = () => {\n        if (xhr.rea"
  },
  {
    "path": "src/scripts/totop.js",
    "chars": 537,
    "preview": "import dom from '@scripts/dom'\nimport scroll from '@scripts/scroll'\n\nexports.init = () => {\n\n    const _ = {\n        dom"
  },
  {
    "path": "src/scripts/util.js",
    "chars": 727,
    "preview": "module.exports = {\n    isMobile() {\n        const userAgentInfo = navigator.userAgent\n        for (let agent of ['Androi"
  },
  {
    "path": "src/styles/base.scss",
    "chars": 647,
    "preview": "::selection {\n    background: #EBEBEB\n}\n\n.container {\n    width: 980px;\n    min-height: 60vh;\n    margin: 2.5rem auto;\n "
  },
  {
    "path": "src/styles/code/hightlight.scss",
    "chars": 4676,
    "preview": "@import \"./theme.scss\";\n\n.codeBlock {\n    overflow: auto;\n    margin: 20px 0;\n    padding: 0;\n    font-size: $code-font-"
  },
  {
    "path": "src/styles/code/theme.scss",
    "chars": 877,
    "preview": "// from hexo-theme-next\n\n$code-font-size : 13.5px;\n$number-font-size : 12px;\n$code-letter-spacing : .5px;\n$line-height-c"
  },
  {
    "path": "src/styles/iconfont.scss",
    "chars": 2182,
    "preview": "/**\n* @see http://www.iconfont.cn\n*/\n\n\n@font-face {\n  font-family: 'iconfont';\n  src: url('./iconfonts/iconfont.eot');\n "
  },
  {
    "path": "src/styles/mobile/mobile.scss",
    "chars": 3546,
    "preview": ".header-wrapper {\n    display: none\n}\n\n.mobile-header-wrapper {\n    width: 100%;\n    min-height: 60px;\n    transition: a"
  },
  {
    "path": "src/styles/partial/archive.scss",
    "chars": 1253,
    "preview": ".archive {\n    text-align: center;\n\n    .archive-post {\n        margin-top: 1rem;\n\n        .archive-year {\n            m"
  },
  {
    "path": "src/styles/partial/footer.scss",
    "chars": 365,
    "preview": ".footer {\n    width: 100%;\n    margin: 10vh 0 5vh;\n    color: #797f86;\n    text-align: center;\n    .inner {\n        marg"
  },
  {
    "path": "src/styles/partial/header.scss",
    "chars": 1829,
    "preview": ".header-wrapper {\n    width: 100%;\n    min-height: 70px;\n    transition: all 0.4s ease-in-out;\n    box-shadow: 0 1px 1px"
  },
  {
    "path": "src/styles/partial/index.scss",
    "chars": 2993,
    "preview": "// porfile\n\n.profile {\n    margin-bottom: 28px;\n    text-align: center;\n    border-bottom: 0.5px solid $c-shallow-line;\n"
  },
  {
    "path": "src/styles/partial/item.scss",
    "chars": 442,
    "preview": ".items {\n    .item {\n        display: flex;\n        align-items: center;\n        margin: 2rem 2rem;\n\n        .time {\n   "
  },
  {
    "path": "src/styles/partial/page-name.scss",
    "chars": 207,
    "preview": ".page-name {\n    margin-bottom: 1rem;\n    text-align: center;\n\n    .name {\n        font-size: 1rem;\n    }\n\n    .iconfont"
  },
  {
    "path": "src/styles/partial/paginator.scss",
    "chars": 1011,
    "preview": ".paginator {\n    margin: 8rem 0;\n    padding: 0 1rem;\n    text-align: center;\n    color: $c-gray;\n    font-size: 0.825re"
  },
  {
    "path": "src/styles/partial/post.scss",
    "chars": 3346,
    "preview": "@import \"~@styles/three/valine.scss\";\n\n.post {    \n\n    .header {\n        padding-bottom: 12px;\n        border-bottom: 1"
  },
  {
    "path": "src/styles/partial/search.scss",
    "chars": 1800,
    "preview": "#search {\n    width: 800px;\n    height: 620px;\n    position: fixed;\n    left: 50%;\n    top: 50%;\n    margin-left: -400px"
  },
  {
    "path": "src/styles/partial/tag.scss",
    "chars": 406,
    "preview": ".tag {\n    .tag-item {\n        list-style: none;\n        display: inline-block;\n        margin-right: 1.8rem;\n\n        ."
  },
  {
    "path": "src/styles/partial/toc.scss",
    "chars": 1666,
    "preview": ".toc {\n    position: absolute;\n    padding: 8px 10px;\n    width: 250px;\n    max-height: 600px;\n    top: 140px;\n    right"
  },
  {
    "path": "src/styles/styles.scss",
    "chars": 790,
    "preview": "@import \"~@styles/utils/reset.scss\";\n@import \"~@styles/utils/vars.scss\";\n@import \"~@styles/utils/typo.scss\";\n@import \"~@"
  },
  {
    "path": "src/styles/three/hover.scss",
    "chars": 177,
    "preview": "$inactive-color : #747474;\n\n.inactive-item {\n    color: $inactive-color !important;\n\n    &:link,\n    &:visited,\n    &:ac"
  },
  {
    "path": "src/styles/three/valine.scss",
    "chars": 820,
    "preview": "#comment {\n    margin-bottom: 4rem;\n    padding-bottom: 1rem;\n    position: relative;\n    border: none;\n}\n\n\n.power,\n.vem"
  },
  {
    "path": "src/styles/utils/ani.scss",
    "chars": 2138,
    "preview": "@keyframes leftIn {\n    from {\n        transform: translateX(100px);\n        opacity: 0;\n    }\n\n    to {\n        transfo"
  },
  {
    "path": "src/styles/utils/reset.scss",
    "chars": 926,
    "preview": "/**\n*   重置css样式\n*/\n\nhtml {\n    background: transparent;\n    -webkit-text-size-adjust: 100%;\n}\n\nbody {\n    font-family: -"
  },
  {
    "path": "src/styles/utils/typo.scss",
    "chars": 2306,
    "preview": ".typo {\n    font-size: 15px;\n    line-height: 2;\n    color: #0d0d0d;\n\n    h1,\n    h2,\n    h3,\n    h4,\n    h5,\n    h6 {\n "
  },
  {
    "path": "src/styles/utils/vars.scss",
    "chars": 936,
    "preview": "$c-shallow-line: #f5f5f5;\n$c-deep-line :#f1f1f1;\n$c-hover: #e26d6d;\n$c-black: #555;\n$c-gray : #727272;\n\n@mixin hover($be"
  },
  {
    "path": "webpack.config.js",
    "chars": 1817,
    "preview": "/**\n * \n * webpack 4.0 配置文件\n * @time 2019-03-28\n */\n\nconst path = require('path')\nconst CleanPlugin = require('clean-web"
  }
]

About this extraction

This page contains the full source code of the Lemonreds/hexo-theme-nayo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 73 files (97.5 KB), approximately 30.4k tokens, and a symbol index with 39 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!