redesign 2023

This commit is contained in:
m3tam3re
2023-10-12 14:01:05 +02:00
commit 19bfc7311a
3053 changed files with 76380 additions and 0 deletions

View File

@ -0,0 +1,168 @@
// ==============================
// Variables
// ==============================
// ========== Global ========== //
// Prefix for :root CSS variables.
$prefix: fi- !default;
// Font and Line Height
$global-font-family: system-ui, -apple-system, BlinkMacSystemFont, PingFang SC, Microsoft YaHei UI, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif !default;
$global-font-size: 16px !default;
$global-font-weight: 400 !default;
$global-line-height: 1.5rem !default;
// scroll-margin-top of content anchor
$global-scroll-margin-top: 0.5rem;
// Radius of the border
$global-border-radius: 5px !default;
// Color of the background
$global-background-color: #ffffff !default;
$global-background-color-dark: #292a2d !default;
// Color of the text
$global-font-color: #161209 !default;
$global-font-color-dark: #a9a9b3 !default;
// Color of the secondary text
$global-font-secondary-color: #b1b1ba !default;
$global-font-secondary-color-dark: #909092 !default;
// Color of the link
$global-link-color: #ba0066 !default;
$global-link-color-dark: #EC008C !default;
// Color of the hover link
$global-link-hover-color: #EC008C !default; // 潮蓝
$global-link-hover-color-dark: #ba0066 !default;
// Color of m3tam3re-border-color: #ba0066 !default;
$global-border-color-dark: #EC008C !lets-encrypt;
// ========== Global =====m3tam3re===== Scrollbar ========== //
// Color of the scrollbar
$scrollbar-color: #ba0066 !default;
// Color of the hover scrollbar
$scrollbar-hover-color: #EC008C !default;
// ========== Scrollbar ========== //
// ========== Selection ========== //
// Color of the selected text
$selection-color: rgba(72.9, 0, 40, 0.4) !default;
$selection-color-dark: rgba(72.9, 0, 40, 0.4) !default;
// ========== Selection ========== //
// ========== Header ========== //
// Height of the header
$header-height: 3.5rem !default;
// Color of the header background
$header-background-color: #f8f8f8 !default;
$header-background-color-dark: #252627 !default;
// Font style of the header title
$header-title-font-family: $global-font-family !default;
$header-title-font-size: 1.5rem !default;
// Color of the active menu item
$menu-active-color: #EC008C !default;
$menu-active-color-dark: #ba0066 !default;
// Color of the search background
$search-background-color: #e9e9e9 !default;
$search-background-color-dark: #363636 !default;
// ========== Header ========== //
// ========== Tag Cloud ========== //
// Color range of tag cloud
$tag-cloud-start: $global-font-secondary-color!default;
$tag-cloud-end: $global-font-color!default;
$tag-cloud-start-dark: $global-font-secondary-color-dark!default;
$tag-cloud-end-dark: $global-font-color-dark!default;
// ========== Tag Cloud ========== //
// ========== Single Content ========== //
// Font size of the TOC
$toc-title-font-size: 1.2rem !default;
$toc-content-font-size: 1rem !default;
// Color of the single link
$single-link-color: #ba0066 !default; // 花青
$single-link-color-dark: #EC008C !default; // 釉蓝
// Color of the hover single link
$single-link-hover-color: #EC008C !default; // 莲瓣红
$single-link-hover-color-dark: #ba0066 !default; // 羽扇豆蓝
// Color of the table background
$table-background-color: #f6f8fa !default;
$table-background-color-dark: #2d333b !default;
// Color of the table thead
$table-thead-color: #EC008C !default;
$table-thead-color-dark: #ba0066 !default;
// Color of the blockquote
$blockquote-color: #697681 !default;
$blockquote-color-dark: #9ba3aa !default;
// Color of reward
$reward-color: tomato !default;
$reward-color-dark: darken($reward-color, 5%) !default;
// Width of reward image
$reward-img-width: 180px !default;
// ========== Single Content ========== //
// ========== Pagination ========== //
// Color of the link in pagination
$pagination-link-color: #bfbfbf !default;
$pagination-link-color-dark: #b1b1ba !default;
// Color of the hover link in pagination
$pagination-link-hover-color: #ba0066 !default;
$pagination-link-hover-color-dark: #EC008C !default;
// ========== Pagination ========== //
// ========== Code ========== //
// Color of the code
$code-color: #24292f !default;
$code-color-dark: #adbac7 !default;
// Color of the code background
$code-background-color: #f6f8fa !default;
$code-background-color-dark: #2d333b !default;
$code-error-color: #dc3545 !default;
// Color of the hightlight code
$code-hightlight-color: #fff8c5 !default;
$code-hightlight-color-dark: rgba(174, 124, 20, 0.15) !default;
$code-info-color: #EC008C !default;
$code-info-color-dark: #ba0066 !default;
// Font size of the code
$code-font-size: 0.875rem !default;
// Font family of the code
$code-font-family: Source Code Pro, Menlo, Consolas, Monaco, monospace, $global-font-family !default;
// ========== Code ========== //
// ========== GitHub Corners ========== //
// Color of the GitHub Corners
$github-corner-color: white !default;
$github-corner-color-dark: black !default;
// Color of the GitHub Corners background
$github-corner-fill: $header-background-color-dark !default;
$github-corner-fill-dark: $header-background-color !default;
// ========== GitHub Corners ========== //
@import '_partials/_maps/admonition';
@import '_partials/_maps/code-highlight';
@import '_partials/_maps/code-type';
@import '_partials/_maps/colors';
@import '_partials/_maps/utilities';

View File

@ -0,0 +1,96 @@
@import "../../lib/normalize/normalize";
html {
font-family: $global-font-family;
font-weight: $global-font-weight;
font-display: swap;
font-size: $global-font-size;
line-height: $global-line-height;
width: 100%;
scroll-behavior: smooth;
overflow: overlay;
}
@media screen and (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
/* scrollbar, only support webkit */
::-webkit-scrollbar {
width: 0.5rem;
height: 0.5rem;
}
::-webkit-scrollbar-thumb {
background-color: $scrollbar-color;
@include border-radius($global-border-radius);
&:hover {
background-color: $scrollbar-hover-color;
}
}
::selection {
background-color: $selection-color;
[data-theme='dark'] & {
background-color: $selection-color-dark;
}
}
body {
background-color: $global-background-color;
color: $global-font-color;
scrollbar-color: auto;
@include overflow-wrap(break-word);
&::-webkit-scrollbar {
width: 0.75rem;
height: 0.75rem;
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background-color: transparent;
background-clip: content-box;
border: 2px solid transparent;
@include border-radius(0.5rem);
}
&[data-scroll]::-webkit-scrollbar-thumb {
background-color: $scrollbar-color;
}
&[data-theme='dark'] {
color: $global-font-color-dark;
background-color: $global-background-color-dark;
}
}
iframe {
border: 0;
@include border-radius($global-border-radius);
}
[role='button'] {
cursor: pointer;
}
summary {
cursor: pointer;
}
abbr[title] {
cursor: help;
text-decoration-skip-ink: none;
}
@include link(true, true);
@import '../_partials/mask';
@import '../_partials/img';
@import '../_partials/icon';
@import '../_partials/details';
@import '../_partials/widgets';

View File

@ -0,0 +1,46 @@
.breadcrumb-container {
padding-inline: 1rem;
font-size: 0.75rem;
@include z-index(1);
@extend .print-d-none;
&.sticky {
position: sticky;
top: $header-height;
}
.breadcrumb {
display: flex;
flex-wrap: wrap;
padding: 0.5rem 0;
margin: 0 auto;
list-style: none;
border-bottom: 1px inset $global-border-color;
background-color: $global-background-color;
@extend %page-style;
[data-theme='dark'] & {
border-bottom-color: $global-border-color-dark;
background-color: $global-background-color-dark;
}
.breadcrumb-item {
display: flex;
+.breadcrumb-item::before {
content: "/";
display: inline-block;
padding-inline: 0.5rem;
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
&.active {
@extend .text-secondary;
}
}
}
}

View File

@ -0,0 +1,66 @@
// ==============================
// Common Styles
// 常用样式
// ==============================
.text-truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.text-start {
text-align: left !important;
}
.text-end {
text-align: right !important;
}
.text-center {
text-align: center !important;
}
.d-none {
display: none !important;
}
.d-none-desktop {
display: none;
}
.d-none-mobile {
display: block;
}
.ms-1,
.mx-1 {
margin-left: 0.25rem !important;
}
.me-1,
.mx-1 {
margin-right: 0.25rem !important;
}
.ps-1,
.px-1 {
padding-left: 0.25rem !important;
}
.pe-1,
.px-1 {
padding-right: 0.25rem !important;
}
@each $color, $value in $theme-colors {
.text-#{$color} {
color: #{$value} !important;
[data-theme='dark'] & {
color: #{darken($value, 5%)} !important;
}
}
}
@each $key, $value in $orders {
.order-#{$key} {
order: #{$value} !important;
}
}
.variant-numeric {
font-variant-numeric: tabular-nums lining-nums;
}

View File

@ -0,0 +1,63 @@
footer {
height: auto;
width: 100%;
text-align: center;
line-height: 1.25rem;
padding: 1rem 0;
@extend .print-d-none;
.footer-container {
display: flex;
flex-direction: column;
font-size: 0.875rem;
.footer-line {
width: 100%;
.footer-divider:not(:first-child)::before {
content: '|';
margin-left: 0.25rem;
margin-right: 0.25rem;
}
.fixit-icon {
top: 0.25em;
}
.animate-icon {
color: #dc143c;
animation: icon-animate 1.33s ease-in-out infinite;
}
.run-times {
font-variant-numeric: tabular-nums lining-nums;
}
}
}
@include blur;
}
@keyframes icon-animate {
0%,
100% {
@include transform(scale(1));
}
10%,
30% {
@include transform(scale(0.9));
}
20%,
40%,
60%,
80% {
@include transform(scale(1.1));
}
50%,
70% {
@include transform(scale(1.1));
}
}

View File

@ -0,0 +1,645 @@
header {
width: 100%;
background-color: $header-background-color;
@include z-index(2);
@include transition(box-shadow 0.3s ease);
@extend .print-d-none;
[data-theme='dark'] & {
background-color: $header-background-color-dark;
}
&:hover {
@include box-shadow(0 0 1.5rem 0 rgba(0, 0, 0, 0.1));
[data-theme='dark'] & {
@include box-shadow(0 0 1.5rem 0 rgba(255, 255, 255, 0.1));
}
}
}
.header-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
width: 100%;
}
.header-title {
font-family: $header-title-font-family;
font-weight: bold;
margin-right: 0.5rem;
min-width: 10%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
@include flex(10);
.logo {
min-height: 1.5em;
height: 1.5em;
vertical-align: middle;
width: auto;
}
.header-title-text {
margin-left: 0.25rem;
margin-right: 0.25rem;
}
.header-subtitle {
margin-left: 0.25rem;
font-size: 0.6em;
}
}
.menu {
margin: 0;
padding: 0;
.menu-item {
list-style: none;
& .dropdown-icon {
margin-left: 0.25rem;
font-size: .875em;
color: $global-font-color;
[data-theme='dark'] & {
color: $global-font-color-dark;
}
&.open::before {
content: "\f078";
}
}
&.active {
>.menu-link,
>.nested-item>.menu-link {
font-weight: bold;
color: $menu-active-color;
[data-theme='dark'] & {
color: $menu-active-color-dark;
}
}
}
&.language-switch,
&.theme-switch {
cursor: pointer;
}
}
}
.search {
position: relative;
input {
color: transparent;
box-sizing: border-box;
height: 2.5rem;
width: 1.25rem;
@include border-radius(0.5rem);
border: none;
outline: none;
background-color: transparent;
vertical-align: baseline !important;
@include transition(width 0.3s ease);
}
@include placeholder(transparent);
.search-button {
margin: 0;
position: absolute;
left: auto;
right: 1rem;
}
.search-toggle {
left: 0.5rem;
right: auto;
#header-desktop.open & {
left: 1rem;
}
}
.search-loading {
display: none;
}
.search-clear {
display: none;
}
.open &,
&.mobile {
input {
color: $global-font-color;
background-color: $search-background-color;
padding: 0 2rem 0 2rem;
}
[data-theme='dark'] & {
input {
color: darken($global-font-color-dark, 10%);
background-color: darken($code-background-color-dark, 5%);
}
@include placeholder($global-font-secondary-color-dark);
}
@include placeholder($global-font-secondary-color);
.search-button {
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
.search-clear:hover {
color: #ff6b6b;
}
.search-toggle:hover {
cursor: default;
}
}
}
.theme-switch {
i {
@include transform(rotate(225deg));
@include transition(transform 0.4s ease);
}
&:hover i {
@include transform(rotate(45deg));
}
}
#header-desktop {
display: block;
position: sticky;
top: 0;
height: $header-height;
line-height: $header-height;
box-sizing: border-box;
[data-header-desktop='normal'] & {
position: static;
}
nav {
overflow: hidden;
white-space: nowrap;
}
.header-wrapper {
// use css native function to calculate max value
padding: 0 2rem 0 MAX(10vh, $header-height);
height: 100%;
&[data-github-corner='right'] {
padding-right: $header-height;
}
.header-title {
font-size: $header-title-font-size;
height: 100%;
}
.menu {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
float: right;
>.menu-item {
&:hover .sub-menu {
display: block;
@include transform(translateX(-0.5rem));
}
&.language-switch:hover .sub-menu {
@include transform(translateX(calc(1.75rem - 100%)));
}
}
.menu-item {
padding: 0 0.5rem;
&.delimiter {
width: 0;
margin: 0.125rem 0.25rem;
padding: 0;
border-left: 1px dashed lighten($global-font-secondary-color, 15%);
[data-theme='dark'] & {
border-left-color: darken($global-font-secondary-color-dark, 15%);
}
}
}
.sub-menu {
position: absolute;
margin: 0;
padding: 0.25rem 0;
display: none;
top: calc(#{$header-height} - 0.75rem);
border-radius: $global-border-radius;
border: 1px solid $global-border-color;
background-color: $header-background-color;
@include transition(box-shadow 0.3s ease);
@include box-shadow(0 0 1.5rem 0 rgba(0, 0, 0, 0.1));
[data-theme='dark'] & {
background-color: $header-background-color-dark;
border-color: $global-border-color-dark;
@include box-shadow(0 0 1.5rem 0 rgba(255, 255, 255, 0.1));
}
.menu-item {
height: $header-height*0.5;
line-height: $header-height*0.5;
max-width: 15rem;
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
}
}
}
}
&.open .header-wrapper .menu .menu-item.search {
input {
width: 24rem;
}
}
}
#header-mobile {
display: none;
position: sticky;
top: 0;
min-height: $header-height;
line-height: $header-height;
[data-header-mobile='normal'] & {
position: static;
}
.header-container {
padding: 0;
margin: 0;
.header-wrapper {
padding: 0 1rem;
font-size: 1.125rem;
@include transition(margin-top 0.3s ease);
.header-title {
font-size: $header-title-font-size;
max-width: 80%;
}
.menu-toggle {
line-height: 4rem;
cursor: pointer;
@include transition(width 0.3s ease);
span {
display: block;
background: $global-font-color;
width: 1.5rem;
height: 2px;
@include border-radius(3px);
@include transition(all 0.3s ease-in-out);
[data-theme='dark'] & {
background: $global-font-color-dark;
}
}
span:nth-child(1) {
margin-bottom: 0.5rem;
}
span:nth-child(3) {
margin-top: 0.5rem;
}
&.active {
span:nth-child(1) {
@include transform(rotate(45deg) translate(0.4rem, 0.5rem));
}
span:nth-child(2) {
opacity: 0;
}
span:nth-child(3) {
@include transform(rotate(-45deg) translate(0.4rem, -0.5rem));
}
}
}
}
.menu {
background: $header-background-color;
border-top: 2px solid $global-border-color;
display: none;
overflow-y: overlay;
max-height: 70vh;
@include box-shadow(0 0.125rem 0.25rem rgba(0, 0, 0, 0.1));
[data-theme='dark'] & {
@include box-shadow(0 0.125rem 0.25rem rgba(255, 255, 255, 0.1));
}
&::-webkit-scrollbar {
width: 0;
}
.search-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
padding: ($header-height - 2.5rem) / 2 1rem;
line-height: 2.5rem;
position: sticky;
top: 0;
background-color: $header-background-color;
@include z-index(0, 50);
[data-theme='dark'] & {
background-color: $header-background-color-dark;
}
}
.search {
flex-grow: 10;
.algolia-autocomplete,
input {
width: 100%;
}
}
.search-loading,
.search-clear {
right: 0.5rem;
}
.search-button {
top: 0;
}
.search-cancel {
display: none;
margin-left: 0.75rem;
}
.menu-item {
display: block;
position: relative;
line-height: 2.5rem;
padding: 0 1rem;
&:not(.menu-system):hover {
background-color: lighten($code-background-color, 24%);
[data-theme='dark'] & {
background-color: lighten($code-background-color-dark, 5%);
}
}
.menu-link {
display: block;
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
@include flex(4);
}
& .nested-item {
display: flex;
justify-content: space-between;
align-items: center;
.menu-link {
max-width: 80%;
}
}
}
.menu-system {
display: flex;
justify-content: center;
gap: 0.25rem;
position: sticky;
bottom: 0;
line-height: 2.5rem;
padding: 0 1rem;
background-color: $header-background-color;
[data-theme='dark'] & {
background-color: $header-background-color-dark;
}
.menu-system-item {
padding-inline: 0.5rem;
}
.language-switch {
position: relative;
.language-select {
position: absolute;
opacity: 0;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
}
}
.sub-menu {
padding-left: 0;
display: none;
&.open {
display: block;
}
.menu-item:hover {
background-color: lighten($global-font-secondary-color, 20%);
[data-theme='dark'] & {
background-color: darken($global-font-secondary-color-dark, 20%);
}
}
}
&.active {
display: block;
}
[data-theme='dark'] & {
background: $header-background-color-dark;
border-top-color: $global-border-color-dark;
}
}
}
&.open {
.header-wrapper {
margin-top: -$header-height;
}
.menu {
padding-top: 0;
border-top: none;
.menu-item {
display: none;
}
.search-cancel {
display: inline;
}
}
}
}
.search-dropdown {
position: fixed;
top: $header-height;
@include z-index(2);
@include box-shadow(0 0.125rem 0.25rem rgba(0, 0, 0, 0.1));
[data-theme='dark'] & {
@include box-shadow(0 0.125rem 0.25rem rgba(255, 255, 255, 0.1));
}
&.desktop {
right: 2rem;
width: 30rem;
}
&.mobile {
right: 0;
width: 100%;
}
.dropdown-menu {
right: 0 !important;
background-color: $global-background-color;
[data-theme='dark'] & {
background-color: $global-background-color-dark;
}
.suggestions {
overflow-y: auto;
max-height: calc(100vh - #{$header-height});
.suggestion {
padding: 0.75rem 1rem;
.suggestion-title {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 1rem;
font-weight: bold;
max-width: 75%;
}
.suggestion-date {
font-size: 0.875rem;
float: right;
text-align: right;
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
.suggestion-context {
line-height: 1.25rem;
@include box(vertical);
-webkit-line-clamp: 2;
overflow: hidden;
text-overflow: ellipsis;
@include overflow-wrap(break-word);
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
em {
font-style: normal;
background-color: $selection-color;
[data-theme='dark'] & {
background-color: $selection-color-dark;
}
}
&.cursor {
background: darken($code-background-color, 5%);
[data-theme='dark'] & {
background: lighten($code-background-color-dark, 5%);
}
}
&:hover {
cursor: pointer;
}
}
}
.search-empty {
padding: 1rem;
text-align: center;
.search-query {
font-weight: bold;
[data-theme='dark'] & {
color: #ddd;
}
}
}
.search-footer {
padding: 0.5rem 1rem;
float: right;
font-size: 0.8rem;
color: $global-font-secondary-color;
[data-theme='dark'] {
color: $global-font-secondary-color-dark;
}
@include link(false, false);
a {
font-size: 1rem;
}
}
}
}

View File

@ -0,0 +1,41 @@
/** Layout **/
.wrapper {
display: flex;
flex-direction: column;
min-height: 100vh;
width: 100%;
main {
flex: 1 0 auto;
aside {
flex: 1;
padding-inline: 0.5rem;
&:first-child {
order: 2;
}
}
&.container {
display: flex;
align-items: flex-start;
justify-content: center;
padding: 0 1rem;
&.container-reverse {
flex-direction: row-reverse;
}
&:has(.home:not(.posts)) {
align-items: center;
}
}
}
}
@import "_core/header";
@import "_core/breadcrumb";
@import "_core/footer";
@import "_core/pagination";

View File

@ -0,0 +1,160 @@
@media only screen and (min-width: 1441px) {
%page-style {
width: 60%;
[data-page-style='wide'] & {
width: 64%;
}
[data-page-style='narrow'] & {
max-width: 800px;
}
}
}
@media only screen and (max-width: 1440px) {
%page-style {
width: 56%;
[data-page-style='wide'] & {
width: 60%;
}
}
}
@media only screen and (max-width: 1200px) {
%page-style {
width: 52%;
[data-page-style='wide'] & {
width: 56%;
}
}
#header-desktop .header-wrapper {
padding-right: 1rem;
}
.search-dropdown.desktop {
right: 1rem;
}
}
@media only screen and (max-width: 960px) {
%page-style {
width: 80% !important;
}
aside {
display: none !important;
}
#toc-static {
display: block;
}
#header-desktop .header-wrapper {
padding-left: 1rem;
}
}
@media only screen and (min-width: 681px) {
.breadcrumb-container.sticky {
body:not([data-header-desktop='sticky']) & {
top: 0;
}
// adjust the scroll margin top of the content anchors on the page
body:not([data-header-desktop='auto']) &+.container .content [id] {
scroll-margin-top: calc(var(--#{$prefix}scroll-mt) + var(--#{$prefix}breadcrumb-offset));
}
}
[data-header-desktop='normal'] .page .content [id] {
--#{$prefix}scroll-mt: #{$global-scroll-margin-top};
}
}
@media only screen and (max-width: 680px) {
#header-desktop {
display: none;
}
#header-mobile,
.d-none-desktop {
display: block;
}
.d-none-mobile {
display: none !important;
}
.breadcrumb-container.sticky {
body:not([data-header-mobile='sticky']) & {
top: 0;
}
// adjust the scroll margin top of the content anchors on the page
body:not([data-header-mobile='auto']) &+.container .content [id] {
scroll-margin-top: calc(var(--#{$prefix}scroll-mt) + var(--#{$prefix}breadcrumb-offset));
}
}
[data-header-mobile='normal'] .page .content [id] {
--#{$prefix}scroll-mt: #{$global-scroll-margin-top};
}
%page-style {
width: 100% !important;
}
.page {
.categories-card {
.card-item {
width: 100%;
}
}
}
footer {
.footer-container {
font-size: 0.618rem;
}
}
.pagination .page-item {
margin: 0 5px;
}
}
@media only print {
@page {
size: A4 portrait;
margin: 1.27cm;
}
.page {
width: 100% !important;
padding-top: 0 !important;
&.single {
.single-title,
.single-subtitle,
.post-meta {
text-align: center;
}
}
h1:not(.single-title),
.page-break-before {
page-break-before: always;
}
.page-break-after {
page-break-after: always;
}
}
.print-d-none {
display: none !important;
}
}

View File

@ -0,0 +1,90 @@
.pagination {
display: flex;
flex-direction: row;
justify-content: center;
flex-wrap: wrap;
list-style: none;
white-space: nowrap;
width: 100%;
padding: 1rem 0;
a {
font-size: 0.8rem;
color: $pagination-link-color;
letter-spacing: 0.1rem;
font-weight: 700;
padding: 5px 5px;
text-decoration: none;
@include transition(0.3s);
[data-theme='dark'] & {
color: $pagination-link-color-dark;
}
}
li {
padding: 5px;
margin: 0 10px;
box-sizing: border-box;
position: relative;
display: inline;
&.disabled {
display: none;
}
&:hover a {
color: $pagination-link-hover-color;
}
[data-theme='dark'] &:hover a {
color: $pagination-link-hover-color-dark;
}
&::before,
&::after {
position: absolute;
content: '';
width: 0;
height: 3px;
background: $pagination-link-hover-color;
@include transition(0.3s);
bottom: 0px;
}
[data-theme='dark'] &::before,
[data-theme='dark'] &::after {
background: $pagination-link-hover-color-dark;
}
&::before {
left: 50%;
}
&::after {
right: 50%;
}
&:hover {
&::before,
&::after {
width: 50%;
}
}
&.active {
a {
color: $pagination-link-hover-color;
}
[data-theme='dark'] & a {
color: $pagination-link-hover-color-dark;
}
&::before,
&::after {
width: 50%;
}
}
}
}

View File

@ -0,0 +1,20 @@
/* Resolve style conflicts between third-party plugins */
@keyframes #{$prefix}pulse {
from {
@include transform(scale3d(1, 1, 1));
}
50% {
@include transform(scale3d(1.05, 1.05, 1.05));
}
to {
@include transform(scale3d(1, 1, 1));
}
}
.animate__pulse {
-webkit-animation-name: #{$prefix}pulse !important;
animation-name: #{$prefix}pulse !important;
}

View File

@ -0,0 +1,15 @@
:root {
// Note: Custom variable values only support SassScript inside `#{}`.
// Theme colors varibles
@each $color, $value in $theme-colors {
--#{$prefix}#{$color}: #{$value};
}
@each $color, $value in $theme-colors {
--#{$prefix}#{$color}-dark: #{darken($value, 5%)};
}
// Scroll margin top and Stack sticky top related
--#{$prefix}scroll-mt: calc(#{$header-height} + #{$global-scroll-margin-top});
--#{$prefix}breadcrumb-offset: 2.5rem;
}

View File

@ -0,0 +1,75 @@
// ==============================
// Custom style
// 自定义样式
// ==============================
.button {
background-color: $global-link-color;
transition-duration: 0.4s;
border: none;
border-radius: 5px;
color: $global-background-color;
padding: 8px 16px;
text-align: center;
text-decoration: none;
display: inline-block;
font-weight: bold;
margin: 4px 2px;
transition-duration: 0.4s;
}
.button:hover {
background-color: $global-link-color-dark;
}
[data-theme="dark"] .button {
background-color: $global-link-color-dark;
transition-duration: 0.4s;
border: none;
border-radius: 5px;
color: $global-background-color-dark;
padding: 8px 16px;
text-align: center;
text-decoration: none;
display: inline-block;
font-weight: bold;
margin: 4px 2px;
transition-duration: 0.4s;
}
[data-theme="dark"] .button:hover {
background-color: $global-link-color;
}
.field {
background-color: $global-background-color;
transition-duration: 0.4s;
border: 2px solid $global-link-color;
border-radius: 5px;
color: $global-font-color;
padding: 8px 16px;
font-weight: bold;
margin: 4px 2px;
transition-duration: 0.4s;
}
[data-theme="dark"] .field {
background-color: $global-background-color-dark;
transition-duration: 0.4s;
border: 2px solid $global-link-color-dark;
border-radius: 5px;
color: $global-font-color-dark;
padding: 8px 16px;
font-weight: bold;
margin: 4px 2px;
transition-duration: 0.4s;
}
.newsletter {
border-top: 1px dashed $global-link-color;
margin-top: 20px;
}
[theme="dark"] .newsletter {
border-top: 1px dashed $global-link-color-dark;
margin-top: 20px;
}

View File

@ -0,0 +1,4 @@
// ==============================
// Custom style
// 自定义样式
// ==============================

View File

@ -0,0 +1,5 @@
@mixin blur {
.blur & {
@include filter(blur(1.5px));
}
}

View File

@ -0,0 +1,107 @@
@mixin border-radius($value) {
-webkit-border-radius: $value;
-moz-border-radius: $value;
border-radius: $value;
}
@mixin box-shadow($values...) {
-webkit-box-shadow: $values;
box-shadow: $values;
}
@mixin transition($values...) {
-webkit-transition: $values;
-moz-transition: $values;
-o-transition: $values;
transition: $values;
}
@mixin transform($value) {
-webkit-transform: $value;
-ms-transform: $value;
-o-transform: $value;
transform: $value;
}
@mixin filter($value) {
-webkit-filter: $value;
filter: $value;
}
@mixin flex($value) {
-webkit-flex: $value;
flex: $value;
}
@mixin box($orient) {
display: -moz-box;
display: -webkit-box;
display: box;
-webkit-box-orient: $orient;
-moz-box-orient: $orient;
box-orient: $orient;
}
@mixin placeholder($color) {
input::-webkit-input-placeholder {
color: $color;
}
input:-moz-placeholder {
color: $color;
}
input::-moz-placeholder {
color: $color;
}
input:-ms-input-placeholder {
color: $color;
}
input::placeholder {
color: $color;
}
}
@mixin max-content($property) {
#{$property}: -webkit-max-content;
#{$property}: -moz-max-content;
#{$property}: intrinsic;
#{$property}: max-content;
}
@mixin tab-size($value) {
-moz-tab-size: $value;
-o-tab-size: $value;
tab-size: $value;
}
@mixin appearance($value) {
-moz-appearance: $value;
-webkit-appearance: $value;
}
@mixin overflow-wrap($value) {
word-wrap: $value;
overflow-wrap: $value;
}
@mixin line-break($value) {
-webkit-line-break: $value;
-ms-line-break: $value;
line-break: $value;
}
@mixin object-fit($value) {
-o-object-fit: $value;
object-fit: $value;
font-family: 'object-fit: #{$value};';
}
@mixin user-select($value) {
-webkit-user-select: $value !important;
-moz-user-select: $value !important;
user-select: $value !important;
}

View File

@ -0,0 +1,7 @@
@mixin details-transition-open {
@include transition(max-height 0.2s cubic-bezier(0, 1, 0, 1) -0.1s);
}
@mixin details-transition-close {
@include transition(max-height 0.2s cubic-bezier(0.5, 0, 1, 0) 0s);
}

View File

@ -0,0 +1,5 @@
@import '_compatibility';
@import '_link';
@import '_blur';
@import '_details';
@import '_z-index';

View File

@ -0,0 +1,46 @@
@mixin link($light, $dark) {
a,
a::before,
a::after {
text-decoration: none;
@if $light {
color: $global-link-color;
}
@else {
color: $single-link-color;
}
[data-theme='dark'] & {
@if $dark {
color: $global-link-color-dark;
}
@else {
color: $single-link-color-dark;
}
}
}
a:active,
a:hover {
@if $light {
color: $global-link-hover-color;
}
@else {
color: $single-link-hover-color;
}
[data-theme='dark'] & {
@if $dark {
color: $global-link-hover-color-dark;
}
@else {
color: $single-link-hover-color-dark;
}
}
}
}

View File

@ -0,0 +1,3 @@
@mixin z-index($level, $diff: 0) {
z-index: ($level * 100) + $diff;
}

View File

@ -0,0 +1,4 @@
// ==============================
// Override Variables
// 覆盖变量
// ==============================

View File

@ -0,0 +1,6 @@
#content-404 {
font-size: 1.8rem;
line-height: 3rem;
@include transform(translateY(30vh));
text-align: center;
}

View File

@ -0,0 +1,27 @@
.archive {
.single-title {
padding: 1rem 0 0.5rem;
margin: 0;
font-size: 1.6rem;
font-weight: bold;
line-height: 140%;
text-align: right;
}
.single-subtitle {
margin: 0.5rem 0;
font-size: 1.2rem;
font-weight: normal;
line-height: 100%;
text-align: right;
}
.group-title {
font-size: 1.2rem;
margin-top: 1.5rem;
margin-bottom: 1rem;
}
@import '../_partials/_archive/terms';
@import '../_partials/_archive/tags';
}

View File

@ -0,0 +1,63 @@
/**
* @Description: Style of layout named 'friends'.
* @Author: Lruihao <https://lruihao.cn>
* @Updated: 2022/3/11 21:36
*/
.friend-links {
margin-top: 1rem;
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
}
@media (max-width: 576px) {
.friend-links {
justify-content: space-around;
}
}
.friend-link {
width: 150px;
height: 200px;
font-size: 1rem;
text-align: center;
background: rgba(255, 255, 255, 0.3);
box-sizing: border-box;
box-shadow: 3px 3px 5px #aaa;
@include border-radius($global-border-radius);
border: none;
transition-duration: 0.3s;
margin-bottom: 1rem;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.friend-link:hover {
background: #fff;
@include transform(scale(1.03));
box-shadow: 0 0 3px #aaa;
}
.friend-avatar {
object-fit: cover;
object-position: center;
width: 100% !important;
height: 150px !important;
@include border-radius($global-border-radius);
margin: 0;
padding: 0;
}
.friend-nickname {
display: block;
position: relative;
color: #2bbc8a;
font-weight: bold;
max-width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
line-height: 18px;
margin-bottom: 1rem;
}
.friend-nickname:hover {
color: #d480aa;
}

View File

@ -0,0 +1,189 @@
.home {
.home-profile {
text-align: center;
.home-avatar {
padding: 0.5rem;
img {
display: inline-block;
width: 8rem;
height: auto;
margin: 0 auto;
@include border-radius(100%);
@include box-shadow(0 0 0 0.3618em rgba(0, 0, 0, 0.05));
@include transition(all 0.4s ease);
[data-theme='dark'] & {
@include box-shadow(0 0 0 0.3618em rgba(255, 255, 255, 0.05));
}
&:hover {
position: relative;
@include transform(translateY(-0.75rem));
}
}
}
.home-title {
font-size: 1.25rem;
font-weight: bold;
margin: 0;
padding: 0.5rem;
}
.home-subtitle {
font-size: 1rem;
font-weight: normal;
margin: 0;
padding: 0.5rem;
}
.links {
padding: 0.5rem;
font-size: 1.5rem;
a * {
vertical-align: text-bottom;
}
img {
height: 1.5rem;
padding: 0 0.25rem;
}
}
.home-disclaimer {
font-size: 1rem;
line-height: 1.5rem;
font-weight: normal;
margin: 0;
padding: 0.5rem;
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
}
}
.home.posts {
.home-profile {
padding: 2rem 0;
}
.home-avatar img {
width: 6rem;
}
.summary {
padding-top: 1rem;
padding-bottom: 0.8rem;
color: $global-font-color;
border-bottom: 1px dashed $global-border-color;
&:first-of-type {
padding-top: 0;
}
[data-theme='dark'] & {
color: $global-font-color-dark;
border-bottom: 1px dashed $global-border-color-dark;
}
.featured-image-preview {
width: 100%;
padding: 30% 0 0;
position: relative;
margin: 0.6rem auto;
@include transition(transform 0.4s ease);
img {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
@include object-fit(cover);
}
&:hover {
@include transform(scale(1.01));
}
}
.single-title {
font-size: 1.25rem;
line-height: 140%;
margin: 0.4rem 0;
}
.content {
@include box(vertical);
-webkit-line-clamp: 3;
margin-top: 0.3rem;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
@include overflow-wrap(break-word);
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
h2,
h3,
h4,
h5,
h6,
p {
font-size: 1rem;
line-height: 1.5;
display: inline;
&::after {
content: '\A';
white-space: pre;
}
}
h2 {
font-size: 1.125rem;
}
@include link(false, true);
b,
strong {
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
}
.post-footer {
margin-top: 0.4rem;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 0.875rem;
@include link(false, false);
.post-tags {
padding: 0;
@include link(true, true);
.post-tag:not(:last-child)::after {
content: ',';
margin-right: 0.25rem;
}
}
}
}
}

View File

@ -0,0 +1,20 @@
.page {
position: relative;
@extend %page-style;
.content {
[id] {
scroll-margin-top: var(--#{$prefix}scroll-mt);
}
}
@include blur;
}
@import '_single';
@import '_special';
@import '_archive';
@import '_home';
@import '_404';
@import '_offline';
@import '_friends';

View File

@ -0,0 +1,19 @@
#content-offline {
@include transform(translateY(30vh));
text-align: center;
.offline-title {
font-size: 3.6rem;
}
.offline-subtitle {
margin: 0.4rem 0;
font-size: 1rem;
font-weight: normal;
font-style: italic;
line-height: 100%;
color: #57606a;
}
.error-text {
font-size: 1.2rem;
}
}

View File

@ -0,0 +1,393 @@
@import '../_partials/_single/toc';
@import '../_partials/_single/fixit-decryptor';
.single {
.single-title {
padding: 1rem 0 0.5rem;
margin: 0;
font-size: 1.6rem;
font-weight: bold;
line-height: 140%;
.icon-repost {
color: var(--#{$prefix}success);
display: inline-block;
width: max-content;
margin-right: 0.25rem;
[data-theme='dark'] & {
color: var(--#{$prefix}success-dark);
}
}
}
.single-subtitle {
margin: 0.5rem 0;
font-size: 1.2rem;
font-weight: normal;
line-height: 100%;
}
.post-meta {
font-size: 0.875rem;
color: $global-font-secondary-color;
.comment-visitors,
.comment-count {
@extend .print-d-none;
}
span {
display: inline-block;
}
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
@include link(false, true);
.author {
font-size: 1.05rem;
img.avatar {
width: 1.3rem;
height: 1.3rem;
border-radius: 50%;
vertical-align: text-bottom;
border: 0.25px solid $global-border-color;
box-sizing: border-box;
object-position: center;
@include object-fit(cover);
[data-theme='dark'] & {
border-color: $global-border-color-dark;
}
}
}
}
.featured-image {
margin: 0.5rem 0 1rem 0;
img {
display: block;
width: 100%;
max-width: 100%;
height: auto;
margin: 0 auto;
overflow: hidden;
}
}
#content[data-end-flag]:not([data-password])::after {
content: attr(data-end-flag);
display: block;
text-align: center;
color: $global-font-secondary-color;
font-size: 15px;
padding: 5px;
}
.content {
> h1,
> h2 {
font-size: 1.5rem;
& code {
font-size: 1.25rem;
}
}
> h3 {
font-size: 1.375rem;
& code {
font-size: 1.125rem;
}
}
> h4 {
font-size: 1.25rem;
& code {
font-size: 1rem;
}
}
> h5 {
font-size: 1.125rem;
}
> h6 {
font-size: 1rem;
}
h2,
h3,
h4,
h5,
h6 {
font-weight: bold;
margin: 1.2rem 0;
[data-theme='dark'] & {
font-weight: bolder;
}
}
> h2,
> h3,
> h4,
> h5,
> h6 {
> .header-mark::before {
content: '|';
margin-right: 0.3125rem;
color: $single-link-color;
[data-theme='dark'] & {
color: $single-link-color-dark;
}
}
}
> h2 > .header-mark::before {
content: '#';
}
p {
margin: 0.5rem 0;
}
b,
strong {
font-weight: bold;
[data-theme='dark'] & {
color: #ddd;
}
}
@include link(false, false);
a {
white-space: normal;
@include overflow-wrap(break-word);
[data-theme='dark'] & b,
[data-theme='dark'] & strong {
color: $single-link-color-dark;
}
}
[data-theme='dark'] a:hover b,
[data-theme='dark'] a:hover strong {
color: $single-link-hover-color-dark;
}
ul,
ol {
margin: 0.5rem 0;
padding-left: 2.5rem;
}
ul {
list-style-type: disc;
}
ruby {
background: $code-background-color;
rt {
color: $global-font-secondary-color;
}
[data-theme='dark'] & {
background: $code-background-color-dark;
rt {
color: $global-font-secondary-color-dark;
}
}
}
.table-wrapper {
overflow-x: auto;
&::-webkit-scrollbar {
background-color: $table-background-color;
[data-theme='dark'] & {
background-color: $table-background-color-dark;
}
}
> table {
width: 100%;
max-width: 100%;
margin: 0.625rem 0;
border-spacing: 0;
background: $table-background-color;
border-collapse: collapse;
[data-theme='dark'] & {
background: $table-background-color-dark;
}
thead {
background: $table-thead-color;
[data-theme='dark'] & {
background-color: $table-thead-color-dark;
}
}
&:not([class]) tbody {
& tr:nth-child(odd) {
background: darken($table-background-color, 2.25%);
[data-theme='dark'] & {
background-color: lighten($table-background-color-dark, 2.75%);
}
}
& tr:hover {
background: darken($table-background-color, 4.5%);
[data-theme='dark'] & {
background-color: lighten($table-background-color-dark, 5.5%);
}
}
}
th,
td {
padding: 0.3rem 1rem;
border: 1px solid darken($table-thead-color, 2%);
[data-theme='dark'] & {
border-color: darken($table-thead-color-dark, 2%);
}
}
}
}
img {
max-width: 100%;
min-height: 1em;
&:not([data-h]) {
height: auto;
}
&.version {
height: 1.25em;
vertical-align: text-bottom;
}
}
svg {
max-width: 100%;
}
figure {
margin: 0.5rem;
text-align: center;
.image-caption:not(:empty) {
min-width: 20%;
max-width: 80%;
display: inline-block;
padding: 0.5rem;
margin: 0 auto;
font-size: 0.875rem;
color: #969696;
}
img {
display: block;
margin: 0 auto;
overflow: hidden;
&:not([width]) {
width: 100%;
}
}
}
blockquote {
display: block;
border-left: 0.25em solid $global-border-color;
color: $blockquote-color;
padding: 0 1em;
margin: 1rem 0;
ul,
ol {
padding-left: 1.5em;
}
[data-theme='dark'] & {
color: $blockquote-color-dark;
border-left-color: $global-border-color-dark;
}
@include link(false, true);
}
.footnotes {
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
p {
margin: 0.25rem 0;
}
}
@import '../_partials/_single/code';
@import '../_shortcodes';
hr {
margin: 1rem 0;
position: relative;
border-top: 1px dashed $global-border-color;
border-bottom: none;
[data-theme='dark'] & {
border-top: 1px dashed $global-border-color-dark;
}
}
kbd {
display: inline-block;
padding: 0 0.25rem;
background-color: $global-background-color;
border: 1px solid $global-border-color;
border-bottom-color: $global-border-color;
font-size: 0.8rem;
font-family: $code-font-family;
color: $code-color;
@include border-radius($global-border-radius);
@include box-shadow(inset 0 -1px 0 $global-border-color);
[data-theme='dark'] & {
background-color: $global-background-color-dark;
border: 1px solid $global-border-color-dark;
border-bottom-color: $global-border-color-dark;
color: $code-color-dark;
@include box-shadow(inset 0 -1px 0 $global-border-color-dark);
}
}
}
@import '../_partials/_single/reward';
@import '../_partials/_single/footer';
@import '../_partials/_single/comment';
}
.lg-toolbar .lg-icon::after {
color: #999;
}

View File

@ -0,0 +1,6 @@
.special {
.single-title,
.single-subtitle {
text-align: right;
}
}

View File

@ -0,0 +1,69 @@
.tag-cloud-tags {
margin: 10px 0;
@include link(true, true);
a {
display: inline-block;
position: relative;
margin: 5px 10px;
@include overflow-wrap(break-word);
@include transition(all ease-out 0.3s);
&:active,
&:focus,
&:hover {
@include transform(scale(1.2));
sup {
color: $global-font-color;
@include transition(all ease-out 0.3s);
[data-theme='dark'] & {
color: $global-font-color-dark;
}
}
}
sup {
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
}
}
@for $grade from 0 through 10 {
$tag-cloud-color: mix($tag-cloud-end, $tag-cloud-start, $grade * 10);
$tag-cloud-color-dark: mix($tag-cloud-end-dark, $tag-cloud-start-dark, $grade * 10);
.tag-cloud-#{$grade} {
color: $tag-cloud-color!important;
font-size: var(--tag-font);
margin: 10px!important;
&:active,
&:focus,
&:hover {
color: $global-link-hover-color!important;
[data-theme='dark'] & {
color: $global-link-hover-color-dark;
}
sup {
opacity: 1;
}
}
[data-theme='dark'] & {
color: $tag-cloud-color-dark!important;
}
sup {
opacity: 0;
}
}
}

View File

@ -0,0 +1,85 @@
.categories-card {
margin: 0 auto;
display: flex;
align-items: flex-start;
justify-content: space-between;
flex-direction: row;
flex-wrap: wrap;
line-height: 1.6rem;
.card-item {
font-size: 0.875rem;
text-align: left;
width: 45%;
display: flex;
align-items: flex-start;
min-height: 10rem;
padding: 0 2%;
position: relative;
&:nth-child(n+3){
margin-top: 2rem;
}
.card-item-wrapper {
width: 100%;
overflow: hidden;
.card-item-title {
font-size: 1.2rem;
font-weight: bold;
display: inline-block;
margin-top: 1rem;
margin-bottom: 0.75rem;
}
span {
float: right;
padding-right: 1rem;
}
}
}
}
.archive-item {
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
margin: 0.25rem 0 0.25rem 1.5rem;
}
.archive-item-link {
min-width: 10%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
&:hover {
color: $global-link-hover-color;
background-color: transparent;
}
[data-theme='dark'] & {
color: $global-link-color-dark;
&:hover {
color: $global-link-hover-color-dark;
}
}
}
.archive-item-date {
text-align: right;
color: $global-font-secondary-color;
white-space: nowrap;
font-variant-numeric: tabular-nums lining-nums;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
.more-post {
text-align: right;
}

View File

@ -0,0 +1,40 @@
.details {
.details-summary {
@include border-radius($global-border-radius);
&:hover {
cursor: pointer;
}
}
i.details-icon {
color: $global-font-secondary-color;
@include transition(transform 0.2s ease);
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
.details-content {
max-height: 0;
overflow-y: hidden;
@include details-transition-open;
}
&.open {
.details-summary {
@include border-radius($global-border-radius $global-border-radius 0 0);
}
i.details-icon {
@include transform(rotate(90deg));
}
.details-content {
max-height: 100%;
@include border-radius(0 0 $global-border-radius $global-border-radius);
@include details-transition-close;
}
}
}

View File

@ -0,0 +1,27 @@
svg.icon {
display: inline-block;
width: 1.25em;
height: 1em;
text-align: center;
path {
fill: currentColor;
}
}
img.emoji {
display: inline-block;
height: 1em;
width: 1em;
margin: 0 0.05em 0 0.1em;
vertical-align: -0.1em;
}
.fixit-icon {
display: inline-block;
height: 1.5em;
width: 1.5em;
line-height: 1.5em;
position: relative;
vertical-align: text-bottom;
}

View File

@ -0,0 +1,3 @@
img {
@include border-radius($global-border-radius/2);
}

View File

@ -0,0 +1,15 @@
// Color map of admonition [$type $color $background-color, ... ]
$admonition-color-map:
'note' #448aff rgba(68, 138, 255, 0.1),
'abstract' #00b0ff rgba(0, 176, 255, 0.1),
'info' #00b8d4 rgba(0, 184, 212, 0.1),
'tip' #00bfa5 rgba(0, 191, 165, 0.1),
'success' #00c853 rgba(0, 200, 83, 0.1),
'question' #64dd17 rgba(100, 221, 23, 0.1),
'warning' #ff9100 rgba(255, 145, 0, 0.1),
'failure' #ff5252 rgba(255, 82, 82, 0.1),
'danger' #ff1744 rgba(255, 23, 68, 0.1),
'bug' #f50057 rgba(245, 0, 87, 0.1),
'example' #651fff rgba(101, 31, 255, 0.1),
'quote' #9e9e9e rgba(159, 159, 159, 0.1)
!default;

View File

@ -0,0 +1,157 @@
// Color map of the code highlight
$code-highlight-color-map: (
/* Error */ 'err': $code-error-color,
/* Keyword */ 'k': #cf222e,
/* KeywordConstant */ 'kc': #0550ae,
/* KeywordDeclaration */ 'kd': #cf222e,
/* KeywordNamespace */ 'kn': #cf222e,
/* KeywordPseudo */ 'kp': #cf222e,
/* KeywordReserved */ 'kr': #cf222e,
/* KeywordType */ 'kt': #cf222e,
/* Name */ 'n': $code-color,
/* NameAttribute */ 'na': #0550ae,
/* NameBuiltin */ 'nb': #0550ae,
/* NameBuiltinPseudo */ 'bp': $code-color,
/* NameClass */ 'nc': #8250df,
/* NameConstant */ 'no': #cf222e,
/* NameDecorator */ 'nd': #8250df,
/* NameEntity */ 'ni': #0550ae,
/* NameException */ 'ne': #0550ae,
/* NameFunction */ 'nf': #0550ae,
/* NameFunctionMagic */ 'fm': #0550ae,
/* NameLabel */ 'nl': #0550ae,
/* NameNamespace */ 'nn': #8250df,
/* NameOther */ 'nx': #0550ae,
/* NameProperty */ 'py': #0550ae,
/* NameTag */ 'nt': #116329,
/* NameVariable */ 'nv': #953800,
/* NameVariableClass */ 'vc': #0550ae,
/* NameVariableGlobal */ 'vg': #0550ae,
/* NameVariableInstance */ 'vi': #0550ae,
/* NameVariableMagic */ 'vm': #0550ae,
/* Literal */ 'l': #0550ae,
/* LiteralDate */ 'ld': #0a3069,
/* LiteralString */ 's': #0a3069,
/* LiteralStringAffix */ 'sa': #0a3069,
/* LiteralStringBacktick */ 'sb': #0a3069,
/* LiteralStringChar */ 'sc': #0a3069,
/* LiteralStringDelimiter */ 'dl': #0a3069,
/* LiteralStringDoc */ 'sd': #0a3069,
/* LiteralStringDouble */ 's2': #0a3069,
/* LiteralStringEscape */ 'se': #0a3069,
/* LiteralStringHeredoc */ 'sh': #0a3069,
/* LiteralStringInterpol */ 'si': #0a3069,
/* LiteralStringOther */ 'sx': #0a3069,
/* LiteralStringRegex */ 'sr': #0a3069,
/* LiteralStringSingle */ 's1': #0a3069,
/* LiteralStringSymbol */ 'ss': #0a3069,
/* LiteralNumber */ 'm': #0550ae,
/* LiteralNumberBin */ 'mb': #0550ae,
/* LiteralNumberFloat */ 'mf': #0550ae,
/* LiteralNumberHex */ 'mh': #0550ae,
/* LiteralNumberInteger */ 'mi': #0550ae,
/* LiteralNumberIntegerLong */ 'il': #0550ae,
/* LiteralNumberOct */ 'mo': #0550ae,
/* Operator */ 'o': #cf222e,
/* OperatorWord */ 'ow': #cf222e,
/* Punctuation */ 'p': $code-color,
/* Comment */ 'c': #6e7781,
/* CommentHashbang */ 'ch': #6e7781,
/* CommentMultiline */ 'cm': #6e7781,
/* CommentSingle */ 'c1': #6e7781,
/* CommentSpecial */ 'cs': #6e7781,
/* CommentPreproc */ 'cp': #0550ae,
/* CommentPreprocFile */ 'cpf': #6e7781,
/* Generic */ 'g': $code-color,
/* GenericDeleted */ 'gd': #82071e,
/* GenericEmph */ 'ge': $code-color,
/* GenericError */ 'gr': $code-error-color,
/* GenericHeading */ 'gh': $code-color,
/* GenericInserted */ 'gi': #116329,
/* GenericOutput */ 'go': $code-color,
/* GenericPrompt */ 'gp': $code-color,
/* GenericStrong */ 'gs': $code-color,
/* GenericSubheading */ 'gu': $code-color,
/* GenericTraceback */ 'gt': $code-error-color,
/* GenericUnderline */ 'gl': $code-color,
/* TextWhitespace */ 'w': $code-color,
/* Other */ 'x': $code-color
) !default;
$code-highlight-color-map-dark: (
/* Error */ 'err': $code-error-color,
/* Keyword */ 'k': #f47067,
/* KeywordConstant */ 'kc': #6cb6ff,
/* KeywordDeclaration */ 'kd': #f47067,
/* KeywordNamespace */ 'kn': #f47067,
/* KeywordPseudo */ 'kp': #f47067,
/* KeywordReserved */ 'kr': #f47067,
/* KeywordType */ 'kt': #f47067,
/* Name */ 'n': $code-color-dark,
/* NameAttribute */ 'na': #6cb6ff,
/* NameBuiltin */ 'nb': #dcbdfb,
/* NameBuiltinPseudo */ 'bp': $code-color-dark,
/* NameClass */ 'nc': #dcbdfb,
/* NameConstant */ 'no': #6cb6ff,
/* NameDecorator */ 'nd': #dcbdfb,
/* NameEntity */ 'ni': #6cb6ff,
/* NameException */ 'ne': #6cb6ff,
/* NameFunction */ 'nf': #dcbdfb,
/* NameFunctionMagic */ 'fm': #6cb6ff,
/* NameLabel */ 'nl': #6cb6ff,
/* NameNamespace */ 'nn': #f47067,
/* NameOther */ 'nx': #dcbdfb,
/* NameProperty */ 'py': #6cb6ff,
/* NameTag */ 'nt': #8ddb8c,
/* NameVariable */ 'nv': #f69d50,
/* NameVariableClass */ 'vc': #6cb6ff,
/* NameVariableGlobal */ 'vg': #6cb6ff,
/* NameVariableInstance */ 'vi': #6cb6ff,
/* NameVariableMagic */ 'vm': #6cb6ff,
/* Literal */ 'l': #6cb6ff,
/* LiteralDate */ 'ld': #96d0ff,
/* LiteralString */ 's': #96d0ff,
/* LiteralStringAffix */ 'sa': #96d0ff,
/* LiteralStringBacktick */ 'sb': #96d0ff,
/* LiteralStringChar */ 'sc': #96d0ff,
/* LiteralStringDelimiter */ 'dl': #96d0ff,
/* LiteralStringDoc */ 'sd': #96d0ff,
/* LiteralStringDouble */ 's2': #96d0ff,
/* LiteralStringEscape */ 'se': #96d0ff,
/* LiteralStringHeredoc */ 'sh': #96d0ff,
/* LiteralStringInterpol */ 'si': #96d0ff,
/* LiteralStringOther */ 'sx': #96d0ff,
/* LiteralStringRegex */ 'sr': #96d0ff,
/* LiteralStringSingle */ 's1': #96d0ff,
/* LiteralStringSymbol */ 'ss': #96d0ff,
/* LiteralNumber */ 'm': #6cb6ff,
/* LiteralNumberBin */ 'mb': #6cb6ff,
/* LiteralNumberFloat */ 'mf': #6cb6ff,
/* LiteralNumberHex */ 'mh': #6cb6ff,
/* LiteralNumberInteger */ 'mi': #6cb6ff,
/* LiteralNumberIntegerLong */ 'il': #6cb6ff,
/* LiteralNumberOct */ 'mo': #6cb6ff,
/* Operator */ 'o': #f47067,
/* OperatorWord */ 'ow': #f47067,
/* Punctuation */ 'p': $code-color-dark,
/* Comment */ 'c': #768390,
/* CommentHashbang */ 'ch': #768390,
/* CommentMultiline */ 'cm': #768390,
/* CommentSingle */ 'c1': #768390,
/* CommentSpecial */ 'cs': #768390,
/* CommentPreproc */ 'cp': #6cb6ff,
/* CommentPreprocFile */ 'cpf': #768390,
/* Generic */ 'g': $code-color-dark,
/* GenericDeleted */ 'gd': #ffd8d3,
/* GenericEmph */ 'ge': $code-color-dark,
/* GenericError */ 'gr': $code-error-color,
/* GenericHeading */ 'gh': $code-color-dark,
/* GenericInserted */ 'gi': #b4f1b4,
/* GenericOutput */ 'go': $code-color-dark,
/* GenericPrompt */ 'gp': $code-color-dark,
/* GenericStrong */ 'gs': $code-color-dark,
/* GenericSubheading */ 'gu': $code-color-dark,
/* GenericTraceback */ 'gt': $code-error-color,
/* GenericUnderline */ 'gl': $code-color-dark,
/* TextWhitespace */ 'w': $code-color-dark,
/* Other */ 'x': $code-color-dark
) !default;

View File

@ -0,0 +1,373 @@
// Code type map
$code-type-map: (
// Chroma supported languages
// @generator https://github.com/hugo-fixit/.tools/blob/main/tampermonkey/code-type-map-fetcher.user.js
"abap": "ABAP",
"abnf": "ABNF",
"as": "ActionScript",
"actionscript": "ActionScript",
"as3": "ActionScript 3",
"actionscript3": "ActionScript 3",
"ada": "Ada",
"ada95": "Ada",
"ada2005": "Ada",
"al": "AL",
"ng2": "Angular2",
"antlr": "ANTLR",
"apacheconf": "ApacheConf",
"aconf": "ApacheConf",
"apache": "ApacheConf",
"apl": "APL",
"applescript": "AppleScript",
"arduino": "Arduino",
"armasm": "ArmAsm",
"awk": "Awk",
"gawk": "Awk",
"mawk": "Awk",
"nawk": "Awk",
"ballerina": "Ballerina",
"make": "Base Makefile",
"makefile": "Base Makefile",
"mf": "Base Makefile",
"bsdmake": "Base Makefile",
"bash": "Bash",
"sh": "Bash",
"ksh": "Bash",
"zsh": "Bash",
"shell": "Bash",
"bash-session": "BashSession",
"console": "BashSession",
"shell-session": "BashSession",
"bat": "Batchfile",
"batch": "Batchfile",
"dosbatch": "Batchfile",
"winbatch": "Batchfile",
"bib": "BibTeX",
"bibtex": "BibTeX",
"bicep": "Bicep",
"blitzbasic": "BlitzBasic",
"b3d": "BlitzBasic",
"bplus": "BlitzBasic",
"bnf": "BNF",
"brainfuck": "Brainfuck",
"bf": "Brainfuck",
"c": "C",
"csharp": "C#",
"c\\#": "C#",
"cpp": "C++",
"c\\+\\+": "C++",
"caddyfile": "Caddyfile",
"caddy": "Caddyfile",
"caddyfile-directives": "Caddyfile Directives",
"caddyfile-d": "Caddyfile Directives",
"caddy-d": "Caddyfile Directives",
"capnp": "Cap'n Proto",
"cassandra": "Cassandra CQL",
"cql": "Cassandra CQL",
"ceylon": "Ceylon",
"cfengine3": "CFEngine3",
"cf3": "CFEngine3",
"cfs": "cfstatement",
"chai": "ChaiScript",
"chaiscript": "ChaiScript",
"cheetah": "Cheetah",
"spitfire": "Cheetah",
"clojure": "Clojure",
"clj": "Clojure",
"cmake": "CMake",
"cobol": "COBOL",
"coffee-script": "CoffeeScript",
"coffeescript": "CoffeeScript",
"coffee": "CoffeeScript",
"common-lisp": "Common Lisp",
"cl": "Common Lisp",
"lisp": "Common Lisp",
"coq": "Coq",
"cr": "Crystal",
"crystal": "Crystal",
"css": "CSS",
"cython": "Cython",
"pyx": "Cython",
"pyrex": "Cython",
"d": "D",
"dart": "Dart",
"diff": "Diff",
"udiff": "Diff",
"django": "Django/Jinja",
"jinja": "Django/Jinja",
"docker": "Docker",
"dockerfile": "Docker",
"dtd": "DTD",
"dylan": "Dylan",
"ebnf": "EBNF",
"elixir": "Elixir",
"ex": "Elixir",
"exs": "Elixir",
"elm": "Elm",
"emacs": "EmacsLisp",
"elisp": "EmacsLisp",
"emacs-lisp": "EmacsLisp",
"erlang": "Erlang",
"factor": "Factor",
"fennel": "Fennel",
"fnl": "Fennel",
"fish": "Fish",
"fishshell": "Fish",
"forth": "Forth",
"fortran": "Fortran",
"fortranfixed": "FortranFixed",
"fsharp": "FSharp",
"gas": "GAS",
"asm": "GAS",
"gdscript": "GDScript",
"gd": "GDScript",
"genshi": "Genshi",
"kid": "Genshi",
"xml\\+genshi": "Genshi",
"xml\\+kid": "Genshi",
"html\\+genshi": "Genshi HTML",
"html\\+kid": "Genshi HTML",
"genshitext": "Genshi Text",
"cucumber": "Gherkin",
"Cucumber": "Gherkin",
"gherkin": "Gherkin",
"Gherkin": "Gherkin",
"glsl": "GLSL",
"gnuplot": "Gnuplot",
"go": "Go",
"golang": "Go",
"go-html-template": "Go HTML Template",
"go-text-template": "Go Text Template",
"graphql": "GraphQL",
"graphqls": "GraphQL",
"gql": "GraphQL",
"groff": "Groff",
"nroff": "Groff",
"man": "Groff",
"groovy": "Groovy",
"handlebars": "Handlebars",
"hbs": "Handlebars",
"haskell": "Haskell",
"hs": "Haskell",
"hx": "Haxe",
"haxe": "Haxe",
"hxsl": "Haxe",
"hcl": "HCL",
"hexdump": "Hexdump",
"hlb": "HLB",
"html": "HTML",
"http": "HTTP",
"hylang": "Hy",
"idris": "Idris",
"idr": "Idris",
"igor": "Igor",
"igorpro": "Igor",
"ini": "INI",
"cfg": "INI",
"dosini": "INI",
"io": "Io",
"j": "J",
"java": "Java",
"js": "JavaScript",
"javascript": "JavaScript",
"json": "JSON",
"julia": "Julia",
"jl": "Julia",
"jungle": "Jungle",
"kotlin": "Kotlin",
"lighty": "Lighttpd configuration file",
"lighttpd": "Lighttpd configuration file",
"llvm": "LLVM",
"lua": "Lua",
"mako": "Mako",
"md": "markdown",
"mkd": "markdown",
"mason": "Mason",
"mathematica": "Mathematica",
"mma": "Mathematica",
"nb": "Mathematica",
"matlab": "Matlab",
"mcfunction": "mcfunction",
"meson": "Meson",
"meson\\.build": "Meson",
"metal": "Metal",
"minizinc": "MiniZinc",
"MZN": "MiniZinc",
"mzn": "MiniZinc",
"mlir": "MLIR",
"modula2": "Modula-2",
"m2": "Modula-2",
"monkeyc": "MonkeyC",
"morrowind": "MorrowindScript",
"mwscript": "MorrowindScript",
"myghty": "Myghty",
"mysql": "MySQL",
"mariadb": "MySQL",
"nasm": "NASM",
"newspeak": "Newspeak",
"nginx": "Nginx configuration file",
"nim": "Nim",
"nimrod": "Nim",
"nixos": "Nix",
"nix": "Nix",
"objective-c": "Objective-C",
"objectivec": "Objective-C",
"obj-c": "Objective-C",
"objc": "Objective-C",
"ocaml": "OCaml",
"octave": "Octave",
"ones": "OnesEnterprise",
"onesenterprise": "OnesEnterprise",
"1S": "OnesEnterprise",
"1S:Enterprise": "OnesEnterprise",
"openedge": "OpenEdge ABL",
"abl": "OpenEdge ABL",
"progress": "OpenEdge ABL",
"openedgeabl": "OpenEdge ABL",
"openscad": "OpenSCAD",
"org": "Org Mode",
"orgmode": "Org Mode",
"pacmanconf": "PacmanConf",
"perl": "Perl",
"pl": "Perl",
"php": "PHP",
"php3": "PHP",
"php4": "PHP",
"php5": "PHP",
"phtml": "PHTML",
"pig": "Pig",
"pkgconfig": "PkgConfig",
"plpgsql": "PL/pgSQL",
"text": "plaintext",
"plain": "plaintext",
"no-highlight": "plaintext",
"plutus-core": "Plutus Core",
"plc": "Plutus Core",
"pony": "Pony",
"postgresql": "PostgreSQL SQL dialect",
"postgres": "PostgreSQL SQL dialect",
"postscript": "PostScript",
"postscr": "PostScript",
"pov": "POVRay",
"powerquery": "PowerQuery",
"pq": "PowerQuery",
"powershell": "PowerShell",
"posh": "PowerShell",
"ps1": "PowerShell",
"psm1": "PowerShell",
"psd1": "PowerShell",
"prolog": "Prolog",
"promql": "PromQL",
"protobuf": "Protocol Buffer",
"proto": "Protocol Buffer",
"puppet": "Puppet",
"python": "Python",
"py": "Python",
"sage": "Python",
"python3": "Python",
"py3": "Python",
"python2": "Python 2",
"py2": "Python 2",
"qbasic": "QBasic",
"basic": "QBasic",
"qml": "QML",
"qbs": "QML",
"splus": "R",
"s": "R",
"r": "R",
"racket": "Racket",
"rkt": "Racket",
"ragel": "Ragel",
"perl6": "Raku",
"pl6": "Raku",
"raku": "Raku",
"jsx": "react",
"react": "react",
"reason": "ReasonML",
"reasonml": "ReasonML",
"registry": "reg",
"rst": "reStructuredText",
"rest": "reStructuredText",
"restructuredtext": "reStructuredText",
"rexx": "Rexx",
"arexx": "Rexx",
"rb": "Ruby",
"ruby": "Ruby",
"duby": "Ruby",
"rust": "Rust",
"rs": "Rust",
"sas": "SAS",
"sass": "Sass",
"scala": "Scala",
"scheme": "Scheme",
"scm": "Scheme",
"scilab": "Scilab",
"scss": "SCSS",
"sieve": "Sieve",
"smalltalk": "Smalltalk",
"squeak": "Smalltalk",
"st": "Smalltalk",
"smarty": "Smarty",
"snobol": "Snobol",
"sol": "Solidity",
"solidity": "Solidity",
"sparql": "SPARQL",
"sql": "SQL",
"squidconf": "SquidConf",
"squid\\.conf": "SquidConf",
"squid": "SquidConf",
"sml": "Standard ML",
"stylus": "Stylus",
"svelte": "Svelte",
"swift": "Swift",
"systemd": "SYSTEMD",
"systemverilog": "systemverilog",
"sv": "systemverilog",
"tablegen": "TableGen",
"tasm": "TASM",
"tcl": "Tcl",
"tcsh": "Tcsh",
"csh": "Tcsh",
"termcap": "Termcap",
"terminfo": "Terminfo",
"terraform": "Terraform",
"tf": "Terraform",
"tex": "TeX",
"latex": "TeX",
"thrift": "Thrift",
"toml": "TOML",
"tradingview": "TradingView",
"tv": "TradingView",
"tsql": "Transact-SQL",
"t-sql": "Transact-SQL",
"turing": "Turing",
"turtle": "Turtle",
"twig": "Twig",
"ts": "TypeScript",
"tsx": "TypeScript",
"typescript": "TypeScript",
"typoscript": "TypoScript",
"typoscriptcssdata": "TypoScriptCssData",
"typoscripthtmldata": "TypoScriptHtmlData",
"v": "verilog",
"vlang": "V",
"vsh": "V shell",
"vshell": "V shell",
"vb\\.net": "VB.net",
"vbnet": "VB.net",
"verilog": "verilog",
"vhdl": "VHDL",
"vim": "VimL",
"vue": "vue",
"vuejs": "vue",
"whiley": "Whiley",
"xml": "XML",
"xorg\\.conf": "Xorg",
"yaml": "YAML",
"yang": "YANG",
"zed": "Zed",
"zig": "Zig",
// Custom code type
"markdown": "markdown",
"yml": "YAML"
) !default;

View File

@ -0,0 +1,17 @@
// Theme colors
$primary: #1772ee !default;
$secondary: #919191 !default;
$success: #13ce66 !default;
$info: #0dcaf0 !default;
$warning: #ffba00 !default;
$danger: #ff4949 !default;
// Theme colors map
$theme-colors: (
'primary': $primary,
'secondary': $secondary,
'success': $success,
'info': $info,
'warning': $warning,
'danger': $danger
) !default;

View File

@ -0,0 +1,13 @@
// Utilities
// property order
$orders: (
first: -1,
0: 0,
1: 1,
2: 2,
3: 3,
4: 4,
5: 5,
last: 6,
) !default;

View File

@ -0,0 +1,16 @@
#mask {
background-repeat: no-repeat;
background-position: center;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0);
@include z-index(0, -1);
.blur & {
@include z-index(1);
background-color: rgba(0, 0, 0, 0.25);
}
}

View File

@ -0,0 +1,364 @@
// inline code
code {
padding: 0.2em 0.4em;
margin: 0;
font-size: $code-font-size;
font-family: $code-font-family;
color: $code-color;
background-color: rgba(175, 184, 193, 0.2);
text-decoration: inherit;
@include border-radius($global-border-radius);
@include overflow-wrap(break-word);
@include line-break(auto);
[data-theme='dark'] & {
color: $code-color-dark;
background-color: rgba(99, 110, 123, 0.4);
}
}
// indented code
pre {
margin: 0;
line-height: 1.45em;
padding: 0.5rem;
overflow: auto;
font-size: $code-font-size;
font-family: $code-font-family;
@include border-radius($global-border-radius);
@include tab-size(4);
background-color: $code-background-color;
[data-theme='dark'] & {
background-color: $code-background-color-dark;
}
code {
padding: 0;
background-color: transparent;
@include border-radius(0);
@include max-content(min-width);
[data-theme='dark'] & {
background-color: transparent;
}
}
img {
min-height: 1em;
max-height: 1.2em;
vertical-align: text-bottom;
}
}
.highlight,
.gist {
font-size: $code-font-size;
font-family: $code-font-family;
.table-wrapper {
> table,
> table thead,
> table tr,
> table td {
margin: 0;
padding: 0;
border: none !important;
white-space: nowrap;
}
}
}
// block fenced code
.highlight {
margin: 0.5rem 0;
> .chroma {
position: relative;
.code-header {
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
width: 100%;
font-family: $global-font-family;
font-weight: bold;
line-height: 1.4em;
color: $code-info-color;
background-color: darken($code-background-color, 3%);
@include border-radius($global-border-radius);
@include transition(border-radius 0.2s ease);
[data-theme='dark'] & {
color: $code-info-color-dark;
background-color: darken($code-background-color-dark, 6%);
}
&:hover {
cursor: pointer;
}
.ellipses,
.edit,
.copy {
@extend .print-d-none;
}
.code-title {
width: 100%;
padding: 0.4rem;
.arrow {
padding: 0 0.2rem;
@include transition(transform 0.2s ease);
}
.title-inner {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
}
.code-title::after {
padding-left: 0.2rem;
content: 'Code';
}
.ellipses {
padding: 0.4rem;
}
.edit,
.copy {
display: none;
padding: 0.4rem;
&:hover {
cursor: pointer;
color: $global-link-hover-color;
[data-theme='dark'] & {
color: $global-link-hover-color-dark;
}
}
}
@each $type, $text in $code-type-map {
&.language-#{$type} .code-title::after {
content: $text;
}
}
}
// delayed loading table-wrapper
.table-wrapper {
max-height: 0;
overflow: hidden;
@include border-radius(0 0 $global-border-radius $global-border-radius);
@include details-transition-open;
}
table {
border-spacing: 0;
width: auto;
overflow: auto;
display: block;
background-color: $code-background-color;
[data-theme='dark'] & {
background-color: $code-background-color-dark;
}
td {
vertical-align: top;
padding: 0;
}
pre {
padding: 0.25rem;
outline-offset: -1px;
@include border-radius(0);
}
/* lineNumbersInTable=false */
.ln {
min-width: 1.25rem;
}
// ========== lineNumbersInTable ========== //
// line numbers
.lntd:first-child {
min-width: 1.6rem;
text-align: right;
position: sticky;
left: 0;
pre {
@include user-select(none);
}
}
// code content
.lntd:last-child {
width: 100%;
pre {
padding-left: 0.5rem;
padding-right: 0.5rem;
}
code {
width: 100%;
}
}
// ========== lineNumbersInTable ========== //
}
&.open {
.code-header {
background-color: darken($code-background-color, 6%);
@include border-radius($global-border-radius $global-border-radius 0 0);
[data-theme='dark'] & {
background-color: darken($code-background-color-dark, 3%);
}
}
.table-wrapper {
max-height: 100%;
@include details-transition-close;
}
.arrow {
@include transform(rotate(90deg));
}
.ellipses {
display: none;
}
.edit,
.copy {
display: inline;
}
}
}
/* LineHighlight */
.hl {
display: block;
background-color: $code-hightlight-color;
box-shadow: -0.5rem 0 0 $code-hightlight-color, 0.5rem 0 0 $code-hightlight-color;
[data-theme='dark'] & {
background-color: $code-hightlight-color-dark;
box-shadow: -0.5rem 0 0 $code-hightlight-color-dark, 0.5rem 0 0 $code-hightlight-color-dark;
}
}
/* GenericUnderline */
.gl {
text-decoration: underline;
}
/* GenericStrong */
.gs {
font-weight: bold;
}
/* GenericEmph */
.ge {
font-style: italic;
}
/* lineNumbersInTable=false */
.ln {
padding-right: 0.5rem;
display: inline-block;
min-width: 1.1rem;
text-align: right;
}
/* LineNumbers */
.lnt,
.ln {
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
}
// ========== Higtlight Color ========== //
/* Error */
.err {
font-style: italic;
border-bottom: 1px dotted $code-error-color;
}
/* GenericDeleted */
.gd {
background-color: #ffebe9;
[data-theme='dark'] & {
background-color: #78191b;
}
}
/* GenericInserted */
.gi {
background-color: #dafbe1;
[data-theme='dark'] & {
background-color: #1b4721;
}
}
@each $class, $color in $code-highlight-color-map {
.#{$class} {
color: $color;
}
}
[data-theme='dark'] & {
@each $class, $color in $code-highlight-color-map-dark {
.#{$class} {
color: $color;
}
}
}
// ========== Higtlight Color ========== //
}
// gist shortcode
.gist {
.gist-file,
.gist-data,
.gist-meta {
border: none;
}
.gist-data {
background-color: transparent;
}
.gist-meta {
padding: 0.4rem 0.8rem;
@include link(false, false);
background-color: darken($code-background-color, 5%);
[data-theme='dark'] & {
background-color: darken($code-background-color-dark, 5%);
}
}
.table-wrapper {
.highlight,
&::-webkit-scrollbar {
background-color: #f6f8fa;
[data-theme='dark'] & {
background-color: #2d333b;
}
}
}
[data-theme='dark'] & {
@import './github-dark-dimmed';
}
}

View File

@ -0,0 +1,4 @@
>#comments {
padding: 2rem 0;
@extend .print-d-none;
}

View File

@ -0,0 +1,67 @@
.fixit-decryptor-container {
font-family: $global-font-family;
text-align: center;
margin-top: 3rem;
.fixit-encryptor-shortcode & {
margin-top: 1rem;
}
#fixit-decryptor-input,
.fixit-decryptor-input,
.fixit-encryptor-btn {
display: inline-block;
box-sizing: border-box;
outline: none;
color: $global-font-color;
border: 1px solid darken($global-border-color, 15%);
border-radius: $global-border-radius;
@include transition(all 0.1s ease-out);
box-shadow: 0px 0px 5px 0px darken($global-border-color, 15%);
&:active,
&:focus,
&:hover {
color: darken($global-link-hover-color, 6%);
border-color: $global-link-hover-color;
box-shadow: 0px 0px 5px 0px lighten($global-link-hover-color, 20%);
[data-theme='dark'] & {
color: lighten($global-link-hover-color-dark, 6%);
border-color: $global-link-hover-color-dark;
box-shadow: 0px 0px 5px 0px darken($global-link-hover-color-dark, 20%);
}
}
[data-theme='dark'] & {
color: $global-font-color-dark;
border-color: lighten($global-border-color-dark, 15%);
box-shadow: 0px 0px 5px 0px lighten($global-border-color-dark, 15%);
}
}
#fixit-decryptor-input,
.fixit-decryptor-input {
width: clamp(50%, 400px, 100%);
height: 3rem;
padding-left: 1rem;
padding-right: 1rem;
background-color: $global-background-color;
[data-theme='dark'] & {
background-color: $global-background-color-dark;
}
}
.fixit-encryptor-btn {
cursor: pointer;
@include transition(all 0.1s ease-out);
padding: 0.6rem 1rem;
background-color: $header-background-color;
[data-theme='dark'] & {
background-color: $header-background-color-dark;
}
}
}

View File

@ -0,0 +1,115 @@
.post-footer {
margin: 2rem 0;
&:has(~.post-reward) {
margin-bottom: 0;
}
.post-info {
border-bottom: 1px solid $global-border-color;
padding: 1rem 0 0.3rem;
[data-theme='dark'] & {
border-bottom: 1px solid $global-border-color-dark;
}
.post-info-line {
display: flex;
justify-content: space-between;
.post-info-mod {
font-size: 0.8em;
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
@include link(false, false);
}
.post-info-license {
font-size: 0.8em;
color: $global-font-secondary-color;
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
}
@include link(false, false);
}
.post-info-md {
font-size: 0.8rem;
width: fit-content;
@include link(false, false);
>span:not(:first-child)::before {
content: '|';
margin-left: 0.25rem;
margin-right: 0.25rem;
}
}
.post-info-share {
@extend .print-d-none;
a * {
vertical-align: text-bottom;
}
}
}
}
.post-info-more {
padding: 0.3rem 0 1rem;
display: flex;
justify-content: space-between;
font-size: 0.9rem;
section:last-child {
@extend .print-d-none;
}
}
.post-tags {
max-width: 65%;
* {
display: inline;
}
@include link(true, true);
.post-tag:not(:last-child)::after {
content: ',';
margin-right: 0.25rem;
}
}
.post-nav {
display: flex;
justify-content: space-between;
gap: 1.5rem;
@extend .print-d-none;
.post-nav-item {
flex: 1;
font-size: 1rem;
font-weight: 600;
@include transition(all 0.3s ease-out);
&[rel='next'] {
text-align: right;
}
&[rel='prev']:hover {
@include transform(translateX(-4px));
}
&[rel='next']:hover {
@include transform(translateX(4px));
}
}
}
}

View File

@ -0,0 +1,169 @@
/**
* Theme: GitHub Dark Dimmed
* Description: Dark Dimmed theme as seen on github.com
* Author: github.com
* Maintainer: https://github.com/hugo-fixit/FixIt
* Updated: 2022-03-01
*/
& {
--color-fg-default: #adbac7;
--color-prettylights-syntax-comment: #768390;
--color-prettylights-syntax-constant: #6cb6ff;
--color-prettylights-syntax-entity: #dcbdfb;
--color-prettylights-syntax-storage-modifier-import: #adbac7;
--color-prettylights-syntax-entity-tag: #8ddb8c;
--color-prettylights-syntax-keyword: #f47067;
--color-prettylights-syntax-string: #96d0ff;
--color-prettylights-syntax-variable: #f69d50;
--color-prettylights-syntax-brackethighlighter-unmatched: #e5534b;
--color-prettylights-syntax-invalid-illegal-text: #cdd9e5;
--color-prettylights-syntax-invalid-illegal-bg: #922323;
--color-prettylights-syntax-carriage-return-text: #cdd9e5;
--color-prettylights-syntax-carriage-return-bg: #ad2e2c;
--color-prettylights-syntax-string-regexp: #8ddb8c;
--color-prettylights-syntax-markup-list: #eac55f;
--color-prettylights-syntax-markup-heading: #316dca;
--color-prettylights-syntax-markup-italic: #adbac7;
--color-prettylights-syntax-markup-bold: #adbac7;
--color-prettylights-syntax-markup-deleted-text: #ffd8d3;
--color-prettylights-syntax-markup-deleted-bg: #78191b;
--color-prettylights-syntax-markup-inserted-text: #b4f1b4;
--color-prettylights-syntax-markup-inserted-bg: #1b4721;
--color-prettylights-syntax-markup-changed-text: #ffddb0;
--color-prettylights-syntax-markup-changed-bg: #682d0f;
--color-prettylights-syntax-markup-ignored-text: #adbac7;
--color-prettylights-syntax-markup-ignored-bg: #255ab2;
--color-prettylights-syntax-meta-diff-range: #dcbdfb;
--color-prettylights-syntax-brackethighlighter-angle: #768390;
--color-prettylights-syntax-sublimelinter-gutter-mark: #545d68;
--color-prettylights-syntax-constant-other-reference-link: #96d0ff;
.blob-num,
.blob-code-inner {
color: val(--color-fg-default);
}
.pl-c /* comment, punctuation.definition.comment, string.comment */ {
color: var(--color-prettylights-syntax-comment);
}
.pl-c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header, meta.output */,
.pl-s .pl-v /* string variable */ {
color: var(--color-prettylights-syntax-constant);
}
.pl-e /* entity */,
.pl-en /* entity.name */ {
color: var(--color-prettylights-syntax-entity);
}
.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
.pl-s .pl-s1 /* string source */ {
color: var(--color-prettylights-syntax-storage-modifier-import);
}
.pl-ent /* entity.name.tag, markup.quote */ {
color: var(--color-prettylights-syntax-entity-tag);
}
.pl-k /* keyword, storage, storage.type */ {
color: var(--color-prettylights-syntax-keyword);
}
.pl-s /* string */,
.pl-pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
color: var(--color-prettylights-syntax-string);
}
.pl-v /* variable */,
.pl-smw /* sublimelinter.mark.warning */ {
color: var(--color-prettylights-syntax-variable);
}
.pl-bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
color: var(--color-prettylights-syntax-brackethighlighter-unmatched);
}
.pl-ii /* invalid.illegal */ {
color: var(--color-prettylights-syntax-invalid-illegal-text);
background-color: var(--color-prettylights-syntax-invalid-illegal-bg);
}
.pl-c2 /* carriage-return */ {
color: var(--color-prettylights-syntax-carriage-return-text);
background-color: var(--color-prettylights-syntax-carriage-return-bg);
}
.pl-c2::before /* carriage-return */ {
content: '^M';
}
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
font-weight: bold;
color: var(--color-prettylights-syntax-string-regexp);
}
.pl-ml /* markup.list */ {
color: var(--color-prettylights-syntax-markup-list);
}
.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
font-weight: bold;
color: var(--color-prettylights-syntax-markup-heading);
}
.pl-mi /* markup.italic */ {
font-style: italic;
color: var(--color-prettylights-syntax-markup-italic);
}
.pl-mb /* markup.bold */ {
font-weight: bold;
color: var(--color-prettylights-syntax-markup-bold);
}
.pl-md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
color: var(--color-prettylights-syntax-markup-deleted-text);
background-color: var(--color-prettylights-syntax-markup-deleted-bg);
}
.pl-mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
color: var(--color-prettylights-syntax-markup-inserted-text);
background-color: var(--color-prettylights-syntax-markup-inserted-bg);
}
.pl-mc /* markup.changed, punctuation.definition.changed */ {
color: var(--color-prettylights-syntax-markup-changed-text);
background-color: var(--color-prettylights-syntax-markup-changed-bg);
}
.pl-mi2 /* markup.ignored, markup.untracked */ {
color: var(--color-prettylights-syntax-markup-ignored-text);
background-color: var(--color-prettylights-syntax-markup-ignored-bg);
}
.pl-mdr /* meta.diff.range */ {
font-weight: bold;
color: var(--color-prettylights-syntax-meta-diff-range);
}
.pl-ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
color: var(--color-prettylights-syntax-brackethighlighter-angle);
}
.pl-sg /* sublimelinter.gutter-mark */ {
color: var(--color-prettylights-syntax-sublimelinter-gutter-mark);
}
.pl-corl /* constant.other.reference.link, string.other.link */ {
text-decoration: underline;
color: var(--color-prettylights-syntax-constant-other-reference-link);
}
}

View File

@ -0,0 +1,101 @@
.post-reward {
padding: 1rem;
text-align: center;
@extend .print-d-none;
&~.post-footer {
margin-top: 0;
}
&:has(.reward-ways:empty) {
display: none;
}
.comment {
margin: 0.5rem 0;
font-weight: 500;
}
.reward-ways {
display: none;
}
.reward-input:checked~.reward-ways {
display: block;
padding-top: 20px;
div {
display: inline-block;
@include user-select(none);
span {
display: block;
}
&:hover span[data-animation] {
animation: var(--animation-reward, jackInTheBox) 0.8s infinite linear;
// The animation may affect :hover of img in dark mode
pointer-events: none;
}
img {
display: inline-block;
margin: 0.8em 2em 0;
max-width: 100%;
width: $reward-img-width;
}
}
// `fixed` mode only supports desktop
&[data-mode='fixed'] {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 1rem;
background-color: $global-background-color;
@include z-index(2);
@include border-radius($global-border-radius);
@include box-shadow(0 0 1.5rem 0 rgba(0, 0, 0, 0.2));
[data-theme='dark'] & {
background-color: $global-background-color-dark;
@include box-shadow(0 0 1.5rem 0 rgba(255, 255, 255, 0.2));
}
}
}
.reward-button {
display: inline-block;
box-sizing: border-box;
cursor: pointer;
outline: none;
color: lighten($reward-color, 5%);
border: 2px solid lighten($reward-color, 10%);
border-radius: $global-border-radius;
padding: 0.6rem 1rem;
background-color: $global-background-color;
vertical-align: text-top;
line-height: 1rem;
@include transition(all 0.3s ease-out);
&:active,
&:hover {
color: #ffffff;
border-color: $reward-color;
background-color: $reward-color;
[data-theme='dark'] & {
color: #ffffff;
border-color: $reward-color-dark;
background-color: $reward-color-dark;
}
}
[data-theme='dark'] & {
color: $reward-color;
border-color: lighten($reward-color, 5%);
background-color: $global-background-color-dark;
}
}
}

View File

@ -0,0 +1,178 @@
.toc {
.toc-title {
font-size: $toc-title-font-size;
font-weight: bold;
text-transform: uppercase;
}
.toc-content {
font-size: $toc-content-font-size;
ul {
text-indent: -0.8rem;
padding-left: 0.8rem;
list-style: none;
a:first-child::before {
content: '|';
font-weight: bolder;
margin-right: 0.5rem;
color: $single-link-color;
[data-theme='dark'] & {
color: $single-link-color-dark;
}
}
ul {
padding-left: 1.5rem;
}
}
}
ruby {
background: $code-background-color;
rt {
color: $global-font-secondary-color;
}
[data-theme='dark'] & {
background: $code-background-color-dark;
rt {
color: $global-font-secondary-color-dark;
}
}
}
}
#toc-auto {
display: block;
position: sticky;
top: var(--#{$prefix}scroll-mt);
box-sizing: border-box;
visibility: hidden;
@include z-index(1);
@include overflow-wrap(break-word);
@include blur;
@extend .print-d-none;
[data-header-desktop='normal'] & {
--#{$prefix}scroll-mt: #{$global-scroll-margin-top};
}
.toc-title {
margin: 0.5rem 0;
cursor: pointer;
@include user-select(none);
&::before {
content: '|';
font-weight: bolder;
margin-right: 0.5rem;
color: $global-border-color;
[data-theme='dark'] & {
color: $global-border-color-dark;
}
}
i.toc-icon {
@include transition(transform 0.2s ease);
}
}
&.toc-hidden i.toc-icon {
@include transform(rotate(-90deg));
@include transition(transform 0.2s ease);
}
.toc-content {
overflow-y: scroll;
max-height: calc(100vh - #{2*$header-height});
&::-webkit-scrollbar {
width: 0;
}
&.always-active ul {
display: block;
}
> nav > ul {
margin: 0;
}
ul {
ul {
display: none;
}
.has-active > ul {
display: block;
}
}
a.active {
font-weight: bold;
color: $single-link-color;
[data-theme='dark'] & {
color: $single-link-color-dark;
}
&::before {
color: $single-link-hover-color;
[data-theme='dark'] & {
color: $single-link-hover-color-dark;
}
}
}
}
}
#toc-static {
display: none;
margin: 0.8rem 0;
&[data-kept='true'] {
display: block;
}
.toc-title {
display: flex;
justify-content: space-between;
line-height: 2em;
padding: 0 0.75rem;
background: darken($code-background-color, 3%);
[data-theme='dark'] & {
background: darken($code-background-color-dark, 6%);
}
}
.toc-content {
background-color: $code-background-color;
> nav > ul {
margin: 0;
padding: 0.4rem 1rem 0.4rem 1.8rem;
}
[data-theme='dark'] & {
background-color: $code-background-color-dark;
}
}
&.open {
.toc-title {
background: darken($code-background-color, 6%);
[data-theme='dark'] & {
background: darken($code-background-color-dark, 3%);
}
}
}
}

View File

@ -0,0 +1,6 @@
@import '_widgets/cookieconsent';
@import '_widgets/fixed-button';
@import '_widgets/github-corner';
@import '_widgets/noscript-warning';
@import '_widgets/reading-progress';
@import '_widgets/typeit';

View File

@ -0,0 +1,19 @@
.cc-window.cc-banner {
.cc-btn {
color: $global-font-color;
&:hover,
&:focus {
background-color: #ccc;
}
[data-theme='dark'] & {
color: $global-font-color;
&:hover,
&:focus {
background-color: #fff;
}
}
}
}

View File

@ -0,0 +1,44 @@
.fixed-button {
position: fixed;
right: 1.5rem;
font-size: 1rem;
line-height: 1.5rem;
padding: 0.5rem 0.625rem;
color: $global-font-secondary-color;
background-color: $header-background-color;
@include z-index(1);
@include border-radius(1.25rem);
@include transition(color 0.4s ease);
@include blur;
@extend .print-d-none;
&:hover,
&:active {
color: $global-font-color;
cursor: pointer;
}
&:active,
&:focus,
&:hover {
outline: none;
}
[data-theme='dark'] & {
color: $global-font-secondary-color-dark;
background-color: $header-background-color-dark;
&:hover,
&:active {
color: $global-font-color-dark;
}
}
}
.back-to-top {
bottom: 1.5rem;
}
.view-comments {
bottom: 4.5rem;
}

View File

@ -0,0 +1,47 @@
@keyframes octocat-wave {
0%,
100% {
@include transform(rotate(0));
}
20%,
60% {
@include transform(rotate(-25deg));
}
40%,
80% {
@include transform(rotate(10deg));
}
}
.github-corner {
position: fixed;
top: 0;
@include z-index(2);
@extend .print-d-none;
:hover .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
svg {
width: $header-height;
height: $header-height;
border: 0;
color: $github-corner-color;
fill: $github-corner-fill;
[data-theme='dark'] & {
color: $github-corner-color-dark;
fill: $github-corner-fill-dark;
}
}
&.left {
left: 0;
svg {
@include transform(scale(-1, 1));
}
}
&.right {
right: 0;
}
}

View File

@ -0,0 +1,16 @@
.noscript-warning {
background-color: var(--#{$prefix}danger);
color: white;
font-size: 1rem;
font-weight: bold;
position: fixed;
text-align: center;
left: 0;
bottom: 0;
width: 100%;
@include z-index(2);
[data-theme='dark'] & {
background-color: var(--#{$prefix}danger-dark);
}
}

View File

@ -0,0 +1,13 @@
.reading-progress-bar {
--progress: 0;
height: var(--progress-h, 2px);
width: var(--progress);
background-color: var(--bg-progress, var(--#{$prefix}info));
position: fixed;
@include z-index(2);
@extend .print-d-none;
[data-theme="dark"] & {
background-color: var(--bg-progress-dark, var(--#{$prefix}info-dark));
}
}

View File

@ -0,0 +1,22 @@
.typeit {
.highlight {
padding: 0.375rem;
font-size: 0.875rem;
font-family: $code-font-family;
font-weight: bold;
word-break: break-all;
white-space: pre-wrap;
}
--ti-cursor-font-family: #{$global-font-family};
--ti-cursor-font-size: #{$global-font-size};
--ti-cursor-font-style: normal;
--ti-cursor-font-weight: #{$global-font-weight};
--ti-cursor-line-height: #{$global-line-height};
--ti-cursor-color: #{$global-font-color};
--ti-cursor-transform: translateX(0);
[data-theme='dark'] & {
--ti-cursor-color: #{$global-font-color-dark};
}
}

View File

@ -0,0 +1,77 @@
.admonition {
position: relative;
margin: 1rem 0;
padding: 0 0.75rem;
border-left: .25rem solid;
overflow: auto;
@include border-radius($global-border-radius);
.admonition-title {
font-weight: bold;
margin: 0 -0.75rem;
padding: 0.25rem 1.8rem;
border-bottom: 1px solid;
@include border-radius(0);
}
.admonition-content {
padding: 0.5rem 0;
}
i.icon {
font-size: 0.85rem;
position: absolute;
top: 0.6rem;
left: 0.4rem;
}
i.details-icon {
position: absolute;
top: 0.6rem;
right: 0.3rem;
}
@each $type, $color, $background-color in $admonition-color-map {
@if $type == 'note' {
background-color: $background-color;
border-left-color: $color;
.admonition-title {
border-bottom-color: $background-color;
background-color: opacify($background-color, 0.15);
}
&.open .admonition-title {
background-color: $background-color;
}
i.icon {
color: $color;
}
}
@else {
&.#{$type} {
background-color: $background-color;
border-left-color: $color;
.admonition-title {
border-bottom-color: $background-color;
background-color: opacify($background-color, 0.15);
}
&.open .admonition-title {
background-color: $background-color;
}
i.icon {
color: $color;
}
}
}
}
&:last-child {
margin-bottom: 0.75rem;
}
}

View File

@ -0,0 +1,16 @@
.bilibili {
position: relative;
width: 100%;
height: 0;
padding-bottom: 75%;
margin: 3% auto;
text-align: center;
iframe {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
}
}

View File

@ -0,0 +1,99 @@
/**
* Card link style
* @author @Lruihao https://lruihao.cn
*/
.card-link {
position: relative;
display: block;
margin: 0.5rem auto;
box-sizing: border-box;
width: clamp(50%, 400px, 100%);
max-width: 100%;
overflow: hidden;
text-decoration: none;
border: none;
@include border-radius(0.75rem);
}
.cl- {
&backdrop {
position: absolute;
top: 0.75rem;
bottom: 0.75rem;
left: 0;
right: 0;
background-image: var(--cl-bg-url);
background-repeat: no-repeat;
filter: blur(0.5rem);
opacity: 0.5;
background-size: contain;
background-position: center;
}
&content {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.75rem;
background-color: rgba(245, 245, 245, 0.88);
}
&text {
overflow: hidden;
}
&title {
display: -webkit-box;
-webkit-line-clamp: 2;
overflow: hidden;
max-height: calc(1rem * 1.25 * 2);
font-size: 1rem;
font-weight: 500;
line-height: 1.25;
color: $global-font-color;
}
&meta {
display: flex;
align-items: center;
margin-top: 0.25rem;
font-size: 0.825rem;
color: $global-font-secondary-color;
}
&icon-link {
width: 1rem;
height: 1rem;
flex-shrink: 0;
margin-right: 0.25rem;
}
&url {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
&icon-globe {
width: 4rem;
height: 4rem;
flex-shrink: 0;
margin-left: 0.25rem;
}
[data-theme='dark'] & {
&content {
background-color: rgba(61, 62, 65, 0.88);
}
&title {
color: $global-font-color-dark;
}
&meta {
color: $global-font-secondary-color-dark;
}
}
}

View File

@ -0,0 +1,43 @@
.blockquote-center {
border-left: none;
margin: 40px 0;
padding: 0;
position: relative;
text-align: center;
color: initial;
&::after,
&::before {
left: 0;
line-height: 1;
opacity: 0.6;
position: absolute;
width: 100%;
}
&::before {
border-top: 1px solid $global-border-color;
text-align: left;
top: -20px;
content: '\f10d';
font-family: 'Font Awesome 5 Free';
font-weight: 900;
[data-theme='dark'] & {
border-top-color: $global-border-color-dark;
}
}
&::after {
border-bottom: 1px solid $global-border-color;
bottom: -20px;
text-align: right;
content: '\f10e';
font-family: 'Font Awesome 5 Free';
font-weight: 900;
[data-theme='dark'] & {
border-bottom-color: $global-border-color-dark;
}
}
}

View File

@ -0,0 +1,4 @@
.echarts {
margin: 0.5rem 0;
text-align: center;
}

View File

@ -0,0 +1,8 @@
@import '_admonition';
@import '_bilibili';
@import '_cardlink';
@import '_center-quote';
@import '_echarts';
@import '_instagram';
@import '_mapbox';
@import '_mermaid';

View File

@ -0,0 +1,5 @@
iframe.instagram-media {
[data-theme='dark'] & {
border: none !important;
}
}

View File

@ -0,0 +1,5 @@
.mapbox {
margin: 0.5rem 0;
padding: 0.5rem 0;
@include border-radius($global-border-radius);
}

View File

@ -0,0 +1,8 @@
.mermaid {
text-align: center;
svg {
max-width: 100%;
height: auto;
}
}

View File

@ -0,0 +1,171 @@
// ==============================
// Variables
// ==============================
// ========== Global ========== //
// Prefix for :root CSS variables.
$prefix: fi- !default;
// Font and Line Height
$global-font-family: system-ui, -apple-system, BlinkMacSystemFont, PingFang SC, Microsoft YaHei UI, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif !default;
$global-font-size: 16px !default;
$global-font-weight: 400 !default;
$global-line-height: 1.5rem !default;
// scroll-margin-top of content anchor
$global-scroll-margin-top: 0.5rem;
// Radius of the border
$global-border-radius: 5px !default;
// Color of the background
$global-background-color: #ffffff !default;
$global-background-color-dark: #221531 !default;
// Color of the text
$global-font-color: #161209 !default;
$global-font-color-dark: #a9a9b3 !default;
// Color of the secondary text
$global-font-secondary-color: #b1b1ba !default;
$global-font-secondary-color-dark: #909092 !default;
// Color of the link
$global-link-color: #ba0066 !default;
$global-link-color-dark: #EC008C !default;
// Color of the hover link
$global-link-hover-color: #EC008C !default; // 潮蓝
$global-link-hover-color-dark: #ba0066 !default;
// Color of the border
$global-border-color: #ba0066 !default;
$global-border-color-dark: #EC008C !default;
// ========== Global ========== //
// ========== Scrollbar ========== //
// Color of the scrollbar
$scrollbar-color: #ba0066 !default;
// Color of the hover scrollbar
$scrollbar-hover-color: #EC008C !default;
// ========== Scrollbar ========== //
// ========== Selection ========== //
// Color of the selected text
$selection-color: rgba(72.9, 0, 40, 0.4) !default;
$selection-color-dark: rgba(72.9, 0, 40, 0.4) !default;
// ========== Selection ========== //
// ========== Header ========== //
// Height of the header
$header-height: 3.5rem !default;
// Color of the header background
$header-background-color: #f8f8f8 !default;
$header-background-color-dark: #0d132c !default;
// Font style of the header title
$header-title-font-family: $global-font-family !default;
$header-title-font-size: 1.5rem !default;
// Color of the active menu item
$menu-active-color: #EC008C !default;
$menu-active-color-dark: #ba0066 !default;
// Color of the search background
$search-background-color: #e9e9e9 !default;
$search-background-color-dark: #2d333b !default;
// ========== Header ========== //
// ========== Tag Cloud ========== //
// Color range of tag cloud
$tag-cloud-start: $global-font-secondary-color!default;
$tag-cloud-end: $global-font-color!default;
$tag-cloud-start-dark: $global-font-secondary-color-dark!default;
$tag-cloud-end-dark: $global-font-color-dark!default;
// ========== Tag Cloud ========== //
// ========== Single Content ========== //
// Font size of the TOC
$toc-title-font-size: 1.2rem !default;
$toc-content-font-size: 1rem !default;
// Color of the single link
$single-link-color: #ba0066 !default; // 花青
$single-link-color-dark: #EC008C !default; // 釉蓝
// Color of the hover single link
$single-link-hover-color: #EC008C !default; // 莲瓣红
$single-link-hover-color-dark: #ba0066 !default; // 羽扇豆蓝
// Color of the table background
$table-background-color: #f6f8fa !default;
$table-background-color-dark: #0d132c !default;
// Color of the table thead
$table-thead-color: #EC008C !default;
$table-thead-color-dark: #0d132c !default;
// Color of the blockquote
$blockquote-color: #697681 !default;
$blockquote-color-dark: #2d333b !default;
// Color of reward
$reward-color: tomato !default;
$reward-color-dark: darken($reward-color, 5%) !default;
// Width of reward image
$reward-img-width: 180px !default;
// ========== Single Content ========== //
// ========== Pagination ========== //
// Color of the link in pagination
$pagination-link-color: #bfbfbf !default;
$pagination-link-color-dark: #b1b1ba !default;
// Color of the hover link in pagination
$pagination-link-hover-color: #ba0066 !default;
$pagination-link-hover-color-dark: #EC008C !default;
// ========== Pagination ========== //
// ========== Code ========== //
// Color of the code
$code-color: #24292f !default;
$code-color-dark: #adbac7 !default;
// Color of the code background
$code-background-color: #f6f8fa !default;
$code-background-color-dark: #0d132c !default;
$code-error-color: #dc3545 !default;
// Color of the hightlight code
$code-hightlight-color: #fff8c5 !default;
$code-hightlight-color-dark: rgba(174, 124, 20, 0.15) !default;
$code-info-color: #EC008C !default;
$code-info-color-dark: #ba0066 !default;
// Font size of the code
$code-font-size: 0.875rem !default;
// Font family of the code
$code-font-family: Source Code Pro, Menlo, Consolas, Monaco, monospace, $global-font-family !default;
// ========== Code ========== //
// ========== GitHub Corners ========== //
// Color of the GitHub Corners
$github-corner-color: white !default;
$github-corner-color-dark: black !default;
// Color of the GitHub Corners background
$github-corner-fill: $header-background-color-dark !default;
$github-corner-fill-dark: $header-background-color !default;
// ========== GitHub Corners ========== //
@import '_partials/_maps/admonition';
@import '_partials/_maps/code-highlight';
@import '_partials/_maps/code-type';
@import '_partials/_maps/colors';
@import '_partials/_maps/utilities';

View File

@ -0,0 +1,171 @@
// ==============================
// Variables
// ==============================
// ========== Global ========== //
// Prefix for :root CSS variables.
$prefix: fi- !default;
// Font and Line Height
$global-font-family: system-ui, -apple-system, BlinkMacSystemFont, PingFang SC, Microsoft YaHei UI, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Helvetica, Arial, sans-serif !default;
$global-font-size: 16px !default;
$global-font-weight: 400 !default;
$global-line-height: 1.5rem !default;
// scroll-margin-top of content anchor
$global-scroll-margin-top: 0.5rem;
// Radius of the border
$global-border-radius: 5px !default;
// Color of the background
$global-background-color: #ffffff !default;
$global-background-color-dark: #292a2e !default;
// Color of the text
$global-font-color: #161209 !default;
$global-font-color-dark: #b1b1ba !default;
// Color of the secondary text
$global-font-secondary-color: #b1b1ba !default;
$global-font-secondary-color-dark: #909092 !default;
// Color of the link
$global-link-color: #161209 !default;
$global-link-color-dark: #b1b1ba !default;
// Color of the hover link
$global-link-hover-color: #2983bb !default; // 潮蓝
$global-link-hover-color-dark: #fff !default;
// Color of the border
$global-border-color: #f0f0f0 !default;
$global-border-color-dark: #363636 !default;
// ========== Global ========== //
// ========== Scrollbar ========== //
// Color of the scrollbar
$scrollbar-color: #87878d !default;
// Color of the hover scrollbar
$scrollbar-hover-color: #b1b1ba !default;
// ========== Scrollbar ========== //
// ========== Selection ========== //
// Color of the selected text
$selection-color: rgba(53, 166, 247, 0.25) !default;
$selection-color-dark: rgba(50, 112, 194, 0.4) !default;
// ========== Selection ========== //
// ========== Header ========== //
// Height of the header
$header-height: 3.5rem !default;
// Color of the header background
$header-background-color: #f8f8f8 !default;
$header-background-color-dark: #252627 !default;
// Font style of the header title
$header-title-font-family: $global-font-family !default;
$header-title-font-size: 1.5rem !default;
// Color of the active menu item
$menu-active-color: #161209 !default;
$menu-active-color-dark: #fff !default;
// Color of the search background
$search-background-color: #e9e9e9 !default;
$search-background-color-dark: #363636 !default;
// ========== Header ========== //
// ========== Tag Cloud ========== //
// Color range of tag cloud
$tag-cloud-start: $global-font-secondary-color!default;
$tag-cloud-end: $global-font-color!default;
$tag-cloud-start-dark: $global-font-secondary-color-dark!default;
$tag-cloud-end-dark: $global-font-color-dark!default;
// ========== Tag Cloud ========== //
// ========== Single Content ========== //
// Font size of the TOC
$toc-title-font-size: 1.2rem !default;
$toc-content-font-size: 1rem !default;
// Color of the single link
$single-link-color: #2376b7 !default; // 花青
$single-link-color-dark: #1781b5 !default; // 釉蓝
// Color of the hover single link
$single-link-hover-color: #ea517f !default; // 莲瓣红
$single-link-hover-color-dark: #619ac3 !default; // 羽扇豆蓝
// Color of the table background
$table-background-color: #fff !default;
$table-background-color-dark: #272c34 !default;
// Color of the table thead
$table-thead-color: #ededed !default;
$table-thead-color-dark: #20252b !default;
// Color of the blockquote
$blockquote-color: #697681 !default;
$blockquote-color-dark: #9ba3aa !default;
// Color of reward
$reward-color: tomato !default;
$reward-color-dark: darken($reward-color, 5%) !default;
// Width of reward image
$reward-img-width: 180px !default;
// ========== Single Content ========== //
// ========== Pagination ========== //
// Color of the link in pagination
$pagination-link-color: #bfbfbf !default;
$pagination-link-color-dark: #b1b1ba !default;
// Color of the hover link in pagination
$pagination-link-hover-color: #000 !default;
$pagination-link-hover-color-dark: #fff !default;
// ========== Pagination ========== //
// ========== Code ========== //
// Color of the code
$code-color: #24292f !default;
$code-color-dark: #adbac7 !default;
// Color of the code background
$code-background-color: #f6f8fa !default;
$code-background-color-dark: #2d333b !default;
$code-error-color: #dc3545 !default;
// Color of the hightlight code
$code-hightlight-color: #fff8c5 !default;
$code-hightlight-color-dark: rgba(174, 124, 20, 0.15) !default;
$code-info-color: #9c9c9c !default;
$code-info-color-dark: #b1b0b0 !default;
// Font size of the code
$code-font-size: 0.875rem !default;
// Font family of the code
$code-font-family: Source Code Pro, Menlo, Consolas, Monaco, monospace, $global-font-family !default;
// ========== Code ========== //
// ========== GitHub Corners ========== //
// Color of the GitHub Corners
$github-corner-color: white !default;
$github-corner-color-dark: black !default;
// Color of the GitHub Corners background
$github-corner-fill: $header-background-color-dark !default;
$github-corner-fill-dark: $header-background-color !default;
// ========== GitHub Corners ========== //
@import '_partials/_maps/admonition';
@import '_partials/_maps/code-highlight';
@import '_partials/_maps/code-type';
@import '_partials/_maps/colors';
@import '_partials/_maps/utilities';

View File

@ -0,0 +1,13 @@
@charset "utf-8";
@import "_variables";
@import "_override";
@import "_mixin/index";
@import "_core/root";
@import "_core/base";
@import "_core/layout";
@import "_core/common";
@import "_core/patch";
@import "_page";
@import "_core/media";
@import "_custom";

View File

@ -0,0 +1,87 @@
# Tips: remove sourceMappingURL of local libraries to avoid source map 404 error.
# See https://github.com/hugo-fixit/FixIt/issues/67
prefix:
libFiles: https://cdn.jsdelivr.net/npm/
# simple-icons@7.12.0 https://github.com/simple-icons/simple-icons
simpleIcons: https://cdn.jsdelivr.net/npm/simple-icons@7.12.0/icons/
libFiles:
# algoliasearch@4.14.2 https://github.com/algolia/algoliasearch-client-javascript
algoliasearchJS: algoliasearch@4.14.2/dist/algoliasearch-lite.umd.min.js
# animate.css@4.1.1 https://github.com/daneden/animate.css
animateCSS: animate.css@4.1.1/animate.min.css
# aplayer@1.10.1 https://github.com/MoePlayer/APlayer
aplayerCSS: aplayer@1.10.1/dist/APlayer.min.css
aplayerJS: aplayer@1.10.1/dist/APlayer.min.js
# artalk@2.5.2 https://github.com/ArtalkJS/Artalk
artalkCSS: artalk@2.5.2/dist/Artalk.css
artalkJS: artalk@2.5.2/dist/Artalk.js
# autocomplete-js@0.38.1 https://github.com/algolia/autocomplete
# TODO update autocompleteJS: '@algolia/autocomplete-js@1.7.1/dist/umd/index.production.js'
autocompleteJS: autocomplete.js@0.38.1/dist/autocomplete.min.js
# cell-watermark@1.0.3 https://github.com/Lruihao/watermark
cellWatermarkJS: cell-watermark@1.0.3/src/watermark.min.js
# cookieconsent@3.1.1 https://github.com/osano/cookieconsent
cookieconsentCSS: cookieconsent@3.1.1/build/cookieconsent.min.css
cookieconsentJS: cookieconsent@3.1.1/build/cookieconsent.min.js
# crypto-js@4.1.1 https://github.com/brix/crypto-js
cryptoCoreJS: crypto-js@4.1.1/core.js
cryptoEncBase64JS: crypto-js@4.1.1/enc-base64.js
cryptoMd5JS: crypto-js@4.1.1/md5.js
cryptoSha256JS: crypto-js@4.1.1/sha256.js
# echarts@5.3.3 https://github.com/apache/echarts
echartsJS: echarts@5.3.3/dist/echarts.min.js
# eruda@2.5.0 https://github.com/liriliri/eruda
erudaJS: eruda@2.5.0/eruda.js
# fontawesome-free@6.2.0 https://github.com/FortAwesome/Font-Awesome
fontawesomeFreeCSS: '@fortawesome/fontawesome-free@6.2.0/css/all.min.css'
# fusejs@6.6.2 https://github.com/krisk/fuse
fuseJS: fuse.js@6.6.2/dist/fuse.min.js
# gitalk@1.7.2 https://github.com/gitalk/gitalk
gitalkCSS: gitalk@1.7.2/dist/gitalk.min.css
gitalkJS: gitalk@1.7.2/dist/gitalk.min.js
# instant.page@5.1.1 https://github.com/instantpage/instant.page
instantPage: instant.page@5.1.1/instantpage.min.js
# katex@0.16.2 https://github.com/KaTeX/KaTeX
katexAutoRenderJS: katex@0.16.2/dist/contrib/auto-render.min.js
katexCopyTexJS: katex@0.16.2/dist/contrib/copy-tex.min.js
katexCSS: katex@0.16.2/dist/katex.min.css
katexJS: katex@0.16.2/dist/katex.min.js
katexMhchemJS: katex@0.16.2/dist/contrib/mhchem.min.js
# lightgallery@2.6.1 https://github.com/sachinchoolur/lightgallery
lightgalleryCSS: lightgallery@2.6.1/css/lightgallery-bundle.min.css
lightgalleryJS: lightgallery@2.6.1/lightgallery.min.js
lightgalleryThumbnailJS: lightgallery@2.6.1/plugins/thumbnail/lg-thumbnail.min.js
lightgalleryZoomJS: lightgallery@2.6.1/plugins/zoom/lg-zoom.min.js
# lunr.js@2.3.9 https://github.com/olivernn/lunr.js
lunrJS: lunr@2.3.9/lunr.min.js
# mapbox-gl@2.10.0 https://docs.mapbox.com/mapbox-gl-js
mapboxGLCSS: mapbox-gl@2.10.0/dist/mapbox-gl.css
mapboxGLJS: mapbox-gl@2.10.0/dist/mapbox-gl.js
# mermaid@9.4.3 https://github.com/mermaid-js/mermaid
# TODO bump Mermaid from 9.x to 10.x
mermaidJS: mermaid@9.4.3/dist/mermaid.min.js
# meting@2.0.1 https://github.com/metowolf/MetingJS
metingJS: meting@2.0.1/dist/Meting.min.js
# object-fit-images@3.2.4 https://github.com/fregante/object-fit-images
objectFitImagesJS: object-fit-images@3.2.4/dist/ofi.min.js
# pangu.js@4.0.7 https://github.com/vinta/pangu.js
panguJS: pangu@4.0.7/dist/browser/pangu.min.js
# pace-js@1.2.4 https://github.com/CodeByZach/pace
paceJS: pace-js@1.2.4
# sharer.js@0.4.2 https://github.com/ellisonleao/sharer.js
sharerJS: sharer.js@0.5.1/sharer.min.js
# twemoji@13.1.0 https://github.com/twitter/twemoji
twemojiJS: twemoji@14.0.2/dist/twemoji.min.js
# twikoo@1.6.8 https://github.com/imaegoo/twikoo
twikooJS: twikoo@1.6.8/dist/twikoo.all.min.js
# typeit@8.7.1 https://github.com/alexmacarthur/typeit
typeitJS: typeit@8.7.1/dist/index.umd.js
# valine@1.5.1 https://github.com/xCss/Valine
valineJS: valine@1.5.1/dist/Valine.min.js
# vconsole@3.14.6 https://github.com/Tencent/vConsole
vconsoleJS: vconsole@3.14.6/dist/vconsole.min.js
# waline@2.14.7 https://github.com/walinejs/waline
walineCSS: '@waline/client@2.14.7/dist/waline.css'
walineJS: '@waline/client@2.14.7/dist/waline.js'

View File

@ -0,0 +1,87 @@
# Tips: remove sourceMappingURL of local libraries to avoid source map 404 error.
# See https://github.com/hugo-fixit/FixIt/issues/67
prefix:
libFiles: https://unpkg.com/
# simple-icons@7.12.0 https://github.com/simple-icons/simple-icons
simpleIcons: https://unpkg.com/simple-icons@7.12.0/icons/
libFiles:
# algoliasearch@4.14.2 https://github.com/algolia/algoliasearch-client-javascript
algoliasearchJS: algoliasearch@4.14.2/dist/algoliasearch-lite.umd.js
# animate.css@4.1.1 https://github.com/daneden/animate.css
animateCSS: animate.css@4.1.1/animate.min.css
# aplayer@1.10.1 https://github.com/MoePlayer/APlayer
aplayerCSS: aplayer@1.10.1/dist/APlayer.min.css
aplayerJS: aplayer@1.10.1/dist/APlayer.min.js
# artalk@2.5.2 https://github.com/ArtalkJS/Artalk
artalkCSS: artalk@2.5.2/dist/Artalk.css
artalkJS: artalk@2.5.2/dist/Artalk.js
# autocomplete-js@0.38.1 https://github.com/algolia/autocomplete
# TODO update autocompleteJS: '@algolia/autocomplete-js@1.7.1/dist/umd/index.production.js'
autocompleteJS: autocomplete.js@0.38.1/dist/autocomplete.min.js
# cell-watermark@1.0.3 https://github.com/Lruihao/watermark
cellWatermarkJS: cell-watermark@1.0.3/src/watermark.min.js
# cookieconsent@3.1.1 https://github.com/osano/cookieconsent
cookieconsentCSS: cookieconsent@3.1.1/build/cookieconsent.min.css
cookieconsentJS: cookieconsent@3.1.1/build/cookieconsent.min.js
# crypto-js@4.1.1 https://github.com/brix/crypto-js
cryptoCoreJS: crypto-js@4.1.1/core.js
cryptoEncBase64JS: crypto-js@4.1.1/enc-base64.js
cryptoMd5JS: crypto-js@4.1.1/md5.js
cryptoSha256JS: crypto-js@4.1.1/sha256.js
# echarts@5.3.3 https://github.com/apache/echarts
echartsJS: echarts@5.3.3/dist/echarts.min.js
# eruda@2.5.0 https://github.com/liriliri/eruda
erudaJS: eruda@2.5.0/eruda.js
# fontawesome-free@6.2.0 https://github.com/FortAwesome/Font-Awesome
fontawesomeFreeCSS: '@fortawesome/fontawesome-free@6.2.0/css/all.min.css'
# fusejs@6.6.2 https://github.com/krisk/fuse
fuseJS: fuse.js@6.6.2/dist/fuse.min.js
# gitalk@1.7.2 https://github.com/gitalk/gitalk
gitalkCSS: gitalk@1.7.2/dist/gitalk.min.css
gitalkJS: gitalk@1.7.2/dist/gitalk.min.js
# instant.page@5.1.1 https://github.com/instantpage/instant.page
instantPage: instant.page@5.1.1/instantpage.js
# katex@0.16.2 https://github.com/KaTeX/KaTeX
katexAutoRenderJS: katex@0.16.2/dist/contrib/auto-render.min.js
katexCopyTexJS: katex@0.16.2/dist/contrib/copy-tex.min.js
katexCSS: katex@0.16.2/dist/katex.min.css
katexJS: katex@0.16.2/dist/katex.min.js
katexMhchemJS: katex@0.16.2/dist/contrib/mhchem.min.js
# lightgallery@2.6.1 https://github.com/sachinchoolur/lightgallery
lightgalleryCSS: lightgallery@2.6.1/css/lightgallery-bundle.min.css
lightgalleryJS: lightgallery@2.6.1/lightgallery.min.js
lightgalleryThumbnailJS: lightgallery@2.6.1/plugins/thumbnail/lg-thumbnail.min.js
lightgalleryZoomJS: lightgallery@2.6.1/plugins/zoom/lg-zoom.min.js
# lunr.js@2.3.9 https://github.com/olivernn/lunr.js
lunrJS: lunr@2.3.9/lunr.min.js
# mapbox-gl@2.10.0 https://docs.mapbox.com/mapbox-gl-js
mapboxGLCSS: mapbox-gl@2.10.0/dist/mapbox-gl.css
mapboxGLJS: mapbox-gl@2.10.0/dist/mapbox-gl.js
# mermaid@9.4.3 https://github.com/mermaid-js/mermaid
# TODO bump Mermaid from 9.x to 10.x
mermaidJS: mermaid@9.4.3/dist/mermaid.min.js
# meting@2.0.1 https://github.com/metowolf/MetingJS
metingJS: meting@2.0.1/dist/Meting.min.js
# object-fit-images@3.2.4 https://github.com/fregante/object-fit-images
objectFitImagesJS: object-fit-images@3.2.4/dist/ofi.min.js
# pangu.js@4.0.7 https://github.com/vinta/pangu.js
panguJS: pangu@4.0.7/dist/browser/pangu.min.js
# pace-js@1.2.4 https://github.com/CodeByZach/pace
paceJS: pace-js@1.2.4
# sharer.js@0.4.2 https://github.com/ellisonleao/sharer.js
sharerJS: sharer.js@0.5.1/sharer.min.js
# twemoji@13.1.0 https://github.com/twitter/twemoji
twemojiJS: twemoji@14.0.2/dist/twemoji.min.js
# twikoo@1.6.8 https://github.com/imaegoo/twikoo
twikooJS: twikoo@1.6.8/dist/twikoo.all.min.js
# typeit@8.7.1 https://github.com/alexmacarthur/typeit
typeitJS: typeit@8.7.1/dist/index.umd.js
# valine@1.5.1 https://github.com/xCss/Valine
valineJS: valine@1.5.1/dist/Valine.min.js
# vconsole@3.14.6 https://github.com/Tencent/vConsole
vconsoleJS: vconsole@3.14.6/dist/vconsole.min.js
# waline@2.14.7 https://github.com/walinejs/waline
walineCSS: '@waline/client@2.14.7/dist/waline.css'
walineJS: '@waline/client@2.14.7/dist/waline.js'

View File

@ -0,0 +1,18 @@
theme:
- html5shiv
- Object.values
- Promise
- fetch
- Element.prototype.after
algoliasearch:
- Promise
- Object.entries
- Object.assign
TypeIt:
- Array.prototype.fill
- Array.prototype.find
- Array.from
- IntersectionObserver
- Math.sign
- Object.assign
- Promise

View File

@ -0,0 +1,699 @@
# 001: Github
github:
Weight: 1
Prefix: https://github.com/
Title: GitHub
Icon:
Class: fa-brands fa-github-alt fa-fw
# 002: LinkedIn
linkedin:
Weight: 2
Prefix: https://linkedin.com/in/
Title: LinkedIn
Icon:
Class: fa-brands fa-linkedin fa-fw
# 003: Twitter
twitter:
Weight: 5
Prefix: https://twitter.com/
Title: Twitter
Icon:
Src: svg/icons/x.svg
# 004: Instagram
instagram:
Weight: 4
Prefix: https://www.instagram.com/
Title: Instagram
Icon:
Class: fa-brands fa-instagram fa-fw
# 005: facebook
facebook:
Weight: 5
Prefix: https://facebook.com/
Title: facebook
Icon:
Class: fa-brands fa-facebook fa-fw
# 006: Telegram
telegram:
Weight: 6
Prefix: https://t.me/
Title: Telegram
Icon:
Class: fa-brands fa-telegram-plane fa-fw
# 007: Medium
medium:
Weight: 7
Prefix: https://medium.com/
Title: Medium
Icon:
Class: fa-brands fa-medium fa-fw
# 008: GitLab
gitlab:
Weight: 8
Prefix: https://gitlab.com/
Title: GitLab
Icon:
Class: fa-brands fa-gitlab fa-fw
# 009: YouTube Legacy
youtubelegacy:
Weight: 9
Prefix: https://www.youtube.com/user/
Title: YouTube
Icon:
Class: fa-brands fa-youtube fa-fw
# 010: YouTube Custom
youtubecustom:
Weight: 10
Prefix: https://www.youtube.com/c/
Title: YouTube
Icon:
Class: fa-brands fa-youtube fa-fw
# 011: YouTube Channel
youtubechannel:
Weight: 11
Prefix: https://www.youtube.com/channel/
Title: YouTube
Icon:
Class: fa-brands fa-youtube fa-fw
# 012: Tumblr
tumblr:
Weight: 12
Template: https://%v.tumblr.com/
Title: Tumblr
Icon:
Class: fa-brands fa-tumblr fa-fw
# 013: Quora
quora:
Weight: 13
Prefix: https://www.quora.com/profile/
Title: Quora
Icon:
Class: fa-brands fa-quora fa-fw
# 014: Keybase
keybase:
Weight: 14
Prefix: https://keybase.io/
Title: Keybase
Icon:
Class: fa-brands fa-keybase fa-fw
# 015: Pinterest
pinterest:
Weight: 15
Prefix: https://www.pinterest.com/
Title: Pinterest
Icon:
Class: fa-brands fa-pinterest fa-fw
# 016: Reddit
reddit:
Weight: 16
Prefix: https://www.reddit.com/user/
Title: Reddit
Icon:
Class: fa-brands fa-reddit fa-fw
# 017: CodePen
codepen:
Weight: 17
Prefix: https://codepen.io/
Title: CodePen
Icon:
Class: fa-brands fa-codepen fa-fw
# 018: freeCodeCamp
freecodecamp:
Weight: 18
Prefix: https://freecodecamp.org/
Title: freeCodeCamp
Icon:
Class: fa-brands fa-free-code-camp fa-fw
# 019: Bitbucket
bitbucket:
Weight: 19
Prefix: https://bitbucket.org/
Title: Bitbucket
Icon:
Class: fa-brands fa-bitbucket fa-fw
# 020: Stack Overflow
stackoverflow:
Weight: 20
Prefix: https://stackoverflow.com/users/
Title: Stack Overflow
Icon:
Class: fa-brands fa-stack-overflow fa-fw
# 021: 微博
weibo:
Weight: 21
Prefix: https://weibo.com/
Title: 微博
Icon:
Class: fa-brands fa-weibo fa-fw
# 022: OK.RU
odnoklassniki:
Weight: 22
Prefix: https://ok.ru/
Title: OK.RU
Icon:
Class: fa-brands fa-odnoklassniki fa-fw
# 023: VK
vk:
Weight: 23
Prefix: https://vk.com/
Title: VK
Icon:
Class: fa-brands fa-vk fa-fw
# 024: Flickr
flickr:
Weight: 24
Prefix: https://www.flickr.com/photos/
Title: Flickr
Icon:
Class: fa-brands fa-flickr fa-fw
# 025: Xing
xing:
Weight: 25
Prefix: https://www.xing.com/profile/
Title: Xing
Icon:
Class: fa-brands fa-xing fa-fw
# 026: Snapchat
snapchat:
Weight: 26
Prefix: https://www.snapchat.com/add/
Title: Snapchat
Icon:
Class: fa-brands fa-snapchat fa-fw
# 027: SoundCloud
soundcloud:
Weight: 27
Prefix: https://soundcloud.com/
Title: SoundCloud
Icon:
Class: fa-brands fa-soundcloud fa-fw
# 028: Spotify
spotify:
Weight: 28
Prefix: https://open.spotify.com/user/
Title: Spotify
Icon:
Class: fa-brands fa-spotify fa-fw
# 029: Bandcamp
bandcamp:
Weight: 29
Template: https://%v.bandcamp.com/
Title: Bandcamp
Icon:
Class: fa-brands fa-bandcamp fa-fw
# 030: PayPal
paypal:
Weight: 30
Prefix: https://paypal.me/
Title: PayPal
Icon:
Class: fa-brands fa-paypal fa-fw
# 031: 500px
fivehundredpx:
Weight: 31
Prefix: https://500px.com/
Title: 500px
Icon:
Class: fa-brands fa-500px fa-fw
# 032: Mix
mix:
Weight: 32
Prefix: https://mix.com/
Title: Mix
Icon:
Class: fa-brands fa-mix fa-fw
# 033: Goodreads
goodreads:
Weight: 33
Prefix: https://www.goodreads.com/user/show/
Title: Goodreads
Icon:
Class: fa-brands fa-goodreads fa-fw
# 034: Last.fm
lastfm:
Weight: 34
Prefix: https://www.last.fm/user/
Title: Last.fm
Icon:
Class: fa-brands fa-lastfm fa-fw
# 035: Foursquare
foursquare:
Weight: 35
Prefix: https://foursquare.com/
Title: Foursquare
Icon:
Class: fa-brands fa-foursquare fa-fw
# 036: Hacker News
hackernews:
Weight: 36
Template: https://news.ycombinator.com/user?id=%v
Title: Hacker News
Icon:
Class: fa-brands fa-hacker-news fa-fw
# 037: Kickstarter
kickstarter:
Weight: 37
Prefix: https://kickstarter.com/profile/
Title: Kickstarter
Icon:
Class: fa-brands fa-kickstarter fa-fw
# 038: Patreon
patreon:
Weight: 38
Prefix: https://patreon.com/
Title: Patreon
Icon:
Class: fa-brands fa-patreon fa-fw
# 039: Steam
steam:
Weight: 39
Prefix: https://steamcommunity.com/id/
Title: Steam
Icon:
Class: fa-brands fa-steam fa-fw
# 040: Twitch
twitch:
Weight: 40
Prefix: https://www.twitch.tv/
Title: Twitch
Icon:
Class: fa-brands fa-twitch fa-fw
# 041: Strava
strava:
Weight: 41
Prefix: https://www.strava.com/athletes/
Title: Strava
Icon:
Class: fa-brands fa-strava fa-fw
# 042: Skype
skype:
Weight: 42
Template: "skype:"
Title: Skype
Icon:
Class: fa-brands fa-skype fa-fw
# 043: WhatsApp
whatsapp:
Weight: 43
Prefix: https://wa.me/
Title: WhatsApp
Icon:
Class: fa-brands fa-whatsapp fa-fw
# 044: 知乎
zhihu:
Weight: 44
Prefix: https://www.zhihu.com/people/
Title: 知乎
Icon:
Class: fa-brands fa-zhihu fa-fw
# 045: 豆瓣
douban:
Weight: 45
Prefix: https://www.douban.com/people/
Title: 豆瓣
Icon:
Simpleicons: douban
# 046: Angellist
angellist:
Weight: 46
Prefix: https://angel.co/
Title: Angellist
Icon:
Class: fa-brands fa-angellist fa-fw
# 047: SlideShare
slideshare:
Weight: 47
Prefix: https://slideshare.com/
Title: SlideShare
Icon:
Class: fa-brands fa-slideshare fa-fw
# 048: JSFiddle
jsfiddle:
Weight: 48
Prefix: https://jsfiddle.com/
Title: JSFiddle
Icon:
Class: fa-brands fa-jsfiddle fa-fw
# 049: DeviantArt
deviantart:
Weight: 49
Template: https://%v.deviantart.com/
Title: DeviantArt
Icon:
Class: fa-brands fa-deviantart fa-fw
# 050: Behance
behance:
Weight: 50
Prefix: https://behance.net/
Title: Behance
Icon:
Class: fa-brands fa-behance fa-fw
# 051: Dribbble
dribbble:
Weight: 51
Prefix: https://dribbble.com/
Title: Dribbble
Icon:
Class: fa-brands fa-dribbble fa-fw
# 052: WordPress
wordpress:
Weight: 52
Template: https://%v.wordpress.com/
Title: WordPress
Icon:
Class: fa-brands fa-wordpress fa-fw
# 053: Vine
vine:
Weight: 53
Prefix: https://vine.co/
Title: Vine
Icon:
Class: fa-brands fa-vine fa-fw
# 054: Google Scholar
googlescholar:
Weight: 54
Template: https://scholar.google.com/citations?%v
Title: Google Scholar
Icon:
Simpleicons: googlescholar
# 055: ResearchGate
researchgate:
Weight: 55
Prefix: https://www.researchgate.net/profile/
Title: ResearchGate
Icon:
Class: fa-brands fa-researchgate fa-fw
# 056: Mastodon
mastodon:
Weight: 2
Prefix: https://fosstodon.org/
Title: Mastodon
Icon:
Class: fa-brands fa-mastodon fa-fw
# 057: Thingiverse
thingiverse:
Weight: 57
Prefix: https://www.thingiverse.com/
Title: Thingiverse
Icon:
Simpleicons: thingiverse
# 058: Dev.To
devto:
Weight: 58
Prefix: https://dev.to/
Title: Dev.To
Icon:
Class: fa-brands fa-dev fa-fw
# 059: Gitea
gitea:
Weight: 59
Title: Gitea
Icon:
Simpleicons: gitea
# 060: XMPP
xmpp:
Weight: 60
Template: xmpp:%v
Title: XMPP
Icon:
Simpleicons: xmpp
# 061: Matrix
matrix:
Weight: 1
Prefix: https://matrix.to/#/
Title: Matrix
Icon:
Simpleicons: matrix
# 062: bilibili
bilibili:
Weight: 62
Prefix: https://space.bilibili.com/
Title: bilibili
Icon:
Class: fa-brands fa-bilibili
# 063: ORCID
orcid:
Weight: 63
Prefix: https://orcid.org/
Title: ORCID
Icon:
Class: fa-brands fa-orcid fa-fw
# 064 Liberapay
liberapay:
Weight: 64
Prefix: https://liberapay.com/
Title: Liberapay
Icon:
Simpleicons: liberapay
# 065 Ko-Fi
ko-fi:
Weight: 65
Prefix: https://ko-fi.com/
Title: Ko-Fi
Icon:
Simpleicons: kofi
# 066: BuyMeaCoffee
buymeacoffee:
Weight: 66
Prefix: https://www.buymeacoffee.com/
Title: BuyMeaCoffee
Icon:
Simpleicons: buymeacoffee
# 067: Linktree
linktree:
Weight: 67
Prefix: https://links.m3tam3re.com
Title: All My Links
Icon:
Class: fa-solid fa-square-share-nodes
# 068: QQ
qq:
Weight: 68
Template: https://wpa.qq.com/msgrd?v=3&uin=%v&site=qq&menu=yes
Title: QQ
Icon:
Simpleicons: tencentqq
# 069: QQ Group
qqgroup:
Weight: 69
Template: https://qm.qq.com/cgi-bin/qm/qr?k=%v&jump_from=webapi
Title: QQ Group
Icon:
Class: fa-solid fa-users
# 070: Diaspora
diaspora:
Weight: 70
Title: diaspora*
Icon:
Simpleicons: diaspora
# 071: CSDN
csdn:
Weight: 71
Prefix: https://blog.csdn.net/
Title: CSDN
Icon:
Src: svg/icons/csdn.svg
# 072: Discord User Profile / Revolt
discord:
Weight: 72
Prefix: https://discordapp.com/users/
Title: Discord
Icon:
Class: fa-brands fa-discord fa-fw
# 073: Discord Server Invite Link
discordinvite:
Weight: 73
Prefix: https://discord.gg/
Title: Discord
Icon:
Class: fa-brands fa-discord fa-fw
# 074: Lichess user profile
lichess:
Weight: 74
Prefix: https://lichess.org/@/
Title: Lichess
Icon:
Simpleicons: lichess
# 075: Pleroma
pleroma:
Weight: 75
Title: Pleroma
Icon:
Simpleicons: pleroma
# 076: Kaggle
kaggle:
Weight: 76
Prefix: https://kaggle.com/
Title: Kaggle
Icon:
Class: fa-brands fa-kaggle fa-fw
# 077: MediaWiki
mediawiki:
Weight: 77
Title: MediaWiki
Icon:
Class: fa-brands fa-wikipedia-w fa-fw
# 078: Plume
plume:
Weight: 78
Title: Plume
Icon:
Src: svg/icons/plume.svg
# 079: Hack The Box
hackthebox:
Weight: 79
Title: Hack The Box
Prefix: https://app.hackthebox.com/users/
Icon:
Simpleicons: hackthebox
# 080: Root-Me
rootme:
Weight: 80
Title: Root-Me
Prefix: https://www.root-me.org/
Icon:
Src: svg/icons/rootme.svg
# 081: Feishu
feishu:
Weight: 81
Title: Feishu
Template: https://www.feishu.cn/invitation/page/add_contact/?token=%v
Icon:
Class: fa-solid fa-dove
# 082: TryHackMe
tryhackme:
Weight: 82
Title: TryHackMe
Prefix: https://tryhackme.com/p/
Icon:
Simpleicons: tryhackme
# 083 douyin
douyin:
Weight: 83
Title: 抖音
Prefix: https://www.douyin.com/user/
Icon:
Class: fa-brands fa-tiktok
# 084 TikTok
tiktok:
Weight: 84
Title: TikTok
Prefix: https://www.tiktok.com/
Icon:
Class: fa-brands fa-tiktok
# 085 Revolt Server Invite
revoltinvite:
Weight: 3
Prefix: https://rvlt.gg/
Title: Revolt
Icon:
Simpleicons: revoltdotchat
# Phone
phone:
Weight: 997
Template: tel:%v
Title: Phone
Icon:
Class: fa-solid fa-phone fa-fw
# Email
email:
Weight: 998
Template: mailto:%v
Title: Email
Icon:
Class: fa-regular fa-envelope fa-fw
# RSS
rss:
Weight: 999
Url: /index.xml
Title: RSS
Newtab: true
Icon:
Class: fa-solid fa-rss fa-fw

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" version="1.1"><defs><style>.fixit-ban{opacity:.9;}</style></defs><path d="M159.12 338.69l24.8-16.54a78.87 78.87 0 0 1-6.77-22.72l-30.88 4.41a16 16 0 0 1-4.54-31.68l34.27-4.9v-.76l98.94 98.95a76.89 76.89 0 0 1-71.68-17.73l-26.39 17.59c-.15.11-.31.21-.47.31a16 16 0 0 1-17.28-26.93zm224.72-48.42a16 16 0 0 0-13.57-18.11l-34.27-4.9V244.9l34.27-4.9a16 16 0 1 0-4.54-31.68l-30.54 4.36a79.31 79.31 0 0 0-6.85-22.85l24.54-16.36a16 16 0 1 0-17.29-26.93l-.46.31-26 17.34a79.9 79.9 0 0 0-102.64-3l139.83 139.88 19.41 2.77a16 16 0 0 0 18.11-13.57z" fill="#358C3C" class="fixit-bug"/><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 432c-101.46 0-184-82.54-184-184a182.84 182.84 0 0 1 33.38-105.37l256 256A182.86 182.86 0 0 1 256 440zm150.62-78.63l-256-256A182.84 182.84 0 0 1 256 72c101.46 0 184 82.54 184 184a182.84 182.84 0 0 1-33.38 105.37z" fill="#FF6347" class="fixit-ban"/></svg>

After

Width:  |  Height:  |  Size: 968 B

View File

@ -0,0 +1,35 @@
/**
* Custom javascript for FixIt site.
* @author @Lruihao https://lruihao.cn
*/
const FixItCustom = new (function () {
/**
* Hello World
* You can define your own functions below.
* @returns {FixItCustom}
*/
this.hello = () => {
console.log('FixItCustom echo: Hello FixIt!');
return this;
};
/**
* Initialize.
* @returns {FixItCustom}
*/
this.init = () => {
// Custom infos.
this.hello();
return this;
};
})();
/**
* Immediate.
*/
(() => {
FixItCustom.init();
// It will be executed when the DOM tree is built.
document.addEventListener('DOMContentLoaded', () => {
// FixItCustom.init();
});
})();

View File

@ -0,0 +1,223 @@
/**
* FixIt decryptor for encrypted pages and fixit-encryptor shortcode
* @param {Object} options
* @param {Function} [options.decrypted] [Lifecycle Hooks] handler after decrypting
* @param {Function} [options.reset] [Lifecycle Hooks] handler after encrypting again
* @param {Number} [options.duration=86400] number of seconds to cache decryption statistics. unit: s
* @author @Lruihao https://lruihao.cn
* @since v0.2.15
*/
FixItDecryptor = function (options = {}) {
var _proto = FixItDecryptor.prototype;
this.options = options || {};
this.options.duration = this.options.duration || 24 * 60 * 60; // default cache one day
this.decryptedEventSet = new Set();
this.resetEventSet = new Set();
this.$el = document.querySelector('.fixit-decryptor-container');
/**
* decrypt content
* @param {String} base64EncodeContent encrypted content
*/
var _decryptContent = (base64EncodeContent) => {
try {
this.$el.querySelector('.fixit-decryptor-loading').classList.add('d-none');
this.$el.querySelector('#fixit-decryptor-input').classList.add('d-none');
this.$el.querySelector('.fixit-encryptor-btn').classList.remove('d-none');
document.querySelector('#content').insertAdjacentHTML(
'afterbegin',
CryptoJS.enc.Base64.parse(base64EncodeContent).toString(CryptoJS.enc.Utf8)
);
} catch (err) {
return console.error(err);
}
// decrypted hook
console.log(this.decryptedEventSet)
for (const event of this.decryptedEventSet) {
event();
}
};
/**
* initialize FixIt decryptor
*/
_proto.init = () => {
this.addEventListener('decrypted', this.options?.decrypted);
this.addEventListener('reset', this.options?.reset);
this.validateCache();
const _decryptor = this;
this.$el.querySelector('#fixit-decryptor-input')?.addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
e.preventDefault();
const $content = document.querySelector('#content');
const password = $content.getAttribute('data-password');
const input = this.value.trim();
const saltLen = input.length % 2 ? input.length : input.length + 1;
const inputMd5 = CryptoJS.MD5(input).toString();
const inputSha256 = CryptoJS.SHA256(input).toString();
this.value = '';
this.blur();
if (!input) {
alert('Please enter the correct password!');
return console.warn('Please enter the correct password!');
}
if (inputMd5 !== password) {
alert(`Password error: ${input} not the correct password!`);
return console.warn(`Password error: ${input} not the correct password!`);
}
// cache decryption statistics
window.localStorage?.setItem(
`fixit-decryptor/#${location.pathname}`,
JSON.stringify({
expiration: Math.ceil(Date.now() / 1000) + _decryptor.options.duration,
md5: inputMd5,
sha256: inputSha256.slice(saltLen)
})
);
_decryptContent($content.getAttribute('data-content').replace(inputSha256.slice(saltLen), ''));
}
});
this.$el.querySelector('.fixit-encryptor-btn')?.addEventListener('click', function (e) {
e.preventDefault();
this.classList.add('d-none')
_decryptor.$el.querySelector('#fixit-decryptor-input').classList.remove('d-none');
document.querySelector('#content').innerHTML = '';
document.querySelector('#content').insertAdjacentElement(
'afterbegin',
_decryptor.$el
);
window.localStorage?.removeItem(`fixit-decryptor/#${location.pathname}`);
// reset hook
for (const event of _decryptor.resetEventSet) {
event();
}
});
};
/**
* initialize fixit-encryptor shortcodes
*/
_proto.initShortcodes = () => {
// TODO TODO shortcode decrypted event
// this.addEventListener('decrypted', this.options?.decrypted);
const _decryptor = this;
const $shortcodes = document.querySelectorAll('fixit-encryptor:not(.decrypted)');
$shortcodes.forEach($shortcode => {
$shortcode.querySelector('.fixit-decryptor-input')?.addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
e.preventDefault();
const $decryptor = this.parentElement.parentElement;
const $content = $decryptor.nextElementSibling;
const password = $content.getAttribute('data-password');
const input = this.value.trim();
const saltLen = input.length % 2 ? input.length : input.length + 1;
const inputMd5 = CryptoJS.MD5(input).toString();
const inputSha256 = CryptoJS.SHA256(input).toString();
this.value = '';
this.blur();
if (!input) {
alert('Please enter the correct password!');
return console.warn('Please enter the correct password!');
}
if (inputMd5 !== password) {
alert(`Password error: ${input} not the correct password!`);
return console.warn(`Password error: ${input} not the correct password!`);
}
try {
const base64EncodeContent = $content.getAttribute('data-content').replace(inputSha256.slice(saltLen), '');
$decryptor.querySelector('.fixit-decryptor-input').classList.add('d-none');
$content.insertAdjacentHTML(
'afterbegin',
CryptoJS.enc.Base64.parse(base64EncodeContent).toString(CryptoJS.enc.Utf8)
);
$decryptor.parentElement.classList.add('decrypted');
} catch (err) {
return console.error(err);
}
// TODO shortcode decrypted hook
// for (const event of _decryptor.decryptedEventSet) {
// event();
// }
}
});
});
};
/**
* validate the cached decryption statistics in localStorage
* @returns {FixItDecryptor}
*/
_proto.validateCache = () => {
const $content = document.querySelector('#content');
const password = $content.getAttribute('data-password');
const cachedStat = JSON.parse(window.localStorage?.getItem(`fixit-decryptor/#${location.pathname}`));
if (!cachedStat) {
this.$el.querySelector('.fixit-decryptor-loading').classList.add('d-none');
this.$el.querySelector('#fixit-decryptor-input').classList.remove('d-none');
return this;
}
if (cachedStat?.md5 !== password || Number(cachedStat?.expiration) < Math.ceil(Date.now() / 1000)) {
this.$el.querySelector('.fixit-decryptor-loading').classList.add('d-none');
this.$el.querySelector('#fixit-decryptor-input').classList.remove('d-none');
window.localStorage?.removeItem(`fixit-decryptor/#${location.pathname}`);
console.warn('The password has expired, please re-enter!');
return this;
}
_decryptContent($content.getAttribute('data-content').replace(cachedStat.sha256, ''));
return this;
};
/**
* add event listener for FixIt Decryptor
* @param {String} event event name
* @param {Function} listener event handler
* @returns {FixItDecryptor}
*/
_proto.addEventListener = (event, listener) => {
if (typeof listener !== 'function') {
return this;
}
switch (event) {
case 'decrypted':
this.decryptedEventSet.add(listener);
break;
case 'reset':
this.resetEventSet.add(listener);
break;
default:
console.warn(`Event ${event} not found in FixIt Decryptor!`);
break;
}
return this;
};
/**
* remove event listener for FixIt Decryptor
* @param {String} event event name
* @param {Function} listener event handler
* @returns {FixItDecryptor}
*/
_proto.removeEventListener = (event, listener) => {
if (typeof listener !== 'function') {
return this;
}
switch (event) {
case 'decrypted':
this.decryptedEventSet.delete(listener);
break;
case 'reset':
this.resetEventSet.delete(listener);
break;
default:
console.warn(`Event ${event} not found in FixIt Decryptor!`);
break;
}
return this;
};
};

View File

@ -0,0 +1,269 @@
/**
* Service Worker
* imported from https://github.com/HEIGE-PCloud/DoIt/blob/v0.2.11/src/js/sw.js
*/
CACHE_VERSION = 1;
const BASE_CACHE_FILES = [
'/css/style.min.css',
'/js/theme.min.js',
'/site.webmanifest',
'/fixit.min.svg'
];
const OFFLINE_CACHE_FILES = [
'/css/style.min.css',
'/js/theme.min.js',
'/site.webmanifest',
'/fixit.min.svg',
'/offline/'
];
const NOT_FOUND_CACHE_FILES = [
'/css/style.min.css',
'/js/theme.min.js',
'/site.webmanifest',
'/fixit.min.svg',
'/404.html'
];
const OFFLINE_PAGE = '/offline/';
const NOT_FOUND_PAGE = '/404.html';
const CACHE_VERSIONS = {
assets: 'assets-v' + CACHE_VERSION,
content: 'content-v' + CACHE_VERSION,
offline: 'offline-v' + CACHE_VERSION,
notFound: '404-v' + CACHE_VERSION
};
// Define MAX_TTL's in SECONDS for specific file extensions
const MAX_TTL = {
'/': 3600,
html: 3600,
json: 86400,
js: 86400,
css: 86400
};
const CACHE_BLACKLIST = [
(str) => {
return !str.startsWith('http://localhost');
}
];
const SUPPORTED_METHODS = ['GET'];
/**
* isBlackListed
* @param {string} url
* @returns {boolean}
*/
function isBlacklisted(url) {
return CACHE_BLACKLIST.length > 0
? !CACHE_BLACKLIST.filter((rule) => {
if (typeof rule === 'function') {
return !rule(url);
} else {
return false;
}
}).length
: false;
}
/**
* getFileExtension
* @param {string} url
* @returns {string}
*/
function getFileExtension(url) {
const extension = url.split('.').reverse()[0].split('?')[0];
return extension.endsWith('/') ? '/' : extension;
}
/**
* getTTL
* @param {string} url
*/
function getTTL(url) {
if (typeof url === 'string') {
const extension = getFileExtension(url);
if (typeof MAX_TTL[extension] === 'number') {
return MAX_TTL[extension];
} else {
return null;
}
} else {
return null;
}
}
/**
* installServiceWorker
* @returns {Promise}
*/
function installServiceWorker() {
return Promise.all([
caches.open(CACHE_VERSIONS.assets).then((cache) => {
return cache.addAll(BASE_CACHE_FILES);
}),
caches.open(CACHE_VERSIONS.offline).then((cache) => {
return cache.addAll(OFFLINE_CACHE_FILES);
}),
caches.open(CACHE_VERSIONS.notFound).then((cache) => {
return cache.addAll(NOT_FOUND_CACHE_FILES);
})
]).then(() => {
return self.skipWaiting();
});
}
/**
* cleanupLegacyCache
* @returns {Promise}
*/
function cleanupLegacyCache() {
const currentCaches = Object.keys(CACHE_VERSIONS).map((key) => {
return CACHE_VERSIONS[key];
});
return new Promise((resolve, reject) => {
caches
.keys()
.then((keys) => {
return keys.filter((key) => {
return !~currentCaches.indexOf(key);
});
})
.then((legacy) => {
if (legacy.length) {
Promise.all(
legacy.map((legacyKey) => {
return caches.delete(legacyKey);
})
)
.then(() => {
resolve();
})
.catch((err) => {
reject(err);
});
} else {
resolve();
}
})
.catch((err) => {
reject(err);
});
});
}
self.addEventListener('install', (event) => {
event.waitUntil(Promise.all([installServiceWorker(), self.skipWaiting()]));
});
// The activate handler takes care of cleaning up old caches.
self.addEventListener('activate', (event) => {
event.waitUntil(
Promise.all([
cleanupLegacyCache(),
self.clients.claim(),
self.skipWaiting()
]).catch((err) => {
console.log(err);
self.skipWaiting();
})
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.open(CACHE_VERSIONS.content).then((cache) => {
return cache
.match(event.request)
.then((response) => {
if (response) {
const headers = response.headers.entries();
let date = null;
for (const pair of headers) {
if (pair[0] === 'date') {
date = new Date(pair[1]);
}
}
if (date) {
const age = parseInt(
(new Date().getTime() - date.getTime()) / 1000
);
const ttl = getTTL(event.request.url);
if (ttl && age > ttl) {
return new Promise((resolve) => {
return fetch(event.request.clone())
.then((updatedResponse) => {
if (updatedResponse) {
cache.put(event.request, updatedResponse.clone());
resolve(updatedResponse);
} else {
resolve(response);
}
})
.catch(() => {
resolve(response);
});
}).catch((err) => {
console.log(err);
return response;
});
} else {
return response;
}
} else {
return response;
}
} else {
return null;
}
})
.then((response) => {
if (response) {
return response;
} else {
return fetch(event.request.clone())
.then((response) => {
if (response.status < 400) {
if (
~SUPPORTED_METHODS.indexOf(event.request.method) &&
!isBlacklisted(event.request.url) &&
event.request.url.slice(0, 4) === 'http'
) {
cache.put(event.request, response.clone());
}
return response;
} else {
return caches.open(CACHE_VERSIONS.notFound).then((cache) => {
return cache.match(NOT_FOUND_PAGE);
});
}
})
.then((response) => {
if (response) {
return response;
}
})
.catch(() => {
return caches
.open(CACHE_VERSIONS.offline)
.then((offlineCache) => {
return offlineCache.match(OFFLINE_PAGE);
});
});
}
})
.catch((error) => {
console.error(' Error in fetch handler:', error);
throw error;
});
})
);
});

3
themes/FixIt/assets/js/theme.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,32 @@
algoliasearch@4.14.2 https://github.com/algolia/algoliasearch-client-javascript
animate.css@4.1.1 https://github.com/daneden/animate.css
aplayer@1.10.1 https://github.com/MoePlayer/APlayer
artalk@2.5.2 https://github.com/ArtalkJS/Artalk
autocomplete-js@0.38.1 https://github.com/algolia/autocomplete
cell-watermark@1.0.3 https://github.com/Lruihao/watermark
cookieconsent@3.1.1 https://github.com/osano/cookieconsent
crypto-js@4.1.1 https://github.com/brix/crypto-js
echarts@5.3.3 https://github.com/apache/echarts
emoji-data@14.0.0 https://github.com/iamcal/emoji-data
eruda@2.5.0 https://github.com/liriliri/eruda
fontawesome-free@6.2.0 https://github.com/FortAwesome/Font-Awesome
fusejs@6.6.2 https://github.com/krisk/fuse
gitalk@1.7.2 https://github.com/gitalk/gitalk
instant.page@5.1.1 https://github.com/instantpage/instant.page
katex@0.16.2 https://github.com/KaTeX/KaTeX
lightgallery@2.6.1 https://github.com/sachinchoolur/lightgallery
lunr.js@2.3.9 https://github.com/olivernn/lunr.js
mapbox-gl@2.10.0 https://github.com/mapbox/mapbox-gl-js
mermaid@9.4.3 https://github.com/mermaid-js/mermaid
meting@2.0.1 https://github.com/metowolf/MetingJS
normalize.css@8.0.1 https://github.com/necolas/normalize.css
object-fit-images@3.2.4 https://github.com/fregante/object-fit-images [archived]
pangu.js@4.0.7 https://github.com/vinta/pangu.js
sharer.js@0.5.1 https://github.com/ellisonleao/sharer.js
simple-icons@7.12.0 https://github.com/simple-icons/simple-icons
twemoji@14.0.2 https://github.com/twitter/twemoji
twikoo@1.6.8 https://github.com/imaegoo/twikoo
typeit@8.7.1 https://github.com/alexmacarthur/typeit
valine@1.5.1 https://github.com/xCss/Valine
vconsole@3.14.6 https://github.com/Tencent/vConsole
waline@2.14.7 https://github.com/walinejs/waline

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,112 @@
[data-theme='dark'] .aplayer {
background: #212121;
&.aplayer-withlist {
.aplayer-info {
border-bottom-color: #5c5c5c;
}
}
&.aplayer-fixed {
.aplayer-list {
border-color: #5c5c5c;
}
}
.aplayer-body {
background-color: #212121;
}
.aplayer-info {
border-top-color: #212121;
}
.aplayer-info {
.aplayer-music {
.aplayer-title {
color: #fff;
}
.aplayer-author {
color: #fff;
}
}
.aplayer-controller {
.aplayer-time {
color: #eee;
.aplayer-icon {
path {
fill: #eee;
}
}
}
}
}
.aplayer-list {
background-color: #212121;
&::-webkit-scrollbar-thumb {
background-color: #999;
}
&::-webkit-scrollbar-thumb:hover {
background-color: #bbb;
}
li {
color: #fff;
border-top-color: #666;
&:hover {
background: #4e4e4e;
}
&.aplayer-list-light {
background: #6c6c6c;
}
.aplayer-list-index {
color: #ddd;
}
.aplayer-list-author {
color: #ddd;
}
}
}
.aplayer-lrc {
text-shadow: -1px -1px 0 #666;
&:before {
background: -moz-linear-gradient(top, rgba(33,33,33,1) 0%, rgba(33,33,33,0) 100%);
background: -webkit-linear-gradient(top, rgba(33,33,33,1) 0%,rgba(33,33,33,0) 100%);
background: linear-gradient(to bottom, rgba(33,33,33,1) 0%,rgba(33,33,33,0) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#212121', endColorstr='#00212121',GradientType=0 );
}
&:after {
background: -moz-linear-gradient(top, rgba(33,33,33,0) 0%, rgba(33,33,33,0.8) 100%);
background: -webkit-linear-gradient(top, rgba(33,33,33,0) 0%,rgba(33,33,33,0.8) 100%);
background: linear-gradient(to bottom, rgba(33,33,33,0) 0%,rgba(33,33,33,0.8) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00212121', endColorstr='#cc212121',GradientType=0 );
}
p {
color: #fff;
}
}
.aplayer-miniswitcher {
background: #484848;
.aplayer-icon {
path {
fill: #eee;
}
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(function(e,t){"function"==typeof define&&define.amd?define([],t()):"object"==typeof module&&module.exports?module.exports=t():e.Watermark=t()})(this,function(){function e(t={}){var n=e.prototype;this.options=t,s(this),d(this,this.options),h(this),p(this),n.upload=function(e){if(e){o.disconnect(),i.disconnect(),this.options.content=e;for(const t of this._container.querySelectorAll(".cell-watermark"))t.innerHTML=e;o.observe(this._container.parentNode,{childList:!0,subtree:!0}),i.observe(this._container,{attributes:!0,childList:!0,characterData:!0,subtree:!0})}},n.render=function(e={}){l(this,Object.assign(this.options,e))},n.destroy=function(){i.disconnect(),o.disconnect(),window.removeEventListener("resize",r),this._container.parentNode.removeChild(this._container)}}var t,n,i,o,r,c=window.outerWidth,a=window.outerHeight,s=function(e){e._container=document.createElement("div"),e._container.classList.add("cell-watermark-container"),e._container.style.cssText="display: block; pointer-events: none;",e._container.setAttribute("aria-hidden",!0),t=document.querySelector(e.options.appendTo)||document.body,t.appendChild(e._container)},d=function(e,t){t.rowSpacing=t.rowSpacing||60,t.colSpacing=t.colSpacing||30,t.width=t.width||150,t.height=t.height||20;let i=parseInt(a/(t.height+t.rowSpacing)),o=parseInt(c/(t.width+t.colSpacing)),r=(c-t.width*o-t.colSpacing*(o-1))/2,s=(a-t.height*i-t.rowSpacing*(i-1))/2,d=document.createElement("div");d.classList.add("cell-watermark"),d.style.cssText="transform: rotate(15deg); opacity: 0.1; font-size: 0.85rem; text-align: center;position: fixed; user-select: none; word-break: break-all; overflow: hidden; z-index: 999999;";for(let n=0;n<i;n++){let i=s+(t.rowSpacing+t.height)*n,c=o;n%2!=0&&c++;for(let n=0;n<c;n++){let a=r+(t.colSpacing+t.width)*n;c!==o&&(a-=(t.colSpacing+t.width)/2);let s=d.cloneNode();s.style.cssText+=`left: ${a}px; top: ${i}px; width: ${t.width}px; height: ${t.height}px`,s.style.transform=`rotate(${t.rotate}deg)`,s.style.opacity=t.opacity,s.style.fontSize=`${t.fontSize}rem`,s.style.fontFamily=t.fontFamily,s.innerHTML=t.content,e._container.appendChild(s)}}n=e._container},l=function(e,t){i.disconnect(),e._container.innerHTML="",d(e,t),i.observe(e._container,{attributes:!0,childList:!0,characterData:!0,subtree:!0})},h=function(e){i=new MutationObserver(function(t,n){l(e,e.options)}),i.observe(e._container,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),o=new MutationObserver(function(e){for(let i of e)"childList"===i.type&&i.removedNodes.length>0&&0===document.querySelectorAll(".cell-watermark-container").length&&t.appendChild(n)}),o.observe(e._container.parentNode,{childList:!0,subtree:!0})},p=function(e){r=function(){window.outerHeight===a&&window.outerWidth===c||(a=window.outerHeight,c=window.outerWidth,l(e,e.options))},window.addEventListener("resize",r)};return e});

View File

@ -0,0 +1,6 @@
.cc-window{opacity:1;-webkit-transition:opacity 1s ease;transition:opacity 1s ease}.cc-window.cc-invisible{opacity:0}.cc-animate.cc-revoke{-webkit-transition:transform 1s ease;-webkit-transition:-webkit-transform 1s ease;transition:-webkit-transform 1s ease;transition:transform 1s ease;transition:transform 1s ease,-webkit-transform 1s ease}.cc-animate.cc-revoke.cc-top{-webkit-transform:translateY(-2em);transform:translateY(-2em)}.cc-animate.cc-revoke.cc-bottom{-webkit-transform:translateY(2em);transform:translateY(2em)}.cc-animate.cc-revoke.cc-active.cc-top{-webkit-transform:translateY(0);transform:translateY(0)}.cc-animate.cc-revoke.cc-active.cc-bottom{-webkit-transform:translateY(0);transform:translateY(0)}.cc-revoke:hover{-webkit-transform:translateY(0);transform:translateY(0)}.cc-grower{max-height:0;overflow:hidden;-webkit-transition:max-height 1s;transition:max-height 1s}
.cc-revoke,.cc-window{position:fixed;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:Helvetica,Calibri,Arial,sans-serif;font-size:16px;line-height:1.5em;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;z-index:9999}.cc-window.cc-static{position:static}.cc-window.cc-floating{padding:2em;max-width:24em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner{padding:1em 1.8em;width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.cc-revoke{padding:.5em}.cc-revoke:hover{text-decoration:underline}.cc-header{font-size:18px;font-weight:700}.cc-btn,.cc-close,.cc-link,.cc-revoke{cursor:pointer}.cc-link{opacity:.8;display:inline-block;padding:.2em;text-decoration:underline}.cc-link:hover{opacity:1}.cc-link:active,.cc-link:visited{color:initial}.cc-btn{display:block;padding:.4em .8em;font-size:.9em;font-weight:700;border-width:2px;border-style:solid;text-align:center;white-space:nowrap}.cc-highlight .cc-btn:first-child{background-color:transparent;border-color:transparent}.cc-highlight .cc-btn:first-child:focus,.cc-highlight .cc-btn:first-child:hover{background-color:transparent;text-decoration:underline}.cc-close{display:block;position:absolute;top:.5em;right:.5em;font-size:1.6em;opacity:.9;line-height:.75}.cc-close:focus,.cc-close:hover{opacity:1}
.cc-revoke.cc-top{top:0;left:3em;border-bottom-left-radius:.5em;border-bottom-right-radius:.5em}.cc-revoke.cc-bottom{bottom:0;left:3em;border-top-left-radius:.5em;border-top-right-radius:.5em}.cc-revoke.cc-left{left:3em;right:unset}.cc-revoke.cc-right{right:3em;left:unset}.cc-top{top:1em}.cc-left{left:1em}.cc-right{right:1em}.cc-bottom{bottom:1em}.cc-floating>.cc-link{margin-bottom:1em}.cc-floating .cc-message{display:block;margin-bottom:1em}.cc-window.cc-floating .cc-compliance{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.cc-window.cc-banner{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cc-banner.cc-top{left:0;right:0;top:0}.cc-banner.cc-bottom{left:0;right:0;bottom:0}.cc-banner .cc-message{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;max-width:100%;margin-right:1em}.cc-compliance{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:justify;align-content:space-between}.cc-floating .cc-compliance>.cc-btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.cc-btn+.cc-btn{margin-left:.5em}
@media print{.cc-revoke,.cc-window{display:none}}@media screen and (max-width:900px){.cc-btn{white-space:normal}}@media screen and (max-width:414px) and (orientation:portrait),screen and (max-width:736px) and (orientation:landscape){.cc-window.cc-top{top:0}.cc-window.cc-bottom{bottom:0}.cc-window.cc-banner,.cc-window.cc-floating,.cc-window.cc-left,.cc-window.cc-right{left:0;right:0}.cc-window.cc-banner{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner .cc-compliance{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.cc-window.cc-floating{max-width:none}.cc-window .cc-message{margin-bottom:1em}.cc-window.cc-banner{-webkit-box-align:unset;-ms-flex-align:unset;align-items:unset}.cc-window.cc-banner .cc-message{margin-right:0}}
.cc-floating.cc-theme-classic{padding:1.2em;border-radius:5px}.cc-floating.cc-type-info.cc-theme-classic .cc-compliance{text-align:center;display:inline;-webkit-box-flex:0;-ms-flex:none;flex:none}.cc-theme-classic .cc-btn{border-radius:5px}.cc-theme-classic .cc-btn:last-child{min-width:140px}.cc-floating.cc-type-info.cc-theme-classic .cc-btn{display:inline-block}
.cc-theme-edgeless.cc-window{padding:0}.cc-floating.cc-theme-edgeless .cc-message{margin:2em;margin-bottom:1.5em}.cc-banner.cc-theme-edgeless .cc-btn{margin:0;padding:.8em 1.8em;height:100%}.cc-banner.cc-theme-edgeless .cc-message{margin-left:1em}.cc-floating.cc-theme-edgeless .cc-btn+.cc-btn{margin-left:0}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,807 @@
;(function (root, factory) {
if (typeof exports === "object") {
// CommonJS
module.exports = exports = factory();
}
else if (typeof define === "function" && define.amd) {
// AMD
define([], factory);
}
else {
// Global (browser)
root.CryptoJS = factory();
}
}(this, function () {
/*globals window, global, require*/
/**
* CryptoJS core components.
*/
var CryptoJS = CryptoJS || (function (Math, undefined) {
var crypto;
// Native crypto from window (Browser)
if (typeof window !== 'undefined' && window.crypto) {
crypto = window.crypto;
}
// Native crypto in web worker (Browser)
if (typeof self !== 'undefined' && self.crypto) {
crypto = self.crypto;
}
// Native crypto from worker
if (typeof globalThis !== 'undefined' && globalThis.crypto) {
crypto = globalThis.crypto;
}
// Native (experimental IE 11) crypto from window (Browser)
if (!crypto && typeof window !== 'undefined' && window.msCrypto) {
crypto = window.msCrypto;
}
// Native crypto from global (NodeJS)
if (!crypto && typeof global !== 'undefined' && global.crypto) {
crypto = global.crypto;
}
// Native crypto import via require (NodeJS)
if (!crypto && typeof require === 'function') {
try {
crypto = require('crypto');
} catch (err) {}
}
/*
* Cryptographically secure pseudorandom number generator
*
* As Math.random() is cryptographically not safe to use
*/
var cryptoSecureRandomInt = function () {
if (crypto) {
// Use getRandomValues method (Browser)
if (typeof crypto.getRandomValues === 'function') {
try {
return crypto.getRandomValues(new Uint32Array(1))[0];
} catch (err) {}
}
// Use randomBytes method (NodeJS)
if (typeof crypto.randomBytes === 'function') {
try {
return crypto.randomBytes(4).readInt32LE();
} catch (err) {}
}
}
throw new Error('Native crypto module could not be used to get secure random number.');
};
/*
* Local polyfill of Object.create
*/
var create = Object.create || (function () {
function F() {}
return function (obj) {
var subtype;
F.prototype = obj;
subtype = new F();
F.prototype = null;
return subtype;
};
}());
/**
* CryptoJS namespace.
*/
var C = {};
/**
* Library namespace.
*/
var C_lib = C.lib = {};
/**
* Base object for prototypal inheritance.
*/
var Base = C_lib.Base = (function () {
return {
/**
* Creates a new object that inherits from this object.
*
* @param {Object} overrides Properties to copy into the new object.
*
* @return {Object} The new object.
*
* @static
*
* @example
*
* var MyType = CryptoJS.lib.Base.extend({
* field: 'value',
*
* method: function () {
* }
* });
*/
extend: function (overrides) {
// Spawn
var subtype = create(this);
// Augment
if (overrides) {
subtype.mixIn(overrides);
}
// Create default initializer
if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
subtype.init = function () {
subtype.$super.init.apply(this, arguments);
};
}
// Initializer's prototype is the subtype object
subtype.init.prototype = subtype;
// Reference supertype
subtype.$super = this;
return subtype;
},
/**
* Extends this object and runs the init method.
* Arguments to create() will be passed to init().
*
* @return {Object} The new object.
*
* @static
*
* @example
*
* var instance = MyType.create();
*/
create: function () {
var instance = this.extend();
instance.init.apply(instance, arguments);
return instance;
},
/**
* Initializes a newly created object.
* Override this method to add some logic when your objects are created.
*
* @example
*
* var MyType = CryptoJS.lib.Base.extend({
* init: function () {
* // ...
* }
* });
*/
init: function () {
},
/**
* Copies properties into this object.
*
* @param {Object} properties The properties to mix in.
*
* @example
*
* MyType.mixIn({
* field: 'value'
* });
*/
mixIn: function (properties) {
for (var propertyName in properties) {
if (properties.hasOwnProperty(propertyName)) {
this[propertyName] = properties[propertyName];
}
}
// IE won't copy toString using the loop above
if (properties.hasOwnProperty('toString')) {
this.toString = properties.toString;
}
},
/**
* Creates a copy of this object.
*
* @return {Object} The clone.
*
* @example
*
* var clone = instance.clone();
*/
clone: function () {
return this.init.prototype.extend(this);
}
};
}());
/**
* An array of 32-bit words.
*
* @property {Array} words The array of 32-bit words.
* @property {number} sigBytes The number of significant bytes in this word array.
*/
var WordArray = C_lib.WordArray = Base.extend({
/**
* Initializes a newly created word array.
*
* @param {Array} words (Optional) An array of 32-bit words.
* @param {number} sigBytes (Optional) The number of significant bytes in the words.
*
* @example
*
* var wordArray = CryptoJS.lib.WordArray.create();
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
*/
init: function (words, sigBytes) {
words = this.words = words || [];
if (sigBytes != undefined) {
this.sigBytes = sigBytes;
} else {
this.sigBytes = words.length * 4;
}
},
/**
* Converts this word array to a string.
*
* @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
*
* @return {string} The stringified word array.
*
* @example
*
* var string = wordArray + '';
* var string = wordArray.toString();
* var string = wordArray.toString(CryptoJS.enc.Utf8);
*/
toString: function (encoder) {
return (encoder || Hex).stringify(this);
},
/**
* Concatenates a word array to this word array.
*
* @param {WordArray} wordArray The word array to append.
*
* @return {WordArray} This word array.
*
* @example
*
* wordArray1.concat(wordArray2);
*/
concat: function (wordArray) {
// Shortcuts
var thisWords = this.words;
var thatWords = wordArray.words;
var thisSigBytes = this.sigBytes;
var thatSigBytes = wordArray.sigBytes;
// Clamp excess bits
this.clamp();
// Concat
if (thisSigBytes % 4) {
// Copy one byte at a time
for (var i = 0; i < thatSigBytes; i++) {
var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
}
} else {
// Copy one word at a time
for (var j = 0; j < thatSigBytes; j += 4) {
thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
}
}
this.sigBytes += thatSigBytes;
// Chainable
return this;
},
/**
* Removes insignificant bits.
*
* @example
*
* wordArray.clamp();
*/
clamp: function () {
// Shortcuts
var words = this.words;
var sigBytes = this.sigBytes;
// Clamp
words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
words.length = Math.ceil(sigBytes / 4);
},
/**
* Creates a copy of this word array.
*
* @return {WordArray} The clone.
*
* @example
*
* var clone = wordArray.clone();
*/
clone: function () {
var clone = Base.clone.call(this);
clone.words = this.words.slice(0);
return clone;
},
/**
* Creates a word array filled with random bytes.
*
* @param {number} nBytes The number of random bytes to generate.
*
* @return {WordArray} The random word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.lib.WordArray.random(16);
*/
random: function (nBytes) {
var words = [];
for (var i = 0; i < nBytes; i += 4) {
words.push(cryptoSecureRandomInt());
}
return new WordArray.init(words, nBytes);
}
});
/**
* Encoder namespace.
*/
var C_enc = C.enc = {};
/**
* Hex encoding strategy.
*/
var Hex = C_enc.Hex = {
/**
* Converts a word array to a hex string.
*
* @param {WordArray} wordArray The word array.
*
* @return {string} The hex string.
*
* @static
*
* @example
*
* var hexString = CryptoJS.enc.Hex.stringify(wordArray);
*/
stringify: function (wordArray) {
// Shortcuts
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
// Convert
var hexChars = [];
for (var i = 0; i < sigBytes; i++) {
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
hexChars.push((bite >>> 4).toString(16));
hexChars.push((bite & 0x0f).toString(16));
}
return hexChars.join('');
},
/**
* Converts a hex string to a word array.
*
* @param {string} hexStr The hex string.
*
* @return {WordArray} The word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.Hex.parse(hexString);
*/
parse: function (hexStr) {
// Shortcut
var hexStrLength = hexStr.length;
// Convert
var words = [];
for (var i = 0; i < hexStrLength; i += 2) {
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
}
return new WordArray.init(words, hexStrLength / 2);
}
};
/**
* Latin1 encoding strategy.
*/
var Latin1 = C_enc.Latin1 = {
/**
* Converts a word array to a Latin1 string.
*
* @param {WordArray} wordArray The word array.
*
* @return {string} The Latin1 string.
*
* @static
*
* @example
*
* var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
*/
stringify: function (wordArray) {
// Shortcuts
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
// Convert
var latin1Chars = [];
for (var i = 0; i < sigBytes; i++) {
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
latin1Chars.push(String.fromCharCode(bite));
}
return latin1Chars.join('');
},
/**
* Converts a Latin1 string to a word array.
*
* @param {string} latin1Str The Latin1 string.
*
* @return {WordArray} The word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
*/
parse: function (latin1Str) {
// Shortcut
var latin1StrLength = latin1Str.length;
// Convert
var words = [];
for (var i = 0; i < latin1StrLength; i++) {
words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
}
return new WordArray.init(words, latin1StrLength);
}
};
/**
* UTF-8 encoding strategy.
*/
var Utf8 = C_enc.Utf8 = {
/**
* Converts a word array to a UTF-8 string.
*
* @param {WordArray} wordArray The word array.
*
* @return {string} The UTF-8 string.
*
* @static
*
* @example
*
* var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
*/
stringify: function (wordArray) {
try {
return decodeURIComponent(escape(Latin1.stringify(wordArray)));
} catch (e) {
throw new Error('Malformed UTF-8 data');
}
},
/**
* Converts a UTF-8 string to a word array.
*
* @param {string} utf8Str The UTF-8 string.
*
* @return {WordArray} The word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
*/
parse: function (utf8Str) {
return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
}
};
/**
* Abstract buffered block algorithm template.
*
* The property blockSize must be implemented in a concrete subtype.
*
* @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
*/
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
/**
* Resets this block algorithm's data buffer to its initial state.
*
* @example
*
* bufferedBlockAlgorithm.reset();
*/
reset: function () {
// Initial values
this._data = new WordArray.init();
this._nDataBytes = 0;
},
/**
* Adds new data to this block algorithm's buffer.
*
* @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
*
* @example
*
* bufferedBlockAlgorithm._append('data');
* bufferedBlockAlgorithm._append(wordArray);
*/
_append: function (data) {
// Convert string to WordArray, else assume WordArray already
if (typeof data == 'string') {
data = Utf8.parse(data);
}
// Append
this._data.concat(data);
this._nDataBytes += data.sigBytes;
},
/**
* Processes available data blocks.
*
* This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
*
* @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
*
* @return {WordArray} The processed data.
*
* @example
*
* var processedData = bufferedBlockAlgorithm._process();
* var processedData = bufferedBlockAlgorithm._process(!!'flush');
*/
_process: function (doFlush) {
var processedWords;
// Shortcuts
var data = this._data;
var dataWords = data.words;
var dataSigBytes = data.sigBytes;
var blockSize = this.blockSize;
var blockSizeBytes = blockSize * 4;
// Count blocks ready
var nBlocksReady = dataSigBytes / blockSizeBytes;
if (doFlush) {
// Round up to include partial blocks
nBlocksReady = Math.ceil(nBlocksReady);
} else {
// Round down to include only full blocks,
// less the number of blocks that must remain in the buffer
nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
}
// Count words ready
var nWordsReady = nBlocksReady * blockSize;
// Count bytes ready
var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
// Process blocks
if (nWordsReady) {
for (var offset = 0; offset < nWordsReady; offset += blockSize) {
// Perform concrete-algorithm logic
this._doProcessBlock(dataWords, offset);
}
// Remove processed words
processedWords = dataWords.splice(0, nWordsReady);
data.sigBytes -= nBytesReady;
}
// Return processed words
return new WordArray.init(processedWords, nBytesReady);
},
/**
* Creates a copy of this object.
*
* @return {Object} The clone.
*
* @example
*
* var clone = bufferedBlockAlgorithm.clone();
*/
clone: function () {
var clone = Base.clone.call(this);
clone._data = this._data.clone();
return clone;
},
_minBufferSize: 0
});
/**
* Abstract hasher template.
*
* @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
*/
var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
/**
* Configuration options.
*/
cfg: Base.extend(),
/**
* Initializes a newly created hasher.
*
* @param {Object} cfg (Optional) The configuration options to use for this hash computation.
*
* @example
*
* var hasher = CryptoJS.algo.SHA256.create();
*/
init: function (cfg) {
// Apply config defaults
this.cfg = this.cfg.extend(cfg);
// Set initial values
this.reset();
},
/**
* Resets this hasher to its initial state.
*
* @example
*
* hasher.reset();
*/
reset: function () {
// Reset data buffer
BufferedBlockAlgorithm.reset.call(this);
// Perform concrete-hasher logic
this._doReset();
},
/**
* Updates this hasher with a message.
*
* @param {WordArray|string} messageUpdate The message to append.
*
* @return {Hasher} This hasher.
*
* @example
*
* hasher.update('message');
* hasher.update(wordArray);
*/
update: function (messageUpdate) {
// Append
this._append(messageUpdate);
// Update the hash
this._process();
// Chainable
return this;
},
/**
* Finalizes the hash computation.
* Note that the finalize operation is effectively a destructive, read-once operation.
*
* @param {WordArray|string} messageUpdate (Optional) A final message update.
*
* @return {WordArray} The hash.
*
* @example
*
* var hash = hasher.finalize();
* var hash = hasher.finalize('message');
* var hash = hasher.finalize(wordArray);
*/
finalize: function (messageUpdate) {
// Final message update
if (messageUpdate) {
this._append(messageUpdate);
}
// Perform concrete-hasher logic
var hash = this._doFinalize();
return hash;
},
blockSize: 512/32,
/**
* Creates a shortcut function to a hasher's object interface.
*
* @param {Hasher} hasher The hasher to create a helper for.
*
* @return {Function} The shortcut function.
*
* @static
*
* @example
*
* var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
*/
_createHelper: function (hasher) {
return function (message, cfg) {
return new hasher.init(cfg).finalize(message);
};
},
/**
* Creates a shortcut function to the HMAC's object interface.
*
* @param {Hasher} hasher The hasher to use in this HMAC helper.
*
* @return {Function} The shortcut function.
*
* @static
*
* @example
*
* var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
*/
_createHmacHelper: function (hasher) {
return function (message, key) {
return new C_algo.HMAC.init(hasher, key).finalize(message);
};
}
});
/**
* Algorithm namespace.
*/
var C_algo = C.algo = {};
return C;
}(Math));
return CryptoJS;
}));

View File

@ -0,0 +1,136 @@
;(function (root, factory) {
if (typeof exports === "object") {
// CommonJS
module.exports = exports = factory(require("./core"));
}
else if (typeof define === "function" && define.amd) {
// AMD
define(["./core"], factory);
}
else {
// Global (browser)
factory(root.CryptoJS);
}
}(this, function (CryptoJS) {
(function () {
// Shortcuts
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var C_enc = C.enc;
/**
* Base64 encoding strategy.
*/
var Base64 = C_enc.Base64 = {
/**
* Converts a word array to a Base64 string.
*
* @param {WordArray} wordArray The word array.
*
* @return {string} The Base64 string.
*
* @static
*
* @example
*
* var base64String = CryptoJS.enc.Base64.stringify(wordArray);
*/
stringify: function (wordArray) {
// Shortcuts
var words = wordArray.words;
var sigBytes = wordArray.sigBytes;
var map = this._map;
// Clamp excess bits
wordArray.clamp();
// Convert
var base64Chars = [];
for (var i = 0; i < sigBytes; i += 3) {
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
}
}
// Add padding
var paddingChar = map.charAt(64);
if (paddingChar) {
while (base64Chars.length % 4) {
base64Chars.push(paddingChar);
}
}
return base64Chars.join('');
},
/**
* Converts a Base64 string to a word array.
*
* @param {string} base64Str The Base64 string.
*
* @return {WordArray} The word array.
*
* @static
*
* @example
*
* var wordArray = CryptoJS.enc.Base64.parse(base64String);
*/
parse: function (base64Str) {
// Shortcuts
var base64StrLength = base64Str.length;
var map = this._map;
var reverseMap = this._reverseMap;
if (!reverseMap) {
reverseMap = this._reverseMap = [];
for (var j = 0; j < map.length; j++) {
reverseMap[map.charCodeAt(j)] = j;
}
}
// Ignore padding
var paddingChar = map.charAt(64);
if (paddingChar) {
var paddingIndex = base64Str.indexOf(paddingChar);
if (paddingIndex !== -1) {
base64StrLength = paddingIndex;
}
}
// Convert
return parseLoop(base64Str, base64StrLength, reverseMap);
},
_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
function parseLoop(base64Str, base64StrLength, reverseMap) {
var words = [];
var nBytes = 0;
for (var i = 0; i < base64StrLength; i++) {
if (i % 4) {
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
var bitsCombined = bits1 | bits2;
words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
nBytes++;
}
}
return WordArray.create(words, nBytes);
}
}());
return CryptoJS.enc.Base64;
}));

View File

@ -0,0 +1,268 @@
;(function (root, factory) {
if (typeof exports === "object") {
// CommonJS
module.exports = exports = factory(require("./core"));
}
else if (typeof define === "function" && define.amd) {
// AMD
define(["./core"], factory);
}
else {
// Global (browser)
factory(root.CryptoJS);
}
}(this, function (CryptoJS) {
(function (Math) {
// Shortcuts
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var Hasher = C_lib.Hasher;
var C_algo = C.algo;
// Constants table
var T = [];
// Compute constants
(function () {
for (var i = 0; i < 64; i++) {
T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
}
}());
/**
* MD5 hash algorithm.
*/
var MD5 = C_algo.MD5 = Hasher.extend({
_doReset: function () {
this._hash = new WordArray.init([
0x67452301, 0xefcdab89,
0x98badcfe, 0x10325476
]);
},
_doProcessBlock: function (M, offset) {
// Swap endian
for (var i = 0; i < 16; i++) {
// Shortcuts
var offset_i = offset + i;
var M_offset_i = M[offset_i];
M[offset_i] = (
(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
(((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
);
}
// Shortcuts
var H = this._hash.words;
var M_offset_0 = M[offset + 0];
var M_offset_1 = M[offset + 1];
var M_offset_2 = M[offset + 2];
var M_offset_3 = M[offset + 3];
var M_offset_4 = M[offset + 4];
var M_offset_5 = M[offset + 5];
var M_offset_6 = M[offset + 6];
var M_offset_7 = M[offset + 7];
var M_offset_8 = M[offset + 8];
var M_offset_9 = M[offset + 9];
var M_offset_10 = M[offset + 10];
var M_offset_11 = M[offset + 11];
var M_offset_12 = M[offset + 12];
var M_offset_13 = M[offset + 13];
var M_offset_14 = M[offset + 14];
var M_offset_15 = M[offset + 15];
// Working varialbes
var a = H[0];
var b = H[1];
var c = H[2];
var d = H[3];
// Computation
a = FF(a, b, c, d, M_offset_0, 7, T[0]);
d = FF(d, a, b, c, M_offset_1, 12, T[1]);
c = FF(c, d, a, b, M_offset_2, 17, T[2]);
b = FF(b, c, d, a, M_offset_3, 22, T[3]);
a = FF(a, b, c, d, M_offset_4, 7, T[4]);
d = FF(d, a, b, c, M_offset_5, 12, T[5]);
c = FF(c, d, a, b, M_offset_6, 17, T[6]);
b = FF(b, c, d, a, M_offset_7, 22, T[7]);
a = FF(a, b, c, d, M_offset_8, 7, T[8]);
d = FF(d, a, b, c, M_offset_9, 12, T[9]);
c = FF(c, d, a, b, M_offset_10, 17, T[10]);
b = FF(b, c, d, a, M_offset_11, 22, T[11]);
a = FF(a, b, c, d, M_offset_12, 7, T[12]);
d = FF(d, a, b, c, M_offset_13, 12, T[13]);
c = FF(c, d, a, b, M_offset_14, 17, T[14]);
b = FF(b, c, d, a, M_offset_15, 22, T[15]);
a = GG(a, b, c, d, M_offset_1, 5, T[16]);
d = GG(d, a, b, c, M_offset_6, 9, T[17]);
c = GG(c, d, a, b, M_offset_11, 14, T[18]);
b = GG(b, c, d, a, M_offset_0, 20, T[19]);
a = GG(a, b, c, d, M_offset_5, 5, T[20]);
d = GG(d, a, b, c, M_offset_10, 9, T[21]);
c = GG(c, d, a, b, M_offset_15, 14, T[22]);
b = GG(b, c, d, a, M_offset_4, 20, T[23]);
a = GG(a, b, c, d, M_offset_9, 5, T[24]);
d = GG(d, a, b, c, M_offset_14, 9, T[25]);
c = GG(c, d, a, b, M_offset_3, 14, T[26]);
b = GG(b, c, d, a, M_offset_8, 20, T[27]);
a = GG(a, b, c, d, M_offset_13, 5, T[28]);
d = GG(d, a, b, c, M_offset_2, 9, T[29]);
c = GG(c, d, a, b, M_offset_7, 14, T[30]);
b = GG(b, c, d, a, M_offset_12, 20, T[31]);
a = HH(a, b, c, d, M_offset_5, 4, T[32]);
d = HH(d, a, b, c, M_offset_8, 11, T[33]);
c = HH(c, d, a, b, M_offset_11, 16, T[34]);
b = HH(b, c, d, a, M_offset_14, 23, T[35]);
a = HH(a, b, c, d, M_offset_1, 4, T[36]);
d = HH(d, a, b, c, M_offset_4, 11, T[37]);
c = HH(c, d, a, b, M_offset_7, 16, T[38]);
b = HH(b, c, d, a, M_offset_10, 23, T[39]);
a = HH(a, b, c, d, M_offset_13, 4, T[40]);
d = HH(d, a, b, c, M_offset_0, 11, T[41]);
c = HH(c, d, a, b, M_offset_3, 16, T[42]);
b = HH(b, c, d, a, M_offset_6, 23, T[43]);
a = HH(a, b, c, d, M_offset_9, 4, T[44]);
d = HH(d, a, b, c, M_offset_12, 11, T[45]);
c = HH(c, d, a, b, M_offset_15, 16, T[46]);
b = HH(b, c, d, a, M_offset_2, 23, T[47]);
a = II(a, b, c, d, M_offset_0, 6, T[48]);
d = II(d, a, b, c, M_offset_7, 10, T[49]);
c = II(c, d, a, b, M_offset_14, 15, T[50]);
b = II(b, c, d, a, M_offset_5, 21, T[51]);
a = II(a, b, c, d, M_offset_12, 6, T[52]);
d = II(d, a, b, c, M_offset_3, 10, T[53]);
c = II(c, d, a, b, M_offset_10, 15, T[54]);
b = II(b, c, d, a, M_offset_1, 21, T[55]);
a = II(a, b, c, d, M_offset_8, 6, T[56]);
d = II(d, a, b, c, M_offset_15, 10, T[57]);
c = II(c, d, a, b, M_offset_6, 15, T[58]);
b = II(b, c, d, a, M_offset_13, 21, T[59]);
a = II(a, b, c, d, M_offset_4, 6, T[60]);
d = II(d, a, b, c, M_offset_11, 10, T[61]);
c = II(c, d, a, b, M_offset_2, 15, T[62]);
b = II(b, c, d, a, M_offset_9, 21, T[63]);
// Intermediate hash value
H[0] = (H[0] + a) | 0;
H[1] = (H[1] + b) | 0;
H[2] = (H[2] + c) | 0;
H[3] = (H[3] + d) | 0;
},
_doFinalize: function () {
// Shortcuts
var data = this._data;
var dataWords = data.words;
var nBitsTotal = this._nDataBytes * 8;
var nBitsLeft = data.sigBytes * 8;
// Add padding
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
var nBitsTotalL = nBitsTotal;
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
(((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
(((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
);
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
(((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
(((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
);
data.sigBytes = (dataWords.length + 1) * 4;
// Hash final blocks
this._process();
// Shortcuts
var hash = this._hash;
var H = hash.words;
// Swap endian
for (var i = 0; i < 4; i++) {
// Shortcut
var H_i = H[i];
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
}
// Return final computed hash
return hash;
},
clone: function () {
var clone = Hasher.clone.call(this);
clone._hash = this._hash.clone();
return clone;
}
});
function FF(a, b, c, d, x, s, t) {
var n = a + ((b & c) | (~b & d)) + x + t;
return ((n << s) | (n >>> (32 - s))) + b;
}
function GG(a, b, c, d, x, s, t) {
var n = a + ((b & d) | (c & ~d)) + x + t;
return ((n << s) | (n >>> (32 - s))) + b;
}
function HH(a, b, c, d, x, s, t) {
var n = a + (b ^ c ^ d) + x + t;
return ((n << s) | (n >>> (32 - s))) + b;
}
function II(a, b, c, d, x, s, t) {
var n = a + (c ^ (b | ~d)) + x + t;
return ((n << s) | (n >>> (32 - s))) + b;
}
/**
* Shortcut function to the hasher's object interface.
*
* @param {WordArray|string} message The message to hash.
*
* @return {WordArray} The hash.
*
* @static
*
* @example
*
* var hash = CryptoJS.MD5('message');
* var hash = CryptoJS.MD5(wordArray);
*/
C.MD5 = Hasher._createHelper(MD5);
/**
* Shortcut function to the HMAC's object interface.
*
* @param {WordArray|string} message The message to hash.
* @param {WordArray|string} key The secret key.
*
* @return {WordArray} The HMAC.
*
* @static
*
* @example
*
* var hmac = CryptoJS.HmacMD5(message, key);
*/
C.HmacMD5 = Hasher._createHmacHelper(MD5);
}(Math));
return CryptoJS.MD5;
}));

View File

@ -0,0 +1,199 @@
;(function (root, factory) {
if (typeof exports === "object") {
// CommonJS
module.exports = exports = factory(require("./core"));
}
else if (typeof define === "function" && define.amd) {
// AMD
define(["./core"], factory);
}
else {
// Global (browser)
factory(root.CryptoJS);
}
}(this, function (CryptoJS) {
(function (Math) {
// Shortcuts
var C = CryptoJS;
var C_lib = C.lib;
var WordArray = C_lib.WordArray;
var Hasher = C_lib.Hasher;
var C_algo = C.algo;
// Initialization and round constants tables
var H = [];
var K = [];
// Compute constants
(function () {
function isPrime(n) {
var sqrtN = Math.sqrt(n);
for (var factor = 2; factor <= sqrtN; factor++) {
if (!(n % factor)) {
return false;
}
}
return true;
}
function getFractionalBits(n) {
return ((n - (n | 0)) * 0x100000000) | 0;
}
var n = 2;
var nPrime = 0;
while (nPrime < 64) {
if (isPrime(n)) {
if (nPrime < 8) {
H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
}
K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
nPrime++;
}
n++;
}
}());
// Reusable object
var W = [];
/**
* SHA-256 hash algorithm.
*/
var SHA256 = C_algo.SHA256 = Hasher.extend({
_doReset: function () {
this._hash = new WordArray.init(H.slice(0));
},
_doProcessBlock: function (M, offset) {
// Shortcut
var H = this._hash.words;
// Working variables
var a = H[0];
var b = H[1];
var c = H[2];
var d = H[3];
var e = H[4];
var f = H[5];
var g = H[6];
var h = H[7];
// Computation
for (var i = 0; i < 64; i++) {
if (i < 16) {
W[i] = M[offset + i] | 0;
} else {
var gamma0x = W[i - 15];
var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
((gamma0x << 14) | (gamma0x >>> 18)) ^
(gamma0x >>> 3);
var gamma1x = W[i - 2];
var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
((gamma1x << 13) | (gamma1x >>> 19)) ^
(gamma1x >>> 10);
W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
}
var ch = (e & f) ^ (~e & g);
var maj = (a & b) ^ (a & c) ^ (b & c);
var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
var t1 = h + sigma1 + ch + K[i] + W[i];
var t2 = sigma0 + maj;
h = g;
g = f;
f = e;
e = (d + t1) | 0;
d = c;
c = b;
b = a;
a = (t1 + t2) | 0;
}
// Intermediate hash value
H[0] = (H[0] + a) | 0;
H[1] = (H[1] + b) | 0;
H[2] = (H[2] + c) | 0;
H[3] = (H[3] + d) | 0;
H[4] = (H[4] + e) | 0;
H[5] = (H[5] + f) | 0;
H[6] = (H[6] + g) | 0;
H[7] = (H[7] + h) | 0;
},
_doFinalize: function () {
// Shortcuts
var data = this._data;
var dataWords = data.words;
var nBitsTotal = this._nDataBytes * 8;
var nBitsLeft = data.sigBytes * 8;
// Add padding
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
data.sigBytes = dataWords.length * 4;
// Hash final blocks
this._process();
// Return final computed hash
return this._hash;
},
clone: function () {
var clone = Hasher.clone.call(this);
clone._hash = this._hash.clone();
return clone;
}
});
/**
* Shortcut function to the hasher's object interface.
*
* @param {WordArray|string} message The message to hash.
*
* @return {WordArray} The hash.
*
* @static
*
* @example
*
* var hash = CryptoJS.SHA256('message');
* var hash = CryptoJS.SHA256(wordArray);
*/
C.SHA256 = Hasher._createHelper(SHA256);
/**
* Shortcut function to the HMAC's object interface.
*
* @param {WordArray|string} message The message to hash.
* @param {WordArray|string} key The secret key.
*
* @return {WordArray} The HMAC.
*
* @static
*
* @example
*
* var hmac = CryptoJS.HmacSHA256(message, key);
*/
C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
}(Math));
return CryptoJS.SHA256;
}));

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,273 @@
# dark theme based on chalk theme
color:
- '#fc97af'
- '#87f7cf'
- '#f7f494'
- '#72ccff'
- '#f7c5a0'
- '#d4a4eb'
- '#d2f5a6'
- '#76f2f2'
backgroundColor: rgba(41,52,65,1)
textStyle: {}
title:
textStyle:
color: '#ffffff'
subtextStyle:
color: '#dddddd'
line:
itemStyle:
borderWidth: 1
lineStyle:
width: 2
symbolSize: 6
symbol: circle
smooth: true
radar:
itemStyle:
borderWidth: 1
lineStyle:
width: 2
symbolSize: 3
symbol: circle
smooth: true
bar:
itemStyle:
barBorderWidth: 0
barBorderColor: '#ccc'
pie:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
scatter:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
boxplot:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
parallel:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
sankey:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
funnel:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
gauge:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
candlestick:
itemStyle:
color: '#fc97af'
color0: transparent
borderColor: '#fc97af'
borderColor0: '#87f7cf'
borderWidth: 1
graph:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
lineStyle:
width: 1
color: '#ffffff'
symbolSize: 3
symbol: emptyCircle
smooth: true
color:
- '#fc97af'
- '#87f7cf'
- '#f7f494'
- '#72ccff'
- '#f7c5a0'
- '#d4a4eb'
- '#d2f5a6'
- '#76f2f2'
label:
color: '#293441'
map:
itemStyle:
areaColor: '#f3f3f3'
borderColor: '#999999'
borderWidth: 0.5
label:
color: '#893448'
emphasis:
itemStyle:
areaColor: rgba(255,178,72,1)
borderColor: '#eb8146'
borderWidth: 1
label:
color: rgb(137,52,72)
geo:
itemStyle:
areaColor: '#f3f3f3'
borderColor: '#999999'
borderWidth: 0.5
label:
color: '#893448'
emphasis:
itemStyle:
areaColor: rgba(255,178,72,1)
borderColor: '#eb8146'
borderWidth: 1
label:
color: rgb(137,52,72)
categoryAxis:
axisLine:
show: true
lineStyle:
color: '#666666'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#aaaaaa'
splitLine:
show: false
lineStyle:
color:
- '#e6e6e6'
splitArea:
show: false
areaStyle:
color:
- rgba(250,250,250,0.05)
- rgba(200,200,200,0.02)
valueAxis:
axisLine:
show: true
lineStyle:
color: '#666666'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#aaaaaa'
splitLine:
show: true
lineStyle:
color:
- '#e6e6e6'
splitArea:
show: false
areaStyle:
color:
- rgba(250,250,250,0.05)
- rgba(200,200,200,0.02)
logAxis:
axisLine:
show: true
lineStyle:
color: '#666666'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#aaaaaa'
splitLine:
show: true
lineStyle:
color:
- '#e6e6e6'
splitArea:
show: true
areaStyle:
color:
- rgba(250,250,250,0.05)
- rgba(200,200,200,0.02)
timeAxis:
axisLine:
show: true
lineStyle:
color: '#666666'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#aaaaaa'
splitLine:
show: true
lineStyle:
color:
- '#e6e6e6'
splitArea:
show: false
areaStyle:
color:
- rgba(250,250,250,0.05)
- rgba(200,200,200,0.02)
toolbox:
iconStyle:
borderColor: '#999999'
emphasis:
iconStyle:
borderColor: '#666666'
legend:
textStyle:
color: '#999999'
tooltip:
axisPointer:
lineStyle:
color: '#cccccc'
width: 1
crossStyle:
color: '#cccccc'
width: 1
timeline:
lineStyle:
color: '#87f7cf'
width: 1
itemStyle:
color: '#87f7cf'
borderWidth: 1
controlStyle:
color: '#87f7cf'
borderColor: '#87f7cf'
borderWidth: 0.5
checkpointStyle:
color: '#fc97af'
borderColor: '#fc97af'
label:
color: '#87f7cf'
emphasis:
itemStyle:
color: '#f7f494'
controlStyle:
color: '#87f7cf'
borderColor: '#87f7cf'
borderWidth: 0.5
label:
color: '#87f7cf'
visualMap:
color:
- '#fc97af'
- '#87f7cf'
dataZoom:
backgroundColor: rgba(255,255,255,0)
dataBackgroundColor: rgba(114,204,255,1)
fillerColor: rgba(114,204,255,0.2)
handleColor: '#72ccff'
handleSize: 100%
textStyle:
color: '#333333'
markPoint:
label:
color: '#293441'
emphasis:
label:
color: '#293441'

View File

@ -0,0 +1,297 @@
# light theme based on macarons theme
color:
- '#2ec7c9'
- '#b6a2de'
- '#5ab1ef'
- '#ffb980'
- '#d87a80'
- '#8d98b3'
- '#e5cf0d'
- '#97b552'
- '#95706d'
- '#dc69aa'
- '#07a2a4'
- '#9a7fd1'
- '#588dd5'
- '#f5994e'
- '#c05050'
- '#59678c'
- '#c9ab00'
- '#7eb00a'
- '#6f5553'
- '#c14089'
backgroundColor: rgba(0,0,0,0)
textStyle: {}
title:
textStyle:
color: '#008acd'
subtextStyle:
color: '#aaaaaa'
line:
itemStyle:
borderWidth: 1
lineStyle:
width: 2
symbolSize: 5
symbol: emptyCircle
smooth: true
radar:
itemStyle:
borderWidth: 1
lineStyle:
width: 2
symbolSize: 3
symbol: emptyCircle
smooth: true
bar:
itemStyle:
barBorderWidth: 0
barBorderColor: '#ccc'
pie:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
scatter:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
boxplot:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
parallel:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
sankey:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
funnel:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
gauge:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
candlestick:
itemStyle:
color: '#d87a80'
color0: '#2ec7c9'
borderColor: '#d87a80'
borderColor0: '#2ec7c9'
borderWidth: 1
graph:
itemStyle:
borderWidth: 0
borderColor: '#ccc'
lineStyle:
width: 1
color: '#aaaaaa'
symbolSize: 3
symbol: emptyCircle
smooth: true
color:
- '#2ec7c9'
- '#b6a2de'
- '#5ab1ef'
- '#ffb980'
- '#d87a80'
- '#8d98b3'
- '#e5cf0d'
- '#97b552'
- '#95706d'
- '#dc69aa'
- '#07a2a4'
- '#9a7fd1'
- '#588dd5'
- '#f5994e'
- '#c05050'
- '#59678c'
- '#c9ab00'
- '#7eb00a'
- '#6f5553'
- '#c14089'
label:
color: '#eeeeee'
map:
itemStyle:
areaColor: '#dddddd'
borderColor: '#eeeeee'
borderWidth: 0.5
label:
color: '#d87a80'
emphasis:
itemStyle:
areaColor: rgba(254,153,78,1)
borderColor: '#444'
borderWidth: 1
label:
color: rgb(100,0,0)
geo:
itemStyle:
areaColor: '#dddddd'
borderColor: '#eeeeee'
borderWidth: 0.5
label:
color: '#d87a80'
emphasis:
itemStyle:
areaColor: rgba(254,153,78,1)
borderColor: '#444'
borderWidth: 1
label:
color: rgb(100,0,0)
categoryAxis:
axisLine:
show: true
lineStyle:
color: '#008acd'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#333'
splitLine:
show: false
lineStyle:
color:
- '#eee'
splitArea:
show: false
areaStyle:
color:
- rgba(250,250,250,0.3)
- rgba(200,200,200,0.3)
valueAxis:
axisLine:
show: true
lineStyle:
color: '#008acd'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#333'
splitLine:
show: true
lineStyle:
color:
- '#eee'
splitArea:
show: true
areaStyle:
color:
- rgba(250,250,250,0.3)
- rgba(200,200,200,0.3)
logAxis:
axisLine:
show: true
lineStyle:
color: '#008acd'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#333'
splitLine:
show: true
lineStyle:
color:
- '#eee'
splitArea:
show: true
areaStyle:
color:
- rgba(250,250,250,0.3)
- rgba(200,200,200,0.3)
timeAxis:
axisLine:
show: true
lineStyle:
color: '#008acd'
axisTick:
show: true
lineStyle:
color: '#333'
axisLabel:
show: true
color: '#333'
splitLine:
show: true
lineStyle:
color:
- '#eee'
splitArea:
show: false
areaStyle:
color:
- rgba(250,250,250,0.3)
- rgba(200,200,200,0.3)
toolbox:
iconStyle:
borderColor: '#2ec7c9'
emphasis:
iconStyle:
borderColor: '#18a4a6'
legend:
textStyle:
color: '#333333'
tooltip:
axisPointer:
lineStyle:
color: '#008acd'
width: 1
crossStyle:
color: '#008acd'
width: 1
timeline:
lineStyle:
color: '#008acd'
width: 1
itemStyle:
color: '#008acd'
borderWidth: 1
controlStyle:
color: '#008acd'
borderColor: '#008acd'
borderWidth: 0.5
checkpointStyle:
color: '#2ec7c9'
borderColor: '#2ec7c9'
label:
color: '#008acd'
emphasis:
itemStyle:
color: '#a9334c'
controlStyle:
color: '#008acd'
borderColor: '#008acd'
borderWidth: 0.5
label:
color: '#008acd'
visualMap:
color:
- '#5ab1ef'
- '#e0ffff'
dataZoom:
backgroundColor: rgba(47,69,84,0)
dataBackgroundColor: '#efefff'
fillerColor: rgba(182,162,222,0.2)
handleColor: '#008acd'
handleSize: 100%
textStyle:
color: '#333333'
markPoint:
label:
color: '#eeeeee'
emphasis:
label:
color: '#eeeeee'

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(()=>{var o,u,f=new Set,b=document.createElement("link").relList.supports("prefetch"),y="instantAllowQueryString"in document.body.dataset,E="instantAllowExternalLinks"in document.body.dataset,L="instantWhitelist"in document.body.dataset,m="instantMousedownShortcut"in document.body.dataset,h=1111,p=65,w=!1,v=!1,c=!1,g=null;navigator.userAgentData&&navigator.userAgentData.brands.forEach(({brand:t,version:e})=>{t=="Chromium"&&(g=parseInt(e))});if("instantIntensity"in document.body.dataset){let t=document.body.dataset.instantIntensity;if(t.startsWith("mousedown"))w=!0,t=="mousedown-only"&&(v=!0);else if(t.startsWith("viewport"))navigator.connection&&(navigator.connection.saveData||navigator.connection.effectiveType&&navigator.connection.effectiveType.includes("2g"))||(t=="viewport"?document.documentElement.clientWidth*document.documentElement.clientHeight<45e4&&(c=!0):t=="viewport-all"&&(c=!0));else{let e=parseInt(t);isNaN(e)||(p=e)}}if(b){let t={capture:!0,passive:!0};if(v||document.addEventListener("touchstart",I,t),w?m||document.addEventListener("mousedown",O,t):document.addEventListener("mouseover",T,t),m&&document.addEventListener("mousedown",A,t),c){let e=window.requestIdleCallback;e||(e=n=>{n()}),e(function(){let i=new IntersectionObserver(s=>{s.forEach(l=>{if(l.isIntersecting){let d=l.target;i.unobserve(d),a(d.href)}})});document.querySelectorAll("a").forEach(s=>{r(s)&&i.observe(s)})},{timeout:1500})}}function I(t){u=performance.now();let e=t.target.closest("a");r(e)&&a(e.href,"high")}function T(t){if(performance.now()-u<h||!("closest"in t.target))return;let e=t.target.closest("a");r(e)&&(e.addEventListener("mouseout",k,{passive:!0}),o=setTimeout(()=>{a(e.href,"high"),o=void 0},p))}function O(t){let e=t.target.closest("a");r(e)&&a(e.href,"high")}function k(t){t.relatedTarget&&t.target.closest("a")==t.relatedTarget.closest("a")||o&&(clearTimeout(o),o=void 0)}function A(t){if(performance.now()-u<h)return;let e=t.target.closest("a");if(t.which>1||t.metaKey||t.ctrlKey||!e)return;e.addEventListener("click",function(i){i.detail!=1337&&i.preventDefault()},{capture:!0,passive:!1,once:!0});let n=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1,detail:1337});e.dispatchEvent(n)}function r(t){if(!(!t||!t.href)&&!(L&&!("instant"in t.dataset))&&!(t.origin!=location.origin&&(!(E||"instant"in t.dataset)||!g))&&["http:","https:"].includes(t.protocol)&&!(t.protocol=="http:"&&location.protocol=="https:")&&!(!y&&t.search&&!("instant"in t.dataset))&&!(t.hash&&t.pathname+t.search==location.pathname+location.search)&&!("noInstant"in t.dataset))return!0}function a(t,e="auto"){if(f.has(t))return;let n=document.createElement("link");n.rel="prefetch",n.href=t,n.fetchPriority=e,n.as="document",document.head.appendChild(n),f.add(t)}})();

Some files were not shown because too many files have changed in this diff Show More