hexo-shiki-highlight
Version:
个人博客[vluv's space](https://vluv.space/)使用的代码高亮插件,基于 [Shiki](https://shiki.style/) 实现。
302 lines (262 loc) • 5.96 kB
CSS
/* ===== SCROLLBAR STYLES ===== */
figure.shiki div.codeblock::-webkit-scrollbar {
width: 5px;
height: 5px;
}
figure.shiki div.codeblock::-webkit-scrollbar-thumb {
background: var(--hlscrollbar-bg);
border-radius: 2.5px;
}
/* ===== MAIN CODE BLOCK FIGURE ===== */
figure.shiki {
margin: 0 0 24px;
padding: 0;
border-radius: 8px ;
border: #313244 1.5px solid;
background: var(--hl-bg);
color: var(--hl-color);
line-height: 1.6;
position: relative;
overflow: auto;
-webkit-transform: translateZ(0);
transform: translateZ(0);
}
/* Hide content when toolbar is closed */
figure.shiki .shiki-tools.closed~* {
display: none;
}
/* ===== TOOLBAR STYLES ===== */
.shiki-tools {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 30px;
height: 0.9em;
padding: 0 15px;
border-radius: 35px 35px 0 0;
background: var(--hltools-bg);
color: var(--hltools-color);
font-size: 1em;
user-select: none;
overflow: hidden;
position: relative;
}
/* Toolbar sections */
.shiki-tools .left,
.shiki-tools .right {
display: flex;
align-items: center;
flex-shrink: 0;
}
.shiki-tools .left {
gap: 5px;
}
.shiki-tools .right {
gap: 10px;
}
.shiki-tools .center {
display: flex;
align-items: center;
justify-content: center;
flex-grow: 1;
overflow: hidden;
min-width: 0;
}
/* ===== INTERACTIVE ELEMENTS ===== */
.shiki-tools .copy-button,
.shiki-tools .raw-button,
.shiki-tools .fa-list-ol,
.shiki-tools .fa-arrow-down-wide-short,
.shiki-tools .expand {
cursor: pointer;
transition: color 0.3s, transform 0.3s ease;
}
.shiki-tools .expand {
font-size: 1.2em;
margin-left: -2px;
}
.shiki-tools .expand.closed {
transform: rotate(90deg);
}
/* Hover effects */
.shiki-tools .copy-button:hover,
.shiki-tools .raw-button:hover,
.shiki-tools .fa-list-ol:hover,
.shiki-tools .fa-arrow-down-wide-short:hover,
.shiki-tools .expand:hover {
color: #89b4fa;
}
/* ===== COPY NOTICE ===== */
.shiki-tools .copy-notice {
position: absolute;
color: #89b4fa;
background: var(--hltools-bg);
white-space: nowrap;
opacity: 0;
visibility: hidden;
z-index: 1000;
padding: 0 5px 0 0;
transform: translateX(-110%);
transition: opacity 0.2s ease, visibility 0.2s ease;
}
.shiki-tools .copy-notice[style*="opacity: 1"] {
opacity: 1;
visibility: visible;
}
/* ===== TITLE AND LANGUAGE STYLES ===== */
.shiki-tools .code-title {
font-size: 0.9em;
font-weight: 500;
padding: 0 10px;
color: var(--hltools-color);
user-select: text;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex-shrink: 1;
}
.shiki-tools .code-lang {
padding-left: 5px;
font-size: 0.9em;
font-weight: 500;
opacity: 0;
visibility: hidden;
user-select: none;
transition: opacity 0.4s ease, visibility 0.4s ease;
}
figure.shiki:hover .shiki-tools .code-lang {
opacity: 1;
visibility: visible;
}
/* ===== TRAFFIC LIGHTS ===== */
.shiki-tools .left .traffic-lights {
display: flex;
align-items: center;
padding-right: 8px;
margin-left: -7px;
}
.traffic-light {
display: block;
width: 12px;
height: 12px;
border-radius: 50%;
margin-left: 8px;
background-color: #ddd;
position: relative;
}
.traffic-light.red {
background-color: #f38ba8;
}
.traffic-light.yellow {
background-color: #fab387;
}
.traffic-light.green {
background-color: #a6e3a1;
}
/* Traffic light hover icons */
.traffic-light::after {
content: "";
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
color: rgba(0, 0, 0, 0.6);
font-weight: bold;
font-size: 9px;
font-family: "Lucida Grande", "Segoe UI", sans-serif;
opacity: 0;
transition: opacity 0.2s ease-in-out;
}
/* ===== EXPAND BUTTON ===== */
.code-expand-btn {
position: absolute;
bottom: 0;
width: 100%;
z-index: 1000;
display: flex;
justify-content: center;
align-items: center;
background: var(--hlexpand-bg);
font-size: 1em;
cursor: pointer;
}
.code-expand-btn i {
padding: 6px 0;
color: var(--hlnumber-color);
animation: code-expand-pulse 1.2s infinite;
}
.code-expand-btn.expand-done>i {
transform: rotate(180deg);
}
@keyframes code-expand-pulse {
0%,
100% {
opacity: 0.6;
}
50% {
opacity: 0.1;
}
}
/* ===== CODE BLOCK CONTENT ===== */
figure.shiki div.codeblock {
margin: 0;
border: none;
border-radius: 0 0 8px 8px ;
display: flex;
overflow: auto;
padding-bottom: 10px;
}
figure.shiki div.codeblock div {
padding: 0;
border: none;
}
/* Line numbers (gutter) */
figure.shiki .gutter pre {
margin-right: 8px ;
padding: 0 8px ;
background-color: var(--hlnumber-bg) ;
color: var(--hlnumber-color) ;
text-align: right ;
user-select: none ;
border: none ;
border-radius: 0 ;
}
/* Code content */
figure.shiki pre {
margin: 0 ;
padding: 0 ;
border-radius: 0 ;
}
figure.shiki pre code {
background: none ;
border: none ;
}
figure.shiki .codeblock pre * {
font-size: 1em;
font-family: "Maple Mono NF CN", "Fira Code", "JetbrainsMono Nerd Font", Menlo, "DejaVu Sans Mono", monospace, 宋体;
line-height: 1.6;
overflow: auto ;
}
figure.shiki .code pre {
width: 100% ;
padding: 0 ;
background: none ;
}
/* Expand button interactions */
.code-expand-btn:not(.expand-done)~pre,
.code-expand-btn:not(.expand-done)~* pre {
overflow: hidden;
}
.code-expand-btn.expand-done+pre,
.code-expand-btn.expand-done+* pre,
.code-expand-btn.expand-done+div.codeblock,
.code-expand-btn.expand-done+* div.codeblock {
margin-bottom: 1.8em;
}
.code-expand-btn.expand-done+pre,
.code-expand-btn.expand-done+* pre,
.code-expand-btn.expand-done+div.codeblock,
.code-expand-btn.expand-done+* div.codeblock {
margin-bottom: 1.8em;
}