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/)
## 效果图

## 安装说明
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">
©
<% 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/')
}
}
}
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
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.