代码块优化,增加aardio、R语言代码高亮等

This commit is contained in:
2026-08-05 11:58:35 +08:00
parent 860dffd547
commit e50047e1c8
14 changed files with 1270 additions and 50 deletions

View File

@@ -4292,12 +4292,12 @@ a.post-title:visited {
border: 1px solid color-mix(in srgb, var(--j13-green) 12%, var(--j13-border-light));
}
/* 代码块外壳 */
/* 代码块外壳(默认跟亮色主题;暗色见下方 .dark */
.post-detail-content .md-codeblock {
margin: 1.15em 0;
border: 1px solid var(--j13-border-light);
border: 1px solid #d8dee4;
border-radius: 12px;
background: #0f1419;
background: #f6f8fa;
overflow: hidden;
box-shadow: var(--j13-shadow-soft);
}
@@ -4307,34 +4307,78 @@ a.post-title:visited {
justify-content: space-between;
gap: 12px;
padding: 8px 12px;
background: #161b22;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
background: #eef1f4;
border-bottom: 1px solid #d8dee4;
}
.post-detail-content .md-codeblock__lang {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.45);
color: #656d76;
}
.post-detail-content .md-codeblock__copy {
/* aardio 品牌名保持全小写,不做 uppercase */
.post-detail-content .md-codeblock[data-lang="aardio"] .md-codeblock__lang {
text-transform: none;
letter-spacing: 0.02em;
}
.post-detail-content .md-codeblock__actions {
display: inline-flex;
align-items: center;
gap: 6px;
}
.post-detail-content .md-codeblock__editor-meta {
font-size: 11px;
font-weight: 500;
letter-spacing: 0.02em;
color: #656d76;
}
/* 编辑态代码块:只保留主题壳 / 头栏角标 / 可编辑正文,行号与折叠交给阅读态 */
.article-prosemirror .md-codeblock--editor {
margin: 1em 0;
}
.article-prosemirror .md-codeblock--editor .md-codeblock__head {
cursor: default;
user-select: none;
}
.article-prosemirror .md-codeblock--editor .md-codeblock__pre {
min-height: 1.65em;
/* 编辑态永不按折叠裁切,即使误带 collapsed class */
max-height: none !important;
overflow: visible !important;
}
.article-prosemirror .md-codeblock--editor .md-codeblock__pre::after {
display: none !important;
}
.article-prosemirror .md-codeblock--editor .md-codeblock__pre code,
.article-prosemirror .md-codeblock--editor.md-codeblock--lines .md-codeblock__pre code {
display: block;
outline: none;
/* 覆盖阅读态行号布局的 white-space: normal避免粘贴多行被挤成一行 */
white-space: pre-wrap;
overflow-wrap: normal;
word-break: normal;
}
.post-detail-content .md-codeblock__copy,
.post-detail-content .md-codeblock__fold {
padding: 3px 10px;
border: 1px solid rgba(255, 255, 255, 0.12);
border: 1px solid #d0d7de;
border-radius: 6px;
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.72);
background: #fff;
color: #57606a;
font-size: 12px;
line-height: 1.4;
cursor: pointer;
transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.post-detail-content .md-codeblock__copy:hover {
background: rgba(255, 255, 255, 0.1);
color: #fff;
.post-detail-content .md-codeblock__copy:hover,
.post-detail-content .md-codeblock__fold:hover {
background: #f3f4f6;
color: #24292f;
}
.post-detail-content .md-codeblock__copy.is-copied {
border-color: color-mix(in srgb, var(--j13-green) 50%, transparent);
color: #7ee2a8;
color: color-mix(in srgb, var(--j13-green) 55%, #24292f);
}
.post-detail-content .md-codeblock__pre,
.post-detail-content pre {
@@ -4343,10 +4387,11 @@ a.post-title:visited {
background: transparent;
border-radius: 0;
overflow-x: auto;
color: #e6edf3;
color: #24292f;
font-size: 13px;
line-height: 1.65;
tab-size: 2;
position: relative;
}
.post-detail-content .md-codeblock__pre code,
.post-detail-content pre code {
@@ -4357,56 +4402,182 @@ a.post-title:visited {
color: inherit;
font-size: inherit;
white-space: pre;
display: block;
}
/* 行号布局:外层改为 normal正文行内保留 pre */
.post-detail-content .md-codeblock--lines .md-codeblock__pre code {
white-space: normal;
}
/* 行号:列宽随 data-lineno-digits 自适应nowrap 避免父级 white-space:normal 把多位数折行 */
.post-detail-content .md-codeblock--lines {
--md-lineno-col: 1ch;
}
.post-detail-content .md-codeblock--lines[data-lineno-digits="2"] {
--md-lineno-col: 2ch;
}
.post-detail-content .md-codeblock--lines[data-lineno-digits="3"] {
--md-lineno-col: 3ch;
}
.post-detail-content .md-codeblock--lines[data-lineno-digits="4"] {
--md-lineno-col: 4ch;
}
.post-detail-content .md-code-line {
display: block;
min-height: 1.65em;
}
.post-detail-content .md-codeblock--lines .md-code-line {
display: grid;
grid-template-columns: var(--md-lineno-col) minmax(0, 1fr);
column-gap: 10px;
}
.post-detail-content .md-code-line__num {
user-select: none;
text-align: right;
color: #8c959f;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.post-detail-content .md-code-line__body {
min-width: 0;
overflow-wrap: normal;
white-space: pre;
}
/* 默认折叠:约 5 行;刚好 5 行时再压到约 2 行,保证能看出效果 */
.post-detail-content .md-codeblock--collapsed .md-codeblock__pre {
max-height: calc(5 * 1.65em + 28px);
overflow: hidden;
}
.post-detail-content .md-codeblock--collapsed.md-codeblock--short .md-codeblock__pre {
max-height: calc(2 * 1.65em + 20px);
}
.post-detail-content .md-codeblock--collapsed .md-codeblock__pre::after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 56px;
pointer-events: none;
background: linear-gradient(to bottom, transparent, #f6f8fa 85%);
}
/* 未包壳的遗留 pre兜底 */
.post-detail-content > pre {
margin: 1.15em 0;
padding: 14px 16px;
background: #0f1419;
border: 1px solid var(--j13-border-light);
background: #f6f8fa;
border: 1px solid #d8dee4;
border-radius: 12px;
color: #e6edf3;
color: #24292f;
overflow-x: auto;
}
/* highlight.js token深色代码块 */
/* highlight.js token亮色 */
.post-detail-content .hljs-comment,
.post-detail-content .hljs-quote { color: #8b949e; font-style: italic; }
.post-detail-content .hljs-quote { color: #6e7781; font-style: italic; }
.post-detail-content .hljs-keyword,
.post-detail-content .hljs-selector-tag,
.post-detail-content .hljs-addition { color: #ff7b72; }
.post-detail-content .hljs-addition { color: #cf222e; }
.post-detail-content .hljs-string,
.post-detail-content .hljs-meta .hljs-string,
.post-detail-content .hljs-attribute { color: #a5d6ff; }
.post-detail-content .hljs-attribute { color: #0a3069; }
.post-detail-content .hljs-number,
.post-detail-content .hljs-literal,
.post-detail-content .hljs-variable,
.post-detail-content .hljs-template-variable { color: #79c0ff; }
.post-detail-content .hljs-template-variable { color: #0550ae; }
.post-detail-content .hljs-title,
.post-detail-content .hljs-section,
.post-detail-content .hljs-name { color: #d2a8ff; }
.post-detail-content .hljs-name { color: #8250df; }
.post-detail-content .hljs-type,
.post-detail-content .hljs-class .hljs-title { color: #ffa657; }
.post-detail-content .hljs-class .hljs-title { color: #953800; }
.post-detail-content .hljs-built_in,
.post-detail-content .hljs-params { color: #ffa657; }
.post-detail-content .hljs-params { color: #953800; }
.post-detail-content .hljs-attr,
.post-detail-content .hljs-symbol,
.post-detail-content .hljs-bullet { color: #7ee787; }
.post-detail-content .hljs-bullet { color: #116329; }
.post-detail-content .hljs-meta,
.post-detail-content .hljs-deletion { color: #ffa198; }
.post-detail-content .hljs-deletion { color: #82071e; }
.post-detail-content .hljs-regexp,
.post-detail-content .hljs-link { color: #a5d6ff; }
.post-detail-content .hljs-link { color: #0a3069; }
.post-detail-content .hljs-operator { color: #cf222e; }
.post-detail-content .hljs-emphasis { font-style: italic; }
.post-detail-content .hljs-strong { font-weight: 700; }
/* 暗色主题:代码块跟随站点主题自动切换 */
.dark .post-detail-content .md-codeblock {
background: #0b0d10;
background: #0f1419;
border-color: #2a2f36;
}
.dark .post-detail-content .md-codeblock__head {
background: #12151a;
background: #161b22;
border-bottom-color: rgba(255, 255, 255, 0.06);
}
.dark .post-detail-content .md-codeblock__lang {
color: rgba(255, 255, 255, 0.45);
}
.dark .post-detail-content .md-codeblock__editor-meta {
color: rgba(255, 255, 255, 0.4);
}
.dark .post-detail-content .md-codeblock__copy,
.dark .post-detail-content .md-codeblock__fold {
border-color: rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.72);
}
.dark .post-detail-content .md-codeblock__copy:hover,
.dark .post-detail-content .md-codeblock__fold:hover {
background: rgba(255, 255, 255, 0.1);
color: #fff;
}
.dark .post-detail-content .md-codeblock__copy.is-copied {
border-color: color-mix(in srgb, var(--j13-green) 50%, transparent);
color: #7ee2a8;
}
.dark .post-detail-content .md-codeblock__pre,
.dark .post-detail-content pre {
color: #e6edf3;
}
.dark .post-detail-content .md-code-line__num {
color: rgba(255, 255, 255, 0.28);
}
.dark .post-detail-content .md-codeblock--collapsed .md-codeblock__pre::after {
background: linear-gradient(to bottom, transparent, #0f1419 85%);
}
.dark .post-detail-content > pre {
background: #0f1419;
border-color: #2a2f36;
color: #e6edf3;
}
.dark .post-detail-content .hljs-comment,
.dark .post-detail-content .hljs-quote { color: #8b949e; }
.dark .post-detail-content .hljs-keyword,
.dark .post-detail-content .hljs-selector-tag,
.dark .post-detail-content .hljs-addition { color: #ff7b72; }
.dark .post-detail-content .hljs-string,
.dark .post-detail-content .hljs-meta .hljs-string,
.dark .post-detail-content .hljs-attribute { color: #a5d6ff; }
.dark .post-detail-content .hljs-number,
.dark .post-detail-content .hljs-literal,
.dark .post-detail-content .hljs-variable,
.dark .post-detail-content .hljs-template-variable { color: #79c0ff; }
.dark .post-detail-content .hljs-title,
.dark .post-detail-content .hljs-section,
.dark .post-detail-content .hljs-name { color: #d2a8ff; }
.dark .post-detail-content .hljs-type,
.dark .post-detail-content .hljs-class .hljs-title { color: #ffa657; }
.dark .post-detail-content .hljs-built_in,
.dark .post-detail-content .hljs-params { color: #ffa657; }
.dark .post-detail-content .hljs-attr,
.dark .post-detail-content .hljs-symbol,
.dark .post-detail-content .hljs-bullet { color: #7ee787; }
.dark .post-detail-content .hljs-meta,
.dark .post-detail-content .hljs-deletion { color: #ffa198; }
.dark .post-detail-content .hljs-regexp,
.dark .post-detail-content .hljs-link { color: #a5d6ff; }
.dark .post-detail-content .hljs-operator { color: #ff7b72; }
/* 评论区 — 独立卡片板块 */
.comment-section {
@@ -7273,6 +7444,119 @@ button.profile-stat:hover strong {
gap: 8px;
}
/* 代码块插入弹窗 */
.article-codeblock-dialog__body {
display: flex;
flex-direction: column;
gap: 20px;
margin-top: 4px;
}
.article-codeblock-dialog__section {
display: flex;
flex-direction: column;
gap: 10px;
}
.article-codeblock-dialog__langs {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
max-height: 220px;
overflow: auto;
padding: 10px;
border: 1px solid var(--j13-border-light);
border-radius: 12px;
background: var(--j13-bg-block-muted);
}
.article-codeblock-dialog__lang {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 8px;
padding: 9px 12px;
border: 1px solid transparent;
border-radius: 9px;
background: var(--j13-bg-surface);
color: var(--color-text-1, inherit);
font-size: 13px;
text-align: left;
cursor: pointer;
transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;
}
.article-codeblock-dialog__lang:hover {
border-color: color-mix(in srgb, var(--j13-green) 25%, var(--j13-border));
}
.article-codeblock-dialog__lang.is-active {
border-color: color-mix(in srgb, var(--j13-green) 45%, transparent);
background: var(--j13-green-bg);
color: var(--j13-green-hover);
font-weight: 600;
box-shadow: 0 0 0 1px color-mix(in srgb, var(--j13-green) 20%, transparent);
}
.article-codeblock-dialog__lang-id {
font-size: 11px;
opacity: 0.55;
font-family: ui-monospace, Consolas, monospace;
font-weight: 400;
}
.article-codeblock-dialog__empty {
grid-column: 1 / -1;
margin: 0;
padding: 16px;
font-size: 13px;
color: var(--color-text-3, #8b949e);
text-align: center;
}
.article-codeblock-dialog__codehint {
display: inline;
padding: 1px 5px;
border-radius: 4px;
background: var(--j13-bg-block-muted);
font-family: ui-monospace, Consolas, monospace;
font-size: 11px;
color: var(--color-text-2, inherit);
}
.article-codeblock-dialog__toggles {
display: flex;
flex-direction: column;
gap: 12px;
padding-top: 2px;
}
.article-codeblock-dialog__toggle {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 16px;
border: 1px solid var(--j13-border-light);
border-radius: 12px;
background: var(--j13-bg-block-muted);
}
.article-codeblock-dialog__toggle-text {
display: flex;
flex-direction: column;
gap: 5px;
min-width: 0;
}
.article-codeblock-dialog__toggle-text p {
margin: 0;
font-size: 12px;
color: var(--color-text-3, #8b949e);
line-height: 1.45;
}
.article-codeblock-dialog__footer {
gap: 8px;
margin-top: 4px;
}
.article-codeblock-dialog__remove {
margin-right: auto;
}
@media (max-width: 560px) {
.article-codeblock-dialog__langs {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
.article-editor-markdown {
flex: 1;
min-height: 0;