This repository has been archived on 2026-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
MetaLab/templates/MetaLab-2026/static/css/posts.css
Victor_Jay 36b18c0ffe feat: 代码块语法高亮 + 语言选择 + 样式统一
- 引入 @tiptap/extension-code-block-lowlight + lowlight 实现代码语法高亮
- 工具栏新增语言下拉选择器,光标在代码块内时显示,支持 27 种常用语言
- 默认语言 text,高亮主题适配 MetaLab 深蓝背景 (#1a2332)
- 代码块语言标签用 JS 动态注入 DOM 元素(避免 ::before 在 overflow 容器中失效)
- 详情页同步代码块高亮和语言标签显示
- 编辑器与详情页样式统一:代码块暗色背景、引用蓝色边框、链接 accent 蓝
- sanitizePolicy 放行 data-language 属性和 hljs-* class
- 修复 import map 避免 keyed plugin 重复实例
- 修复详情页代码块开头空白行(移除多余的 padding-top)
- 修复语法错误(多余的闭合括号)
2026-05-28 14:34:58 +08:00

445 lines
8.9 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ========== 帖子列表 ========== */
.posts-container {
max-width: 960px;
margin: 0 auto;
padding: 24px 16px;
}
.posts-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.posts-header h1 {
font-size: 28px;
font-weight: 700;
color: #111;
margin: 0;
}
.post-card {
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 10px;
padding: 20px 24px;
margin-bottom: 16px;
transition: box-shadow 0.2s;
}
.post-card:hover {
box-shadow: 0 2px 12px rgba(0,0,0,0.08);
}
.post-card-title a {
font-size: 20px;
font-weight: 600;
color: #111;
text-decoration: none;
}
.post-card-title a:hover {
color: #6366f1;
}
.post-card-meta {
display: flex;
gap: 16px;
margin-top: 8px;
font-size: 13px;
color: #6b7280;
}
.post-card-summary {
margin-top: 12px;
color: #4b5563;
font-size: 14px;
line-height: 1.6;
}
/* ========== 帖子详情 ========== */
.post-detail {
max-width: 800px;
margin: 24px auto 40px;
}
.post-article {
background: #fff;
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
padding: 40px 48px;
}
.post-detail-header {
position: static !important;
z-index: auto !important;
box-shadow: none !important;
background: transparent !important;
margin-bottom: 32px;
padding-bottom: 20px;
border-bottom: 1px solid #e5e7eb;
}
.post-detail-title {
font-size: 32px;
font-weight: 700;
color: #111;
margin: 0 0 12px 0;
line-height: 1.3;
}
.post-detail-meta {
display: flex;
gap: 16px;
align-items: center;
font-size: 14px;
color: #6b7280;
}
.post-detail-body {
font-size: 16px;
line-height: 1.8;
color: #1f2937;
}
.post-detail-body h1,
.post-detail-body h2,
.post-detail-body h3 {
margin-top: 24px;
margin-bottom: 12px;
}
.post-detail-body p {
margin-bottom: 12px;
}
.post-detail-body a {
color: var(--color-accent);
text-decoration: underline;
text-underline-offset: 2px;
transition: color 0.2s;
}
.post-detail-body a:hover {
color: #2980b9;
}
/* 代码块基础样式 */
.post-detail-body pre {
position: relative;
background: #1a2332;
color: #e2e8f0;
padding: 12px 16px;
border-radius: 8px;
overflow-x: auto;
font-size: 14px;
line-height: 1.5;
font-family: 'Menlo', 'Consolas', 'Monaco', 'Liberation Mono', monospace;
}
/* 代码块语言标签JS 动态注入) */
.post-detail-body pre .code-lang-label {
position: absolute;
top: 0;
left: 0;
right: 0;
padding: 4px 16px;
font-size: 11px;
font-weight: 600;
color: #94a3b8;
background: #2c3e50;
border-radius: 8px 8px 0 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
pointer-events: none;
z-index: 1;
}
.post-detail-body pre code {
background: transparent !important;
border: none !important;
padding: 0 !important;
font-size: inherit !important;
white-space: pre;
display: block;
}
.post-detail-body code {
background: #f3f4f6;
padding: 2px 6px;
border-radius: 4px;
font-size: 0.9em;
}
/* highlight.js 语法高亮 — 适配 MetaLab 深蓝背景 */
.post-detail-body pre code .hljs-keyword,
.post-detail-body pre code .hljs-selector-tag,
.post-detail-body pre code .hljs-literal,
.post-detail-body pre code .hljs-section,
.post-detail-body pre code .hljs-link { color: #c792ea; }
.post-detail-body pre code .hljs-string,
.post-detail-body pre code .hljs-title,
.post-detail-body pre code .hljs-name,
.post-detail-body pre code .hljs-type,
.post-detail-body pre code .hljs-attribute,
.post-detail-body pre code .hljs-symbol,
.post-detail-body pre code .hljs-bullet,
.post-detail-body pre code .hljs-addition,
.post-detail-body pre code .hljs-variable,
.post-detail-body pre code .hljs-template-tag,
.post-detail-body pre code .hljs-template-variable { color: #c3e88d; }
.post-detail-body pre code .hljs-comment,
.post-detail-body pre code .hljs-quote,
.post-detail-body pre code .hljs-deletion,
.post-detail-body pre code .hljs-meta { color: #676e95; }
.post-detail-body pre code .hljs-number,
.post-detail-body pre code .hljs-regexp,
.post-detail-body pre code .hljs-built_in { color: #f78c6c; }
.post-detail-body pre code .hljs-function .hljs-title,
.post-detail-body pre code .hljs-doctag,
.post-detail-body pre code .hljs-formula { color: #82aaff; }
.post-detail-body pre code .hljs-tag,
.post-detail-body pre code .hljs-subst { color: #f07178; }
.post-detail-body pre code .hljs-emphasis { font-style: italic; }
.post-detail-body pre code .hljs-strong { font-weight: bold; }
.post-detail-body pre code .hljs-attr,
.post-detail-body pre code .hljs-selector-attr,
.post-detail-body pre code .hljs-selector-class,
.post-detail-body pre code .hljs-selector-id,
.post-detail-body pre code .hljs-selector-pseudo { color: #ffcb6b; }
.post-detail-body img {
max-width: 100%;
height: auto;
border-radius: 8px;
}
.post-detail-body blockquote {
border-left: 4px solid #6366f1;
padding-left: 16px;
color: #6b7280;
margin: 16px 0;
}
.post-status {
padding: 2px 10px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
}
.post-status-draft { background: #f3f4f6; color: #6b7280; }
.post-status-pending { background: #fef3c7; color: #d97706; }
.post-status-approved { background: #d1fae5; color: #059669; }
.post-status-rejected { background: #fef2f2; color: #dc2626; }
.post-status-locked { background: #fee2e2; color: #b91c1c; }
.post-reject-reason {
margin-top: 20px;
padding: 12px 16px;
background: #fef2f2;
border: 1px solid #fecaca;
border-radius: 8px;
color: #b91c1c;
font-size: 14px;
}
.post-actions {
margin-top: 24px;
display: flex;
gap: 12px;
}
/* ========== 编辑器布局(全宽) ========== */
.editor-layout {
height: calc(100vh - 56px);
display: flex;
flex-direction: column;
overflow: hidden;
}
.editor-form {
display: flex;
flex-direction: column;
height: 100%;
}
/* ---- 标题区域 ---- */
.editor-header {
padding: 16px 24px 12px;
border-bottom: 1px solid #e5e7eb;
background: #fff;
flex-shrink: 0;
}
.editor-title-input {
width: 100%;
padding: 6px 0;
border: none;
font-size: 26px;
font-weight: 700;
color: #111;
outline: none;
background: transparent;
line-height: 1.4;
}
.editor-title-input::placeholder {
color: #c4c4c4;
}
/* ---- 编辑器主体 ---- */
.editor-main {
flex: 1;
display: flex;
overflow: hidden;
min-height: 0;
}
.editor-pane {
flex: 1;
overflow: hidden;
min-width: 0;
}
/* ---- 状态栏 ---- */
.editor-statusbar {
display: flex;
align-items: center;
gap: 16px;
padding: 6px 20px;
background: #fafafa;
border-top: 1px solid #e5e7eb;
font-size: 12px;
color: #9ca3af;
flex-shrink: 0;
min-height: 34px;
}
.status-item {
white-space: nowrap;
}
.status-spacer {
flex: 1;
}
.status-draft {
color: #059669;
font-weight: 500;
}
.btn-submit {
padding: 5px 18px;
font-size: 13px;
border-radius: 6px;
}
/* ---- 全屏模式 ---- */
.editor-layout.fullscreen {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
height: 100vh;
background: #fff;
}
/* ========== 404 ========== */
.error-404 {
text-align: center;
padding: 80px 0;
}
.error-404 h1 {
font-size: 72px;
color: #d1d5db;
margin: 0;
}
.error-404 p {
font-size: 18px;
color: #6b7280;
margin: 12px 0 24px;
}
/* ========== 空状态 ========== */
.empty-state {
text-align: center;
padding: 60px 0;
color: #9ca3af;
font-size: 16px;
}
.search-hint {
margin-bottom: 16px;
color: #6b7280;
font-size: 14px;
}
/* ========== 按钮 ========== */
.btn {
display: inline-block;
padding: 10px 20px;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
transition: background 0.2s;
}
.btn-primary {
background: #6366f1;
color: #fff;
}
.btn-primary:hover { background: #4f46e5; }
.btn-secondary {
background: #f3f4f6;
color: #374151;
}
.btn-secondary:hover { background: #e5e7eb; }
/* ========== 分页 ========== */
.pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 16px;
margin-top: 32px;
padding-top: 20px;
border-top: 1px solid #e5e7eb;
}
.page-link {
padding: 8px 16px;
border: 1px solid #d1d5db;
border-radius: 8px;
color: #374151;
text-decoration: none;
font-size: 14px;
}
.page-link:hover { background: #f3f4f6; }
.page-info {
font-size: 14px;
color: #6b7280;
}
/* ========== 错误消息 ========== */
.error-message {
padding: 12px 16px;
background: #fef2f2;
border: 1px solid #fecaca;
border-radius: 8px;
color: #b91c1c;
margin-bottom: 16px;
}