first commit

v1.2.0
kun.peng 2019-10-03 00:15:37 +08:00
commit 3b6e150df7
79 changed files with 5193 additions and 0 deletions

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015 PPOffice
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

16
README.md Normal file
View File

@ -0,0 +1,16 @@
<h1><a href="https://github.com/halo-dev/halo-theme-icarus" target="_blank">halo-theme-icarus</a></h1>
## 说明
该主题的原作者为 [ppoffice](https://github.com/ppoffice),非常感谢做出这么优秀的主题。
原主题地址:[https://github.com/ppoffice/hexo-theme-icarus](https://github.com/ppoffice/hexo-theme-icarus)
## 预览截图
![screenshot.png](https://i.loli.net/2019/08/24/qAZXw6Eo54PbQJ7.png)
![settings.png](https://i.loli.net/2019/08/24/7K6m3VZApyfhUqF.png)
## 使用方法
1. 克隆或者[下载](https://github.com/halo-dev/halo-theme-icarus/releases)。
2. 压缩为 zip 压缩包之后在后台的主题设置直接上传即可使用。

34
archives.ftl Normal file
View File

@ -0,0 +1,34 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="归档 - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/archives">
<@postTag method="archiveYear">
<#list archives as archive>
<div class="card widget">
<div class="card-content">
<h3 class="tag is-link">
${archive.year?c}
</h3>
<div class="timeline">
<#list archive.posts as post>
<article class="media">
<#if post.thumbnail?? && post.thumbnail!=''>
<a href="${post.thumbnail}" class="media-left">
<p class="image is-64x64">
<img class="thumbnail" src="${context!}/archives/${post.url!}" alt="${post.title!}">
</p>
</a>
</#if>
<div class="media-content">
<div class="content">
<time class="has-text-grey is-size-7 is-block is-uppercase" datetime="${post.createTime!}">${post.createTime?string["EEE MMM d"]}</time>
<a href="${context!}/archives/${post.url!}" class="title has-link-black-ter is-size-6 has-text-weight-normal">${post.title!}</a>
</div>
</div>
</article>
</#list>
</div>
</div>
</div>
</#list>
</@postTag>
</@layout>

5
categories.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="分类 - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/categories">
<#include "layout/categories.ftl">
</@layout>

5
category.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="分类:${category.name!} - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/categories/${category.slugName!}">
<#include "layout/category.ftl">
</@layout>

34
index.ftl Normal file
View File

@ -0,0 +1,34 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}">
<#list posts.content as post>
<#if post.topPriority != 1>
<@article post,'index','null',true />
</#if>
</#list>
<#if posts.getTotalPages() gt 0>
<div class="card card-transparent">
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<div class="pagination-previous<#if posts.number gt 0><#else > is-invisible is-hidden-mobile</#if>">
<#if posts.number == 1>
<a class="is-flex-grow has-text-black-ter" href="${context!}">上一页</a>
<#else>
<a class="is-flex-grow has-text-black-ter" href="${context!}/page/${posts.number}">上一页</a>
</#if>
</div>
<div class="pagination-next<#if posts.getTotalPages() gt posts.number+1><#else > is-invisible is-hidden-mobile</#if>">
<a class="is-flex-grow has-text-black-ter" href="${context!}/page/${posts.number+2}">下一页</a>
</div>
<ul class="pagination-list is-hidden-mobile">
<#list rainbow as r>
<#if r == posts.number+1>
<li><a class="pagination-link is-current" href="${context!}/page/${posts.number+1}">${posts.number+1}</a></li>
<#else>
<li><a class="pagination-link has-text-black-ter" href="${context!}/page/${r}">${r}</a></li>
</#if>
</#list>
</ul>
</nav>
</div>
</#if>
</@layout>

25
layout/categories.ftl Normal file
View File

@ -0,0 +1,25 @@
<div class="card widget">
<div class="card-content">
<div class="menu">
<h3 class="menu-label">
分类
</h3>
<ul class="menu-list">
<@categoryTag method="list">
<#list categories as category>
<li>
<a class="level is-marginless" href="${context!}/categories/${category.slugName!}">
<span class="level-start">
<span class="level-item">${category.name}</span>
</span>
<span class="level-end">
<span class="level-item tag">${category.postCount}</span>
</span>
</a>
</li>
</#list>
</@categoryTag>
</ul>
</div>
</div>
</div>

55
layout/category.ftl Normal file
View File

@ -0,0 +1,55 @@
<#if settings.nav_enable!false>
<div class="card">
<div class="card-content">
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><a href="${context!}/categories">分类></a></li>
<li class="is-active"><a href="#" aria-current="page">${category.name}</a></li>
</ul>
</nav>
</div>
</div>
</#if>
<#if posts.content?size gt 0>
<#list posts.content as post>
<@article post,'index','null',true />
</#list>
<#if posts.getTotalPages() gt 0>
<div class="card card-transparent">
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<div class="pagination-previous<#if posts.number gt 0><#else > is-invisible is-hidden-mobile</#if>">
<#if posts.number == 1>
<a class="is-flex-grow has-text-black-ter"
href="${context!}/categories/${category.slugName!}">上一页</a>
<#else>
<a class="is-flex-grow has-text-black-ter"
href="${context!}/categories/${category.slugName!}/page/${posts.number}">上一页</a>
</#if>
</div>
<div class="pagination-next<#if posts.getTotalPages() gt posts.number+1><#else > is-invisible is-hidden-mobile</#if>">
<a class="is-flex-grow has-text-black-ter"
href="${context!}/categories/${category.slugName!}/page/${posts.number+2}">下一页</a>
</div>
<ul class="pagination-list is-hidden-mobile">
<#list rainbow as r>
<#if r == posts.number+1>
<li><a class="pagination-link is-current"
href="${context!}/categories/${category.slugName!}/page/${posts.number+1}">${posts.number+1}</a>
</li>
<#else>
<li><a class="pagination-link has-text-black-ter"
href="${context!}/categories/${category.slugName!}/page/${r}">${r}</a></li>
</#if>
</#list>
</ul>
</nav>
</div>
</#if>
<#else>
<div class="level">
<div class="level-item has-text-centered">
空空如也
</div>
</div>
</#if>

View File

@ -0,0 +1,7 @@
<#macro comment post,type>
<#if !post.disallowComment!false>
<script src="//cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.min.js"></script>
<script src="${options.comment_internal_plugin_js!'//cdn.jsdelivr.net/gh/halo-dev/halo-comment@latest/dist/halo-comment.min.js'}"></script>
<halo-comment id="${post.id}" type="${type}"/>
</#if>
</#macro>

154
layout/common/article.ftl Normal file
View File

@ -0,0 +1,154 @@
<#macro article post,layout,commentType,index>
<#include "../comment/comment.ftl">
<#-- <div class="card" <#if is_post??><#else>style="margin-left: 10px;"</#if>>-->
<div class="card">
<#if is_post?? || is_page?? || is_sheet??>
<#else >
<#if post.thumbnail?? && post.thumbnail!=''>
<div class="card-image">
<#if index>
<a href="${context!}/archives/${post.url!}">
<img class="thumbnail" src="${post.thumbnail!}" alt="${post.title!}">
</a>
<#else>
<span class="image is-7by1">
<img class="thumbnail" src="${post.thumbnail!}" alt="${post.title!}">
</span>
</#if>
</div>
</#if>
</#if>
<div class="card-content article " style="width: 100%">
<div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
<div class="level-left">
<time class="level-item has-text-grey"
datetime="${post.createTime!}">${post.createTime?string["EEE MMM d"]}</time>
<#if index>
<#if post.categories?? && post.categories?size gt 0>
<div class="level-item">
<#list post.categories as category>
<a class="has-link-grey -link"
href="${context!}/categories/${category.slugName!}">${category.name!}</a>&nbsp;
</#list>
</div>
</#if>
<#else>
<#if categories?? && categories?size gt 0>
<div class="level-item">
<#list categories as category>
<a class="has-link-grey -link"
href="${context!}/categories/${category.slugName!}">${category.name!}</a>&nbsp;
</#list>
</div>
</#if>
</#if>
</div>
</div>
<#if is_post??>
<h1 class="title is-size-3 is-size-4-mobile has-text-weight-normal">
<#if index>
<a class="has-link-black-ter" href="${context!}/archives/${post.url!}">${post.title!}</a>
<#else>
${post.title!}
</#if>
</h1>
<#else>
<h1 class="title is-size-5 is-size-4-mobile has-text-weight-normal">
<#if index>
<a class="has-link-black-ter" href="${context!}/archives/${post.url!}">${post.title!}</a>
<#else>
${post.title!}
</#if>
</h1>
</#if>
<div class="content <#if is_post?? || is_sheet??>post-article<#else>is-hidden-touch</#if>">
<#if index && post.summary?? && post.summary!=''>
${post.summary!}
<#else>
${post.formatContent!}
</#if>
</div>
<#if !index && tags?? && (tags?size gt 0)>
<div class="level is-size-7 is-uppercase">
<div class="level-start">
<div class="level-item">
<span class="is-size-6 has-text-grey has-mr-7">#</span>
<#list tags as tag>
<a class="has-link-grey -link"
href="${context!}/tags/${tag.slugName!}">${tag.name!}</a>&nbsp;
</#list>
</div>
</div>
</div>
</#if>
<#if index && post.summary?? && post.summary!=''>
<div class="level is-mobile">
<div class="level-start">
<div class="level-item">
<a class="button is-size-7 is-light" href="${context!}/archives/${post.url!}#more">阅读更多</a>
</div>
</div>
</div>
</#if>
</div>
</div>
<#if !index??>
<#if (settings.donate_alipay?? && settings.donate_alipay!='') || (settings.donate_wechat?? && settings.donate_wechat!='')>
<div class="card">
<div class="card-content">
<h3 class="menu-label has-text-centered">喜欢这篇文章?打赏一下作者吧</h3>
<div class="buttons is-centered">
<#if settings.donate_alipay?? && settings.donate_alipay!=''>
<#include "../donate/alipay.ftl">
</#if>
<#if settings.donate_wechat?? && settings.donate_wechat!=''>
<#include "../donate/wechat.ftl">
</#if>
</div>
</div>
</div>
</#if>
</#if>
<#if !index && nextPost?? && prePost??>
<div class="card card-transparent">
<div class="level post-navigation is-flex-wrap is-mobile">
<#if prePost??>
<div class="level-start">
<a class="level level-item has-link-grey article-nav-prev"
href="${context!}/archives/${prePost.url}">
<i class="level-item fas fa-chevron-left"></i>
<span class="level-item">${prePost.title!}</span>
</a>
</div>
</#if>
<#if nextPost??>
<div class="level-end">
<a class="level level-item has-link-grey article-nav-next"
href="${context!}/archives/${nextPost.url}">
<span class="level-item">${nextPost.title!}</span>
<i class="level-item fas fa-chevron-right"></i>
</a>
</div>
</#if>
</div>
</div>
</#if>
<#if !index>
<div class="card" id="comment-wrapper">
<div class="card-content">
<h3 class="title is-5 has-text-weight-normal">评论</h3>
<#if commentType == 'post'>
<@comment post,"post" />
<#else>
<@comment post,"sheet" />
</#if>
</div>
</div>
</#if>
</#macro>

28
layout/common/footer.ftl Normal file
View File

@ -0,0 +1,28 @@
<footer class="footer">
<div class="container">
<div class="level">
<div class="level-start has-text-centered-mobile">
<#-- <a class="footer-logo is-block has-mb-6" href="${context!}">-->
<#-- <#if options.blog_logo?? && options.blog_logo!=''>-->
<#-- <img src="${options.blog_logo!}" alt="${options.blog_title!}" height="28">-->
<#-- <#else>-->
<#-- ${options.blog_title!}-->
<#-- </#if>-->
<#-- </a>-->
<p class="is-size-6">
&copy; ${.now?string('yyyy')} ${user.nickname!}&nbsp;
Powered by <a href="https://halo.run/" target="_blank">Halo</a>
<br>
&nbsp;&nbsp;&nbsp;Theme <a href="#">Fantastic</a> by <a href="https://github.com/imkundev" target="_blank">Quinn</a>
<br />
<@global.footer />
</p>
</div>
<div class="level-end">
<div class="field has-addons is-flex-center-mobile has-mt-5-mobile is-flex-wrap is-flex-middle">
${settings.links_footer!}
</div>
</div>
</div>
</div>
</footer>

0
layout/common/head.ftl Normal file
View File

47
layout/common/module.ftl Normal file
View File

@ -0,0 +1,47 @@
<#macro module name>
<#if name == 'share'>
<div class="column is-4-tablet is-1-desktop <#if is_sheet??>is-hidden-desktop</#if> is-1-widescreen is-1-fullhd has-order-1 column-left is-hidden-touch <%= sticky_class(left) %>">
<div class="level">
<#-- <a href="#" style="display: block;background: #fff6;width: 30px;height: 30px;border-radius:50px;line-height: 30px;text-align: center;box-shadow: 0 2px 4px 0 rgba(0,0,0,.04);color: #333">-->
<#-- <i class="fas fa-eye"></i>-->
<#-- </a>-->
</div>
<div class="level"></div>
<div class="level"></div>
<div class="level">
<#if settings.share_type?? && settings.share_type!=''>
<#include "../share/${settings.share_type}.ftl">
</#if>
</div>
</div>
</#if>
<#if name == 'slider'>
<div class="blog-slider">
<div class="blog-slider__wrp swiper-wrapper">
<#list posts.content as post>
<#if post.topPriority == 1>
<div class="blog-slider__item swiper-slide">
<div class="blog-slider__img">
<a href="${context!}/archives/${post.url!}">
<img src="${post.thumbnail!}"
alt="${post.title!}">
</a>
</div>
<div class="blog-slider__content">
<span class="blog-slider__code">${post.createTime?string["EEE MMM d"]}</span>
<div class="blog-slider__title title is-5">${post.title!}</div>
<div class="blog-slider__text">${post.summary!}</div>
<a href="${context!}/archives/${post.url!}" class="blog-slider__button">阅读更多</a>
</div>
</div>
</#if>
</#list>
</div>
<div class="blog-slider__pagination"></div>
</div>
<!-- partial -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.5/js/swiper.min.js'></script>
</#if>
</#macro>

77
layout/common/navbar.ftl Normal file
View File

@ -0,0 +1,77 @@
<#macro navbar layout>
<nav class="navbar navbar-main">
<div class="container">
<div class="navbar-brand is-flex-center">
<a class="navbar-item navbar-logo" href="${context!}">
<#if options.blog_logo?? && options.blog_logo!=''>
<img src="${options.blog_logo!}" alt="${options.blog_title!}" height="28">
<#else>
${options.blog_title!}
</#if>
</a>
</div>
<div class="navbar-menu">
<@menuTag method="tree">
<#if menus?? && menus?size gt 0>
<#if settings.tree_menu_enable!false>
<div class="navbar-start">
<#list menus?sort_by('priority') as menu>
<#if menu.children?? && menu.children?size gt 0>
<div class="navbar-item has-dropdown is-hoverable">
<a class="sub-menu" href="${menu.url!}">
${menu.name!}
</a>
<div class="navbar-dropdown is-boxed">
<#list menu.children as child>
<a class="navbar-item"
href="${child.url!}">
${child.name!}
</a>
</#list>
</div>
</div>
<#else>
<a class="navbar-item" href="javascript:void(0)">
target="${menu.target!}">${menu.name}</a>
</#if>
</#list>
</div>
<#else>
<#if menus?? && menus?size gt 0>
<div class="navbar-start">
<#list menus?sort_by('priority') as menu>
<a class="navbar-item" href="${menu.url}" target="${menu.target!}">${menu.name}</a>
</#list>
</div>
</#if> </#if>
</#if>
</@menuTag>
<div class="navbar-end">
<#-- ${settings.links_top!}-->
<a class="navbar-item search" title="夜间模式" href="javascript:alert('开发中,敬请期待');">
<i class="fas fa-adjust"></i>
</a>
<a class="navbar-item search" title="文章搜索" onclick="openSearchPanel()" href="javascript:;">
<i class="fas fa-search"></i>
</a>
</div>
</div>
</div>
</nav>
<style>
.navbar-dropdown {
/*background-color: #fff;*/
/*border-bottom-left-radius: 6px;*/
/*border-bottom-right-radius: 6px;*/
/*border-top: 2px solid #dbdbdb;*/
/*box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);*/
/*font-size: .875rem;*/
/*min-width: 100%;*/
/*position: absolute;*/
/*top: 100%;*/
/*z-index: 20;*/
/*width: 120px;*/
}
</style>
</#macro>

28
layout/common/scripts.ftl Normal file
View File

@ -0,0 +1,28 @@
<script src="//cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js"></script>
<#include "../plugin/gallery.ftl">
<#include "../plugin/outdated-browser.ftl">
<#include "../plugin/mathjax.ftl">
<#include "../plugin/back-to-top.ftl">
<script src="${static!}/source/js/bundle.js"></script>
<#if is_index??>
<script src="${static!}/source/js/widget_pin.js"></script>
</#if>
<script>
var url = location.href;
var urlstatus = false;
$(".navbar-start a").each(function () {
if ((url + '/').indexOf($(this).attr('href')) > -1 && $(this).attr('href') != '/') {
$(this).addClass('is-active');
urlstatus = true;
} else {
$(this).removeClass('is-active');
}
});
if (!urlstatus) {
$(".navbar-start a").eq(0).addClass('is-active');
}
</script>

56
layout/common/widget.ftl Normal file
View File

@ -0,0 +1,56 @@
<#macro widget position>
<#if is_post?? || is_sheet?? >
<div class="column is-4-tablet is-3-desktop is-3-widescreen is-3-fullhd <#if position=='right'>is-hidden-touch </#if> <#if position == 'left'>has-order-1<#else>has-order-3</#if> column-${position} <%= sticky_class(position) %>">
<#elseif is_index??>
<div class="column is-4-tablet is-4-desktop <#if position=='right'>is-hidden-touch is-hidden-desktop-only is-4-widescreen is-4-fullhd <#else>is-3-widescreen</#if> <#if position == 'left'>has-order-1<#else>has-order-3</#if> column-${position} <%= sticky_class(position) %>">
<#else >
<div class="column is-4-tablet is-4-desktop is-3-widescreen is-3-fullhd <#if position=='right'>is-hidden-touch is-hidden-desktop-only</#if> <#if position == 'left'>has-order-1<#else>has-order-3</#if> column-${position} <%= sticky_class(position) %>">
</#if>
<#if position == 'left'>
<#if settings.sidebar_profile!true>
<#include "../widget/profile.ftl">
</#if>
<#if settings.sidebar_categories!true>
<#include "../widget/category.ftl">
</#if>
<#if settings.sidebar_tagcloud!true>
<#include "../widget/tagcloud.ftl">
</#if>
<#if settings.sidebar_links!true>
<#include "../widget/links.ftl">
</#if>
</#if>
<#if position == 'right'>
<#if post??>
<#include "../widget/cate_posts.ftl">
<#include "../widget/tag_posts.ftl">
<#else>
<#if settings.sidebar_recentpost!true>
<#include "../widget/recent_posts.ftl">
</#if>
</#if>
<#if settings.sidebar_recentcomment!true>
<#include "../widget/recent_comments.ftl">
</#if>
<#-- <#include "../widget/archive.ftl">-->
<#if settings.sidebar_tags!true>
<#include "../widget/tag.ftl">
</#if>
</#if>
<#if position == 'left'>
<div class="column-right-shadow is-hidden-widescreen is-6-fullhd ">
<#if settings.sidebar_recentpost!true>
<#include "../widget/recent_posts.ftl">
</#if>
<#if settings.sidebar_recentcomment!true>
<#include "../widget/recent_comments.ftl">
</#if>
<#-- <#include "../widget/archive.ftl">-->
<#if settings.sidebar_tags!true>
<#include "../widget/tag.ftl">
</#if>
</div>
</#if>
</div>
</#macro>

View File

@ -0,0 +1,20 @@
<div class="blog-slider">
<div class="blog-slider__wrp swiper-wrapper">
<div class="blog-slider__item swiper-slide">
<div class="blog-slider__img">
<img src="https://res.cloudinary.com/muhammederdem/image/upload/v1535759872/kuldar-kalvik-799168-unsplash.jpg" alt="">
</div>
<div class="blog-slider__content">
<span class="blog-slider__code">26 December 2019</span>
<div class="blog-slider__title">Lorem Ipsum Dolor</div>
<div class="blog-slider__text">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Recusandae voluptate repellendus magni illo ea animi? </div>
<a href="#" class="blog-slider__button">READ MORE</a>
</div>
</div>
</div>
<div class="blog-slider__pagination"></div>
</div>
<!-- partial -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.5/js/swiper.min.js'></script>

7
layout/donate/alipay.ftl Normal file
View File

@ -0,0 +1,7 @@
<a class="button is-info donate">
<span class="icon is-small">
<i class="fab fa-alipay"></i>
</span>
<span>支付宝捐赠</span>
<div class="qrcode"><img src="${settings.donate_alipay!}" alt="支付宝捐赠"></div>
</a>

7
layout/donate/wechat.ftl Normal file
View File

@ -0,0 +1,7 @@
<a class="button is-success donate">
<span class="icon is-small">
<i class="fab fa-weixin"></i>
</span>
<span>微信捐赠</span>
<div class="qrcode"><img src="${settings.donate_wechat!}" alt="微信捐赠"></div>
</a>

144
layout/layout.ftl Normal file
View File

@ -0,0 +1,144 @@
<#macro layout title,keywords,description,canonical>
<#include "common/navbar.ftl">
<#include "common/widget.ftl">
<#include "common/module.ftl">
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<title>${title!}</title>
<meta name="keywords" content="${keywords!}"/>
<meta name="description" content="${description!}">
<meta property="og:type" content="website">
<meta property="og:title" content="${title!}">
<meta property="og:url" content="${canonical}">
<meta property="og:site_name" content="${title!}">
<meta property="og:description" content="${description!}">
<meta property="og:locale" content="zh">
<meta property="og:image" content="${user.avatar!}">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="${title!}">
<meta name="twitter:description" content="${description!}">
<meta name="twitter:image" content="${user.avatar!}">
<link rel="canonical" href="${canonical!}"/>
<link rel="alternative" href="${context!}/atom.xml" title="${options.blog_title!}" type="application/atom+xml">
<@global.head />
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bulma@0.7.5/css/bulma.min.css">
<link rel="stylesheet" href="//use.fontawesome.com/releases/v5.4.1/css/all.css">
<#-- <link rel="stylesheet" href="//fonts.proxy.ustclug.org/css?family=Ubuntu:400,600|Source+Code+Pro">-->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/highlight.js@9.12.0/styles/atom-one-light.css">
<style>
body > .footer,
body > .navbar,
body > .section {
opacity: 0
}
</style>
<#if is_post?? || is_sheet??>
<style>
.content code .number {
background-color: transparent;
border-radius: 0;
display: unset;
font-size: .85em;
margin-right: 0;
padding: 0;
vertical-align: unset;
}
</style>
</#if>
<#if is_post?? || is_sheet??>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/lightgallery@1.6.8/dist/css/lightgallery.min.css">
<link rel="stylesheet"
href="//cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/css/justifiedGallery.min.css">
</#if>
<link rel="stylesheet"
href="//cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.css">
<script src="//cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>
<link rel="stylesheet" href="${static!}/source/css/style.css">
<link rel="stylesheet" href="${static!}/source/css/bundle.css">
<link rel="stylesheet" href="${static!}/source/css/back-to-top.css">
<#if post??>
<link rel="stylesheet" type="text/css"
href="${static!}/source/lib/prism/css/prism-${settings.code_pretty!'Default'}.css"/>
<script type="text/javascript" src="${static!}/source/lib/prism/js/prism.js"></script>
</#if>
<#if is_index??>
<link rel="stylesheet" href="${static!}/source/css/widget_pin.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.5/css/swiper.min.css">
</#if>
</head>
<body class="is-3-column">
<@navbar 'page' />
<section class="section">
<div class="container">
<div class="columns">
<#if post?? >
<#if settings.share_type !=''>
<@module 'share' />
</#if>
<div class="column is-8-tablet <#if is_sheet?? || settings.share_type != ''>is-9-desktop<#else>is--desktop</#if> is-8-widescreen is-8-fullhd has-order-2 column-main">
<#nested />
</div>
<@widget 'right' />
<#else >
<#if is_index??>
<div class="column is-8-tablet is-8-desktop is-9-widescreen is-9-fullhd has-order-2 column-main"
style="margin-left: 10px">
<div class="columns">
<div class="column is-12-tablet is-12-desktop is-12-widescreen has-order-2 column-main">
<#-- 判断是否已经有置顶文章-->
<#list posts.content as post>
<#if post.topPriority == 1>
<#assign isTop = 'yes'>
<#break>
</#if>
</#list>
<#if isTop??>
<div class="level">
<#-- <#include "./common/widget_pin.ftl">-->
<@module 'slider' />
</div>
</#if>
<div class="level">
<div class="columns">
<div class="column is-8-tablet is-12-desktop is-8-widescreen is-8-fullhd has-order-2 column-main">
<#nested />
</div>
<@widget 'right' />
</div>
</div>
</div>
</div>
</div>
<@widget 'left' />
<#else>
<div class="column is-8-tablet is-8-desktop is-6-widescreen is-6-fullhd has-order-2 column-main">
<#nested />
</div>
<@widget 'left' />
<@widget 'right' />
</#if>
</#if>
</div>
</div>
</section>
<#include "common/footer.ftl">
<#include "common/scripts.ftl">
<#include "search/local.ftl">
</body>
</html>
</#macro>

View File

@ -0,0 +1 @@
<script src="${static!}/source/js/animation.js"></script>

View File

@ -0,0 +1 @@
<a id="back-to-top" title="返回顶部" href="javascript:;"><i class="fas fa-chevron-up"></i></a>

View File

@ -0,0 +1,4 @@
<#if is_post?? || is_sheet??>
<script src="//cdn.jsdelivr.net/npm/lightgallery@1.6.8/dist/js/lightgallery.min.js" defer></script>
<script src="//cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js" defer></script>
</#if>

24
layout/plugin/mathjax.ftl Normal file
View File

@ -0,0 +1,24 @@
<#if (is_post?? || is_sheet??) && settings.mathjax_enable!false>
<script src="//cdn.jsdelivr.net/npm/mathjax@2.7.5/unpacked/MathJax.js?config=TeX-MML-AM_CHTML" defer></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
MathJax.Hub.Config({
'HTML-CSS': {
matchFontHeight: false
},
SVG: {
matchFontHeight: false
},
CommonHTML: {
matchFontHeight: false
},
tex2jax: {
inlineMath: [
['$','$'],
['\\(','\\)']
]
}
});
});
</script>
</#if>

View File

@ -0,0 +1,16 @@
<div id="outdated">
<h6>Your browser is out-of-date!</h6>
<p>Update your browser to view this website correctly. <a id="btnUpdateBrowser" href="http://outdatedbrowser.com/">Update
my browser now </a></p>
<p class="last"><a href="#" id="btnCloseUpdateBrowser" title="Close">&times;</a></p>
</div>
<script src="//cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js" defer>
<script>
document.addEventListener("DOMContentLoaded", function () {
outdatedBrowser({
bgColor: '#f25648',
color: '#ffffff',
lowerThan: 'flex'
});
});
</script>

81
layout/search/local.ftl Normal file
View File

@ -0,0 +1,81 @@
<div class="searchbox ins-search">
<div class="searchbox-container ins-search-container">
<div class="searchbox-input-wrapper">
<form method="get" action="/search">
<input type="text" class="searchbox-input ins-search-input" name="keyword" placeholder="请输入关键字"/>
</form>
<span class="searchbox-close ins-close ins-selectable" onclick="closeSearchPanel()"><i class="fas fa-times"></i></span>
</div>
<div class="searchbox-result-wrapper ins-section-wrapper">
<div class="ins-section-container">
<#-- <section class="ins-section">-->
<#-- <header class="ins-section-header">最新文章</header>-->
<#-- <@postTag method="latest" top="5">-->
<#-- <#list posts as post>-->
<#-- <a href="${context!}/archives/${post.url!}">-->
<#-- <div class="ins-selectable ins-search-item">-->
<#-- <header><i class="fa fa-file"></i><span class="ins-title">${post.title!}</span>-->
<#-- </header>-->
<#-- <p class="ins-search-preview">${post.summary!}</p>-->
<#-- </div>-->
<#-- </a>-->
<#-- </#list>-->
<#-- </@postTag>-->
<#-- </section>-->
<section class="ins-section">
<header class="ins-section-header">分类</header>
<div class="level">
<div class="columns is-multiline" style="padding: 1.5em 2em">
<@categoryTag method="list">
<#list categories as category>
<a href="${context!}/categories/${category.slugName!}">
<div class="ant-tag ant-tag-purple is-primary is-focused" style="margin-bottom: 8px;"> ${category.name!}</div>
<#-- <div class="ins-selectable ins-search-item">-->
<#-- <header>-->
<#-- <i class="fa fa-folder"></i>-->
<#-- <span class="ins-title">${category.name!}</span>-->
<#-- <span class="ins-slug">${category.slugName!}</span>-->
<#-- </header>-->
<#-- </div>-->
</a>
</#list>
</@categoryTag>
</div>
</div>
</section>
<section class="ins-section">
<header class="ins-section-header">标签</header>
<div class="level">
<div class="columns is-multiline" style="padding: 1.5em 2em">
<@tagTag method="list">
<#list tags as tag>
<a href="${context!}/tags/${tag.slugName!}">
<div class="ant-tag ant-tag-green" style="margin-bottom: 8px;"> ${tag.name!}</div>
<#-- <div class="ins-selectable ins-search-item">-->
<#-- <header>-->
<#-- <i class="fa fa-tag"></i>-->
<#-- <span class="ins-title">${tag.name!}</span>-->
<#-- <span class="ins-slug">${tag.slugName!}</span>-->
<#-- </header>-->
<#-- </div>-->
</a>
</#list>
</@tagTag>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
<script>
function openSearchPanel() {
$(".ins-search").addClass("show");
}
function closeSearchPanel() {
$(".ins-search").removeClass("show");
}
</script>

22
layout/share/addtoany.ftl Normal file
View File

@ -0,0 +1,22 @@
<!-- AddToAny BEGIN -->
<div class="a2a_kit a2a_kit_size_32 a2a_default_style">
<a class="a2a_dd" href="https://www.addtoany.com/share"></a>
<a class="a2a_button_facebook"></a>
<a class="a2a_button_twitter"></a>
<a class="a2a_button_telegram"></a>
<a class="a2a_button_whatsapp"></a>
<a class="a2a_button_reddit"></a>
</div>
<script async src="//static.addtoany.com/menu/page.js"></script>
<style>
.a2a_kit, .a2a_menu, .a2a_modal, .a2a_overlay {
margin-left: 1.5em;
}
.a2a_default_style .a2a_counter img, .a2a_default_style .a2a_dd, .a2a_default_style .a2a_svg {
margin-top: .8em;
}
.a2a_menu {
}
</style>
<!-- AddToAny END -->

9
layout/share/bdshare.ftl Normal file
View File

@ -0,0 +1,9 @@
<div class="bdsharebuttonbox">
<a href="#" class="bds_more" data-cmd="more"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "2", "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>

3
layout/share/sharejs.ftl Normal file
View File

@ -0,0 +1,3 @@
<div class="social-share column is-one-third" style="margin-left: 1.5em;"></div>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/social-share.js@1.0.16/dist/css/share.min.css">
<script src="//cdn.jsdelivr.net/npm/social-share.js@1.0.16/dist/js/social-share.min.js"></script>

54
layout/tag.ftl Normal file
View File

@ -0,0 +1,54 @@
<#include "common/article.ftl">
<#if settings.nav_enable!false>
<div class="card">
<div class="card-content">
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><a href="${context!}/tags">标签</a></li>
<li class="is-active"><a href="#" aria-current="page">${tag.name}</a></li>
</ul>
</nav>
</div>
</div>
</#if>
<#if posts.content?size gt 0>
<#list posts.content as post>
<@article post,'index','null',true />
</#list>
<#if posts.getTotalPages() gt 0>
<div class="card card-transparent">
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<div class="pagination-previous<#if posts.number gt 0><#else > is-invisible is-hidden-mobile</#if>">
<#if posts.number == 1>
<a class="is-flex-grow has-text-black-ter" href="${context!}/tags/${tag.slugName!}">上一页</a>
<#else>
<a class="is-flex-grow has-text-black-ter"
href="${context!}/tags/${tag.slugName!}/page/${posts.number}">上一页</a>
</#if>
</div>
<div class="pagination-next<#if posts.getTotalPages() gt posts.number+1><#else > is-invisible is-hidden-mobile</#if>">
<a class="is-flex-grow has-text-black-ter"
href="${context!}/tags/${tag.slugName!}/page/${posts.number+2}">下一页</a>
</div>
<ul class="pagination-list is-hidden-mobile">
<#list rainbow as r>
<#if r == posts.number+1>
<li><a class="pagination-link is-current"
href="${context!}/tags/${tag.slugName!}/page/${posts.number+1}">${posts.number+1}</a>
</li>
<#else>
<li><a class="pagination-link has-text-black-ter"
href="${context!}/tags/${tag.slugName!}/page/${r}">${r}</a></li>
</#if>
</#list>
</ul>
</nav>
</div>
</#if>
<#else>
<div class="level">
<div class="level-item has-text-centered">
空空如也
</div>
</div>
</#if>

21
layout/tags.ftl Normal file
View File

@ -0,0 +1,21 @@
<div class="card widget">
<div class="card-content">
<div class="menu">
<h3 class="menu-label">
标签
</h3>
<div class="field is-grouped is-grouped-multiline">
<@tagTag method="list">
<#list tags as tag>
<div class="control">
<a class="tags has-addons" href="${context!}/tags/${tag.slugName!}">
<span class="tag">${tag.name}</span>
<span class="tag is-grey">${tag.postCount!}</span>
</a>
</div>
</#list>
</@tagTag>
</div>
</div>
</div>
</div>

23
layout/widget/archive.ftl Normal file
View File

@ -0,0 +1,23 @@
<div class="card widget">
<div class="card-content">
<div class="menu">
<h3 class="menu-label">
归档
</h3>
<ul class="menu-list">
<% _list_archives().forEach(archive => { %>
<li>
<a class="level is-marginless" href="<%= archive.url %>">
<span class="level-start">
<span class="level-item"><%= archive.name %></span>
</span>
<span class="level-end">
<span class="level-item tag"><%= archive.count %></span>
</span>
</a>
</li>
<% }) %>
</ul>
</div>
</div>
</div>

View File

@ -0,0 +1,30 @@
<#if categories?exists && categories?size gt 0>
<div class="card widget">
<div class="card-content">
<h3 class="menu-label">
相关推荐
</h3>
<@postTag method="listByCategoryId" categoryId="${categories[0].id}">
<#list posts as post>
<#if post_index lt 3>
<article class="media">
<#if post.thumbnail?? && post.thumbnail!=''>
<a href="${context!}/archives/${post.url!}" class="media-left">
<p class="image is-64x64">
<img class="thumbnail" src="${post.thumbnail!}" alt="${post.title!}">
</p>
</a>
</#if>
<div class="media-content">
<div class="content">
<div><time class="has-text-grey is-size-7 is-uppercase" datetime="${post.createTime!}">${post.createTime?string["EEE MMM d"]}</time></div>
<a href="${context!}/archives/${post.url!}" class="title has-link-black-ter is-size-6 has-text-weight-normal">${post.title!}</a>
</div>
</div>
</article>
</#if>
</#list>
</@postTag>
</div>
</div>
</#if>

View File

@ -0,0 +1 @@
<#include "../categories.ftl">

27
layout/widget/links.ftl Normal file
View File

@ -0,0 +1,27 @@
<@linkTag method="list">
<#if links?? && links?size gt 0>
<div class="card widget">
<div class="card-content">
<div class="menu">
<h3 class="menu-label">
链接
</h3>
<ul class="menu-list">
<#list links as link>
<li>
<a class="level is-mobile" href="${link.url!}" target="_blank">
<span class="level-left">
<span class="level-item">${link.name}</span>
</span>
<span class="level-right">
<span class="level-item tag">${link.url!}</span>
</span>
</a>
</li>
</#list>
</ul>
</div>
</div>
</div>
</#if>
</@linkTag>

116
layout/widget/profile.ftl Normal file
View File

@ -0,0 +1,116 @@
<div class="card widget">
<div class="card-content">
<nav class="level">
<div class="level-item has-text-centered" style="flex-shrink: 1">
<div class="level">
<figure class="image is-64x64 has-mb-6 level-left">
<img class="is-rounded"
src="${user.avatar!}" alt="${user.nickname!}" style="padding: 2px;
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.1);">
</figure>
<#if settings.profile_enable!true>
<div class="level-right">
<div>
<p class="title is-3">
${user.nickname!}
</p>
<p class="is-size-5 is-block" style="padding-left: 1em;">
${user.description!}
</p>
</div>
</div>
</#if>
<#-- <#if settings.profile_location?? && settings.profile_location!=''>-->
<#-- <p class="is-size-6 is-flex is-flex-center has-text-grey">-->
<#-- <i class="fas fa-map-marker-alt has-mr-7"></i>-->
<#-- <span>${settings.profile_location!}</span>-->
<#-- </p>-->
<#-- </#if>-->
</div>
</div>
</nav>
<nav class="level is-mobile">
<div class="level-item has-text-centered is-marginless">
<div>
<p class="heading">
文章
</p>
<p class="title has-text-weight-normal">
<@postTag method="count">${count}</@postTag>
</p>
</div>
</div>
<div class="level-item has-text-centered is-marginless">
<div>
<p class="heading">
分类
</p>
<p class="title has-text-weight-normal">
<@categoryTag method="count">${count}</@categoryTag>
</p>
</div>
</div>
<div class="level-item has-text-centered is-marginless">
<div>
<p class="heading">
标签
</p>
<p class="title has-text-weight-normal">
<@tagTag method="count">${count}</@tagTag>
</p>
</div>
</div>
</nav>
<#-- <div class="level">-->
<#-- <a class="level-item button is-link is-rounded" href="${settings.profile_follow_url!'${context!}'}"-->
<#-- target="_blank">关注我</a>-->
<#-- </div>-->
<div class="level is-mobile">
<#if settings.social_github?? && settings.social_github!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="Github"
href="https://github.com/${settings.social_github}">
<i class="fab fa-github"></i>
</a>
</#if>
<#if settings.social_qq?? && settings.social_qq!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="QQ"
href="tencent://message/?uin=${settings.social_qq}&Site=&Menu=yes">
<i class="fab fa-qq"></i>
</a>
</#if>
<#if settings.social_weibo?? && settings.social_weibo!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="Weibo"
href="https://weibo.com/${settings.social_weibo}">
<i class="fab fa-weibo"></i>
</a>
</#if>
<#if settings.social_twitter?? && settings.social_twitter!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="Twitter"
href="https://twitter.com/${settings.social_twitter}">
<i class="fab fa-twitter"></i>
</a>
</#if>
<#if settings.social_facebook?? && settings.social_facebook!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="Facebook"
href="https://www.facebook.com/${settings.social_facebook}">
<i class="fab fa-facebook"></i>
</a>
</#if>
<#if settings.social_email?? && settings.social_email!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="Email"
href="mailto:${settings.social_email}">
<i class="fas fa-envelope"></i>
</a>
</#if>
<#if settings.social_telegram?? && settings.social_telegram!=''>
<a class="level-item button is-white is-marginless" target="_blank" title="Telegram"
href="https://t.me/${settings.social_telegram}">
<i class="fab fa-telegram"></i>
</a>
</#if>
<a class="level-item button is-white is-marginless" target="_blank" title="RSS" href="${context!}/atom.xml">
<i class="fas fa-rss"></i>
</a>
</div>
</div>
</div>

View File

@ -0,0 +1,21 @@
<div class="card widget">
<div class="card-content">
<h3 class="menu-label">
最新评论
</h3>
<@commentTag method="latest" top="5">
<#if comments?? && comments.getTotalElements() gt 0>
<#list comments.content as comment>
<article class="media">
<div class="media-content">
<div class="content">
<div><time class="has-text-grey is-size-7 is-uppercase" datetime="${comment.createTime!}">${comment.createTime?string('yyyy-MM-dd')}</time></div>
${comment.author!} : <a href="${context!}/archives/${comment.post.url!}#comment-wrapper" class="title has-link-black-ter is-size-6 has-text-weight-normal">${comment.content!}</a>
</div>
</div>
</article>
</#list>
</#if>
</@commentTag>
</div>
</div>

View File

@ -0,0 +1,26 @@
<div class="card widget">
<div class="card-content">
<h3 class="menu-label">
最新文章
</h3>
<@postTag method="latest" top="5">
<#list posts as post>
<article class="media">
<#if post.thumbnail?? && post.thumbnail!=''>
<a href="${context!}/archives/${post.url!}" class="media-left">
<p class="image is-64x64">
<img class="thumbnail" src="${post.thumbnail!}" alt="${post.title!}">
</p>
</a>
</#if>
<div class="media-content">
<div class="content">
<div><time class="has-text-grey is-size-7 is-uppercase" datetime="${post.createTime!}">${post.createTime?string["EEE MMM d"]}</time></div>
<a href="${context!}/archives/${post.url!}" class="title has-link-black-ter is-size-6 has-text-weight-normal">${post.title!}</a>
</div>
</div>
</article>
</#list>
</@postTag>
</div>
</div>

1
layout/widget/tag.ftl Normal file
View File

@ -0,0 +1 @@
<#include "../tags.ftl">

View File

@ -0,0 +1,30 @@
<#if tags?exists && tags?size gt 0>
<div class="card widget">
<div class="card-content">
<h3 class="menu-label">
相关文章
</h3>
<@postTag method="listByTagId" tagId="${tags[0].id}">
<#list posts as post>
<#if post_index lt 3>
<article class="media">
<#if post.thumbnail?? && post.thumbnail!=''>
<a href="${context!}/archives/${post.url!}" class="media-left">
<p class="image is-64x64">
<img class="thumbnail" src="${post.thumbnail!}" alt="${post.title!}">
</p>
</a>
</#if>
<div class="media-content">
<div class="content">
<div><time class="has-text-grey is-size-7 is-uppercase" datetime="${post.createTime!}">${post.createTime?string["EEE MMM d"]}</time></div>
<a href="${context!}/archives/${post.url!}" class="title has-link-black-ter is-size-6 has-text-weight-normal">${post.title!}</a>
</div>
</div>
</article>
</#if>
</#list>
</@postTag>
</div>
</div>
</#if>

View File

@ -0,0 +1,14 @@
<@tagTag method="list">
<#if tags?? && tags?size gt 0>
<div class="card widget">
<div class="card-content">
<h3 class="menu-label">
标签云
</h3>
<#list tags as tag>
<a href="${context!}/tags/${tag.slugName!}" style="font-size:<#if tag.name?length gt 7> ${tag.postCount+(tag.name?length)}<#else>${tag.postCount+(tag.name?length)*3}</#if>px">${tag.name!}</a>
</#list>
</div>
</div>
</#if>
</@tagTag>

39
layout/widget/toc.ftl Normal file
View File

@ -0,0 +1,39 @@
<% if (get_config('toc') === true && (post.layout === 'page' || post.layout === 'post')) {
function buildToc(toc) {
let result = '';
if (toc.hasOwnProperty('id') && toc.hasOwnProperty('index') && toc.hasOwnProperty('text')) {
result += `<li>
<a class="is-flex" href="#${toc.id}">
<span class="has-mr-6">${toc.index}</span>
<span>${toc.text}</span>
</a>`;
}
let keys = Object.keys(toc);
keys.indexOf('id') > -1 && keys.splice(keys.indexOf('id'), 1);
keys.indexOf('text') > -1 && keys.splice(keys.indexOf('text'), 1);
keys.indexOf('index') > -1 && keys.splice(keys.indexOf('index'), 1);
keys = keys.map(k => parseInt(k)).sort((a, b) => a - b);
if (keys.length > 0) {
result += '<ul class="menu-list">';
for (let i of keys) {
result += buildToc(toc[i]);
}
result += '</ul>';
}
if (toc.hasOwnProperty('id') && toc.hasOwnProperty('index') && toc.hasOwnProperty('text')) {
result += '</li>';
}
return result;
}
%>
<div class="card widget" id="toc">
<div class="card-content">
<div class="menu">
<h3 class="menu-label">
<%= _p('widget.catalogue', Infinity) %>
</h3>
<%- buildToc(_toc(post.content)) %>
</div>
</div>
</div>
<% } %>

5
links.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="链接 - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/links">
<#include "layout/widget/links.ftl">
</@layout>

95
photos.ftl Normal file
View File

@ -0,0 +1,95 @@
<#include "./layout/common/navbar.ftl">
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<title>${title!}</title>
<meta name="keywords" content="${keywords!}"/>
<meta name="description" content="${description!}">
<meta property="og:type" content="website">
<meta property="og:title" content="${title!}">
<meta property="og:site_name" content="${title!}">
<meta property="og:description" content="${description!}">
<meta property="og:locale" content="zh">
<meta property="og:image" content="${user.avatar!}">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="${title!}">
<meta name="twitter:description" content="${description!}">
<meta name="twitter:image" content="${user.avatar!}">
<link rel="canonical" href="${canonical!}"/>
<link rel="alternative" href="${context!}/atom.xml" title="${options.blog_title!}" type="application/atom+xml">
<@global.head />
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bulma@0.7.5/css/bulma.min.css">
<link rel="stylesheet" href="//use.fontawesome.com/releases/v5.4.1/css/all.css">
<#-- <link rel="stylesheet" href="//fonts.proxy.ustclug.org/css?family=Ubuntu:400,600|Source+Code+Pro">-->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/highlight.js@9.12.0/styles/atom-one-light.css">
<style>
body > .footer,
body > .navbar,
body > .section {
opacity: 0
}
</style>
<#if is_post?? || is_sheet??>
<style>
.content code .number {
background-color: transparent;
border-radius: 0;
display: unset;
font-size: .85em;
margin-right: 0;
padding: 0;
vertical-align: unset;
}
</style>
</#if>
<link rel="stylesheet"
href="//cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.css">
<script src="//cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>
<link rel="stylesheet" href="${static!}/source/css/style.css">
<link rel="stylesheet" href="${static!}/source/css/bundle.css">
<link rel="stylesheet" href="${static!}/source/css/back-to-top.css">
<#if post??>
<link rel="stylesheet" type="text/css"
href="${static!}/source/lib/prism/css/prism-${settings.code_pretty!'Default'}.css"/>
<script type="text/javascript" src="${static!}/source/lib/prism/js/prism.js"></script>
</#if>
<#if is_index??>
<link rel="stylesheet" href="${static!}/source/css/widget_pin.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.3.5/css/swiper.min.css">
</#if>
</head>
<body class="is-3-column">
<@navbar 'page' />
<section class="section">
<div class="container">
<div class="columns is-mobile is-4-tablet is-1-desktop is-1-widescreen is-6-fullhd is-centered">
<@photoTag method="list">
<div class="column is-2-column " style="padding: 30px">
<a href="">
<#list photos as photo>
<img src="${photo.thumbnail}" alt="">
</#list>
</a>
</div>
</@photoTag>
</div>
</div>
</section>
<#include "./layout/common/footer.ftl">
<#include "./layout/common/scripts.ftl">
<#include "./layout/search/local.ftl">
</body>
</html>

5
post.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="${post.title!} - ${options.blog_title!}" keywords="${options.seo_keywords!},${tagWords!}" description="${post.summary!}" canonical="${context!}/archives/${post.url!}">
<@article post,'page',"post",false />
</@layout>

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 KiB

38
search.ftl Normal file
View File

@ -0,0 +1,38 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="搜索:${keyword} - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/search?keyword=${keyword}">
<#list posts.content as post>
<@article post,'index','null',true />
</#list>
<#if posts.getTotalPages() gt 0>
<div class="card card-transparent">
<nav class="pagination is-centered" role="navigation" aria-label="pagination">
<div class="pagination-previous<#if posts.number gt 0><#else > is-invisible is-hidden-mobile</#if>">
<#if posts.number == 1>
<a class="is-flex-grow has-text-black-ter" href="${context!}/search?keyword=${keyword}">上一页</a>
<#else>
<a class="is-flex-grow has-text-black-ter" href="${context!}/search/page/${posts.number}?keyword=${keyword}">上一页</a>
</#if>
</div>
<div class="pagination-next<#if posts.getTotalPages() gt posts.number+1><#else > is-invisible is-hidden-mobile</#if>">
<a class="is-flex-grow has-text-black-ter" href="${context!}/search/page/${posts.number+2}?keyword=${keyword}">下一页</a>
</div>
<ul class="pagination-list is-hidden-mobile">
<#list rainbow as r>
<#if r == posts.number+1>
<li><a class="pagination-link is-current" href="${context!}/search/page/${posts.number+1}?keyword=${keyword}">${posts.number+1}</a></li>
<#else>
<li><a class="pagination-link has-text-black-ter" href="${context!}/search/page/${r}?keyword=${keyword}">${r}</a></li>
</#if>
</#list>
</ul>
</nav>
</div>
<#else>
<div class="level">
<div class="level-item has-text-centered">
没有你要找的内容『${keyword}』
</div>
</div>
</#if>
</@layout>

233
settings.yaml Normal file
View File

@ -0,0 +1,233 @@
post:
label: 文章设置
items:
share_type:
name: share_type
label: 文章分享组件
type: select
default: ''
options:
- value: ''
label: '无'
- value: addtoany
label: addtoany
- value: sharejs
label: sharejs
donate_alipay:
name: donate_alipay
label: 支付宝捐赠二维码
type: attachment
placeholder: '二维码地址'
donate_wechat:
name: donate_wechat
label: 微信捐赠二维码
type: attachment
placeholder: '二维码地址'
mathjax_enable:
name: mathjax_enable
label: MathJax
type: radio
data-type: bool
default: false
options:
- value: true
label: 开启
- value: false
label: 关闭
code_pretty:
name: code_pretty
label: 文章代码高亮主题
type: select
default: Default
options:
- value: Default
label: Default
- value: Coy
label: Coy
- value: Dark
label: Dark
- value: Okaidia
label: Okaidia
- value: Solarized Light
label: Solarized Light
- value: Tomorrow Night
label: Tomorrow Night
- value: Twilight
label: Twilight
social:
label: 社交设置
items:
social_github:
name: social_github
label: Github
type: text
placeholder: 'Github 用户名'
social_qq:
name: social_qq
label: QQ
type: text
placeholder: 'QQ 号'
social_weibo:
name: social_weibo
label: 微博
type: text
placeholder: '微博用户名'
social_twitter:
name: social_twitter
label: Twitter
type: text
placeholder: 'Twitter 用户名'
social_facebook:
name: social_facebook
label: Facebook
type: text
placeholder: 'Facebook 用户名'
social_email:
name: social_email
label: Email
type: text
placeholder: '邮箱地址'
social_telegram:
name: social_telegram
label: Telegram
type: text
placeholder: 'Telegram 用户名'
sidebar:
label: 个性化
items:
sidebar_profile:
name: sidebar_profile
label: 侧边栏个人资料
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
sidebar_categories:
name: sidebar_categories
label: 侧边栏分类
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
sidebar_tagcloud:
name: sidebar_tagcloud
label: 侧边栏标签云
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
sidebar_links:
name: sidebar_links
label: 侧边栏链接
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
sidebar_recentpost:
name: sidebar_recentpost
label: 侧边栏最近文章
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
nav_enable:
name: nav_enable
label: 是否显示分类导航
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
profile_enable:
name: profile_enable
label: 是否显示个性签名
type: radio
data-type: bool
default: true
options:
- value: true
label: 显示
- value: false
label: 隐藏
tree_menu_enable:
name: profile_enable
label: 菜单样式
type: radio
data-type: bool
default: false
options:
- value: true
label: 级联菜单
- value: false
label: 列表
sidebar_recentcomment:
name: sidebar_recentcomment
label: 侧边栏最近评论
type: radio
data-type: bool
default: false
options:
- value: true
label: 开启
- value: false
label: 关闭
sidebar_tags:
name: sidebar_tags
label: 侧边栏标签
type: radio
data-type: bool
default: true
options:
- value: true
label: 开启
- value: false
label: 关闭
custom_links:
label: 自定义链接
items:
links_top:
name: links_top
label: 顶部链接
type: textarea
default: '<a class="navbar-item" target="_blank" title="Download on GitHub" href="https://github.com/halo-dev/halo-theme-icarus">
<i class="fab fa-github"></i>
</a>'
links_footer:
name: links_footer
label: 底部链接
type: textarea
default: '<p class="control">
<a class="button is-white is-large" target="_blank" title="Creative Commons" href="https://creativecommons.org/">
<i class="fab fa-creative-commons title is-4"></i>
</a>
</p>
<p class="control">
<a class="button is-white is-large" target="_blank" title="Attribution 4.0 International" href="https://creativecommons.org/licenses/by/4.0/">
<i class="fab fa-creative-commons-by title is-4"></i>
</a>
</p>'

5
sheet.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="${sheet.title} - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/s/${sheet.url!}">
<@article sheet,'page',"sheet",false />
</@layout>

View File

@ -0,0 +1,16 @@
#back-to-top {
position: fixed;
padding: 8px 0;
transition: 0.4s ease opacity, 0.4s ease width, 0.4s ease transform, 0.4s ease border-radius;
opacity: 0;
line-height: 24px;
outline: none;
transform: translateY(120px);
display: block;
}
#back-to-top.fade-in {
opacity: 1;
}
#back-to-top.rise-up {
transform: translateY(0);
}

193
source/css/bundle.css Normal file
View File

@ -0,0 +1,193 @@
#back-to-top{position:fixed;padding:8px 0;transition:.4s ease opacity,.4s ease width,.4s ease transform,.4s ease border-radius;opacity:0;line-height:24px;outline:0;transform:translateY(120px)}#back-to-top.fade-in{opacity:1}#back-to-top.rise-up{transform:translateY(0)}.ins-section-container{position:relative;background:#f7f7f7}.ins-section{font-size:14px;line-height:16px}.ins-section .ins-search-item,.ins-section .ins-section-header{padding:8px 15px}.ins-section .ins-section-header{color:#9a9a9a;}.ins-section .ins-slug{margin-left:5px;color:#9a9a9a}.ins-section .ins-slug:before{content:'('}.ins-section .ins-slug:after{content:')'}.ins-section .ins-search-item .ins-search-preview,.ins-section .ins-search-item header{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ins-section .ins-search-item header .ins-title{margin-left:8px}.ins-section .ins-search-item .ins-search-preview{height:15px;font-size:12px;color:#9a9a9a;margin:5px 0 0 20px}.ins-section .ins-search-item.active,.ins-section .ins-search-item:hover{color:#fff;background:#3273dc}.ins-section .ins-search-item.active .ins-search-preview,.ins-section .ins-search-item.active .ins-slug,.ins-section .ins-search-item:hover .ins-search-preview,.ins-section .ins-search-item:hover .ins-slug{color:#fff}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#3273dc;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px}.searchbox{display:none;perspective:50em;top:0;left:0;width:100%;height:100%;z-index:100;background:rgba(0,0,0,.7);transform-origin:0;perspective-origin:top center}.searchbox.show{display:block}.searchbox,.searchbox .searchbox-container{position:fixed}.searchbox .searchbox-container{overflow:hidden}.searchbox .searchbox-selectable{cursor:pointer}.searchbox .searchbox-input-wrapper{position:relative}.searchbox .searchbox-input-wrapper .searchbox-input{font-weight: 400 !important;width:100%;border:none;outline:0;font-size:16px;box-shadow:0 1px 2px 0 rgba(0,0,0,0.05);font-weight:200;border-radius:0;background:#fff;line-height:20px;box-sizing:border-box;padding:12px 28px 12px 20px;border-bottom:1px solid #e2e2e2}.searchbox .searchbox-input-wrapper .searchbox-close{top:50%;right:6px;width:20px;height:20px;line-height:20px;font-size:16px;margin-top:-11px;position:absolute;text-align:center;display:inline-block}.searchbox .searchbox-input-wrapper .searchbox-close:hover{color:#3273dc}.searchbox .searchbox-result-wrapper{left:0;right:0;top:45px;bottom:0;overflow-y:auto;position:absolute}.searchbox .searchbox-container{border-radius:2px;left:50%;top:100px;width:540px;z-index:101;bottom:100px;margin-left:-270px;box-sizing:border-box}@media screen and (max-width:559px),screen and (max-height:479px){.searchbox .searchbox-container{top:0;left:0;margin:0;width:100%;height:100%;background:#f7f7f7}}
.ant-tag {
font-family: Chinese Quote, -apple-system, BlinkMacSystemFont, Segoe UI, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Helvetica Neue, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
color: rgba(0, 0, 0, .65);
-webkit-box-sizing: border-box;
box-sizing: border-box;
margin: 0;
padding: 5px 15px;
list-style: none;
display: inline-block;
border-radius: 2px;
border: 1px solid #d9d9d9;
background: #fafafa;
font-size: 12px;
-webkit-transition: all .3s cubic-bezier(.215, .61, .355, 1);
transition: all .3s cubic-bezier(.215, .61, .355, 1);
opacity: 1;
margin-right: 8px;
cursor: pointer;
white-space:nowrap;
opacity: .8;
font-weight: 400;
text-transform: uppercase;
}
.ant-tag:hover {
opacity:1;
border-color:#91d5ff
}
.ant-tag, .ant-tag a, .ant-tag a:hover {
color:rgba(0, 0, 0, .65)
}
.ant-tag-pink {
color: #eb2f96;
background: #fff0f6;
border-color:#ffadd2
}
.ant-tag-pink-inverse {
background: #eb2f96;
border-color: #eb2f96;
color:#fff
}
.ant-tag-magenta {
color: #eb2f96;
background: #fff0f6;
border-color:#ffadd2
}
.ant-tag-magenta-inverse {
background: #eb2f96;
border-color: #eb2f96;
color:#fff
}
.ant-tag-red {
color: #f5222d;
background: #fff1f0;
border-color:#ffa39e
}
.ant-tag-red-inverse {
background: #f5222d;
border-color: #f5222d;
color:#fff
}
.ant-tag-volcano {
color: #fa541c;
background: #fff2e8;
border-color:#ffbb96
}
.ant-tag-volcano-inverse {
background: #fa541c;
border-color: #fa541c;
color:#fff
}
.ant-tag-orange {
color: #fa8c16;
background: #fff7e6;
border-color:#ffd591
}
.ant-tag-orange-inverse {
background: #fa8c16;
border-color: #fa8c16;
color:#fff
}
.ant-tag-yellow {
color: #fadb14;
background: #feffe6;
border-color:#fffb8f
}
.ant-tag-yellow-inverse {
background: #fadb14;
border-color: #fadb14;
color:#fff
}
.ant-tag-gold {
color: #faad14;
background: #fffbe6;
border-color:#ffe58f
}
.ant-tag-gold-inverse {
background: #faad14;
border-color: #faad14;
color:#fff
}
.ant-tag-cyan {
color: #13c2c2;
background: #e6fffb;
border-color:#87e8de
}
.ant-tag-cyan-inverse {
background: #13c2c2;
border-color: #13c2c2;
color:#fff
}
.ant-tag-lime {
color: #a0d911;
background: #fcffe6;
border-color:#eaff8f
}
.ant-tag-lime-inverse {
background: #a0d911;
border-color: #a0d911;
color:#fff
}
.ant-tag-green {
color: #52c41a;
background: #f6ffed;
border-color:#b7eb8f
}
.ant-tag-green-inverse {
background: #52c41a;
border-color: #52c41a;
color:#fff
}
.ant-tag-blue {
color: #1890ff;
background: #e6f7ff;
border-color:#91d5ff
}
.ant-tag-blue-inverse {
background: #1890ff;
border-color: #1890ff;
color:#fff
}
.ant-tag-geekblue {
color: #2f54eb;
background: #f0f5ff;
border-color:#adc6ff
}
.ant-tag-geekblue-inverse {
background: #2f54eb;
border-color: #2f54eb;
color:#fff
}
.ant-tag-purple {
color: #722ed1;
background: #f9f0ff;
border-color:#d3adf7
}
.ant-tag-purple-inverse {
background: #722ed1;
border-color: #722ed1;
color:#fff
}

57
source/css/insight.css Normal file
View File

@ -0,0 +1,57 @@
.ins-section-container {
position: relative;
background: #f7f7f7;
}
.ins-section {
font-size: 14px;
line-height: 16px;
}
.ins-section .ins-section-header, .ins-section .ins-search-item {
padding: 8px 15px;
}
.ins-section .ins-section-header {
color: #9a9a9a;
border-bottom: 1px solid #e2e2e2;
}
.ins-section .ins-slug {
margin-left: 5px;
color: #9a9a9a;
}
.ins-section .ins-slug:before {
content: '(';
}
.ins-section .ins-slug:after {
content: ')';
}
.ins-section .ins-search-item header, .ins-section .ins-search-item .ins-search-preview {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.ins-section .ins-search-item header .ins-title {
margin-left: 8px;
}
.ins-section .ins-search-item .ins-search-preview {
height: 15px;
font-size: 12px;
color: #9a9a9a;
margin: 5px 0 0 20px;
}
.ins-section .ins-search-item:hover, .ins-section .ins-search-item.active {
color: #fff;
background: #3273dc;
}
.ins-section .ins-search-item:hover .ins-slug, .ins-section .ins-search-item.active .ins-slug, .ins-section .ins-search-item:hover .ins-search-preview, .ins-section .ins-search-item.active .ins-search-preview {
color: #fff;
}

View File

@ -0,0 +1,22 @@
.pace {
-webkit-pointer-events: none;
pointer-events: none;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.pace-inactive {
display: none;
}
.pace .pace-progress {
background: #3273dc;
position: fixed;
z-index: 2000;
top: 0;
right: 100%;
width: 100%;
height: 2px;
}

94
source/css/search.css Normal file
View File

@ -0,0 +1,94 @@
.searchbox {
display: none;
perspective: 50em;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 100;
background: rgba(0, 0, 0, 0.7);
transform-origin: 0%;
perspective-origin: top center;
}
.searchbox.show {
display: block;
}
.searchbox, .searchbox .searchbox-container {
position: fixed;
}
.searchbox .searchbox-container {
overflow: hidden;
}
.searchbox .searchbox-selectable {
cursor: pointer;
}
.searchbox .searchbox-input-wrapper {
position: relative;
}
.searchbox .searchbox-input-wrapper .searchbox-input {
width: 100%;
border: none;
outline: none;
font-size: 16px;
box-shadow: none;
font-weight: 200;
border-radius: 0;
background: #fff;
line-height: 20px;
box-sizing: border-box;
padding: 12px 28px 12px 20px;
border-bottom: 1px solid #e2e2e2;
}
.searchbox .searchbox-input-wrapper .searchbox-close {
top: 50%;
right: 6px;
width: 20px;
height: 20px;
line-height: 20px;
font-size: 16px;
margin-top: -11px;
position: absolute;
text-align: center;
display: inline-block;
}
.searchbox .searchbox-input-wrapper .searchbox-close:hover {
color: #3273dc;
}
.searchbox .searchbox-result-wrapper {
left: 0;
right: 0;
top: 45px;
bottom: 0;
overflow-y: auto;
position: absolute;
}
.searchbox .searchbox-container {
left: 50%;
top: 100px;
width: 540px;
z-index: 101;
bottom: 100px;
margin-left: -270px;
box-sizing: border-box;
}
@media screen and (max-width: 559px), screen and (max-height: 479px) {
.searchbox .searchbox-container {
top: 0;
left: 0;
margin: 0;
width: 100%;
height: 100%;
background: #f7f7f7;
}
}

549
source/css/style.css Normal file
View File

@ -0,0 +1,549 @@
/* ---------------------------------
* Override CSS Framework
* --------------------------------- */
html {
font-size: 14px;
}
body {
background-color: #f7f7f7;
}
.section {
padding: 2rem 1.5rem;
}
body,
button,
input,
select,
textarea {
font-family: "Ubuntu", "Roboto", "Open Sans", "Microsoft YaHei", sans-serif;
}
@media screen and (min-width: 1280px) {
.is-1-column .container,
.is-2-column .container {
max-width: 960px;
width: 960px;
}
}
@media screen and (min-width: 1472px) {
.is-2-column .container {
max-width: 1152px;
width: 1152px;
}
.is-1-column .container {
max-width: 960px;
width: 960px;
}
}
@media screen and (max-width: 768px) {
.section {
padding: 1.5rem 1rem;
}
}
@media screen and (min-width: 769px) {
.column-main.is-sticky,
.column-left.is-sticky,
.column-right.is-sticky,
.column-right-shadow.is-sticky {
align-self: flex-start;
position: -webkit-sticky;
position: sticky;
top: 0.75rem;
}
.column-right-shadow.is-sticky {
top: 1.5rem;
}
}
.tag.is-grey {
background: #e7e7e7;
}
.card {
border-radius: 2px;
box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05);
display: flex;
}
.card + .card,
.card + .column-right-shadow {
margin-top: 1.5rem;
}
.card.card-transparent {
box-shadow: none;
background: transparent;
}
.card .card-image {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
flex: 8;
}
.card .card-image img {
max-height: 150px;
top: 50%;
transform: translateX(-5%) translateY(-50%);
position: relative;
border-radius: 2px;
box-shadow: 3px 4px 12px 0 rgba(0,0,0,0.2);
}
.card .card-content {
flex: 12;
padding: 1rem;
}
img.thumbnail {
object-fit: cover;
width: 100%;
height: 100%;
box-shadow: 3px 4px 12px 0 rgba(0,0,0,0.2);
border-radius: 2px;
}
.navbar-logo img,
.footer-logo img {
max-height: 1.75rem;
}
.navbar-main {
box-shadow: 0 4px 10px rgba(0,0,0,0.05);
}
.navbar-main .navbar-menu,
.navbar-main .navbar-start,
.navbar-main .navbar-end {
align-items: stretch;
display: flex;
padding: 0;
flex-shrink: 0;
}
.navbar-main .navbar-menu {
flex-grow: 1;
flex-shrink: 0;
}
.navbar-main .navbar-start {
justify-content: flex-start;
margin-right: auto;
font-size: 15px;
}
.navbar-main .navbar-end {
justify-content: flex-end;
margin-left: auto;
}
.navbar-main .navbar-item {
display: flex;
align-items: center;
padding: 1.25rem 0.75rem;
padding-right: 1.5rem;
}
.navbar-main .navbar-item.is-active {
color: #3273dc;
background-color: transparent;
}
.navbar-main .navbar-item .navbar-dropdown {
border-radius: 2px;
box-shadow: 0 8px 8px rgba(10,10,10,0.1);
font-weight: 500;
}
.navbar-main .navbar-item .sub-menu {
color: #4a4a4a;
}
.navbar-main .navbar-item .sub-menu:after {
content: '\2022';
position: absolute;
color: #3273dc;
}
@media screen and (max-width: 1087px) {
.navbar-main .navbar-menu {
justify-content: center;
box-shadow: none;
}
.navbar-main .navbar-start {
margin-right: 0;
}
.navbar-main .navbar-end {
margin-left: 0;
}
}
.footer {
background: #fff;
}
.footer .field .button {
background: transparent;
}
.widget .media {
border: none;
}
.widget .media + .media {
margin-top: 0;
}
.widget .menu-list li ul {
margin-right: 0;
}
.widget .menu-list a.level {
display: flex;
}
.pagination {
width: 100%;
}
.pagination .pagination-link:not(.is-current),
.pagination .pagination-previous,
.pagination .pagination-next {
background: #fff;
border: none;
}
.pagination .pagination-link,
.pagination .pagination-previous,
.pagination .pagination-next {
box-shadow: 0 4px 10px rgba(0,0,0,0.05);
}
.post-navigation {
width: 100%;
}
.post-navigation .level-item {
margin-bottom: 0;
}
.timeline {
margin-left: 1rem;
padding-left: 1.5rem;
padding-top: 1rem;
border-left: 1px solid #dbdbdb;
}
.timeline .media {
position: relative;
}
.timeline .media:before,
.timeline .media:last-child:after {
content: '';
display: block;
position: absolute;
left: calc(-5px - 1.5rem);
}
.timeline .media:before {
width: 9px;
height: 9px;
top: 1.3rem;
background: #dbdbdb;
border-radius: 50%;
}
.timeline .media:first-child:before {
top: 0.3rem;
}
.timeline .media:last-child:after {
top: calc(1.3rem + 9px);
width: 9px;
bottom: 0;
background: #fff;
}
.timeline .media:first-child:last-child:after {
top: calc(0.3rem + 9px);
}
.article .article-meta {
margin-bottom: 0.5rem !important;
}
.article .content {
font-size: 1.1rem;
}
.article .content blockquote.pullquote {
float: right;
max-width: 50%;
font-size: 1.15rem;
position: relative;
}
.article .content a {
word-wrap: break-word;
}
.rtl {
direction: rtl;
}
.rtl .level .level-item:not(:last-child),
.rtl .level.is-mobile .level-item:not(:last-child) {
margin-left: 0.75rem;
margin-right: 0;
}
.donate {
position: relative;
}
.donate .qrcode {
display: none;
position: absolute;
z-index: 99;
bottom: 2.5em;
line-height: 0;
overflow: hidden;
border-radius: 2px;
box-shadow: 0 4px 10px rgba(0,0,0,0.1), 0 0 1px rgba(0,0,0,0.2);
overflow: hidden;
}
.donate .qrcode img {
max-width: 280px;
}
.donate:hover .qrcode {
display: block;
}
.donate:first-child:not(:last-child) .qrcode {
left: -0.75rem;
}
.donate:last-child:not(:first-child) .qrcode {
right: -0.75rem;
}
@media screen and (max-width: 768px) {
#toc {
display: none;
position: fixed;
margin: 1rem;
left: 0;
right: 0;
bottom: 0;
z-index: 100;
max-height: calc(100vh - 2rem);
overflow-y: auto;
}
#toc-mask {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 99;
background: rgba(0,0,0,0.7);
}
#toc.is-active,
#toc-mask.is-active {
display: block;
}
}
/* ---------------------------------
* Custom modifiers
* --------------------------------- */
.is-borderless {
border: none;
}
.is-size-7 {
font-size: 0.85rem !important;
}
.is-7by1 {
padding-top: 42.8%;
}
.is-7by1 img {
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0;
}
.is-overflow-x-auto {
overflow-x: auto !important;
}
.is-flex-grow {
flex-grow: 1 !important;
}
.is-flex-wrap {
flex-wrap: wrap !important;
}
.is-flex-start {
justify-content: start !important;
}
.is-flex-center {
justify-content: center !important;
}
.is-flex-middle {
align-items: center !important;
}
.has-order-1 {
order: 1;
}
.has-order-2 {
order: 2;
}
.has-order-3 {
order: 3;
}
.has-mr-6 {
margin-right: 0.5em !important;
}
.has-mb-6 {
margin-bottom: 0.5em !important;
}
.has-mr-7 {
margin-right: 0.25em !important;
}
.has-link-grey,
.has-link-black-ter {
transition: 0.2s ease;
}
.has-link-grey:hover,
.has-link-black-ter:hover {
color: #3273dc !important;
}
.has-link-grey {
color: #7a7a7a !important;
}
.has-link-black-ter {
color: #242424 !important;
}
@media screen and (max-width: 768px) {
.has-text-centered-mobile {
text-align: center !important;
}
.is-flex-center-mobile {
justify-content: center !important;
}
.has-mt-5-mobile {
margin-top: 1em !important;
}
}
/* ---------------------------------
* Font icon fixes
* --------------------------------- */
.fa,
.fab,
.fal,
.far,
.fas {
line-height: inherit;
font-size: 17px;
}
/* ---------------------------------
* Fix content elements
* --------------------------------- */
.content h1,
.content h2,
.content h3,
.content h4,
.content h5,
.content h6 {
font-weight: 400;
}
.content h1 {
font-size: 1.75em;
}
.content h2 {
font-size: 1.5em;
}
.content h3 {
font-size: 1.25em;
}
.content h4 {
font-size: 1.125em;
}
.content h5 {
font-size: 1em;
}
.content blockquote footer strong + cite {
margin-left: 0.5em;
}
/* ---------------------------------
* Fix code highlight
* --------------------------------- */
figure.highlight {
padding: 0;
width: 100%;
position: relative;
margin: 1em 0 1em !important;
}
figure.highlight.folded .highlight-body {
height: 0;
}
figure.highlight pre,
figure.highlight table tr:hover {
color: inherit;
background: transparent;
}
figure.highlight table {
width: auto;
}
figure.highlight pre {
padding: 0;
overflow: visible;
}
figure.highlight pre .line {
line-height: 1.5rem;
}
figure.highlight figcaption,
figure.highlight .gutter {
background: rgba(200,200,200,0.15);
}
figure.highlight figcaption {
padding: 0.3em 0.75em;
text-align: left;
font-style: normal;
font-size: 0.8em;
}
figure.highlight figcaption:after {
clear: both;
content: " ";
display: table;
}
figure.highlight figcaption span {
font-weight: 500;
font-family: "Source Code Pro", monospace, "Microsoft YaHei";
}
figure.highlight figcaption .fold,
figure.highlight figcaption a {
color: #9a9a9a;
}
figure.highlight figcaption a {
float: right;
margin-left: 0.5em;
}
figure.highlight figcaption .fold {
margin-right: 0.5em;
cursor: pointer;
}
figure.highlight .highlight-body {
overflow: auto;
}
figure.highlight .gutter {
text-align: right;
}
figure.highlight .tag,
figure.highlight .title,
figure.highlight .number,
figure.highlight .section {
display: inherit;
font: inherit;
margin: inherit;
padding: inherit;
background: inherit;
height: inherit;
text-align: inherit;
vertical-align: inherit;
min-width: inherit;
border-radius: inherit;
}
/* ---------------------------------
* Overflow Table
* --------------------------------- */
.table-overflow {
overflow-x: auto;
}
.table-overflow table {
width: auto !important;
}
.table-overflow table th {
word-break: keep-all;
}
/* ---------------------------------
* Fix Video
* --------------------------------- */
.video-container {
position: relative;
padding-bottom: 56.25%;
padding-top: 25px;
height: 0;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* ---------------------------------
* Fix Gist Snippet
* --------------------------------- */
.gist table tr:hover {
background: transparent;
}
.gist table td {
border: none;
}
.gist .file {
all: initial;
}
.post-article {
iframe: 400px;
}

513
source/css/style.styl Normal file
View File

@ -0,0 +1,513 @@
family-sans = "Ubuntu", "Roboto", "Open Sans", "Microsoft YaHei", sans-serif
family-mono = "Source Code Pro", monospace, "Microsoft YaHei"
gap = 64px
screen-tablet = 769px
screen-desktop = 1088px
screen-widescreen = 1280px
screen-fullhd = 1472px
/* ---------------------------------
* Override CSS Framework
* --------------------------------- */
html
font-size: 14px
body
background-color: #f7f7f7
.section
padding: 2rem 1.5rem
body, button, input, select, textarea
font-family: family-sans
@media screen and (min-width: screen-widescreen)
.is-1-column .container
.is-2-column .container
max-width: screen-desktop - 2 * gap
width: screen-desktop - 2 * gap
@media screen and (min-width: screen-fullhd)
.is-2-column .container
max-width: screen-widescreen - 2 * gap
width: screen-widescreen - 2 * gap
.is-1-column .container
max-width: screen-desktop - 2 * gap
width: screen-desktop - 2 * gap
@media screen and (max-width: screen-tablet - 1)
.section
padding: 1.5rem 1rem
@media screen and (min-width: screen-tablet)
.column-main,
.column-left,
.column-right,
.column-right-shadow
&.is-sticky
align-self: flex-start
position: -webkit-sticky
position: sticky
top: .75rem
.column-right-shadow
&.is-sticky
top: 1.5rem
.tag
&.is-grey
background: #e7e7e7
//.card:hover
// .card-image
// img
// transform: scale(1.03);
.card
border-radius: 2px
//box-shadow: 0 4px 10px rgba(0,0,0,0.05), 0 0 1px rgba(0,0,0,0.1)
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .05)
display: flex;
& + .card,
& + .column-right-shadow
margin-top: 1.5rem
&.card-transparent
box-shadow: none
background: transparent
.card-image
//overflow: hidden
border-top-left-radius: 4px
border-top-right-radius: 4px
flex: 8
img
//height: 80%
max-height 150px
top: 50%
transform: translateX(-5%) translateY(-50%)
position: relative
border-radius: 2px
box-shadow: 3px 4px 12px 0 rgba(0, 0, 0, .2)
.card-content
flex: 12
padding: 1rem
img.thumbnail
object-fit: cover
width: 100%
height: 100%
box-shadow: 3px 4px 12px 0 rgba(0,0,0,0.2)
border-radius: 2px
.navbar-logo,
.footer-logo
img
max-height: 1.75rem
.navbar-main
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05)
.navbar-menu,
.navbar-start,
.navbar-end
align-items: stretch
display: flex
padding: 0
flex-shrink: 0
.navbar-menu
flex-grow: 1
flex-shrink: 0
.navbar-start
justify-content: flex-start
margin-right: auto
font-size:15px
.navbar-end
justify-content: flex-end
margin-left: auto
.navbar-item
display: flex
align-items: center
padding: 1.25rem 0.75rem
padding-right: 1.5rem
&.is-active
color: hsl(217, 71%, 53%)
background-color: transparent
//&.is-active:after
// content: '*';
// position: absolute;
// top: 40px;
// left: 20px;
.navbar-dropdown
border-radius: 2px
box-shadow 0 8px 8px rgba(10,10,10,.1)
font-weight: 500
.sub-menu {
color: #4a4a4a
}
.sub-menu:after
content '\2022'
position absolute
color: #3273dc
@media screen and (max-width: screen-desktop - 1)
.navbar-menu
justify-content: center
box-shadow: none
.navbar-start
margin-right: 0
.navbar-end
margin-left: 0
.footer
background: white
.field
.button
background: transparent
.widget
.media
border: none
.media + .media
margin-top: 0
.menu-list li ul
margin-right: 0
.menu-list a.level
display: flex
.pagination
width: 100%
.pagination-link:not(.is-current), .pagination-previous, .pagination-next
background: white
border: none
.pagination-link, .pagination-previous, .pagination-next
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05)
.post-navigation
//justify-content: space-around
width 100%
.level-item
margin-bottom: 0
.timeline
margin-left: 1rem
padding-left: 1.5rem
padding-top: 1rem
border-left: 1px solid hsl(0, 0%, 86%)
.media
position: relative
&:before,
&:last-child:after
content: ''
display: block
position: absolute
left: calc(-5px - 1.5rem)
&:before
width: 9px
height: 9px
top: 1.3rem
background: hsl(0, 0%, 86%)
border-radius: 50%
&:first-child:before
top: 0.3rem
&:last-child:after
top: calc(1.3rem + 9px)
width: 9px
bottom: 0
background: white
&:first-child:last-child:after
top: calc(0.3rem + 9px)
.article
.article-meta
margin-bottom: 0.5rem !important
.content
font-size: 1.1rem
blockquote.pullquote
float: right
max-width: 50%
font-size: 1.15rem
position: relative
a
word-wrap: break-word
.rtl
direction: rtl
.level
&, &.is-mobile
.level-item:not(:last-child)
margin-left: 0.75rem
margin-right: 0
.donate
position: relative
.qrcode
display: none
position: absolute
z-index: 99
bottom: 2.5em
line-height: 0
overflow: hidden
border-radius: 2px
box-shadow: 0 4px 10px rgba(0,0,0,.1), 0 0 1px rgba(0,0,0,.2)
overflow: hidden
img
max-width: 280px
&:hover
.qrcode
display: block
&:first-child:not(:last-child)
.qrcode
left: -0.75rem
&:last-child:not(:first-child)
.qrcode
right: -0.75rem
@media screen and (max-width: screen-tablet - 1)
#toc
display: none
position: fixed
margin: 1rem
left: 0
right: 0
bottom: 0
z-index: 100
max-height: calc(100vh - 2rem)
overflow-y: auto
#toc-mask
display: none
position: fixed
top: 0
left: 0
right: 0
bottom: 0
z-index: 99
background: rgba(0, 0, 0, 0.7)
#toc,
#toc-mask
&.is-active
display: block
/* ---------------------------------
* Custom modifiers
* --------------------------------- */
.is-borderless
border: none
.is-size-7
font-size: 0.85rem !important
.is-7by1
padding-top: 42.8%
img
bottom: 0
left: 0
position: absolute
right: 0
top: 0
.is-overflow-x-auto
overflow-x: auto !important
.is-flex-grow
flex-grow: 1 !important
.is-flex-wrap
flex-wrap: wrap !important
.is-flex-start
justify-content: start !important
.is-flex-center
justify-content: center !important
.is-flex-middle
align-items: center !important
.has-order-1
order: 1
.has-order-2
order: 2
.has-order-3
order: 3
.has-mr-6
margin-right: 0.5em !important
.has-mb-6
margin-bottom: 0.5em !important
.has-mr-7
margin-right: 0.25em !important
.has-link-grey,
.has-link-black-ter
transition: 0.2s ease
&:hover
color: hsl(217, 71%, 53%) !important
.has-link-grey
color: hsl(0, 0%, 48%) !important
.has-link-black-ter
color: hsl(0, 0%, 14%) !important
@media screen and (max-width: screen-tablet - 1)
.has-text-centered-mobile
text-align: center !important
.is-flex-center-mobile
justify-content: center !important
.has-mt-5-mobile
margin-top: 1em !important
/* ---------------------------------
* Font icon fixes
* --------------------------------- */
.fa, .fab, .fal, .far, .fas
line-height: inherit
font-size:17px
/* ---------------------------------
* Fix content elements
* --------------------------------- */
.content
h1, h2, h3, h4, h5, h6
font-weight: 400
h1
font-size: 1.75em
h2
font-size: 1.5em
h3
font-size: 1.25em
h4
font-size: 1.125em
h5
font-size: 1em
//code, pre
// font-size: 0.85em
// font-family: family-mono
//code
// color: hsl(348, 100%, 61%)
// background: transparent
// padding: 0
blockquote
footer
strong + cite
margin-left: 0.5em
/* ---------------------------------
* Fix code highlight
* --------------------------------- */
figure.highlight
padding: 0
width: 100%
position: relative
margin: 1em 0 1em !important
&.folded
.highlight-body
height: 0
pre,
table tr:hover
color: inherit
background: transparent
table
width: auto
pre
padding: 0
overflow: visible
.line
line-height: 1.5rem
figcaption,
.gutter
background: rgba(200, 200, 200, 0.15)
figcaption
padding: .3em .75em
text-align: left
font-style: normal
font-size: .8em
&:after
clear: both
content: " "
display: table
span
font-weight: 500
font-family: family-mono
.fold
a
color: #9a9a9a
a
float: right
margin-left: 0.5em
.fold
margin-right: 0.5em
cursor: pointer
.highlight-body
overflow: auto
.gutter
text-align: right
.tag,
.title,
.number,
.section
display: inherit
font: inherit
margin: inherit
padding: inherit
background: inherit
height: inherit
text-align: inherit
vertical-align: inherit
min-width: inherit
border-radius: inherit
/* ---------------------------------
* Overflow Table
* --------------------------------- */
.table-overflow
overflow-x: auto
table
width: auto!important
th
word-break: keep-all
/* ---------------------------------
* Fix Video
* --------------------------------- */
.video-container
position: relative
padding-bottom: 56.25%
padding-top: 25px
height: 0
iframe
position: absolute
top: 0
left: 0
width: 100%
height: 100%
/* ---------------------------------
* Fix Gist Snippet
* --------------------------------- */
.gist
table
tr:hover
background: transparent
td
border: none
.file
all: initial
.post-article
iframe: 400px

250
source/css/widget_pin.css Normal file
View File

@ -0,0 +1,250 @@
/*@import url("https://fonts.googleapis.com/css?family=Fira+Sans:400,500,600,700,800");*/
.blog-slider {
position: relative;
width: 100%;
margin: auto;
background: #fff;
padding: 25px;
border-radius: 2px;
height: 250px;
transition: all .3s;
}
@media screen and (max-width: 992px) {
.blog-slider {
max-width: 680px;
height: 400px;
}
}
@media screen and (max-width: 769px) {
.blog-slider {
/*min-height: 500px;*/
height: auto;
/*margin: 80px auto;*/
margin-top: 80px;
}
}
@media screen and (max-height: 500px) and (min-width: 992px) {
.blog-slider {
height: 350px;
}
}
.blog-slider__item {
display: flex;
align-items: center;
}
@media screen and (max-width: 768px) {
.blog-slider__item {
flex-direction: column;
}
}
.blog-slider__item.swiper-slide-active .blog-slider__img img {
opacity: 1;
transition-delay: .3s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > * {
opacity: 1;
transform: none;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(1) {
transition-delay: 0.3s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(2) {
transition-delay: 0.4s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(3) {
transition-delay: 0.5s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(4) {
transition-delay: 0.6s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(5) {
transition-delay: 0.7s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(6) {
transition-delay: 0.8s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(7) {
transition-delay: 0.9s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(8) {
transition-delay: 1s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(9) {
transition-delay: 1.1s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(10) {
transition-delay: 1.2s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(11) {
transition-delay: 1.3s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(12) {
transition-delay: 1.4s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(13) {
transition-delay: 1.5s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(14) {
transition-delay: 1.6s;
}
.blog-slider__item.swiper-slide-active .blog-slider__content > *:nth-child(15) {
transition-delay: 1.7s;
}
.blog-slider__img {
width: 300px;
flex-shrink: 0;
height: 200px;
background-image: linear-gradient(147deg, #fffcf9, #cde8f6);
box-shadow: 3px 4px 12px 0 rgba(0,0,0,0.2);
border-radius: 2px;
transform: translateX(-40px);
overflow: hidden;
}
.blog-slider__img:after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/*background-image: linear-gradient(147deg, #fff9fb 0%, #fd3838 74%);*/
border-radius: 2px;
opacity: 0.2;
}
.blog-slider__img img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
opacity: 0;
border-radius: 2px;
transition: all .3s;
}
@media screen and (max-width: 768px) {
.blog-slider__img {
transform: translateY(-50%);
width: 90%;
}
}
@media screen and (max-width: 576px) {
.blog-slider__img {
width: 95%;
}
}
@media screen and (max-height: 500px) and (min-width: 992px) {
.blog-slider__img {
height: 270px;
}
}
.blog-slider__content {
padding-right: 25px;
}
@media screen and (max-width: 768px) {
.blog-slider__content {
margin-top: -80px;
text-align: center;
padding: 0 30px;
}
}
@media screen and (max-width: 576px) {
.blog-slider__content {
padding: 0;
}
}
.blog-slider__content > * {
opacity: 0;
transform: translateY(25px);
transition: all .4s;
}
.blog-slider__code {
color: #7b7992;
margin-bottom: 10px;
display: block;
font-weight: 500;
}
.blog-slider__title {
/*color: #0d0925;*/
margin-bottom: 10px;
}
.blog-slider__text {
color: #4e4a67;
margin-bottom: 20px;
line-height: 1.5em;
}
.blog-slider__button {
display: inline-flex;
background-image: linear-gradient(149deg, #6c2bfe, #7e8dfd 49.58%);
padding: 8px 25px;
border-radius: 2px;
color: #fff;
box-shadow: 3px 4px 12px 0 rgba(0,0,0,0.2);
text-decoration: none;
font-weight: 500;
justify-content: center;
text-align: center;
letter-spacing: 1px;
}
@media screen and (max-width: 576px) {
.blog-slider__button {
/*width: 100%;*/
}
}
.blog-slider .swiper-container-horizontal > .swiper-pagination-bullets, .blog-slider .swiper-pagination-custom, .blog-slider .swiper-pagination-fraction {
bottom: 10px;
left: 0;
width: 100%;
}
.blog-slider__pagination {
position: absolute;
z-index: 21;
right: 20px;
width: 11px !important;
text-align: center;
left: auto !important;
top: 50%;
bottom: auto !important;
transform: translateY(-50%);
}
@media screen and (max-width: 768px) {
.blog-slider__pagination {
transform: translateX(-50%);
left: 50% !important;
top: 205px;
width: 100% !important;
display: flex;
justify-content: center;
align-items: center;
}
}
.blog-slider__pagination.swiper-pagination-bullets .swiper-pagination-bullet {
margin: 8px 0;
}
.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet {
margin: 10px 4px !important;
}
@media screen and (max-width: 768px) {
.blog-slider__pagination.swiper-pagination-bullets .swiper-pagination-bullet {
margin: 0px 5px;
}
}
.blog-slider__pagination .swiper-pagination-bullet {
width: 11px;
height: 11px;
display: block;
border-radius: 10px;
background: #062744;
opacity: 0.2;
transition: all .3s;
}
.blog-slider__pagination .swiper-pagination-bullet-active {
opacity: 1;
background: linear-gradient(149deg, #6c2bfe, #7e8dfd 49.58%);
height: 30px;
box-shadow: 0px 0px 20px rgba(126, 141, 253, 0.3);
}
@media screen and (max-width: 768px) {
.blog-slider__pagination .swiper-pagination-bullet-active {
height: 11px;
width: 30px;
}
}

BIN
source/images/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,6 @@
<svg
xmlns="http://www.w3.org/2000/svg" version="1.1" width="256" height="256" viewbox="0 0 949 256">
<path fill="#2366d1" d="M110.85125168440814 128L221.70250336881628 192L110.85125168440814 256L0 192Z"/>
<path fill="#609dff" d="M110.85125168440814 64L221.70250336881628 128L110.85125168440814 192L0 128Z"/>
<path fill="#a4c7ff" d="M110.85125168440814 0L221.70250336881628 64L110.85125168440814 128L0 64Z"/>
</svg>

After

Width:  |  Height:  |  Size: 431 B

9
source/images/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
source/images/og_image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -0,0 +1,9 @@
<svg
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" fill="#ccc">
<rect width="100%" height="100%" fill="#f2f2f2"/>
<path d="M39 38H11c-1.7 0-3-1.3-3-3V17c0-1.7 1.3-3 3-3h6c.2 0 .5-.2.6-.3l1.1-2.2c.4-.8 1.4-1.4 2.3-1.4h8c.9 0 1.9.6 2.3 1.4l1.1 2.2c.1.2.4.3.6.3h6c1.7 0 3 1.3 3 3v18c0 1.7-1.3 3-3 3zM11 16c-.6 0-1 .4-1 1v18c0 .6.4 1 1 1h28c.6 0 1-.4 1-1V17c0-.6-.4-1-1-1h-6c-.9 0-1.9-.6-2.3-1.4l-1.1-2.2c-.1-.2-.4-.4-.6-.4h-8c-.2 0-.5.2-.6.3l-1.1 2.2c-.4.9-1.4 1.5-2.3 1.5h-6z"/>
<path d="M25 34c-5 0-9-4-9-9s4-9 9-9 9 4 9 9-4 9-9 9zm0-16c-3.9 0-7 3.1-7 7s3.1 7 7 7 7-3.1 7-7-3.1-7-7-7z"/>
<circle cx="35" cy="18" r="1"/>
<path d="M12 12h4v1h-4z"/>
<path d="M25 21v-1c-2.8 0-5 2.2-5 5h1c0-2.2 1.8-4 4-4z"/>
</svg>

After

Width:  |  Height:  |  Size: 747 B

41
source/js/animation.js Normal file
View File

@ -0,0 +1,41 @@
(function () {
function $() {
return Array.prototype.slice.call(document.querySelectorAll.apply(document, arguments));
}
$('body > .navbar, body > .section, body > .footer').forEach(function (element) {
element.style.transition = '0s';
element.style.opacity = '0';
});
document.querySelector('body > .navbar').style.transform = 'translateY(-100px)';
['.column-main > .card',
'.column-left > .card, .column-right-shadow > .card',
'.column-right > .card'].map(function (selector) {
$(selector).forEach(function (element) {
element.style.transition = '0s';
element.style.opacity = '0';
element.style.transform = 'scale(0.8)';
element.style.transformOrigin = 'center top';
});
});
setTimeout(function () {
$('body > .navbar, body > .section, body > .footer').forEach(function (element) {
element.style.opacity = '1';
element.style.transition = 'opacity 0.3s ease-out, transform 0.3s ease-out';
});
document.querySelector('body > .navbar').style.transform = 'translateY(0)';
['.column-main > .card',
'.column-left > .card, .column-right-shadow > .card',
'.column-right > .card'].map(function (selector) {
var i = 1;
$(selector).forEach(function (element) {
setTimeout(function () {
element.style.opacity = '1';
element.style.transform = '';
element.style.transition = 'opacity 0.3s ease-out, transform 0.3s ease-out';
}, i * 100);
i++;
});
});
});
})();

156
source/js/back-to-top.js Normal file
View File

@ -0,0 +1,156 @@
$(document).ready(function () {
var $button = $('#back-to-top');
var $footer = $('footer.footer');
var $mainColumn = $('.column-main');
var $leftSidebar = $('.column-left');
var $rightSidebar = $('.column-right');
var lastScrollTop = 0;
var rightMargin = 20;
var bottomMargin = 20;
var lastState = null;
var state = {
base: {
classname: 'card has-text-centered',
left: '',
width: 64,
bottom: bottomMargin,
'border-radius': 4
}
};
state['desktop-hidden'] = Object.assign({}, state.base, {
classname: state.base.classname + ' rise-up',
});
state['desktop-visible'] = Object.assign({}, state['desktop-hidden'], {
classname: state['desktop-hidden'].classname + ' fade-in',
});
state['desktop-dock'] = Object.assign({}, state['desktop-visible'], {
classname: state['desktop-visible'].classname + ' fade-in',
width: 40,
'border-radius': '50%'
});
state['mobile-hidden'] = Object.assign({}, state.base, {
classname: state.base.classname + ' fade-in',
right: rightMargin
});
state['mobile-visible'] = Object.assign({}, state['mobile-hidden'], {
classname: state['mobile-hidden'].classname + ' rise-up',
});
function isStateEquals(prev, next) {
for (var prop in prev) {
if (!next.hasOwnProperty(prop) || next[prop] !== prev[prop]) {
return false;
}
}
for (var prop in next) {
if (!prev.hasOwnProperty(prop) || prev[prop] !== prev[prop]) {
return false;
}
}
return true;
}
function applyState(state) {
if (lastState !== null && isStateEquals(lastState, state)) {
return;
}
$button.attr('class', state.classname);
for (let prop in state) {
if (prop === 'classname') {
continue;
}
$button.css(prop, state[prop]);
}
lastState = state;
}
function isDesktop() {
return window.innerWidth >= 1078;
}
function isTablet() {
return window.innerWidth >= 768 && !isDesktop();
}
function isScrollUp() {
return $(window).scrollTop() < lastScrollTop && $(window).scrollTop() > 0;
}
function hasLeftSidebar() {
return $leftSidebar.length > 0;
}
function hasRightSidebar() {
return $rightSidebar.length > 0;
}
function getRightSidebarBottom() {
if (!hasRightSidebar()) {
return 0;
}
return Math.max.apply(null, $rightSidebar.find('.widget').map(function () {
return $(this).offset().top + $(this).outerHeight(true);
}));
}
function getScrollTop() {
return $(window).scrollTop();
}
function getScrollBottom() {
return $(window).scrollTop() + $(window).height();
}
function getButtonWidth() {
return $button.outerWidth(true);
}
function getButtonHeight() {
return $button.outerHeight(true);
}
function updateScrollTop() {
lastScrollTop = $(window).scrollTop();
}
function update() {
// desktop mode or tablet mode with only right sidebar enabled
if (isDesktop() || (isTablet() && !hasLeftSidebar() && hasRightSidebar())) {
var nextState;
var padding = ($mainColumn.outerWidth() - $mainColumn.width()) / 2;
var maxLeft = $(window).width() - getButtonWidth() - rightMargin;
var maxBottom = $footer.offset().top + getButtonHeight() / 2 + bottomMargin;
if (getScrollTop() == 0 || getScrollBottom() < getRightSidebarBottom() + padding + getButtonHeight()) {
nextState = state['desktop-hidden'];
} else if (getScrollBottom() < maxBottom) {
nextState = state['desktop-visible'];
} else {
nextState = Object.assign({}, state['desktop-dock'], {
bottom: getScrollBottom() - maxBottom + bottomMargin
});
}
var left = $mainColumn.offset().left + $mainColumn.outerWidth() + padding;
nextState = Object.assign({}, nextState, {
left: Math.min(left, maxLeft)
});
applyState(nextState);
} else {
// mobile and tablet mode
if (!isScrollUp()) {
applyState(state['mobile-hidden']);
} else {
applyState(state['mobile-visible']);
}
updateScrollTop();
}
}
update();
$(window).resize(update);
$(window).scroll(update);
$('#back-to-top').on('click', function () {
$('body, html').animate({ scrollTop: 0 }, 400);
});
});

11
source/js/bundle.js Normal file
View File

@ -0,0 +1,11 @@
// main.js
(function($){$('.article img:not(".not-gallery-item")').each(function(){if($(this).parent("a").length===0){$(this).wrap('<a class="gallery-item" href="'+$(this).attr("src")+'"></a>');if(this.alt){$(this).after('<div class="has-text-centered is-size-6 has-text-grey caption">'+this.alt+"</div>")}}});if(typeof(moment)==="function"){$(".article-meta time").each(function(){$(this).text(moment($(this).attr("datetime")).fromNow())})}$(".article > .content > table").each(function(){if($(this).width()>$(this).parent().width()){$(this).wrap('<div class="table-overflow"></div>')}});function adjustNavbar(){const navbarWidth=$(".navbar-main .navbar-start").outerWidth()+$(".navbar-main .navbar-end").outerWidth();if($(document).outerWidth()<navbarWidth){$(".navbar-main .navbar-menu").addClass("is-flex-start")}else{$(".navbar-main .navbar-menu").removeClass("is-flex-start")}}adjustNavbar();$(window).resize(adjustNavbar);$("figure.highlight table").wrap('<div class="highlight-body">');if(typeof(IcarusThemeSettings)!=="undefined"&&typeof(IcarusThemeSettings.article)!=="undefined"&&typeof(IcarusThemeSettings.article.highlight)!=="undefined"){if(typeof(ClipboardJS)!=="undefined"&&IcarusThemeSettings.article.highlight.clipboard){$("figure.highlight").each(function(){var id="code-"+Date.now()+(Math.random()*1000|0);var button='<a href="javascript:;" class="copy" title="Copy" data-clipboard-target="#'+id+' .code"><i class="fas fa-copy"></i></a>';$(this).attr("id",id);if($(this).find("figcaption").length){$(this).find("figcaption").prepend(button)}else{$(this).prepend("<figcaption>"+button+"</figcaption>")}});new ClipboardJS(".highlight .copy")}var fold=IcarusThemeSettings.article.highlight.fold;if(fold.trim()){var button='<span class="fold">'+(fold==="unfolded"?'<i class="fas fa-angle-down"></i>':'<i class="fas fa-angle-right"></i>')+"</span>";$("figure.highlight").each(function(){if($(this).find("figcaption").length){$(this).find("figcaption").prepend(button)}else{$(this).prepend("<figcaption>"+button+"</figcaption>")}});function toggleFold(codeBlock,isFolded){var $toggle=$(codeBlock).find(".fold i");!isFolded?$(codeBlock).removeClass("folded"):$(codeBlock).addClass("folded");!isFolded?$toggle.removeClass("fa-angle-right"):$toggle.removeClass("fa-angle-down");!isFolded?$toggle.addClass("fa-angle-down"):$toggle.addClass("fa-angle-right")}$("figure.highlight").each(function(){toggleFold(this,fold==="folded")});$("figure.highlight figcaption .fold").click(function(){var $code=$(this).closest("figure.highlight");toggleFold($code.eq(0),!$code.hasClass("folded"))})}}var $toc=$("#toc");if($toc.length>0){var $mask=$("<div>");$mask.attr("id","toc-mask");$("body").append($mask);function toggleToc(){$toc.toggleClass("is-active");$mask.toggleClass("is-active")}$toc.on("click",toggleToc);$mask.on("click",toggleToc);$(".navbar-main .catalogue").on("click",toggleToc)}})(jQuery);
// animation.js
(function(){function $(){return Array.prototype.slice.call(document.querySelectorAll.apply(document,arguments))}$("body > .navbar, body > .section, body > .footer").forEach(function(element){element.style.transition="0s";element.style.opacity="0"});document.querySelector("body > .navbar").style.transform="translateY(-100px)";[".column-main > .card",".column-left > .card, .column-right-shadow > .card",".column-right > .card"].map(function(selector){$(selector).forEach(function(element){element.style.transition="0s";element.style.opacity="0";element.style.transform="scale(0.8)";element.style.transformOrigin="center top"})});setTimeout(function(){$("body > .navbar, body > .section, body > .footer").forEach(function(element){element.style.opacity="1";element.style.transition="opacity 0.3s ease-out, transform 0.3s ease-out"});document.querySelector("body > .navbar").style.transform="translateY(0)";[".column-main > .card",".column-left > .card, .column-right-shadow > .card",".column-right > .card"].map(function(selector){var i=1;$(selector).forEach(function(element){setTimeout(function(){element.style.opacity="1";element.style.transform="";element.style.transition="opacity 0.3s ease-out, transform 0.3s ease-out"},i*100);i++})})})})();
// back-to-top.js
$(document).ready(function(){var $button=$('#back-to-top');var $footer=$('footer.footer');var $mainColumn=$('.column-main');var $leftSidebar=$('.column-left');var $rightSidebar=$('.column-right');var lastScrollTop=0;var rightMargin=20;var bottomMargin=20;var lastState=null;var state={base:{classname:'card has-text-centered',left:'',width:64,bottom:bottomMargin,'border-radius':4}};state['desktop-hidden']=Object.assign({},state.base,{classname:state.base.classname+' rise-up',});state['desktop-visible']=Object.assign({},state['desktop-hidden'],{classname:state['desktop-hidden'].classname+' fade-in',});state['desktop-dock']=Object.assign({},state['desktop-visible'],{classname:state['desktop-visible'].classname+' fade-in',width:40,'border-radius':'50%'});state['mobile-hidden']=Object.assign({},state.base,{classname:state.base.classname+' fade-in',right:rightMargin});state['mobile-visible']=Object.assign({},state['mobile-hidden'],{classname:state['mobile-hidden'].classname+' rise-up',});function isStateEquals(prev,next){for(var prop in prev){if(!next.hasOwnProperty(prop)||next[prop]!==prev[prop]){return false}}for(var prop in next){if(!prev.hasOwnProperty(prop)||prev[prop]!==prev[prop]){return false}}return true}function applyState(state){if(lastState!==null&&isStateEquals(lastState,state)){return}$button.attr('class',state.classname);for(let prop in state){if(prop==='classname'){continue}$button.css(prop,state[prop])}lastState=state}function isDesktop(){return window.innerWidth>=1078}function isTablet(){return window.innerWidth>=768&&!isDesktop()}function isScrollUp(){return $(window).scrollTop()<lastScrollTop&&$(window).scrollTop()>0}function hasLeftSidebar(){return $leftSidebar.length>0}function hasRightSidebar(){return $rightSidebar.length>0}function getRightSidebarBottom(){if(!hasRightSidebar()){return 0}return Math.max.apply(null,$rightSidebar.find('.widget').map(function(){return $(this).offset().top+$(this).outerHeight(true)}))}function getScrollTop(){return $(window).scrollTop()}function getScrollBottom(){return $(window).scrollTop()+$(window).height()}function getButtonWidth(){return $button.outerWidth(true)}function getButtonHeight(){return $button.outerHeight(true)}function updateScrollTop(){lastScrollTop=$(window).scrollTop()}function update(){if(isDesktop()||(isTablet()&&!hasLeftSidebar()&&hasRightSidebar())){var nextState;var padding=($mainColumn.outerWidth()-$mainColumn.width())/2;var maxLeft=$(window).width()-getButtonWidth()-rightMargin;var maxBottom=$footer.offset().top+getButtonHeight()/2+bottomMargin;if(getScrollTop()==0||getScrollBottom()<getRightSidebarBottom()+padding+getButtonHeight()){nextState=state['desktop-hidden']}else if(getScrollBottom()<maxBottom){nextState=state['desktop-visible']}else{nextState=Object.assign({},state['desktop-dock'],{bottom:getScrollBottom()-maxBottom+bottomMargin})}var left=$mainColumn.offset().left+$mainColumn.outerWidth()+padding;nextState=Object.assign({},nextState,{left:Math.min(left,maxLeft)});applyState(nextState)}else{if(!isScrollUp()){applyState(state['mobile-hidden'])}else{applyState(state['mobile-visible'])}updateScrollTop()}}update();$(window).resize(update);$(window).scroll(update);$('#back-to-top').on('click',function(){$('body, html').animate({scrollTop:0},400)})});
// gallery.js
document.addEventListener('DOMContentLoaded',function(){if(typeof($.fn.lightGallery)==='function'){$('.article').lightGallery({selector:'.gallery-item'})}if(typeof($.fn.justifiedGallery)==='function'){if($('.justified-gallery > p > .gallery-item').length){$('.justified-gallery > p > .gallery-item').unwrap()}$('.justified-gallery').justifiedGallery()}});

11
source/js/gallery.js Normal file
View File

@ -0,0 +1,11 @@
document.addEventListener('DOMContentLoaded', function () {
if (typeof ($.fn.lightGallery) === 'function') {
$('.article').lightGallery({ selector: '.gallery-item' });
}
if (typeof ($.fn.justifiedGallery) === 'function') {
if ($('.justified-gallery > p > .gallery-item').length) {
$('.justified-gallery > p > .gallery-item').unwrap();
}
$('.justified-gallery').justifiedGallery();
}
});

97
source/js/main.js Normal file
View File

@ -0,0 +1,97 @@
(function ($) {
alert();
$('.article img:not(".not-gallery-item")').each(function () {
// wrap images with link and add caption if possible
if ($(this).parent('a').length === 0) {
$(this).wrap('<a class="gallery-item" href="' + $(this).attr('src') + '"></a>');
if (this.alt) {
$(this).after('<div class="has-text-centered is-size-6 has-text-grey caption">' + this.alt + '</div>');
}
}
});
if (typeof (moment) === 'function') {
$('.article-meta time').each(function () {
$(this).text(moment($(this).attr('datetime')).fromNow());
});
}
$('.article > .content > table').each(function () {
if ($(this).width() > $(this).parent().width()) {
$(this).wrap('<div class="table-overflow"></div>');
}
});
function adjustNavbar() {
const navbarWidth = $('.navbar-main .navbar-start').outerWidth() + $('.navbar-main .navbar-end').outerWidth();
if ($(document).outerWidth() < navbarWidth) {
$('.navbar-main .navbar-menu').addClass('is-flex-start');
} else {
$('.navbar-main .navbar-menu').removeClass('is-flex-start');
}
}
adjustNavbar();
$(window).resize(adjustNavbar);
$('figure.highlight table').wrap('<div class="highlight-body">');
if (typeof (IcarusThemeSettings) !== 'undefined' &&
typeof (IcarusThemeSettings.article) !== 'undefined' &&
typeof (IcarusThemeSettings.article.highlight) !== 'undefined') {
if (typeof (ClipboardJS) !== 'undefined' && IcarusThemeSettings.article.highlight.clipboard) {
$('figure.highlight').each(function () {
var id = 'code-' + Date.now() + (Math.random() * 1000 | 0);
var button = '<a href="javascript:;" class="copy" title="Copy" data-clipboard-target="#' + id + ' .code"><i class="fas fa-copy"></i></a>';
$(this).attr('id', id);
if ($(this).find('figcaption').length) {
$(this).find('figcaption').prepend(button);
} else {
$(this).prepend('<figcaption>' + button + '</figcaption>');
}
});
new ClipboardJS('.highlight .copy');
}
var fold = IcarusThemeSettings.article.highlight.fold;
if (fold.trim()) {
var button = '<span class="fold">' + (fold === 'unfolded' ? '<i class="fas fa-angle-down"></i>' : '<i class="fas fa-angle-right"></i>') + '</span>';
$('figure.highlight').each(function () {
if ($(this).find('figcaption').length) {
$(this).find('figcaption').prepend(button);
} else {
$(this).prepend('<figcaption>' + button + '</figcaption>');
}
});
function toggleFold(codeBlock, isFolded) {
var $toggle = $(codeBlock).find('.fold i');
!isFolded ? $(codeBlock).removeClass('folded') : $(codeBlock).addClass('folded');
!isFolded ? $toggle.removeClass('fa-angle-right') : $toggle.removeClass('fa-angle-down');
!isFolded ? $toggle.addClass('fa-angle-down') : $toggle.addClass('fa-angle-right');
}
$('figure.highlight').each(function () {
toggleFold(this, fold === 'folded');
});
$('figure.highlight figcaption .fold').click(function () {
var $code = $(this).closest('figure.highlight');
toggleFold($code.eq(0), !$code.hasClass('folded'));
});
}
}
var $toc = $('#toc');
if ($toc.length > 0) {
var $mask = $('<div>');
$mask.attr('id', 'toc-mask');
$('body').append($mask);
function toggleToc() {
$toc.toggleClass('is-active');
$mask.toggleClass('is-active');
}
$toc.on('click', toggleToc);
$mask.on('click', toggleToc);
$('.navbar-main .catalogue').on('click', toggleToc);
}
})(jQuery);

9
source/js/widget_pin.js Normal file
View File

@ -0,0 +1,9 @@
var swiper = new Swiper('.blog-slider', {
spaceBetween: 30,
effect: 'fade',
// autoHeight: true,
pagination: {
el: '.blog-slider__pagination',
clickable: true,
}
});

View File

@ -0,0 +1,228 @@
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism-coy&languages=markup+css+clike+javascript+apacheconf+applescript+c+csharp+autohotkey+bash+basic+cpp+aspnet+arduino+ruby+css-extras+d+dart+django+docker+markup-templating+git+go+groovy+less+haskell+http+hpkp+hsts+ini+java+javastacktrace+json+julia+kotlin+latex+markdown+lua+makefile+nginx+objectivec+opencl+perl+php+php-extras+sql+powershell+properties+scss+pure+python+r+jsx+typescript+rust+sass+stylus+scala+scheme+plsql+pug+swift+yaml+haml+toml+tsx+vbnet+velocity+vim+visual-basic */
/**
* prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML
* Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);
* @author Tim Shedor
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
position: relative;
margin: .5em 0;
overflow: visible;
padding: 0;
}
pre[class*="language-"]>code {
position: relative;
border-left: 10px solid #358ccb;
box-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf;
background-color: #fdfdfd;
background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%);
background-size: 3em 3em;
background-origin: content-box;
background-attachment: local;
}
code[class*="language"] {
max-height: inherit;
height: inherit;
padding: 0 1em;
display: block;
overflow: auto;
}
/* Margin bottom to accommodate shadow */
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background-color: #fdfdfd;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
margin-bottom: 1em;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
position: relative;
padding: .2em;
border-radius: 0.3em;
color: #c92c2c;
border: 1px solid rgba(0, 0, 0, 0.1);
display: inline;
white-space: normal;
}
pre[class*="language-"]:before,
pre[class*="language-"]:after {
content: '';
z-index: -2;
display: block;
position: absolute;
bottom: 0.75em;
left: 0.18em;
width: 40%;
height: 20%;
max-height: 13em;
box-shadow: 0px 13px 8px #979797;
-webkit-transform: rotate(-2deg);
-moz-transform: rotate(-2deg);
-ms-transform: rotate(-2deg);
-o-transform: rotate(-2deg);
transform: rotate(-2deg);
}
:not(pre) > code[class*="language-"]:after,
pre[class*="language-"]:after {
right: 0.75em;
left: auto;
-webkit-transform: rotate(2deg);
-moz-transform: rotate(2deg);
-ms-transform: rotate(2deg);
-o-transform: rotate(2deg);
transform: rotate(2deg);
}
.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #7D8B99;
}
.token.punctuation {
color: #5F6364;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.function-name,
.token.constant,
.token.symbol,
.token.deleted {
color: #c92c2c;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.function,
.token.builtin,
.token.inserted {
color: #2f9c0a;
}
.token.operator,
.token.entity,
.token.url,
.token.variable {
color: #a67f59;
background: rgba(255, 255, 255, 0.5);
}
.token.atrule,
.token.attr-value,
.token.keyword,
.token.class-name {
color: #1990b8;
}
.token.regex,
.token.important {
color: #e90;
}
.language-css .token.string,
.style .token.string {
color: #a67f59;
background: rgba(255, 255, 255, 0.5);
}
.token.important {
font-weight: normal;
}
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.namespace {
opacity: .7;
}
@media screen and (max-width: 767px) {
pre[class*="language-"]:before,
pre[class*="language-"]:after {
bottom: 14px;
box-shadow: none;
}
}
/* Plugin styles */
.token.tab:not(:empty):before,
.token.cr:before,
.token.lf:before {
color: #e0d7d1;
}
/* Plugin styles: Line Numbers */
pre[class*="language-"].line-numbers.line-numbers {
padding-left: 0;
}
pre[class*="language-"].line-numbers.line-numbers code {
padding-left: 3.8em;
}
pre[class*="language-"].line-numbers.line-numbers .line-numbers-rows {
left: 0;
}
/* Plugin styles: Line Highlight */
pre[class*="language-"][data-line] {
padding-top: 0;
padding-bottom: 0;
padding-left: 0;
}
pre[data-line] code {
position: relative;
padding-left: 4em;
}
pre .line-highlight {
margin-top: 0;
}

View File

@ -0,0 +1,131 @@
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism-dark&languages=markup+css+clike+javascript+apacheconf+applescript+c+csharp+autohotkey+bash+basic+cpp+aspnet+arduino+ruby+css-extras+d+dart+django+docker+markup-templating+git+go+groovy+less+haskell+http+hpkp+hsts+ini+java+javastacktrace+json+julia+kotlin+latex+markdown+lua+makefile+nginx+objectivec+opencl+perl+php+php-extras+sql+powershell+properties+scss+pure+python+r+jsx+typescript+rust+sass+stylus+scala+scheme+plsql+pug+swift+yaml+haml+toml+tsx+vbnet+velocity+vim+visual-basic */
/**
* prism.js Dark theme for JavaScript, CSS and HTML
* Based on the slides of the talk /Reg(exp){2}lained/
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: white;
background: none;
text-shadow: 0 -.1em .2em black;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
pre[class*="language-"],
:not(pre) > code[class*="language-"] {
background: hsl(30, 20%, 25%);
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
border: .3em solid hsl(30, 20%, 40%);
border-radius: .5em;
box-shadow: 1px 1px .5em black inset;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .15em .2em .05em;
border-radius: .3em;
border: .13em solid hsl(30, 20%, 40%);
box-shadow: 1px 1px .3em -.1em black inset;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: hsl(30, 20%, 50%);
}
.token.punctuation {
opacity: .7;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol {
color: hsl(350, 40%, 70%);
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: hsl(75, 70%, 60%);
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable {
color: hsl(40, 90%, 60%);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: hsl(350, 40%, 70%);
}
.token.regex,
.token.important {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.token.deleted {
color: red;
}

View File

@ -0,0 +1,255 @@
/* PrismJS 1.17.1
https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+abap+abnf+actionscript+ada+apacheconf+apl+applescript+aql+c+arff+asciidoc+asm6502+csharp+autohotkey+autoit+bash+basic+batch+bison+bnf+brainfuck+bro+cpp+aspnet+arduino+cil+coffeescript+cmake+clojure+ruby+csp+css-extras+d+dart+diff+markup-templating+dns-zone-file+docker+ebnf+eiffel+ejs+elixir+elm+erb+erlang+fsharp+firestore-security-rules+flow+fortran+gcode+gdscript+gedcom+gherkin+git+glsl+gml+go+graphql+groovy+less+handlebars+haskell+haxe+hcl+http+hpkp+hsts+ichigojam+icon+inform7+ini+io+j+java+scala+php+javastacktrace+jolie+jq+javadoclike+n4js+markdown+json+jsonp+json5+julia+keyman+kotlin+latex+crystal+scheme+liquid+lisp+livescript+lolcode+lua+makefile+js-templates+django+matlab+mel+mizar+monkey+n1ql+typescript+nand2tetris-hdl+nasm+nginx+nim+nix+nsis+objectivec+ocaml+opencl+oz+parigp+parser+pascal+pascaligo+pcaxis+perl+jsdoc+phpdoc+php-extras+sql+powershell+processing+prolog+properties+protobuf+scss+puppet+pure+python+q+qore+r+js-extras+jsx+renpy+reason+vala+rest+rip+roboconf+robot-framework+textile+rust+sas+sass+stylus+javadoc+lilypond+shell-session+smalltalk+smarty+solidity+soy+turtle+splunk-spl+plsql+twig+swift+yaml+tcl+haml+toml+tt2+sparql+pug+tsx+t4-templating+visual-basic+t4-cs+regex+vbnet+velocity+verilog+vhdl+vim+t4-vb+wasm+wiki+xeora+xojo+xquery+tap+zig&plugins=line-numbers+toolbar+show-language+copy-to-clipboard */
/**
* prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
* Based on https://github.com/chriskempson/tomorrow-theme
* @author Rose Pritchard
*/
pre,
code[class*="language-"],
pre[class*="language-"] {
color: #ccc;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: .9em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
/*:not(pre) > code[class*="language-"],*/
pre,
pre[class*="language-"] {
background: #2d2d2d;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #999;
}
.token.punctuation {
color: #ccc;
}
.token.tag,
.token.attr-name,
.token.namespace,
.token.deleted {
color: #e2777a;
}
.token.function-name {
color: #6196cc;
}
.token.boolean,
.token.number,
.token.function {
color: #f08d49;
}
.token.property,
.token.class-name,
.token.constant,
.token.symbol {
color: #f8c555;
}
.token.selector,
.token.important,
.token.atrule,
.token.keyword,
.token.builtin {
color: #cc99cd;
}
.token.string,
.token.char,
.token.attr-value,
.token.regex,
.token.variable {
color: #7ec699;
}
.token.operator,
.token.entity,
.token.url {
color: #67cdcc;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.token.inserted {
color: green;
}
pre[class*="language-"].line-numbers {
position: relative;
padding-left: 3.8em;
counter-reset: linenumber;
white-space: pre-wrap;
}
pre[class*="language-"].line-numbers > code {
position: relative;
white-space: inherit;
}
.line-numbers .line-numbers-rows {
position: absolute;
pointer-events: none;
top: 0;
font-size: 100%;
left: -3.8em;
width: 3em; /* works for line-numbers below 1000 lines */
letter-spacing: -1px;
border-right: 1px solid #999;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.line-numbers-rows > span {
pointer-events: none;
display: block;
counter-increment: linenumber;
}
.line-numbers-rows > span:before {
content: counter(linenumber);
color: #999;
display: block;
padding-right: 0.8em;
text-align: right;
}
div.code-toolbar {
position: relative;
}
div.code-toolbar > .toolbar {
position: absolute;
top: .3em;
right: .2em;
transition: opacity 0.3s ease-in-out;
opacity: 0;
}
div.code-toolbar:hover > .toolbar {
opacity: 1;
}
/* Separate line b/c rules are thrown out if selector is invalid.
IE11 and old Edge versions don't support :focus-within. */
div.code-toolbar:focus-within > .toolbar {
opacity: 1;
}
div.code-toolbar > .toolbar .toolbar-item {
display: inline-block;
}
div.code-toolbar > .toolbar .toolbar-item:not(:first-child){
margin-left: 10px;
}
div.code-toolbar > .toolbar a {
cursor: pointer;
}
div.code-toolbar > .toolbar button {
background: none;
border: 0;
color: inherit;
font: inherit;
line-height: normal;
overflow: visible;
padding: 0;
-webkit-user-select: none; /* for button */
-moz-user-select: none;
-ms-user-select: none;
}
div.code-toolbar > .toolbar a,
div.code-toolbar > .toolbar button,
div.code-toolbar > .toolbar span {
color: #fff;
font-size: .8em;
padding: .5em 1em;
background: #f5f2f0;
background: rgba(224, 224, 224, 0.2);
box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
border-radius: 2px;
}
div.code-toolbar > .toolbar a:not(:first-child),
div.code-toolbar > .toolbar button:not(:first-child),
div.code-toolbar > .toolbar span:not(:first-child) {
margin-left: 10px;
}
div.code-toolbar > .toolbar a:hover,
div.code-toolbar > .toolbar a:focus,
div.code-toolbar > .toolbar button:hover,
div.code-toolbar > .toolbar button:focus,
div.code-toolbar > .toolbar span:hover,
div.code-toolbar > .toolbar span:focus {
color: inherit;
text-decoration: none;
color: #fff;
cursor: pointer;
opacity: 1;
}
.language-html .tag {
background-color: transparent;
}
code {
background-color: #f5f5f5;
color: #3273dc;
font-size: .875em;
font-weight: 400;
padding: .25em .5em .25em;
}

View File

@ -0,0 +1,125 @@
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism-okaidia&languages=markup+css+clike+javascript+apacheconf+applescript+c+csharp+autohotkey+bash+basic+cpp+aspnet+arduino+ruby+css-extras+d+dart+django+docker+markup-templating+git+go+groovy+less+haskell+http+hpkp+hsts+ini+java+javastacktrace+json+julia+kotlin+latex+markdown+lua+makefile+nginx+objectivec+opencl+perl+php+php-extras+sql+powershell+properties+scss+pure+python+r+jsx+typescript+rust+sass+stylus+scala+scheme+plsql+pug+swift+yaml+haml+toml+tsx+vbnet+velocity+vim+visual-basic */
/**
* okaidia theme for JavaScript, CSS and HTML
* Loosely based on Monokai textmate theme by http://www.monokai.nl/
* @author ocodia
*/
code[class*="language-"],
pre[class*="language-"] {
color: #f8f8f2;
background: none;
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
border-radius: 0.3em;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #272822;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #f8f8f2;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.constant,
.token.symbol,
.token.deleted {
color: #f92672;
}
.token.boolean,
.token.number {
color: #ae81ff;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #a6e22e;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable {
color: #f8f8f2;
}
.token.atrule,
.token.attr-value,
.token.function,
.token.class-name {
color: #e6db74;
}
.token.keyword {
color: #66d9ef;
}
.token.regex,
.token.important {
color: #fd971f;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

View File

@ -0,0 +1,152 @@
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism-solarizedlight&languages=markup+css+clike+javascript+apacheconf+applescript+c+csharp+autohotkey+bash+basic+cpp+aspnet+arduino+ruby+css-extras+d+dart+django+docker+markup-templating+git+go+groovy+less+haskell+http+hpkp+hsts+ini+java+javastacktrace+json+julia+kotlin+latex+markdown+lua+makefile+nginx+objectivec+opencl+perl+php+php-extras+sql+powershell+properties+scss+pure+python+r+jsx+typescript+rust+sass+stylus+scala+scheme+plsql+pug+swift+yaml+haml+toml+tsx+vbnet+velocity+vim+visual-basic */
/*
Solarized Color Schemes originally by Ethan Schoonover
http://ethanschoonover.com/solarized
Ported for PrismJS by Hector Matos
Website: https://krakendev.io
Twitter Handle: https://twitter.com/allonsykraken)
*/
/*
SOLARIZED HEX
--------- -------
base03 #002b36
base02 #073642
base01 #586e75
base00 #657b83
base0 #839496
base1 #93a1a1
base2 #eee8d5
base3 #fdf6e3
yellow #b58900
orange #cb4b16
red #dc322f
magenta #d33682
violet #6c71c4
blue #268bd2
cyan #2aa198
green #859900
*/
code[class*="language-"],
pre[class*="language-"] {
color: #657b83; /* base00 */
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
background: #073642; /* base02 */
}
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
background: #073642; /* base02 */
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
border-radius: 0.3em;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background-color: #fdf6e3; /* base3 */
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #93a1a1; /* base1 */
}
.token.punctuation {
color: #586e75; /* base01 */
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #268bd2; /* blue */
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.url,
.token.inserted {
color: #2aa198; /* cyan */
}
.token.entity {
color: #657b83; /* base00 */
background: #eee8d5; /* base2 */
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #859900; /* green */
}
.token.function,
.token.class-name {
color: #b58900; /* yellow */
}
.token.regex,
.token.important,
.token.variable {
color: #cb4b16; /* orange */
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

View File

@ -0,0 +1,124 @@
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+apacheconf+applescript+c+csharp+autohotkey+bash+basic+cpp+aspnet+arduino+ruby+css-extras+d+dart+django+docker+markup-templating+git+go+groovy+less+haskell+http+hpkp+hsts+ini+java+javastacktrace+json+julia+kotlin+latex+markdown+lua+makefile+nginx+objectivec+opencl+perl+php+php-extras+sql+powershell+properties+scss+pure+python+r+jsx+typescript+rust+sass+stylus+scala+scheme+plsql+pug+swift+yaml+haml+toml+tsx+vbnet+velocity+vim+visual-basic */
/**
* prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML
* Based on https://github.com/chriskempson/tomorrow-theme
* @author Rose Pritchard
*/
code[class*="language-"],
pre[class*="language-"] {
color: #ccc;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background: #2d2d2d;
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.block-comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #999;
}
.token.punctuation {
color: #ccc;
}
.token.tag,
.token.attr-name,
.token.namespace,
.token.deleted {
color: #e2777a;
}
.token.function-name {
color: #6196cc;
}
.token.boolean,
.token.number,
.token.function {
color: #f08d49;
}
.token.property,
.token.class-name,
.token.constant,
.token.symbol {
color: #f8c555;
}
.token.selector,
.token.important,
.token.atrule,
.token.keyword,
.token.builtin {
color: #cc99cd;
}
.token.string,
.token.char,
.token.attr-value,
.token.regex,
.token.variable {
color: #7ec699;
}
.token.operator,
.token.entity,
.token.url {
color: #67cdcc;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
.token.inserted {
color: green;
}

View File

@ -0,0 +1,201 @@
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+apacheconf+applescript+c+csharp+autohotkey+bash+basic+cpp+aspnet+arduino+ruby+css-extras+d+dart+django+docker+markup-templating+git+go+groovy+less+haskell+http+hpkp+hsts+ini+java+javastacktrace+json+julia+kotlin+latex+markdown+lua+makefile+nginx+objectivec+opencl+perl+php+php-extras+sql+powershell+properties+scss+pure+python+r+jsx+typescript+rust+sass+stylus+scala+scheme+plsql+pug+swift+yaml+haml+toml+tsx+vbnet+velocity+vim+visual-basic */
/**
* prism.js Twilight theme
* Based (more or less) on the Twilight theme originally of Textmate fame.
* @author Remy Bach
*/
code[class*="language-"],
pre[class*="language-"] {
color: white;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
text-shadow: 0 -.1em .2em black;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"],
:not(pre) > code[class*="language-"] {
background: hsl(0, 0%, 8%); /* #141414 */
}
/* Code blocks */
pre[class*="language-"] {
border-radius: .5em;
border: .3em solid hsl(0, 0%, 33%); /* #282A2B */
box-shadow: 1px 1px .5em black inset;
margin: .5em 0;
overflow: auto;
padding: 1em;
}
pre[class*="language-"]::-moz-selection {
/* Firefox */
background: hsl(200, 4%, 16%); /* #282A2B */
}
pre[class*="language-"]::selection {
/* Safari */
background: hsl(200, 4%, 16%); /* #282A2B */
}
/* Text Selection colour */
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */
}
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
text-shadow: none;
background: hsla(0, 0%, 93%, 0.15); /* #EDEDED */
}
/* Inline code */
:not(pre) > code[class*="language-"] {
border-radius: .3em;
border: .13em solid hsl(0, 0%, 33%); /* #545454 */
box-shadow: 1px 1px .3em -.1em black inset;
padding: .15em .2em .05em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: hsl(0, 0%, 47%); /* #777777 */
}
.token.punctuation {
opacity: .7;
}
.namespace {
opacity: .7;
}
.token.tag,
.token.boolean,
.token.number,
.token.deleted {
color: hsl(14, 58%, 55%); /* #CF6A4C */
}
.token.keyword,
.token.property,
.token.selector,
.token.constant,
.token.symbol,
.token.builtin {
color: hsl(53, 89%, 79%); /* #F9EE98 */
}
.token.attr-name,
.token.attr-value,
.token.string,
.token.char,
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string,
.token.variable,
.token.inserted {
color: hsl(76, 21%, 52%); /* #8F9D6A */
}
.token.atrule {
color: hsl(218, 22%, 55%); /* #7587A6 */
}
.token.regex,
.token.important {
color: hsl(42, 75%, 65%); /* #E9C062 */
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
pre[data-line] {
padding: 1em 0 1em 3em;
position: relative;
}
/* Markup */
.language-markup .token.tag,
.language-markup .token.attr-name,
.language-markup .token.punctuation {
color: hsl(33, 33%, 52%); /* #AC885B */
}
/* Make the tokens sit above the line highlight so the colours don't look faded. */
.token {
position: relative;
z-index: 1;
}
.line-highlight {
background: hsla(0, 0%, 33%, 0.25); /* #545454 */
background: linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0)); /* #545454 */
border-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */
border-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */
left: 0;
line-height: inherit;
margin-top: 0.75em; /* Same as .prisms padding-top */
padding: inherit 0;
pointer-events: none;
position: absolute;
right: 0;
white-space: pre;
z-index: 0;
}
.line-highlight:before,
.line-highlight[data-end]:after {
background-color: hsl(215, 15%, 59%); /* #8794A6 */
border-radius: 999px;
box-shadow: 0 1px white;
color: hsl(24, 20%, 95%); /* #F5F2F0 */
content: attr(data-start);
font: bold 65%/1.5 sans-serif;
left: .6em;
min-width: 1em;
padding: 0 .5em;
position: absolute;
text-align: center;
text-shadow: none;
top: .4em;
vertical-align: .3em;
}
.line-highlight[data-end]:after {
bottom: .4em;
content: attr(data-end);
top: auto;
}

File diff suppressed because one or more lines are too long

5
tag.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="标签:${tag.name!} - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/tags/${tag.slugName!}">
<#include "layout/tag.ftl">
</@layout>

5
tags.ftl Normal file
View File

@ -0,0 +1,5 @@
<#include "layout/layout.ftl">
<#include "layout/common/article.ftl">
<@layout title="标签 - ${options.blog_title!}" keywords="${options.seo_keywords!}" description="${options.seo_description!}" canonical="${context!}/tags">
<#include "layout/tags.ftl">
</@layout>

10
theme.yaml Normal file
View File

@ -0,0 +1,10 @@
id: imkun_fantastic
name: Fantastic
author:
name: Quinn
website: https://github.com/imkundev
description:
logo:
website: https://www.imkun.dev
repo: https://github.com/halo-dev/halo-theme-icarus
version: 1.0