aboutsummaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
authorGNUxeava <bluenerd@protonmail.com>2022-03-11 10:32:10 +0530
committerGNUxeava <bluenerd@protonmail.com>2022-03-11 10:32:10 +0530
commitfecc9b268410c8fefcd1ca32bc4228bba9002178 (patch)
treeaa621093976dbbe8961f723ddb3569737e96932a /assets
parent2dfa39111cd76b102dbb3f58c1754b6c93b0265a (diff)
use theme
Diffstat (limited to 'assets')
-rw-r--r--assets/js/even.js279
-rw-r--r--assets/js/main.js18
-rw-r--r--assets/sass/_base.scss98
-rw-r--r--assets/sass/_common/_animation.scss156
-rw-r--r--assets/sass/_common/_normalize.scss427
-rw-r--r--assets/sass/_common/_utils.scss23
-rw-r--r--assets/sass/_custom/_custom.scss4
-rw-r--r--assets/sass/_iconfont.scss200
-rw-r--r--assets/sass/_partial/_404.scss25
-rw-r--r--assets/sass/_partial/_archive.scss100
-rw-r--r--assets/sass/_partial/_back-to-top.scss24
-rw-r--r--assets/sass/_partial/_footer.scss10
-rw-r--r--assets/sass/_partial/_footer/_copyright.scss24
-rw-r--r--assets/sass/_partial/_footer/_social.scss19
-rw-r--r--assets/sass/_partial/_header.scss26
-rw-r--r--assets/sass/_partial/_header/_logo.scss18
-rw-r--r--assets/sass/_partial/_header/_menu.scss35
-rw-r--r--assets/sass/_partial/_language-selector.scss25
-rw-r--r--assets/sass/_partial/_mobile.scss77
-rw-r--r--assets/sass/_partial/_pagination.scss36
-rw-r--r--assets/sass/_partial/_post.scss24
-rw-r--r--assets/sass/_partial/_post/_admonition.scss210
-rw-r--r--assets/sass/_partial/_post/_code.scss287
-rw-r--r--assets/sass/_partial/_post/_content.scss198
-rw-r--r--assets/sass/_partial/_post/_copyright.scss29
-rw-r--r--assets/sass/_partial/_post/_footer.scss74
-rw-r--r--assets/sass/_partial/_post/_header.scss46
-rw-r--r--assets/sass/_partial/_post/_outdated.scss25
-rw-r--r--assets/sass/_partial/_post/_reward.scss54
-rw-r--r--assets/sass/_partial/_post/_toc.scss55
-rw-r--r--assets/sass/_partial/_slideout.scss37
-rw-r--r--assets/sass/_partial/_terms.scss46
-rw-r--r--assets/sass/_variables.scss329
-rw-r--r--assets/sass/main.scss19
34 files changed, 3057 insertions, 0 deletions
diff --git a/assets/js/even.js b/assets/js/even.js
new file mode 100644
index 0000000..f6c6f1c
--- /dev/null
+++ b/assets/js/even.js
@@ -0,0 +1,279 @@
+'use strict';
+
+const Even = {};
+
+Even.backToTop = function() {
+ const $backToTop = $('#back-to-top');
+
+ $(window).scroll(function() {
+ if ($(window).scrollTop() > 100) {
+ $backToTop.fadeIn(1000);
+ } else {
+ $backToTop.fadeOut(1000);
+ }
+ });
+
+ $backToTop.click(function() {
+ $('body,html').animate({scrollTop: 0});
+ });
+};
+
+Even.mobileNavbar = function() {
+ const $mobileNav = $('#mobile-navbar');
+ const $mobileNavIcon = $('.mobile-navbar-icon');
+ const slideout = new Slideout({
+ 'panel': document.getElementById('mobile-panel'),
+ 'menu': document.getElementById('mobile-menu'),
+ 'padding': 180,
+ 'tolerance': 70,
+ });
+ slideout.disableTouch();
+
+ $mobileNavIcon.click(function() {
+ slideout.toggle();
+ });
+
+ slideout.on('beforeopen', function() {
+ $mobileNav.addClass('fixed-open');
+ $mobileNavIcon.addClass('icon-click').removeClass('icon-out');
+ });
+
+ slideout.on('beforeclose', function() {
+ $mobileNav.removeClass('fixed-open');
+ $mobileNavIcon.addClass('icon-out').removeClass('icon-click');
+ });
+
+ $('#mobile-panel').on('touchend', function() {
+ slideout.isOpen() && $mobileNavIcon.click();
+ });
+};
+
+Even._initToc = function() {
+ const SPACING = 20;
+ const $toc = $('.post-toc');
+ const $footer = $('.post-footer');
+
+ if ($toc.length) {
+ const minScrollTop = $toc.offset().top - SPACING;
+ const maxScrollTop = $footer.offset().top - $toc.height() - SPACING;
+
+ const tocState = {
+ start: {
+ 'position': 'absolute',
+ 'top': minScrollTop,
+ },
+ process: {
+ 'position': 'fixed',
+ 'top': SPACING,
+ },
+ end: {
+ 'position': 'absolute',
+ 'top': maxScrollTop,
+ },
+ };
+
+ $(window).scroll(function() {
+ const scrollTop = $(window).scrollTop();
+
+ if (scrollTop < minScrollTop) {
+ $toc.css(tocState.start);
+ } else if (scrollTop > maxScrollTop) {
+ $toc.css(tocState.end);
+ } else {
+ $toc.css(tocState.process);
+ }
+ });
+ }
+
+ const HEADERFIX = 30;
+ const $toclink = $('.toc-link');
+ const $headerlink = $('.headerlink');
+ const $tocLinkLis = $('.post-toc-content li');
+
+ const headerlinkTop = $.map($headerlink, function(link) {
+ return $(link).offset().top;
+ });
+
+ const headerLinksOffsetForSearch = $.map(headerlinkTop, function(offset) {
+ return offset - HEADERFIX;
+ });
+
+ const searchActiveTocIndex = function(array, target) {
+ for (let i = 0; i < array.length - 1; i++) {
+ if (target > array[i] && target <= array[i + 1]) return i;
+ }
+ if (target > array[array.length - 1]) return array.length - 1;
+ return -1;
+ };
+
+ $(window).scroll(function() {
+ const scrollTop = $(window).scrollTop();
+ const activeTocIndex = searchActiveTocIndex(headerLinksOffsetForSearch, scrollTop);
+
+ $($toclink).removeClass('active');
+ $($tocLinkLis).removeClass('has-active');
+
+ if (activeTocIndex !== -1 && $toclink[activeTocIndex] != null) {
+ $($toclink[activeTocIndex]).addClass('active');
+ let ancestor = $toclink[activeTocIndex].parentNode;
+ while (ancestor.tagName !== 'NAV') {
+ $(ancestor).addClass('has-active');
+ ancestor = ancestor.parentNode.parentNode;
+ }
+ }
+ });
+};
+
+Even.fancybox = function() {
+ if ($.fancybox) {
+ $('.post-content').each(function() {
+ $(this).find('img').each(function() {
+ $(this).wrap(`<a class="fancybox" href="${this.src}" data-fancybox="gallery" data-caption="${this.title}"></a>`);
+ });
+ });
+
+ $('.fancybox').fancybox({
+ selector: '.fancybox',
+ protect: true,
+ });
+ }
+};
+
+Even.highlight = function() {
+ const blocks = document.querySelectorAll('pre code');
+ for (let i = 0; i < blocks.length; i++) {
+ const block = blocks[i];
+ const rootElement = block.parentElement;
+ const lineCodes = block.innerHTML.split(/\n/);
+ if (lineCodes[lineCodes.length - 1] === '') lineCodes.pop();
+ const lineLength = lineCodes.length;
+
+ let codeLineHtml = '';
+ for (let i = 0; i < lineLength; i++) {
+ codeLineHtml += `<div class="line">${i + 1}</div>`;
+ }
+
+ let codeHtml = '';
+ for (let i = 0; i < lineLength; i++) {
+ codeHtml += `<div class="line">${lineCodes[i]}</div>`;
+ }
+
+ block.className += ' highlight';
+ const figure = document.createElement('figure');
+ figure.className = block.className;
+ figure.innerHTML = `<table><tbody><tr><td class="gutter"><pre>${codeLineHtml}</pre></td><td class="code"><pre>${codeHtml}</pre></td></tr></tbody></table>`;
+
+ rootElement.parentElement.replaceChild(figure, rootElement);
+ }
+};
+
+Even.chroma = function() {
+ const blocks = document.querySelectorAll('.highlight > .chroma');
+ for (let i = 0; i < blocks.length; i++) {
+ const block = blocks[i];
+ const afterHighLight = block.querySelector('pre.chroma > code[data-lang]');
+ const lang = afterHighLight ? afterHighLight.className : '';
+ block.className += ' ' + lang;
+ }
+};
+
+Even.toc = function() {
+ const tocContainer = document.getElementById('post-toc');
+ if (tocContainer !== null) {
+ const toc = document.getElementById('TableOfContents');
+ if (toc === null) {
+ // toc = true, but there are no headings
+ tocContainer.parentNode.removeChild(tocContainer);
+ } else {
+ this._refactorToc(toc);
+ this._linkToc();
+ this._initToc();
+ }
+ }
+};
+
+Even._refactorToc = function(toc) {
+ // when headings do not start with `h1`
+ const oldTocList = toc.children[0];
+ let newTocList = oldTocList;
+ let temp;
+ while (newTocList.children.length === 1
+ && (temp = newTocList.children[0].children[0]).tagName === 'UL') {
+ newTocList = temp;
+ }
+
+ if (newTocList !== oldTocList) toc.replaceChild(newTocList, oldTocList);
+};
+
+Even._linkToc = function() {
+ const links = document.querySelectorAll('#TableOfContents a:first-child');
+ for (let i = 0; i < links.length; i++) links[i].className += ' toc-link';
+
+ for (let num = 1; num <= 6; num++) {
+ const headers = document.querySelectorAll('.post-content>h' + num);
+ for (let i = 0; i < headers.length; i++) {
+ const header = headers[i];
+ header.innerHTML = `<a href="#${header.id}" class="headerlink anchor"><i class="iconfont icon-link"></i></a>${header.innerHTML}`;
+ }
+ }
+};
+
+Even.flowchart = function() {
+ if (!window.flowchart) return;
+
+ const blocks = document.querySelectorAll('pre code.language-flowchart, pre code.language-flow');
+ for (let i = 0; i < blocks.length; i++) {
+ if (!window.hljs && i % 2 === 0) continue;
+
+ const block = blocks[i];
+ const rootElement = window.hljs
+ ? block.parentElement
+ : block.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement;
+
+ const container = document.createElement('div');
+ const id = `js-flowchart-diagrams-${i}`;
+ container.id = id;
+ container.className = 'align-center';
+ rootElement.parentElement.replaceChild(container, rootElement);
+
+ const diagram = flowchart.parse(block.childNodes[0].nodeValue);
+ diagram.drawSVG(id, window.flowchartDiagramsOptions ? window.flowchartDiagramsOptions : {});
+ }
+};
+
+Even.sequence = function() {
+ if (!window.Diagram) return;
+
+ const blocks = document.querySelectorAll('pre code.language-sequence');
+ for (let i = 0; i < blocks.length; i++) {
+ if (!window.hljs && i % 2 === 0) continue;
+
+ const block = blocks[i];
+ const rootElement = window.hljs
+ ? block.parentElement
+ : block.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement;
+
+ const container = document.createElement('div');
+ const id = `js-sequence-diagrams-${i}`;
+ container.id = id;
+ container.className = 'align-center';
+ rootElement.parentElement.replaceChild(container, rootElement);
+
+ const diagram = Diagram.parse(block.childNodes[0].nodeValue);
+ diagram.drawSVG(id, window.sequenceDiagramsOptions
+ ? window.sequenceDiagramsOptions
+ : {theme: 'simple'});
+ }
+};
+
+Even.responsiveTable = function() {
+ const tables = document.querySelectorAll('.post-content table:not(.lntable)');
+ for (let i = 0; i < tables.length; i++) {
+ const table = tables[i];
+ const wrapper = document.createElement('div');
+ wrapper.className = 'table-wrapper';
+ table.parentElement.replaceChild(wrapper, table);
+ wrapper.appendChild(table);
+ }
+};
+
diff --git a/assets/js/main.js b/assets/js/main.js
new file mode 100644
index 0000000..96db5db
--- /dev/null
+++ b/assets/js/main.js
@@ -0,0 +1,18 @@
+$(document).ready(function () {
+ Even.backToTop();
+ Even.mobileNavbar();
+ Even.toc();
+ Even.fancybox();
+});
+
+Even.responsiveTable();
+Even.flowchart();
+Even.sequence();
+
+if (window.hljs) {
+ hljs.initHighlighting();
+ Even.highlight();
+} else {
+ Even.chroma();
+}
+
diff --git a/assets/sass/_base.scss b/assets/sass/_base.scss
new file mode 100644
index 0000000..0e1c342
--- /dev/null
+++ b/assets/sass/_base.scss
@@ -0,0 +1,98 @@
+@import '_common/normalize';
+
+html {
+ font-size: $global-font-size;
+ box-sizing: border-box;
+}
+
+body {
+ padding: 0;
+ margin: 0;
+ font-family: $global-font-family;
+ font-weight: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ line-height: $global-lineheight;
+ color: $global-font-color;
+ background: $global-background;
+ scroll-behavior: smooth;
+ border-top: 3px solid $theme-color;
+}
+
+@include max-screen() {
+ body {
+ border-top: 0;
+ }
+}
+
+::selection {
+ background: $theme-color;
+ color: #fff;
+}
+
+// ::-webkit-scrollbar {
+// width: 8px;
+// height: 6px;
+// }
+
+// ::-webkit-scrollbar-thumb {
+// background: lighten($theme-color, 10%);
+// border-radius: 5px;
+// }
+
+// ::-webkit-scrollbar-track {
+// background: rgba(211, 211, 211, 0.4);
+// border-radius: 5px;
+// }
+
+img {
+ max-width: 100%;
+ height: auto;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+a {
+ color: $global-font-color;
+ text-decoration: none;
+}
+
+@each $header, $size in $global-headings {
+ #{$header} {
+ font-size: $size;
+ font-family: $global-serif-font-family;
+ }
+}
+
+.container {
+ margin: 0 auto;
+ width: $global-body-width;
+}
+
+@include max-screen() {
+ .container {
+ width: 100%;
+ box-shadow: -1px -5px 5px $gray;
+ }
+}
+
+.content-wrapper {
+ padding: $global-container-padding;
+}
+
+// make video fluid:
+// https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php
+// class video-container is the wrapper used by hexo youtube tag plugin
+.video-container {
+ position: relative;
+ padding-bottom: 56.25%; /* 16:9 */
+ padding-top: 25px;
+ height: 0;
+}
+.video-container iframe {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+} \ No newline at end of file
diff --git a/assets/sass/_common/_animation.scss b/assets/sass/_common/_animation.scss
new file mode 100644
index 0000000..d596b16
--- /dev/null
+++ b/assets/sass/_common/_animation.scss
@@ -0,0 +1,156 @@
+@mixin underline-from-center() {
+ display: inline-block;
+ vertical-align: middle;
+ transform: translateZ(0);
+ backface-visibility: hidden;
+ box-shadow: 0 0 1px transparent;
+ position: relative;
+ overflow: hidden;
+
+ &:before {
+ content: '';
+ position: absolute;
+ z-index: -1;
+ height: 2px;
+ bottom: 0;
+ left: 51%;
+ right: 51%;
+ background: $theme-color;
+ transition-duration: 0.2s;
+ transition-property: right, left;
+ transition-timing-function: ease-out;
+ }
+
+ &.active,
+ &:active,
+ &:focus,
+ &:hover {
+ &:before {
+ right: 0;
+ left: 0;
+ }
+ }
+}
+
+@mixin mobile-menu-icon() {
+ @keyframes clickfirst {
+ 0% {
+ transform: translateY(6px) rotate(0deg);
+
+ }
+
+ 100% {
+ transform: translateY(0) rotate(45deg);
+ }
+ }
+
+ @keyframes clickmid {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+ }
+
+ @keyframes clicklast {
+ 0% {
+ transform: translateY(-6px) rotate(0deg);
+ }
+
+ 100% {
+ transform: translateY(0) rotate(-45deg);
+ }
+ }
+
+ @keyframes outfirst {
+ 0% {
+ transform: translateY(0) rotate(-45deg);
+ }
+
+ 100% {
+ transform: translateY(-6px) rotate(0deg);
+ }
+ }
+
+ @keyframes outmid {
+ 0% {
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ }
+ }
+
+ @keyframes outlast {
+ 0% {
+ transform: translateY(0) rotate(45deg);
+ }
+
+ 100% {
+ transform: translateY(6px) rotate(0deg);
+ }
+ }
+
+ span {
+ position: absolute;
+ /* fallback for browsers which still doesn't support for `calc()` */
+ left: 15px;
+ top: 25px;
+ left: calc((100% - 20px) / 2);
+ top: calc((100% - 1px) / 2);
+ width: 20px;
+ height: 1px;
+ background-color: $theme-color;
+
+ &:nth-child(1) {
+ transform: translateY(6px) rotate(0deg);
+ }
+
+ &:nth-child(3) {
+ transform: translateY(-6px) rotate(0deg);
+ }
+ }
+
+ &.icon-click {
+ span:nth-child(1) {
+ animation-duration: 0.5s;
+ animation-fill-mode: both;
+ animation-name: clickfirst;
+ }
+
+ span:nth-child(2) {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-name: clickmid;
+ }
+
+ span:nth-child(3) {
+ animation-duration: 0.5s;
+ animation-fill-mode: both;
+ animation-name: clicklast;
+ }
+ }
+
+ &.icon-out {
+ span:nth-child(1) {
+ animation-duration: 0.5s;
+ animation-fill-mode: both;
+ animation-name: outfirst;
+ }
+
+ span:nth-child(2) {
+ animation-duration: 0.2s;
+ animation-fill-mode: both;
+ animation-name: outmid;
+ }
+
+ span:nth-child(3) {
+ animation-duration: 0.5s;
+ animation-fill-mode: both;
+ animation-name: outlast;
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_common/_normalize.scss b/assets/sass/_common/_normalize.scss
new file mode 100644
index 0000000..81c6f31
--- /dev/null
+++ b/assets/sass/_common/_normalize.scss
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
+ * and Firefox.
+ * Correct `block` display not defined for `main` in IE 11.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * 1. Correct `inline-block` display not defined in IE 8/9.
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+ */
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address `[hidden]` styling not present in IE 8/9/10.
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+ */
+
+[hidden],
+template {
+ display: none;
+}
+
+/* Links
+ ========================================================================== */
+
+/**
+ * Remove the gray background color from active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9/10.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow not hidden in IE 9/10/11.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari.
+ */
+
+figure {
+ margin: 1em 40px;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Contain overflow in all browsers.
+ */
+
+pre {
+ overflow: auto;
+}
+
+/**
+ * Address odd `em`-unit font size rendering in all browsers.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
+ * styling of `select`, unless a `border` property is set.
+ */
+
+/**
+ * 1. Correct color not being inherited.
+ * Known issue: affects color of disabled elements.
+ * 2. Correct font properties not being inherited.
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit; /* 1 */
+ font: inherit; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
+ */
+
+button {
+ overflow: visible;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+ * Correct `select` style inheritance in Firefox.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+input {
+ line-height: normal;
+}
+
+/**
+ * It's recommended that you don't attempt to style these elements.
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
+ *
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
+ * 2. Remove excess padding in IE 8/9/10.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
+ * `font-size` values of the `input`, it causes the cursor style of the
+ * decrement button to change from `default` to `text`.
+ */
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
+ * Safari (but not Chrome) clips the cancel button when the search input has
+ * padding (and `textfield` appearance).
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Remove default vertical scrollbar in IE 8/9/10/11.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * Don't inherit the `font-weight` (applied by a rule above).
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+ */
+
+optgroup {
+ font-weight: bold;
+}
+
+/* Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+td,
+th {
+ padding: 0;
+} \ No newline at end of file
diff --git a/assets/sass/_common/_utils.scss b/assets/sass/_common/_utils.scss
new file mode 100644
index 0000000..1c7b777
--- /dev/null
+++ b/assets/sass/_common/_utils.scss
@@ -0,0 +1,23 @@
+@mixin clearfix() {
+ &:before,
+ &:after {
+ content: " ";
+ display: table;
+ }
+
+ &:after {
+ clear: both;
+ }
+}
+
+@mixin min-screen($min-width: $global-body-width) {
+ @media screen and (min-width: $min-width) {
+ @content;
+ }
+}
+
+@mixin max-screen($max-width: $global-body-width) {
+ @media screen and (max-width: $max-width) {
+ @content;
+ }
+}
diff --git a/assets/sass/_custom/_custom.scss b/assets/sass/_custom/_custom.scss
new file mode 100644
index 0000000..f7cbb5a
--- /dev/null
+++ b/assets/sass/_custom/_custom.scss
@@ -0,0 +1,4 @@
+// ==============================
+// Custom style
+// ==============================
+// You can override the variables in _variables.scss to customize the style
diff --git a/assets/sass/_iconfont.scss b/assets/sass/_iconfont.scss
new file mode 100644
index 0000000..49550a1
--- /dev/null
+++ b/assets/sass/_iconfont.scss
@@ -0,0 +1,200 @@
+// ==============================
+// Iconfont
+// ==============================
+
+@font-face {
+ font-family: 'iconfont';
+
+ src: url('../fonts/iconfont/iconfont.eot');
+ src: url('../fonts/iconfont/iconfont.eot#iefix') format('embedded-opentype'), // not '?#iefix', because webpack will add '?hash=[hash]'
+ url('../fonts/iconfont/iconfont.woff') format('woff'),
+ url('../fonts/iconfont/iconfont.ttf') format('truetype'),
+ url('../fonts/iconfont/iconfont.svg#iconfont') format('svg');
+ font-display: swap;
+}
+
+%base-iconfont {
+ font-family: "iconfont" !important;
+ speak: none;
+ font-style: normal;
+ font-weight: normal;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+
+ -webkit-text-stroke-width: 0.2px;
+ cursor: pointer;
+
+ /* Enable Ligatures ================ */
+ letter-spacing: 0;
+ font-feature-settings: "liga";
+ font-variant-ligatures: discretionary-ligatures;
+
+ /* Better Font Rendering =========== */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.iconfont {
+ @extend %base-iconfont;
+}
+
+/* Social Icon */
+.icon-bilibili:before {
+ content: "\e900";
+ font-size: .9em;
+ position: relative;
+ top: -4px;
+}
+.icon-instagram:before {
+ font-size: .95em;
+ content: "\e611";
+ position: relative;
+ top: 1px;
+}
+.icon-douban:before {
+ content: "\e610";
+ position: relative;
+ top: 2px;
+}
+.icon-tumblr:before {
+ content: "\e69f";
+ font-size: .85em;
+ position: relative;
+ top: -2px;
+}
+.icon-linkedin:before {
+ content: "\e60d";
+ position: relative;
+ top: -2px;
+}
+.icon-twitter:before {
+ content: "\e600";
+}
+.icon-weibo:before {
+ content: "\e602";
+ position: relative;
+ top: 2px;
+}
+.icon-stack-overflow:before {
+ content: "\e902";
+ font-size: .85em;
+ position: relative;
+ top: -4px;
+}
+.icon-email:before {
+ content: "\e605";
+ position: relative;
+ top: -2px;
+}
+.icon-facebook:before {
+ content: "\e601";
+ font-size: .95em;
+ position: relative;
+ top: -2px;
+}
+.icon-gitlab:before {
+ content: "\e901";
+ font-size: .9em;
+ position: relative;
+ top: -4px;
+}
+.icon-github:before {
+ content: "\e606";
+ position: relative;
+ top: -1px;
+}
+.icon-rss:before {
+ content: "\e604";
+}
+.icon-google:before {
+ content: "\e609";
+ position: relative;
+ top: 2px;
+}
+.icon-zhihu:before {
+ content: "\e607";
+ font-size: .9em;
+}
+.icon-pocket:before {
+ content: "\e856";
+ position: relative;
+ top: 2px;
+}
+
+.inline-svg:before {
+ display: inline-block;
+ height: 1.15rem;
+ width: 1.15rem;
+ top: 0.15rem;
+ position: relative;
+}
+
+/* Generic Icon */
+.icon-heart:before {
+ content: "\e608";
+}
+.icon-right:before {
+ content: "\e60a";
+}
+.icon-left:before {
+ content: "\e60b";
+}
+.icon-up:before {
+ content: "\e60c";
+}
+.icon-close:before {
+ content: "\e60f";
+}
+.icon-link:before {
+ content: "\e909";
+}
+
+/* Admonition Icon */
+/*
+.icon-chevron-down:before {
+ content: "\e908";
+}
+.icon-format-quote:before {
+ content: "\e904";
+}
+.icon-pencil:before {
+ content: "\e903";
+}
+.icon-list-numbered:before {
+ content: "\e9b9";
+}
+.icon-list:before {
+ content: "\e9bb";
+}
+.icon-warning:before {
+ content: "\ea07";
+}
+.icon-question:before {
+ content: "\ea09";
+}
+.icon-info:before {
+ content: "\ea0c";
+}
+.icon-cross:before {
+ content: "\ea0f";
+}
+.icon-checkmark:before {
+ content: "\ea10";
+}
+.icon-fire:before {
+ content: "\e905";
+}
+.icon-danger:before {
+ content: "\e905";
+}
+.icon-flame:before {
+ content: "\e905";
+}
+.icon-hot:before {
+ content: "\e905";
+}
+.icon-bulb:before {
+ content: "\e906";
+}
+*/
diff --git a/assets/sass/_partial/_404.scss b/assets/sass/_partial/_404.scss
new file mode 100644
index 0000000..63eb465
--- /dev/null
+++ b/assets/sass/_partial/_404.scss
@@ -0,0 +1,25 @@
+// ==============================
+// Archive
+// =============================
+
+.not-found {
+ text-align: center;
+
+ .error-emoji {
+ color: #363636;
+ font-size: 3rem;
+ }
+
+ .error-text {
+ color: #797979;
+ font-size: 1.25rem;
+ }
+
+ .error-link {
+ margin-top: 2rem;
+
+ a {
+ color: $theme-color;
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_archive.scss b/assets/sass/_partial/_archive.scss
new file mode 100644
index 0000000..f1431c4
--- /dev/null
+++ b/assets/sass/_partial/_archive.scss
@@ -0,0 +1,100 @@
+// ==============================
+// Archive
+// =============================
+
+.archive {
+ margin: $archive-margin;
+ max-width: $archive-max-width;
+
+ .archive-title {
+ font-family: $global-serif-font-family;
+
+ &.tag,
+ &.category {
+ margin: 15px 0;
+ }
+
+ .archive-name {
+ margin: 0;
+ display: inline-block;
+ font-weight: 400;
+ font-size: $archive-name-font-size;
+ line-height: $archive-name-font-size + 2px;
+ }
+
+ .archive-post-counter {
+ color: $dark-gray;
+ }
+ }
+
+ .collection-title {
+ font-family: $global-serif-font-family;
+
+ .archive-year {
+ margin: 15px 0;
+ font-weight: 400;
+ font-size: $collection-title-font-size;
+ line-height: $collection-title-font-size + 2px;
+ }
+ }
+
+ .archive-post {
+ padding: $archive-post-padding;
+ border-left: $archive-post-border-left;
+
+ .archive-post-time {
+ margin-right: 10px;
+ color: $dark-gray;
+ }
+
+ .archive-post-title {
+
+ .archive-post-link {
+ color: $theme-color;
+ }
+ }
+
+ &::first-child {
+ margin-top: 10px;
+ }
+
+ &:hover {
+ border-left: $archive-post-hover-border-left;
+ transition: $archive-post-hover-transition;
+ transform: $archive-post-hover-transform;
+
+ .archive-post-time {
+ color: darken($dark-gray, 10%);
+ }
+
+ .archive-post-title .archive-post-link {
+ color: darken($theme-color, 10%);
+ }
+ }
+ }
+}
+
+@include max-screen() {
+ .archive {
+ margin-left: auto;
+ margin-right: auto;
+
+ .archive-title .archive-name {
+ font-size: $archive-name-font-size - 4px;
+ }
+
+ .collection-title .archive-year {
+ margin: 10px 0;
+ font-size: $collection-title-font-size - 4px;
+ }
+
+ .archive-post {
+ padding: $archive-post-mobile-padding;
+
+ .archive-post-time {
+ font-size: $archive-post-mobile-time-font-size;
+ display: block;
+ }
+ }
+ }
+}
diff --git a/assets/sass/_partial/_back-to-top.scss b/assets/sass/_partial/_back-to-top.scss
new file mode 100644
index 0000000..ee67aa2
--- /dev/null
+++ b/assets/sass/_partial/_back-to-top.scss
@@ -0,0 +1,24 @@
+// ==============================
+// Back to top
+// =============================
+
+.back-to-top {
+ display: none;
+ position: fixed;
+ right: 20px;
+ bottom: 20px;
+ transition-property: transform;
+ transition-timing-function: ease-out;
+ transition-duration: 0.3s;
+ z-index: 10;
+
+ &:hover {
+ transform: translateY(-5px);
+ }
+}
+
+@include max-screen() {
+ .back-to-top {
+ display: none !important;
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_footer.scss b/assets/sass/_partial/_footer.scss
new file mode 100644
index 0000000..1f8cdae
--- /dev/null
+++ b/assets/sass/_partial/_footer.scss
@@ -0,0 +1,10 @@
+// ==============================
+// Post footer
+// =============================
+
+.footer {
+ margin-top: $footer-margin-top;
+
+ @import "_footer/social";
+ @import "_footer/copyright";
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_footer/_copyright.scss b/assets/sass/_partial/_footer/_copyright.scss
new file mode 100644
index 0000000..4e63063
--- /dev/null
+++ b/assets/sass/_partial/_footer/_copyright.scss
@@ -0,0 +1,24 @@
+// ==============================
+// Copyright
+// =============================
+
+.copyright {
+ margin: $copyright-margin;
+ color: $dark-gray;
+ text-align: center;
+ font-family: $global-serif-font-family;
+
+ .hexo-link,
+ .theme-link {
+ color: $theme-color;
+ }
+
+ .copyright-year {
+ display: block;
+
+ .heart {
+ font-size: 14px;
+ margin: 4px;
+ }
+ }
+}
diff --git a/assets/sass/_partial/_footer/_social.scss b/assets/sass/_partial/_footer/_social.scss
new file mode 100644
index 0000000..a23eb69
--- /dev/null
+++ b/assets/sass/_partial/_footer/_social.scss
@@ -0,0 +1,19 @@
+// ==============================
+// Social
+// =============================
+
+.social-links {
+ text-align: center;
+
+ .iconfont {
+ font-size: $social-icon-font-size;
+
+ & + .iconfont {
+ margin-left: $social-link-margin-left;
+ }
+
+ &:hover {
+ color: $theme-color;
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_header.scss b/assets/sass/_partial/_header.scss
new file mode 100644
index 0000000..9c4de56
--- /dev/null
+++ b/assets/sass/_partial/_header.scss
@@ -0,0 +1,26 @@
+// ==============================
+// Header
+// ==============================
+
+.header {
+ @include clearfix;
+ padding: $header-padding;
+
+ @import '_header/logo';
+ @import '_header/menu';
+
+ .language-selector {
+ float: right;
+ }
+}
+
+@include max-screen() {
+ .header {
+ padding: 50px 0 0;
+ text-align: center;
+
+ .language-selector {
+ display: none;
+ }
+ }
+}
diff --git a/assets/sass/_partial/_header/_logo.scss b/assets/sass/_partial/_header/_logo.scss
new file mode 100644
index 0000000..cd6435f
--- /dev/null
+++ b/assets/sass/_partial/_header/_logo.scss
@@ -0,0 +1,18 @@
+// ==============================
+// Logo
+// =============================
+
+.logo-wrapper {
+ float: left;
+
+ .logo {
+ font-size: $logo-font-size;
+ font-family: $logo-font-family;
+ }
+}
+
+@include max-screen() {
+ .logo-wrapper {
+ display: none;
+ }
+}
diff --git a/assets/sass/_partial/_header/_menu.scss b/assets/sass/_partial/_header/_menu.scss
new file mode 100644
index 0000000..7209c80
--- /dev/null
+++ b/assets/sass/_partial/_header/_menu.scss
@@ -0,0 +1,35 @@
+// ==============================
+// Menu
+// =============================
+
+.site-navbar {
+ float: right;
+
+ .menu {
+ display: inline-block;
+ position: relative;
+ padding-left: 0;
+ padding-right: 25px;
+ font-family: $global-serif-font-family;
+
+ .menu-item {
+ display: inline-block;
+
+ & + .menu-item {
+ margin-left: $menu-item-margin-left;;
+ }
+
+ @include underline-from-center;
+ }
+
+ .menu-item-link {
+ font-size: $menu-link-font-size;
+ }
+ }
+}
+
+@include max-screen() {
+ .site-navbar {
+ display: none;
+ }
+}
diff --git a/assets/sass/_partial/_language-selector.scss b/assets/sass/_partial/_language-selector.scss
new file mode 100644
index 0000000..7640e61
--- /dev/null
+++ b/assets/sass/_partial/_language-selector.scss
@@ -0,0 +1,25 @@
+.language-selector {
+ width: max-content;
+
+ .languages-list {
+ padding: 0;
+ background: darken($deputy-color, 3%);
+
+ .language-item {
+ display: inline-block;
+ list-style-type: none;
+ text-transform: uppercase;
+ font-family: $global-serif-font-family;
+ font-size: 18px;
+ padding: 0 10px;
+
+ &.active {
+ background: $theme-color;
+
+ > a {
+ color: #fff;
+ }
+ }
+ }
+ }
+}
diff --git a/assets/sass/_partial/_mobile.scss b/assets/sass/_partial/_mobile.scss
new file mode 100644
index 0000000..26e4c76
--- /dev/null
+++ b/assets/sass/_partial/_mobile.scss
@@ -0,0 +1,77 @@
+// ==============================
+// Mobile Navbar
+// ==============================
+
+.mobile-navbar {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: $mobile-navbar-height;
+ background: $white;
+ box-shadow: 0px 2px 2px $gray;
+ text-align: center;
+ transition: transform 300ms ease;
+ z-index: 99;
+
+ &.fixed-open {
+ transform: translate3d(180px, 0px, 0px);
+ }
+
+ .mobile-header-logo {
+ display: inline-block;
+ margin-right: 50px;
+
+ .logo {
+ font-size: 22px;
+ line-height: $mobile-navbar-height;
+ font-family: $logo-font-family;
+ }
+ }
+
+ .mobile-navbar-icon {
+ color: $theme-color;
+ height: $mobile-navbar-height;
+ width: $mobile-navbar-height;
+ font-size: 24px;
+ text-align: center;
+ float: left;
+ position: relative;
+ transition: background 0.5s;
+
+ @include mobile-menu-icon();
+ }
+}
+
+.mobile-menu {
+ background-color: rgba($deputy-color, 0.5);
+
+ .mobile-menu-list {
+ position: relative;
+ list-style: none;
+ margin-top: 50px;
+ padding: 0;
+ border-top: 1px solid $deputy-color;
+
+ .mobile-menu-item {
+ padding: 10px 30px;
+ border-bottom: 1px solid $deputy-color;
+ }
+
+ a {
+ font-size: 18px;
+ font-family: $global-serif-font-family;
+
+ &:hover {
+ color: $theme-color;
+ }
+ }
+ }
+}
+
+@include max-screen() {
+ .mobile-navbar {
+ display: block;
+ }
+}
diff --git a/assets/sass/_partial/_pagination.scss b/assets/sass/_partial/_pagination.scss
new file mode 100644
index 0000000..c58f8db
--- /dev/null
+++ b/assets/sass/_partial/_pagination.scss
@@ -0,0 +1,36 @@
+// ==============================
+// Pagination
+// ==============================
+
+.pagination {
+ margin: $pagination-margin;
+ @include clearfix;
+
+ .prev,
+ .next {
+ font-weight: 600;
+ font-size: $pagination-font-size;
+ font-family: $global-serif-font-family;
+ transition-property: transform;
+ transition-timing-function: ease-out;
+ transition-duration: 0.3s;
+ }
+
+ .prev {
+ float: left;
+
+ &:hover {
+ color: $theme-color;
+ transform: translateX(-4px);
+ }
+ }
+
+ .next {
+ float: right;
+
+ &:hover {
+ color: $theme-color;
+ transform: translateX(4px);
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_post.scss b/assets/sass/_partial/_post.scss
new file mode 100644
index 0000000..a980b29
--- /dev/null
+++ b/assets/sass/_partial/_post.scss
@@ -0,0 +1,24 @@
+// ==============================
+// Post
+// ==============================
+
+.posts {
+ margin-bottom: $post-list-margin-bottom;
+ border-bottom: $post-border;
+}
+
+.post {
+ padding: $post-padding;
+
+ & + .post {
+ border-top: $post-border;
+ }
+
+ @import '_post/header';
+ @import '_post/toc';
+ @import '_post/content';
+ @import '_post/copyright';
+ @import '_post/reward';
+ @import '_post/footer';
+ @import '_post/outdated';
+}
diff --git a/assets/sass/_partial/_post/_admonition.scss b/assets/sass/_partial/_post/_admonition.scss
new file mode 100644
index 0000000..75444d6
--- /dev/null
+++ b/assets/sass/_partial/_post/_admonition.scss
@@ -0,0 +1,210 @@
+.admonition {
+ box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),
+ 0 1px 5px 0 rgba(0,0,0,.12),
+ 0 3px 1px -2px rgba(0,0,0,.2);
+ position: relative;
+ margin: .9765em 0;
+ padding: 0 .75rem;
+ border-left: .25rem solid #448aff;
+ border-radius: .125rem;
+ overflow: auto;
+
+ .admonition-title {
+ margin: 0 -0.75rem;
+ padding: .5rem .75rem .5rem 2.5rem;
+ border-bottom: .1rem solid rgba(68,138,255,.1);
+ background-color: rgba(68,138,255,.1);
+ font-weight: 700;
+ }
+
+ .admonition-title:before {
+ @extend %base-iconfont;
+ cursor: auto;
+ position: absolute;
+ left: .75rem;
+ top: .75rem;
+ }
+
+ &.note {
+ border-left-color: #448aff;
+
+ .admonition-title:before {
+ color: #448aff;
+ content: "\e903";
+ }
+ }
+
+ &.abstract {
+ border-left-color: #00b0ff;
+
+ .admonition-title {
+ background-color: rgba(0,176,255,.1);
+ }
+
+ .admonition-title:before {
+ color: #00b0ff;
+ content: "\e9bb";
+ }
+ }
+
+ &.info {
+ border-left-color: #00b8d4;
+
+ .admonition-title {
+ background-color: rgba(0,184,212,.1);
+ }
+
+ .admonition-title:before {
+ color: #00b8d4;
+ content: "\ea0c";
+ }
+ }
+
+ &.tip {
+ border-left-color: #00bfa5;
+
+ .admonition-title {
+ background-color: rgba(0,191,165,.1);
+ }
+
+ .admonition-title:before {
+ color: #00bfa5;
+ content: "\e906";
+ }
+ }
+
+ &.success {
+ border-left-color: #00c853;
+
+ .admonition-title {
+ background-color: rgba(0,200,83,.1);
+ }
+
+ .admonition-title:before {
+ color: #00c853;
+ content: "\ea10";
+ }
+ }
+
+ &.question {
+ border-left-color: #64dd17;
+
+ .admonition-title {
+ background-color: rgba(100,221,23,.1);
+ }
+
+ .admonition-title:before {
+ color: #64dd17;
+ content: "\ea09";
+ }
+ }
+
+ &.warning {
+ border-left-color: #ff9100;
+
+ .admonition-title {
+ background-color: rgba(255,145,0,.1);
+ }
+
+ .admonition-title:before {
+ color: #ff9100;
+ content: "\ea07";
+ }
+ }
+
+ &.failure {
+ border-left-color: #ff5252;
+
+ .admonition-title {
+ background-color: rgba(255,82,82,.1);
+ }
+
+ .admonition-title:before {
+ color: #ff5252;
+ content: "\ea0f";
+ }
+ }
+
+ &.danger {
+ border-left-color: #ff1744;
+
+ .admonition-title {
+ background-color: rgba(255,23,68,.1);
+ }
+
+ .admonition-title:before {
+ color: #ff1744;
+ content: "\e905";
+ }
+ }
+
+ &.bug {
+ border-left-color: #f50057;
+
+ .admonition-title {
+ background-color: rgba(245,0,87,.1);
+ }
+
+ .admonition-title:before {
+ color: #f50057;
+ content: "\e907";
+ }
+ }
+
+ &.example {
+ border-left-color: #651fff;
+
+ .admonition-title {
+ background-color: rgba(101,31,255,.1);
+ }
+
+ .admonition-title:before {
+ color: #651fff;
+ content: "\e9b9";
+ }
+ }
+
+ &.quote {
+ border-left-color: #9e9e9e;
+
+ .admonition-title {
+ background-color: hsla(0,0%,62%,.1);
+ }
+
+ .admonition-title:before {
+ color: #9e9e9e;
+ content: "\e904";
+ }
+ }
+
+ &:last-child {
+ margin-bottom: .75rem;
+ }
+}
+
+details.admonition {
+ summary {
+ display: block;
+ outline: none;
+ cursor: pointer;
+
+ &::-webkit-details-marker {
+ display: none;
+ }
+
+ &:after {
+ @extend %base-iconfont;
+ position: absolute;
+ top: .75rem;
+ right: .75rem;
+ color: rgba(0,0,0,.26);
+ content: "\e908";
+ }
+ }
+}
+
+details.admonition[open] {
+ > summary:after {
+ transform: rotate(180deg);
+ }
+}
diff --git a/assets/sass/_partial/_post/_code.scss b/assets/sass/_partial/_post/_code.scss
new file mode 100644
index 0000000..2bd16a1
--- /dev/null
+++ b/assets/sass/_partial/_post/_code.scss
@@ -0,0 +1,287 @@
+code, pre {
+ padding: 7px;
+ font-size: $code-font-size;
+ font-family: $code-font-family;
+ background: $code-background;
+}
+
+code {
+ padding: 3px 5px;
+ border-radius: 4px;
+ color: $code-color;
+}
+
+pre > code {
+ display: block;
+}
+
+// highlight.js
+figure.highlight {
+ margin: 1em 0;
+ border-radius: 5px;
+ overflow-x: auto;
+ box-shadow: 1px 1px 2px rgba(0,0,0,0.125);
+ position: relative;
+
+ table {
+ position: relative;
+
+ &::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ padding: 2px 7px;
+ font-size: $code-font-size;
+ font-weight: bold;
+ color: darken($gray, 10%);
+ background: darken($code-background, 3%);
+ content: 'Code';
+ }
+ }
+
+ @each $sign, $text in $code-type-list {
+ &.#{$sign} > table::after {
+ content: $text;
+ }
+ }
+
+ .code {
+ pre {
+ margin: 0;
+ padding: 30px 10px 10px;
+ }
+ }
+
+ .gutter {
+ width: 10px;
+ color: $gray;
+
+ pre {
+ margin: 0;
+ padding: 30px 7px 10px;
+ }
+ }
+
+ .line {
+ // Fix code block null line height and
+ // Synchronous gutter and code line highly.
+ height: round($code-font-size * 1.5);
+ }
+
+ table, tr, td {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ border-collapse: collapse;
+ }
+
+ .code {
+ .hljs-comment,
+ .hljs-quote {
+ color: map-get($code-highlight-color, comment);
+ }
+
+ .hljs-keyword,
+ .hljs-selector-tag,
+ .hljs-addition {
+ color: map-get($code-highlight-color, keyword);
+ }
+
+ .hljs-number,
+ .hljs-string,
+ .hljs-meta .hljs-meta-string,
+ .hljs-literal,
+ .hljs-doctag,
+ .hljs-regexp {
+ color: map-get($code-highlight-color, number);
+ }
+
+ .hljs-title,
+ .hljs-section,
+ .hljs-name,
+ .hljs-selector-id,
+ .hljs-selector-class {
+ color: map-get($code-highlight-color, title);
+ }
+
+ .hljs-attribute,
+ .hljs-attr,
+ .hljs-variable,
+ .hljs-template-variable,
+ .hljs-class .hljs-title,
+ .hljs-type {
+ color: map-get($code-highlight-color, attribute);
+ }
+
+ .hljs-symbol,
+ .hljs-bullet,
+ .hljs-subst,
+ .hljs-meta,
+ .hljs-meta .hljs-keyword,
+ .hljs-selector-attr,
+ .hljs-selector-pseudo,
+ .hljs-link {
+ color: map-get($code-highlight-color, symbol);
+ }
+
+ .hljs-built_in,
+ .hljs-deletion {
+ color: map-get($code-highlight-color, built_in);
+ }
+
+ .hljs-formula {
+ background: map-get($code-highlight-color, formula);
+ }
+
+ .hljs-emphasis {
+ font-style: italic;
+ }
+
+ .hljs-strong {
+ font-weight: bold;
+ }
+ }
+}
+
+// chroma
+.highlight > .chroma {
+ margin: 1em 0;
+ border-radius: 5px;
+ overflow-x: auto;
+ box-shadow: 1px 1px 2px rgba(0,0,0,0.125);
+ position: relative;
+ background: $code-background;
+
+ code {
+ padding: 0;
+ }
+
+ table {
+ position: relative;
+
+ &::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ padding: 2px 7px;
+ font-size: $code-font-size;
+ font-weight: bold;
+ color: darken($gray, 10%);
+ background: darken($code-background, 3%);
+ content: 'Code';
+ }
+ }
+
+ @each $sign, $text in $code-type-list {
+ &.#{$sign} > table::after {
+ content: $text;
+ }
+ }
+
+ .lntd {
+ // Fix code block null line height and
+ // Synchronous gutter and code line highly.
+ line-height: round($code-font-size * 1.5);
+
+ &:first-child {
+ width: 10px;
+
+ pre {
+ margin: 0;
+ padding: 30px 7px 10px;
+ }
+ }
+
+ &:last-child {
+ vertical-align: top;
+
+ pre {
+ margin: 0;
+ padding: 30px 10px 10px;
+ }
+ }
+ }
+
+ table, tr, td {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ border-collapse: collapse;
+ }
+
+ /* LineNumbersTable */ .lnt { color: $gray; }
+ /* LineHighlight */ .hl { display: block; width: 100%; background-color: #ffffcc }
+
+ /* Keyword */ .k { color: #859900 }
+ /* KeywordConstant */ .kc { color: #859900; font-weight: bold }
+ /* KeywordDeclaration */ .kd { color: #859900 }
+ /* KeywordNamespace */ .kn { color: #dc322f; font-weight: bold }
+ /* KeywordPseudo */ .kp { color: #859900 }
+ /* KeywordReserved */ .kr { color: #859900 }
+ /* KeywordType */ .kt { color: #859900; font-weight: bold }
+ /* Name */ .n { color: #268bd2 }
+ /* NameAttribute */ .na { color: #268bd2 }
+ /* NameBuiltin */ .nb { color: #cb4b16 }
+ /* NameBuiltinPseudo */ .bp { color: #268bd2 }
+ /* NameClass */ .nc { color: #cb4b16 }
+ /* NameConstant */ .no { color: #268bd2 }
+ /* NameDecorator */ .nd { color: #268bd2 }
+ /* NameEntity */ .ni { color: #268bd2 }
+ /* NameException */ .ne { color: #268bd2 }
+ /* NameFunction */ .nf { color: #268bd2 }
+ /* NameFunctionMagic */ .fm { color: #268bd2 }
+ /* NameLabel */ .nl { color: #268bd2 }
+ /* NameNamespace */ .nn { color: #268bd2 }
+ /* NameOther */ .nx { color: #268bd2 }
+ /* NameProperty */ .py { color: #268bd2 }
+ /* NameTag */ .nt { color: #268bd2; font-weight: bold }
+ /* NameVariable */ .nv { color: #268bd2 }
+ /* NameVariableClass */ .vc { color: #268bd2 }
+ /* NameVariableGlobal */ .vg { color: #268bd2 }
+ /* NameVariableInstance */ .vi { color: #268bd2 }
+ /* NameVariableMagic */ .vm { color: #268bd2 }
+ /* Literal */ .l { color: #2aa198 }
+ /* LiteralDate */ .ld { color: #2aa198 }
+ /* LiteralString */ .s { color: #2aa198 }
+ /* LiteralStringAffix */ .sa { color: #2aa198 }
+ /* LiteralStringBacktick */ .sb { color: #2aa198 }
+ /* LiteralStringChar */ .sc { color: #2aa198 }
+ /* LiteralStringDelimiter */ .dl { color: #2aa198 }
+ /* LiteralStringDoc */ .sd { color: #2aa198 }
+ /* LiteralStringDouble */ .s2 { color: #2aa198 }
+ /* LiteralStringEscape */ .se { color: #2aa198 }
+ /* LiteralStringHeredoc */ .sh { color: #2aa198 }
+ /* LiteralStringInterpol */ .si { color: #2aa198 }
+ /* LiteralStringOther */ .sx { color: #2aa198 }
+ /* LiteralStringRegex */ .sr { color: #2aa198 }
+ /* LiteralStringSingle */ .s1 { color: #2aa198 }
+ /* LiteralStringSymbol */ .ss { color: #2aa198 }
+ /* LiteralNumber */ .m { color: #2aa198; font-weight: bold }
+ /* LiteralNumberBin */ .mb { color: #2aa198; font-weight: bold }
+ /* LiteralNumberFloat */ .mf { color: #2aa198; font-weight: bold }
+ /* LiteralNumberHex */ .mh { color: #2aa198; font-weight: bold }
+ /* LiteralNumberInteger */ .mi { color: #2aa198; font-weight: bold }
+ /* LiteralNumberIntegerLong */ .il { color: #2aa198; font-weight: bold }
+ /* LiteralNumberOct */ .mo { color: #2aa198; font-weight: bold }
+ /* OperatorWord */ .ow { color: #859900 }
+ /* Comment */ .c { color: #93a1a1; font-style: italic }
+ /* CommentHashbang */ .ch { color: #93a1a1; font-style: italic }
+ /* CommentMultiline */ .cm { color: #93a1a1; font-style: italic }
+ /* CommentSingle */ .c1 { color: #93a1a1; font-style: italic }
+ /* CommentSpecial */ .cs { color: #93a1a1; font-style: italic }
+ /* CommentPreproc */ .cp { color: #93a1a1; font-style: italic }
+ /* CommentPreprocFile */ .cpf { color: #93a1a1; font-style: italic }
+ /* Generic */ .g { color: #d33682 }
+ /* GenericDeleted */ .gd { color: #b58900 }
+ /* GenericEmph */ .ge { color: #d33682 }
+ /* GenericError */ .gr { color: #d33682 }
+ /* GenericHeading */ .gh { color: #d33682 }
+ /* GenericInserted */ .gi { color: #859900 }
+ /* GenericOutput */ .go { color: #d33682 }
+ /* GenericPrompt */ .gp { color: #d33682 }
+ /* GenericStrong */ .gs { color: #d33682 }
+ /* GenericSubheading */ .gu { color: #d33682 }
+ /* GenericTraceback */ .gt { color: #d33682 }
+}
diff --git a/assets/sass/_partial/_post/_content.scss b/assets/sass/_partial/_post/_content.scss
new file mode 100644
index 0000000..b21d3df
--- /dev/null
+++ b/assets/sass/_partial/_post/_content.scss
@@ -0,0 +1,198 @@
+// ==============================
+// Post content
+// ==============================
+
+.post-content {
+ word-wrap: break-word;
+
+ @for $i from 1 through 6 {
+ h#{$i} {
+ font-weight: 400;
+ font-family: $global-serif-font-family;
+
+ .anchor {
+ float: left;
+ line-height: 1;
+ margin-left: -20px;
+ padding-right: 4px;
+
+ &:hover {
+ border-bottom: initial;
+ }
+
+ .icon-link {
+ visibility: hidden;
+ font-size: 16px;
+ display: contents;
+
+ &:before {
+ vertical-align: middle;
+ }
+ }
+ }
+
+ &:hover {
+ .icon-link {
+ visibility: visible;
+ }
+ }
+ }
+ }
+
+ a {
+ color: $theme-color;
+ word-break: break-all;
+
+ &:hover {
+ border-bottom: $content-link-border;
+ }
+
+ &.fancybox {
+ border: 0;
+ }
+ }
+
+ blockquote {
+ margin: 2em 0;
+ padding: 10px 20px;
+ position: relative;
+ color: rgba(#34495e, 0.8);
+ background-color: $content-blockquote-backgroud;
+ border-left: $content-blockquote-border-left;
+ box-shadow: 1px 1px 2px rgba(0,0,0,0.125);
+
+ p {
+ margin: 0;
+ }
+ }
+
+ img {
+ display: inline-block;
+ max-width: 100%;
+ }
+
+ .table-wrapper {
+ overflow-x: auto;
+
+ > table {
+ max-width: 100%;
+ margin: 10px 0;
+ border-spacing: 0;
+ box-shadow: 2px 2px 3px rgba(0,0,0,.125);
+
+ thead {
+ background: $deputy-color;
+ }
+
+ th, td {
+ padding: 5px 15px;
+ border: 1px double $content-table-border-color;
+ }
+
+ tr:hover {
+ background-color: $deputy-color;
+ }
+ }
+ }
+
+ @import 'code';
+ @import 'admonition';
+
+ .post-summary {
+ margin-bottom: 1em;
+ }
+
+ .read-more {
+ .read-more-link {
+ color: $theme-color;
+ font-size: 1.1em;
+ font-family: $global-serif-font-family;
+
+ &:hover {
+ border-bottom: $post-readMore-border-bottom;
+ }
+ }
+ }
+
+ kbd {
+ display: inline-block;
+ padding: 0.25em;
+ background-color: #fafafa;
+ border: 1px solid #dbdbdb;
+ border-bottom-color: #b5b5b5;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 #b5b5b5;
+ font-size: 0.8em;
+ line-height: 1.25;
+ font-family: "SFMono-Regular","Liberation Mono","Roboto Mono",Menlo,Monaco,Consolas,"Courier New",Courier,monospace;
+ color: #4a4a4a;
+ }
+
+ dl dt::after {
+ content: ':';
+ }
+
+ figure {
+ &.center {
+ text-align: center;
+ }
+
+ &.right {
+ text-align: right;
+ }
+
+ &.left {
+ text-align: left;
+ }
+
+ figcaption h4 {
+ color: #b5b5b5;
+ font-size: 0.9rem;
+ }
+ }
+
+ hr {
+ margin: 1rem 0;
+ position: relative;
+ border-top: 2px dashed $theme-color;
+ border-bottom: none;
+ }
+
+ .footnote-ref {
+ > a {
+ font-weight: bold;
+ margin-left: 3px;
+
+ &:before {
+ content: "[";
+ }
+
+ &:after {
+ content: "]";
+ }
+ }
+ }
+
+ .task-list {
+ list-style: none;
+ padding-left: 1.5rem;
+ }
+
+ .align-center {
+ text-align: center;
+ }
+
+ .align-right {
+ text-align: right;
+ }
+
+ .align-left {
+ text-align: left;
+ }
+
+ .MJXc-display {
+ overflow-x: auto;
+ overflow-y: hidden;
+ padding-right: 1px;
+ }
+}
diff --git a/assets/sass/_partial/_post/_copyright.scss b/assets/sass/_partial/_post/_copyright.scss
new file mode 100644
index 0000000..374061f
--- /dev/null
+++ b/assets/sass/_partial/_post/_copyright.scss
@@ -0,0 +1,29 @@
+.post-copyright {
+ margin-top: 20px;
+ padding-top: 10px;
+ border-top: 1px dashed $light-gray;
+
+ .copyright-item {
+ margin: 5px 0;
+
+ a {
+ color: $theme-color;
+ word-wrap: break-word;
+
+ &:hover {
+ border-bottom: $content-link-border;
+ }
+ }
+
+ .item-title {
+ display: inline-block;
+ min-width: 5rem;
+ margin-right: .5rem;
+ text-align: right;
+
+ &:after {
+ content: " :";
+ }
+ }
+ }
+}
diff --git a/assets/sass/_partial/_post/_footer.scss b/assets/sass/_partial/_post/_footer.scss
new file mode 100644
index 0000000..012110f
--- /dev/null
+++ b/assets/sass/_partial/_post/_footer.scss
@@ -0,0 +1,74 @@
+// ==============================
+// Post footer
+// ==============================
+
+.post-footer {
+ margin-top: $post-footer-margin-top;
+ border-top: $post-footer-border-top;
+ font-family: $global-serif-font-family;
+
+ .post-tags {
+ padding: $post-tags-padding;
+
+ a {
+ margin-right: 5px;
+ color: $theme-color;
+ word-break: break-all;
+
+ &::before {
+ content: '#';
+ }
+ }
+ }
+
+ .post-nav {
+ margin: 1em 0;
+ @include clearfix;
+
+ .prev,
+ .next {
+ font-weight: 600;
+ font-size: $post-nav-font-size;
+ font-family: $global-serif-font-family;
+ transition-property: transform;
+ transition-timing-function: ease-out;
+ transition-duration: 0.3s;
+ }
+
+ .prev {
+ float: left;
+
+ &:hover {
+ color: $theme-color;
+ transform: translateX(-4px);
+ }
+ }
+
+ .next {
+ float: right;
+
+ &:hover {
+ color: $theme-color;
+ transform: translateX(4px);
+ }
+ }
+
+ .nav-mobile {
+ display: none;
+ }
+ }
+}
+
+@include max-screen() {
+ .post-footer {
+ .post-nav {
+ .nav-default {
+ display: none;
+ }
+
+ .nav-mobile {
+ display: inline;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_post/_header.scss b/assets/sass/_partial/_post/_header.scss
new file mode 100644
index 0000000..7faf4e3
--- /dev/null
+++ b/assets/sass/_partial/_post/_header.scss
@@ -0,0 +1,46 @@
+.post-header {
+ margin-bottom: 20px;
+
+ .post-title {
+ margin: 0;
+ font-size: $post-title-font-size;
+ font-weight: $post-title-font-weight;
+ font-family: $global-serif-font-family;
+ }
+
+ .post-link {
+ @include underline-from-center;
+ }
+
+ .post-meta {
+ font-size: 14px;
+ color: $post-meta-font-color;
+
+ .post-time {
+ font-size: 15px;
+ }
+
+ .post-category {
+ display: inline;
+
+ a {
+ color: inherit;
+
+ &::before {
+ content: '·';
+ }
+
+ &:hover {
+ color: $theme-color;
+ }
+ }
+ }
+
+ .more-meta {
+ &::before {
+ content: '·';
+ }
+ }
+
+ }
+}
diff --git a/assets/sass/_partial/_post/_outdated.scss b/assets/sass/_partial/_post/_outdated.scss
new file mode 100644
index 0000000..be7b5ea
--- /dev/null
+++ b/assets/sass/_partial/_post/_outdated.scss
@@ -0,0 +1,25 @@
+.post-outdated {
+ .hint {
+ position: relative;
+ margin-top: 20px;
+ margin-bottom: 20px;
+ padding: 5px 10px;
+ border-left: 4px solid rgb(66, 172, 243);
+ background-color: rgb(239, 245, 255);
+ border-color: rgb(66, 172, 243);
+ }
+
+ .warn {
+ position: relative;
+ margin-top: 20px;
+ margin-bottom: 20px;
+ padding: 5px 10px;
+ border-left: 4px solid #f9cf63;
+ background-color: #ffffc0;
+ border-color: #f9cf63;
+ }
+}
+
+
+
+
diff --git a/assets/sass/_partial/_post/_reward.scss b/assets/sass/_partial/_post/_reward.scss
new file mode 100644
index 0000000..3a03a9f
--- /dev/null
+++ b/assets/sass/_partial/_post/_reward.scss
@@ -0,0 +1,54 @@
+.post-reward {
+ margin-top: 20px;
+ padding-top: 10px;
+ text-align: center;
+ border-top: 1px dashed $light-gray;
+
+ .reward-button {
+ margin: 15px 0;
+ padding: 3px 7px;
+ display: inline-block;
+ color: $theme-color;
+ border: 1px solid $theme-color;
+ border-radius: 5px;
+ cursor: pointer;
+
+ &:hover {
+ color: $white;
+ background-color: $theme-color;
+ transition: 0.5s;
+ }
+ }
+
+ #reward:checked {
+ & ~ .qr-code {
+ display: block;
+ }
+
+ & ~ .reward-button {
+ display: none;
+ }
+ }
+
+ .qr-code {
+ display: none;
+
+ .qr-code-image {
+ display: inline-block;
+ min-width: 200px;
+ width: 40%;
+ margin-top: 15px;
+
+ span {
+ display: inline-block;
+ width: 100%;
+ margin: 8px 0;
+ }
+ }
+
+ .image {
+ width: 200px;
+ height: 200px;
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_partial/_post/_toc.scss b/assets/sass/_partial/_post/_toc.scss
new file mode 100644
index 0000000..8327055
--- /dev/null
+++ b/assets/sass/_partial/_post/_toc.scss
@@ -0,0 +1,55 @@
+.post-toc {
+ position: absolute;
+ width: $post-toc-width;
+ margin-left: $post-toc-margin-left;
+ padding: 10px;
+ font-family: $global-serif-font-family;
+ border-radius: 5px;
+ background: $post-toc-backgroud;
+ box-shadow: 1px 1px 2px rgba(0,0,0,0.125);
+ word-wrap: break-word;
+ box-sizing: border-box;
+
+ .post-toc-title {
+ margin: 0 10px;
+ font-size: $post-toc-title-size;
+ font-weight: 400;
+ text-transform: uppercase;
+ }
+
+ .post-toc-content {
+ font-size: $post-toc-content;
+
+ &.always-active ul {
+ display: block;
+ }
+
+ >nav>ul {
+ margin: 10px 0;
+ }
+
+ ul {
+ padding-left: 20px;
+ list-style: $post-toc-list-style;
+
+ ul {
+ padding-left: 15px;
+ display: none;
+ }
+
+ .has-active > ul {
+ display: block;
+ }
+ }
+
+ .toc-link.active {
+ color: $theme-color;
+ }
+ }
+}
+
+@include max-screen($toc-max-sreen-width) {
+ .post-toc {
+ display: none;
+ }
+}
diff --git a/assets/sass/_partial/_slideout.scss b/assets/sass/_partial/_slideout.scss
new file mode 100644
index 0000000..58891fd
--- /dev/null
+++ b/assets/sass/_partial/_slideout.scss
@@ -0,0 +1,37 @@
+// ==============================
+// slideout (https://github.com/mango/slideout)
+// ==============================
+
+.slideout-menu {
+ position: fixed;
+ top: 0;
+ left: 0px;
+ bottom: 0;
+ width: 180px;
+ min-height: 100vh;
+ overflow-y: hidden;
+ -webkit-overflow-scrolling: touch;
+ z-index: 0;
+ display: none;
+
+ .language-selector {
+ padding-left: 30px;
+ }
+}
+
+.slideout-panel {
+ position: relative;
+ z-index: 1;
+ background-color: $white;
+ min-height: 100vh;
+}
+
+.slideout-open,
+.slideout-open body,
+.slideout-open .slideout-panel {
+ overflow: hidden;
+}
+
+.slideout-open .slideout-menu {
+ display: block;
+}
diff --git a/assets/sass/_partial/_terms.scss b/assets/sass/_partial/_terms.scss
new file mode 100644
index 0000000..f498ffe
--- /dev/null
+++ b/assets/sass/_partial/_terms.scss
@@ -0,0 +1,46 @@
+// ==============================
+// General Terms(tags, categories, etc.)
+// =============================
+
+.terms {
+ margin: 2em 0 3em;
+ text-align: center;
+ font-family: $global-serif-font-family;
+
+ .terms-title {
+ display: inline-block;
+ font-size: $terms-title-size;
+ color: $theme-color;
+ border-bottom: $terms-title-border-bottom;
+ }
+
+ .terms-tags {
+ margin: 10px 0;
+
+ .terms-link {
+ display: inline-block;
+ position: relative;
+ margin: $terms-link-margin;
+ word-wrap: break-word;
+ transition-duration: 0.2s;
+ transition-property: transform;
+ transition-timing-function: ease-out;
+
+ .terms-count {
+ display: inline-block;
+ position: relative;
+ top: -8px;
+ right: -2px;
+ color: $theme-color;
+ font-size: $terms-count-font-size;
+ }
+
+ &:active,
+ &:focus,
+ &:hover {
+ color: $theme-color;
+ transform: scale(1.1);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/assets/sass/_variables.scss b/assets/sass/_variables.scss
new file mode 100644
index 0000000..ae97a8f
--- /dev/null
+++ b/assets/sass/_variables.scss
@@ -0,0 +1,329 @@
+// ==============================
+// Variables
+// ==============================
+
+// ========== Theme Color ========== //
+// Config here to change theme color
+// Default | Mint Green | Cobalt Blue | Hot Pink | Dark Violet
+$theme-color-config: 'Default';
+
+// Default theme color map
+$theme-color-map: (
+ 'Default': #c05b4d #f8f5ec,
+ 'Mint Green': #16982B #f5f5f5,
+ 'Cobalt Blue': #0047AB #f0f2f5,
+ 'Hot Pink': #FF69B4 #f8f5f5,
+ 'Dark Violet': #9932CC #f5f4fa
+);
+
+// Check theme color config.
+// if it does not exist, use default theme color.
+@if not(map-has-key($theme-color-map, $theme-color-config)) {
+ $theme-color-config: 'Default';
+}
+$theme-color-list: map-get($theme-color-map, $theme-color-config);
+
+// Default theme color of the site.
+$theme-color: nth($theme-color-list, 1) !default;
+
+// Deputy theme color of the site.
+$deputy-color: nth($theme-color-list, 2) !default;
+
+
+// ========== Color ========== //
+$black: #0a0a0a !default;
+$white: #fefefe !default;
+$light-gray: #e6e6e6 !default;
+$gray: #cacaca !default;
+$dark-gray: #8a8a8a !default;
+
+
+// ========== Global ========== //
+// Text color of the body.
+$global-font-color: #34495e !default;
+
+// Font size attribute applied to '<html>' and '<body>'.
+$global-font-size: 16px !default;
+
+// Global width of '<body>'.
+$global-body-width: 800px !default;
+
+// Padding of container main
+$global-container-padding: 0 20px !default;
+
+// Default line height for all type. `$global-lineheight` is 24px while `$global-font-size` is 16px.
+$global-lineheight: 1.5 !default;
+
+// Font family of the site.
+$global-font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif !default;
+
+// Serif font family of the site.
+$global-serif-font-family: Athelas, STHeiti, Microsoft Yahei, serif !default;
+
+// Background color of the site.
+$global-background: $white !default;
+
+// Headings font size of the site.
+$global-headings: (
+ h1: 26px,
+ h2: 24px,
+ h3: 20px,
+ h4: 16px,
+ h5: 14px,
+ h6: 14px
+) !default;
+
+
+// ========== Header ========== //
+// Padding of the site header.
+$header-padding: 20px 20px !default;
+
+// Font family: Chancery
+@font-face {
+ font-family: 'Chancery';
+ src: url('../fonts/chancery/apple-chancery-webfont.eot');
+ src: local('Apple Chancery'), url('../fonts/chancery/apple-chancery-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/chancery/apple-chancery-webfont.woff2') format('woff2'),
+ url('../fonts/chancery/apple-chancery-webfont.woff') format('woff'),
+ url('../fonts/chancery/apple-chancery-webfont.ttf') format('truetype'),
+ url('../fonts/chancery/apple-chancery-webfont.svg#apple-chancery') format('svg');
+ font-weight: lighter;
+ font-style: normal;
+ font-display: swap;
+}
+
+// Font size of the logo.
+$logo-font-size: 48px !default;
+
+// Font family of the logo.
+$logo-font-family: 'Chancery', cursive, LiSu, sans-serif !default;
+
+// Margin of menu item.
+$menu-item-margin-left: 10px !default;
+
+// Margin of menu item in mobile.
+$menu-item-mobile-margin: 5px !default;
+
+// Font size of menu item link.
+$menu-link-font-size: 18px !default;
+
+// Height of the mobile header.
+$mobile-navbar-height: 50px !default;
+
+// ========== Post ========== //
+// Margin bottom of post list.
+$post-list-margin-bottom: 20px !default;
+
+// Padding of the post.
+$post-padding: 1.5em 0 !default;
+
+// Border top of the post + post.
+$post-border: 1px solid $light-gray !default;
+
+// Font size of post title.
+$post-title-font-size: 27px !default;
+
+// Font weight of post title.
+$post-title-font-weight: 400 !default;
+
+// Margin top of the post meta (post time).
+$post-meta-margin-top: 5px !default;
+
+// Font color of the post meta.
+$post-meta-font-color: $dark-gray !default;
+
+// Border bottom of the read more link when hover it.
+$post-readMore-border-bottom: 1px solid $theme-color !default;
+
+// Margin top of the post footer.
+$post-footer-margin-top: 20px !default;
+
+// Border top of post footer.
+$post-footer-border-top: 1px solid $light-gray !default;
+
+// Padding of the post tags.
+$post-tags-padding: 15px 0 !default;
+
+// Font size of post pagination.
+$post-nav-font-size: 18px !default;
+
+
+// ========== TOC ========== //
+// Width of the post toc.
+$post-toc-width: 200px !default;
+
+// Backgroud color of the post toc.
+$post-toc-backgroud: rgba($deputy-color, 0.6) !default;
+
+// Margin left of the post toc.
+$post-toc-margin-left: $global-body-width - 15px !default;
+
+// Font size of the post toc title.
+$post-toc-title-size: 20px !default;
+
+// Font size of the post toc content.
+$post-toc-content: 15px !default;
+
+// List style of the post toc list.
+$post-toc-list-style: square !default;
+
+// Max screen media of the post toc.
+$toc-max-sreen-width: 2 * $post-toc-width + $post-toc-margin-left !default;
+
+// ========== Content ========== //
+// Headings anchor.
+$content-headings-anchor: "" !default;
+
+// Border bottom of the link when hover it.
+$content-link-border: 1px solid $theme-color !default;
+
+// Background color of the blockquote.
+$content-blockquote-backgroud: rgba($theme-color, 0.05) !default;
+
+// Border left of the blockquote.
+$content-blockquote-border-left: 3px solid rgba($theme-color, 0.3) !default;
+
+// Border color of the table.
+$content-table-border-color: darken($deputy-color, 3%) !default;
+
+// ========== Code ========== //
+// Color of the code.
+$code-color: #c7254e !default;
+
+// Font size of code.
+$code-font-size: 0.9em !default;
+
+// Font family of the code.
+$code-font-family: Consolas, Monaco, Menlo, "DejaVu Sans Mono",
+ "Bitstream Vera Sans Mono", "Courier New", monospace !default;
+
+// Color of code highlight, solarized.
+$code-highlight-color: (
+ comment: #93a1a1,
+ keyword: #859900,
+ number: #2aa198,
+ title: #268bd2,
+ attribute: #b58900,
+ symbol: #cb4b16,
+ built_in: #dc322f,
+ formula: #eee8d5
+) !default;
+
+// Code type list.
+$code-type-list: (
+ // Custom code type
+ language-bash: "Bash",
+ language-c: "C",
+ language-cs: "C#",
+ language-cpp: "C++",
+ language-css: "CSS",
+ language-coffeescript: "CoffeeScript",
+ language-html: "HTML",
+ language-xml: "XML",
+ language-http: "HTTP",
+ language-json: "JSON",
+ language-java: "Java",
+ language-js: "JavaScript",
+ language-javascript: "JavaScript",
+ language-makefile: "Makefile",
+ language-markdown: "Markdown",
+ language-objectivec: "Objective-C",
+ language-php: "PHP",
+ language-perl: "Perl",
+ language-python: "Python",
+ language-ruby: "Ruby",
+ language-sql: "SQL",
+ language-shell: "Shell",
+
+ language-erlang: "Erlang",
+ language-go: "Go",
+ language-go-html-template: "Go HTML Template",
+ language-groovy: "Groovy",
+ language-haskell: "Haskell",
+ language-kotlin: "Kotlin",
+ language-clojure: "Clojure",
+ language-less: "Less",
+ language-lisp: "Lisp",
+ language-lua: "Lua",
+ language-matlab: "Matlab",
+ language-rust: "Rust",
+ language-scss: "Scss",
+ language-scala: "Scala",
+ language-swift: "Swift",
+ language-typescript: "TypeScript",
+ language-yml: "YAML",
+ language-yaml: "YAML",
+ language-toml: "TOML",
+ language-diff: "Diff"
+) !default;
+
+// Color of the code background.
+$code-background: $deputy-color !default;
+
+
+// ========== Pagination ========== //
+// Margin of the pagination.
+$pagination-margin: 2em 0 !default;
+
+// Font size of the pagination (Without post, post pagination see line 140).
+$pagination-font-size: 20px !default;
+
+
+// ========== Footer ========== //
+// Margin top of the footer.
+$footer-margin-top: 2em !default;
+
+// Margin left of the social link.
+$social-link-margin-left: 10px !default;
+
+// Font size of the social icon.
+$social-icon-font-size: 30px !default;
+
+// Margin of the copyright.
+$copyright-margin: 10px 0 !default;
+
+
+// ========== Archive ========== //
+// Margin of the archive.
+$archive-margin: 2em 0px !default;
+
+// Max width of the archive.
+$archive-max-width: 550px !default;
+
+// Font size of the archive name.
+$archive-name-font-size: 30px !default;
+
+// Font size of the collection title.
+$collection-title-font-size: 28px !default;
+
+// Padding of the archive post.
+$archive-post-padding: 3px 20px !default;
+
+// Padding of the archive post in mobile.
+$archive-post-mobile-padding: 5px 10px !default;
+
+// Font size of the archive post time in mobile.
+$archive-post-mobile-time-font-size: 13px !default;
+
+// Border left of the archive post, use $archive-post-hover-border-left when hover it.
+$archive-post-border-left: 1px solid $gray !default;
+$archive-post-hover-border-left: 3px solid $theme-color !default;
+
+// Transition of the archive post when hover it.
+$archive-post-hover-transition: 0.2s ease-out !default;
+
+// Transform of the archive post when hover it.
+$archive-post-hover-transform: translateX(4px) !default;
+
+// ========== General Terms ========== //
+// Font size of the terms title.
+$terms-title-size: 18px !default;
+
+// Border bottom of the terms title.
+$terms-title-border-bottom: 2px solid $theme-color !default;
+
+// Margin of the terms link.
+$terms-link-margin: 5px 10px !default;
+
+// Font size of the terms count
+$terms-count-font-size: 12px !default;
diff --git a/assets/sass/main.scss b/assets/sass/main.scss
new file mode 100644
index 0000000..2b843f7
--- /dev/null
+++ b/assets/sass/main.scss
@@ -0,0 +1,19 @@
+@import "_custom/custom";
+@import "_variables";
+
+@import "_common/utils";
+@import "_common/animation";
+
+@import "_base";
+@import "_iconfont";
+@import "_partial/header";
+@import "_partial/post";
+@import "_partial/pagination";
+@import "_partial/footer";
+@import "_partial/archive";
+@import "_partial/terms";
+@import "_partial/slideout";
+@import "_partial/mobile";
+@import "_partial/back-to-top";
+@import "_partial/404";
+@import "_partial/language-selector";