Files
jiang13-bbs/frontend/app/globals.css
freefire c6df1b3b7e fix(frontend): 代码块折叠加高度动画,头部在视口外时滚动跟随
收起/展开用 max-height 过渡;头部仍在视口内不改滚动,在视口外则钉住收起按钮随动画跟滚。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-16 06:49:01 +08:00

2226 lines
58 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.
@import "tailwindcss";
/* ============================================================
姜十三论坛 · GRAPHITE INDIGO 设计系统
冷调石墨灰阶 / 纯白卡片 / 靛蓝主色 / 近黑锌灰暗色
============================================================ */
:root {
/* 浅色(默认)——冷调石墨:底色微蓝灰,面板纯白浮起,层次干净锐利 */
--bg: #f6f7f9;
--panel: #ffffff;
--panel-2: #f2f4f7;
--tint: #eceff3;
--ink: #161a22;
--ink-2: #4b5260;
--ink-3: #5b6270;
--line: #e4e7ec; /* 装饰性分隔/卡片边(非交互,配合阴影与底色高差) */
--line-2: #7c8698; /* 功能性边界:输入框/按钮/分页等可交互控件,满足 1.4.11 ≥3:1 */
--accent: #3b5bdb;
--accent-hi: #3451c8;
--accent-soft: rgba(59, 91, 219, 0.1);
--accent-on: #ffffff;
--clay: #a5420a;
--clay-soft: rgba(165, 66, 10, 0.12);
--gold: #825700;
--gold-soft: rgba(130, 87, 0, 0.13);
--danger: #c8281e;
--danger-soft: rgba(200, 40, 30, 0.09);
--ok: #137333;
--ok-soft: rgba(19, 115, 51, 0.1);
/* 工作台语义:导航选中态 / 榜单奖牌色 */
--nav-active-bg: var(--accent-soft);
--nav-active-ink: var(--accent);
--nav-active-line: rgba(59, 91, 219, 0.22);
--rank-1: #96620f;
--rank-2: #5d6676;
--rank-3: #a05a2c;
--shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.05);
--shadow: 0 2px 8px rgba(16, 24, 40, 0.05), 0 10px 28px rgba(16, 24, 40, 0.06);
--shadow-lg: 0 6px 16px rgba(16, 24, 40, 0.08), 0 20px 48px rgba(16, 24, 40, 0.12);
/* next/font 构建期自托管,变量由 layout.tsx 注入;
本地系统字体仅作网络字体分片就绪前的回退(PingFang/雅黑与 Noto 观感接近) */
--font-display: var(--font-jakarta), var(--font-noto-sc), -apple-system,
"PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
--font-sans: var(--font-jakarta), var(--font-noto-sc), -apple-system,
"PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
--font-mono: var(--font-jetbrains), var(--font-noto-sc), ui-monospace,
"Cascadia Code", Consolas, monospace;
--r: 18px;
--r-sm: 12px;
color-scheme: light;
}
.dark {
/* 近黑锌灰:面板逐层浮起,靛蓝提亮为长春花蓝 */
--bg: #0f1115;
--panel: #181b21;
--panel-2: #20242c;
--tint: #282d37;
--ink: #eef1f6;
--ink-2: #b6bdc9;
--ink-3: #98a1b2;
--line: rgba(238, 241, 246, 0.08); /* 装饰性分隔/卡片边 */
--line-2: rgba(238, 241, 246, 0.38); /* 功能性控件边界,1.4.11 ≥3:1 */
--accent: #8ea2ff;
--accent-hi: #a9b8ff;
--accent-soft: rgba(141, 163, 255, 0.16);
--accent-on: #10162b;
--clay: #f0875a;
--clay-soft: rgba(240, 135, 90, 0.16);
--gold: #e0b259;
--gold-soft: rgba(224, 178, 89, 0.16);
--danger: #ff6b60;
--danger-soft: rgba(255, 107, 96, 0.15);
--ok: #58d18a;
--ok-soft: rgba(88, 209, 138, 0.15);
/* 工作台语义 */
--nav-active-bg: rgba(141, 163, 255, 0.14);
--nav-active-ink: #a9b8ff;
--nav-active-line: rgba(141, 163, 255, 0.3);
--rank-1: #e3bf74;
--rank-2: #b9c1cd;
--rank-3: #e0a06e;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow: 0 2px 8px rgba(0, 0, 0, 0.28), 0 12px 32px rgba(0, 0, 0, 0.22);
--shadow-lg: 0 6px 18px rgba(0, 0, 0, 0.35), 0 24px 56px rgba(0, 0, 0, 0.3);
color-scheme: dark;
}
html {
scrollbar-color: var(--line-2) transparent;
}
body {
background-color: var(--bg);
color: var(--ink);
font-family: var(--font-sans);
/* 亚像素渲染在 Windows 高分屏更实;强制 grayscale 会让 400/500 中文偏虚 */
-webkit-font-smoothing: auto;
text-rendering: optimizeLegibility;
font-synthesis: none; /* 禁止伪粗,避免缺档字重糊成一团 */
}
/* 全站悬停即显提示气泡(配合 TipHost + data-tip,替代原生 title 延迟) */
.j13-tip-bubble {
position: fixed;
z-index: 9999;
max-width: min(280px, calc(100vw - 20px));
padding: 5px 10px;
border-radius: 8px;
font-size: 12px;
font-weight: 400;
line-height: 1.4;
letter-spacing: 0.01em;
pointer-events: none;
white-space: normal;
overflow-wrap: anywhere;
color: var(--accent);
background: color-mix(in srgb, var(--accent) 10%, var(--panel));
border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--line));
box-shadow: var(--shadow-sm);
animation: j13-tip-in 80ms ease-out;
}
.dark .j13-tip-bubble {
color: var(--accent);
background: color-mix(in srgb, var(--accent) 16%, var(--panel));
border-color: color-mix(in srgb, var(--accent) 38%, var(--line));
}
@keyframes j13-tip-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@media (prefers-reduced-motion: reduce) {
.j13-tip-bubble {
animation: none;
}
}
/* ============================================================
发帖台:文档式舞台(对齐私信页体量;不改动全站 .field)
控件:白底 + 单层描边;聚焦同 j13-chat-search
============================================================ */
.j13-compose-page {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
}
/* Suspense / 客户端壳层也要把高度往下传 */
.j13-compose-page > :last-child {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
}
.j13-compose-stage {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow);
overflow: visible;
}
.j13-compose-body {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
padding: 1.35rem 1.35rem 0.85rem;
gap: 1.1rem;
}
@media (min-width: 640px) {
.j13-compose-body {
padding: 1.5rem 1.75rem 0.9rem;
gap: 1.15rem;
}
}
.j13-compose-actions {
flex-shrink: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.75rem 1rem;
padding: 1rem 1.5rem 1.25rem;
border-top: 1px solid var(--line);
background: var(--panel);
}
@media (min-width: 640px) {
.j13-compose-actions {
padding-left: 2rem;
padding-right: 2rem;
}
}
/* 元信息:板块固定宽 + 标签吃满剩余 + 可见性 */
.j13-compose-meta {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 0.85rem 1rem;
}
.j13-compose-meta-board {
width: 100%;
max-width: 220px;
flex: 0 1 220px;
}
.j13-compose-meta-tags {
flex: 1 1 240px;
min-width: 200px;
max-width: 100%;
}
.j13-compose-meta-access {
width: 100%;
max-width: 200px;
flex: 0 1 200px;
}
.j13-compose-typebar {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.j13-compose-typechip {
height: 34px;
padding: 0 14px;
border-radius: 999px;
border: 1px solid var(--line);
background: var(--panel);
color: var(--ink-2);
font-size: 13px;
font-weight: 500;
transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.j13-compose-typechip:hover:not(:disabled) {
border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
color: var(--accent);
}
.j13-compose-typechip.is-on {
background: var(--accent-soft);
border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
color: var(--accent);
}
.j13-compose-typechip:disabled:not(.is-on) {
opacity: 0.45;
cursor: not-allowed;
}
.j13-compose-typepanel {
padding: 12px 14px;
border-radius: 12px;
border: 1px dashed color-mix(in srgb, var(--accent) 28%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 55%, var(--panel));
}
.j13-compose-attach-row {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel);
}
.j13-interact-card {
padding: 14px 16px;
border-radius: 14px;
border: 1px solid var(--line);
background: var(--panel);
}
.j13-interact-card.is-unsolved {
background: color-mix(in srgb, var(--danger) 7%, var(--panel));
border-color: color-mix(in srgb, var(--danger) 22%, var(--line));
}
.j13-interact-card.is-solved {
background: color-mix(in srgb, var(--ok) 8%, var(--panel));
border-color: color-mix(in srgb, var(--ok) 22%, var(--line));
}
.dark .j13-interact-card.is-unsolved {
background: color-mix(in srgb, var(--danger) 14%, var(--panel));
border-color: color-mix(in srgb, var(--danger) 32%, var(--line));
}
.dark .j13-interact-card.is-solved {
background: color-mix(in srgb, var(--ok) 14%, var(--panel));
border-color: color-mix(in srgb, var(--ok) 30%, var(--line));
}
.j13-compose-field {
width: 100%;
padding: 10px 14px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
color: var(--ink);
font-size: 15px;
font-family: var(--font-sans);
transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.j13-compose-field::placeholder { color: var(--ink-3); }
.j13-compose-field:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-compose-field:disabled {
opacity: 0.65;
cursor: not-allowed;
}
.j13-compose-title {
width: 100%;
padding: 0.25rem 0 0.75rem;
margin: 0;
border: 0;
border-bottom: 1px solid var(--line);
border-radius: 0;
background: transparent;
color: var(--ink);
font-family: var(--font-sans);
font-size: clamp(1.4rem, 2.5vw, 1.75rem);
font-weight: 800;
letter-spacing: -0.02em;
line-height: 1.3;
transition: border-color 0.15s ease;
}
.j13-compose-title::placeholder {
color: var(--ink-3);
font-weight: 500;
}
.j13-compose-title:focus {
outline: none;
border-bottom-color: var(--accent);
box-shadow: none;
}
/* 标签:对齐私信搜索 —— 同高、同聚焦,输入无内层描边;白底避免灰块 */
.j13-tag-field {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px;
min-height: 2.5rem;
padding: 4px 12px;
cursor: text;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.j13-tag-field:focus-within {
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-tag-field-input,
.j13-tag-field-input:focus,
.j13-tag-field-input:focus-visible {
outline: none !important;
box-shadow: none !important;
border: 0 !important;
background: transparent !important;
}
.j13-board-picker { position: relative; }
.j13-board-trigger {
width: 100%;
display: flex;
align-items: center;
gap: 10px;
height: 2.5rem;
min-height: 2.5rem;
padding: 0 12px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
color: var(--ink);
text-align: left;
transition: border-color 0.15s ease, box-shadow 0.15s ease;
cursor: pointer;
}
.j13-board-trigger:hover:not(:disabled) {
border-color: color-mix(in srgb, var(--line-2) 40%, var(--line));
}
.j13-board-trigger:focus { outline: none; }
.j13-board-trigger:focus-visible,
.j13-board-trigger[aria-expanded="true"] {
outline: none !important;
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-board-trigger:disabled {
opacity: 0.65;
cursor: not-allowed;
}
.j13-board-trigger-ico {
width: 24px;
height: 24px;
border-radius: 7px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 11px;
font-weight: 800;
flex-shrink: 0;
}
.j13-board-menu {
position: absolute;
z-index: 40;
top: calc(100% + 6px);
left: 0;
right: 0;
min-width: 100%;
max-height: 280px;
overflow-y: auto;
padding: 6px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 14px;
box-shadow: var(--shadow-lg);
}
.j13-board-option {
width: 100%;
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border-radius: 10px;
color: var(--ink);
font-size: 14px;
font-weight: 500;
text-align: left;
cursor: pointer;
transition: background 0.12s ease;
}
.j13-board-option:hover,
.j13-board-option.is-active,
.j13-board-option.is-selected {
background: var(--accent-soft);
color: var(--accent);
}
.j13-board-badge {
display: inline-flex;
align-items: center;
gap: 10px;
height: 2.5rem;
min-height: 2.5rem;
padding: 0 12px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
color: var(--ink-2);
font-size: 14px;
font-weight: 600;
}
/* 正文画布占满剩余高度 */
.j13-compose-canvas {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
}
.j13-md-editor {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
margin-top: 0;
border: 0;
background: transparent;
overflow: visible;
}
.j13-md-editor.is-fullscreen {
position: fixed;
inset: 0;
z-index: 80;
margin: 0;
padding: 1rem 1.25rem 1.25rem;
background: var(--panel);
border: 0;
box-shadow: var(--shadow-lg);
}
.j13-md-toolbar {
flex-shrink: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 2px;
padding: 4px 0 12px;
border-bottom: 1px solid var(--line);
background: transparent;
}
.j13-md-tool {
width: 34px;
height: 34px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 10px;
color: var(--ink-2);
transition: background 0.12s ease, color 0.12s ease;
}
.j13-md-tool:hover:not(:disabled) {
background: var(--accent-soft);
color: var(--accent);
}
.j13-md-tool:disabled { opacity: 0.4; }
.j13-md-tool:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
.j13-md-mode {
display: inline-flex;
align-items: center;
padding: 3px;
border-radius: 999px;
background: var(--panel);
border: 1px solid var(--line);
}
.j13-md-mode button {
height: 30px;
padding: 0 12px;
border-radius: 999px;
font-size: 12.5px;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 5px;
color: var(--ink-3);
}
.j13-md-mode button.is-on {
background: var(--accent-soft);
color: var(--accent);
}
.j13-md-textarea {
flex: 1 1 auto;
width: 100%;
min-height: 320px;
height: 100%;
resize: none;
border: 0 !important;
border-radius: 0 !important;
box-shadow: none !important;
background: transparent !important;
padding: 1rem 0 0.75rem !important;
color: var(--ink);
font-family: var(--font-sans);
font-size: 15.5px !important;
line-height: 1.8 !important;
}
.j13-md-editor.is-fullscreen .j13-md-textarea,
.j13-md-editor.is-fullscreen .j13-md-preview {
min-height: 0;
}
.j13-md-textarea::placeholder { color: var(--ink-3); }
.j13-md-textarea:focus,
.j13-md-textarea:focus-visible {
outline: none !important;
box-shadow: none !important;
border: 0 !important;
}
.j13-md-preview {
flex: 1 1 auto;
min-height: 320px;
overflow-y: auto;
padding: 1rem 0 0.75rem;
background: transparent;
}
.j13-md-foot {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 0 0;
font-size: 12.5px;
color: var(--ink-3);
border-top: 1px solid var(--line);
background: transparent;
}
.j13-compose-shell {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow);
overflow: visible;
}
/* 发帖/编辑:占满 main 剩余高度,减少卡片下方空余(保留页脚) */
body:has([data-compose-viewport]) #main {
display: flex;
flex-direction: column;
min-height: 0;
/* 略收紧上下边距,把高度留给舞台 */
padding-top: 1.15rem;
padding-bottom: 1.15rem;
}
body:has([data-compose-viewport]) #main > [data-compose-viewport] {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
}
/* 聊天页:整页锁在视口内,避免「页面滚动 + 对话区滚动」双滚动条 */
body:has([data-chat-viewport]) {
height: 100dvh;
max-height: 100dvh;
overflow: hidden;
}
body:has([data-chat-viewport]) > footer {
display: none;
}
body:has([data-chat-viewport]) #main {
flex: 1 1 0;
min-height: 0;
display: flex;
flex-direction: column;
/* 覆盖 root layout 的 py-7/sm:py-9,只留紧凑间距 */
padding-top: 0.75rem;
padding-bottom: 0.75rem;
overflow: hidden;
}
::selection {
background: var(--accent);
color: var(--accent-on);
}
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-thumb {
background: var(--line-2);
border-radius: 99px;
border: 3px solid var(--bg);
}
/* 链接重置放入 base 层:避免未分层规则击败 components 层的 .btn-primary 等类
(Tailwind v4 中未分层样式优先级高于任何 @layer) */
@layer base {
/* 必须在 base 层:未分层的 * 选择器会击败 @layer components 中所有
border-color(.field/.btn-line/.pager-btn 等曾因此实际渲染成 --line) */
*,
::before,
::after {
border-color: var(--line);
}
a {
color: inherit;
text-decoration: none;
}
}
h1, h2, h3, h4 {
font-family: var(--font-display);
letter-spacing: -0.015em;
}
:focus-visible {
outline: 2.5px solid var(--accent);
outline-offset: 2px;
border-radius: 6px;
}
/* 消息侧栏搜索:单层描边,避免外框 + focus-visible 双线 */
.j13-chat-search:focus-within {
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-chat-search-input,
.j13-chat-search-input:focus,
.j13-chat-search-input:focus-visible {
outline: none !important;
box-shadow: none !important;
}
/* 聊天输入区:与搜索框同款聚焦态 */
.j13-chat-composer:focus-within {
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-chat-composer-input,
.j13-chat-composer-input:focus,
.j13-chat-composer-input:focus-visible {
outline: none !important;
box-shadow: none !important;
resize: none !important;
}
.j13-chat-composer-input.has-value {
color: transparent;
caret-color: var(--ink);
}
.j13-chat-composer-input.has-value::placeholder {
color: transparent;
}
.j13-chat-composer-mirror {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
white-space: pre-wrap;
overflow-wrap: break-word;
word-break: break-word;
color: var(--ink);
}
.j13-mention-token {
display: inline-block;
padding: 2px 8px;
margin: 0 2px;
border-radius: 999px;
line-height: 1.35;
vertical-align: baseline;
/* 主题强调色加深 + 对比色字,胶囊形 */
background: color-mix(in srgb, var(--accent) 82%, #000);
color: #fff !important;
font-weight: 500;
text-decoration: none !important;
cursor: pointer;
transition: filter 0.12s ease, opacity 0.12s ease;
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
}
a.j13-mention-token:hover {
filter: brightness(1.08);
opacity: 0.95;
}
.dark .j13-mention-token {
/* 暗色下 accent 偏亮,用实心 accent + 配套字色 */
background: var(--accent);
color: var(--accent-on) !important;
}
/* 输入镜像层:不加粗/不加 padding,避免与透明 textarea 字宽错位 */
.j13-chat-composer-mirror .j13-mention-token {
display: inline;
padding: 0;
margin: 0;
line-height: inherit;
font-weight: inherit;
border-radius: 999px;
box-shadow: none;
background: color-mix(in srgb, var(--accent) 82%, #000);
}
.dark .j13-chat-composer-mirror .j13-mention-token {
background: var(--accent);
color: var(--accent-on) !important;
}
@layer components {
/* ----- 小标签(旧名 .kicker 保留兼容) ----- */
.kicker {
font-family: var(--font-sans);
font-size: 12.5px;
font-weight: 500;
letter-spacing: 0.02em;
color: var(--ink-3);
}
/* ----- 卡片 ----- */
.panel {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow-sm);
}
.hover-lift {
transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
.hover-lift:hover {
transform: translateY(-2px);
box-shadow: var(--shadow);
border-color: var(--line-2);
}
/* 整行可点:标题链接的 ::after 铺满最近的 relative 行容器,
行内其他交互元素加 .above-link 抬到点击层之上 */
.stretch-link::after {
content: "";
position: absolute;
inset: 0;
z-index: 1;
}
.above-link {
position: relative;
z-index: 2;
}
/* ----- 按钮(胶囊) ----- */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 10px 20px;
border-radius: 999px;
font-size: 14px;
font-weight: 500;
line-height: 1;
border: 1px solid transparent;
cursor: pointer;
transition: background 0.15s, border-color 0.15s, color 0.15s,
transform 0.12s ease, box-shadow 0.15s;
white-space: nowrap;
}
.btn:active { transform: scale(0.97); }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
.btn-primary {
background: var(--accent);
color: var(--accent-on);
/* 阴影色跟随动态主题色(color-mix 引用令牌,换肤自动生效) */
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.12),
0 2px 8px color-mix(in srgb, var(--accent) 26%, transparent);
}
.btn-primary:hover:not(:disabled) {
background: var(--accent-hi);
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(16, 24, 40, 0.1),
0 8px 20px color-mix(in srgb, var(--accent) 34%, transparent);
}
.btn-primary:active:not(:disabled) {
transform: translateY(0);
}
/* 与 btn-primary 同款,历史类名兼容 */
.btn-accent {
background: var(--accent);
color: var(--accent-on);
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.12),
0 2px 8px color-mix(in srgb, var(--accent) 26%, transparent);
}
.btn-accent:hover:not(:disabled) {
background: var(--accent-hi);
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(16, 24, 40, 0.1),
0 8px 20px color-mix(in srgb, var(--accent) 34%, transparent);
}
.btn-accent:active:not(:disabled) {
transform: translateY(0);
}
.btn-line {
background: var(--panel);
border-color: var(--line-2);
color: var(--ink);
}
.btn-line:hover:not(:disabled) {
border-color: var(--accent);
color: var(--accent);
}
.btn-danger {
background: var(--danger-soft);
color: var(--danger);
}
.btn-danger:hover:not(:disabled) {
background: var(--danger);
color: #fff;
}
.dark .btn-danger:hover:not(:disabled) {
/* 暗色 danger 为亮红,白字仅 2.79:1,改用深色文字 */
color: #1a0c0b;
}
.btn-sm { padding: 7px 14px; font-size: 13px; }
/* ----- 点赞按钮:未赞描边态,hover 同色系填充;已赞为浅底实心态 ----- */
.j13-like {
border-color: var(--line-2);
color: var(--ink-2);
background: var(--panel);
transition:
border-color 0.15s ease,
color 0.15s ease,
background-color 0.15s ease,
box-shadow 0.15s ease;
}
.j13-like svg {
transition: transform 0.15s ease;
}
.j13-like:hover:not(:disabled),
.j13-like.is-liked {
border-color: var(--accent);
color: var(--accent);
background: var(--accent-soft);
}
/* 已赞态 hover 再加深一档,并给同色系投影;心形轻微放大(不改变布局) */
.j13-like:hover:not(:disabled) {
box-shadow: 0 2px 10px color-mix(in srgb, var(--accent) 22%, transparent);
}
.j13-like.is-liked:hover:not(:disabled) {
background: color-mix(in srgb, var(--accent) 17%, transparent);
}
.j13-like:hover:not(:disabled) svg {
transform: scale(1.15);
}
.j13-like:active:not(:disabled) svg {
transform: scale(0.95);
}
.j13-like:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
.j13-like,
.j13-like svg {
transition: none;
}
.j13-like:hover:not(:disabled) svg,
.j13-like:active:not(:disabled) svg {
transform: none;
}
}
/* ----- 表单 ----- */
.field-label {
display: block;
font-size: 13px;
font-weight: 500;
color: var(--ink-2);
margin-bottom: 8px;
}
.field {
width: 100%;
padding: 12px 15px;
background: var(--panel);
border: 1px solid var(--line-2);
border-radius: var(--r-sm);
color: var(--ink);
font-size: 15px;
font-family: var(--font-sans);
transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;
}
/* 占位符不使用 opacity:透明度与底色合成后浅色仅 3.7:1,实色 ink-3 达 5.72:1 */
.field::placeholder { color: var(--ink-3); }
.field:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3.5px var(--accent-soft);
background: var(--panel);
}
textarea.field {
font-family: var(--font-sans);
font-size: 15px;
line-height: 1.75;
resize: vertical;
}
/* ----- 标签 / 徽标 ----- */
.chip {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12.5px;
font-weight: 500;
padding: 4px 12px;
background: var(--tint);
color: var(--ink-2);
border-radius: 999px;
white-space: nowrap;
transition: background 0.15s, color 0.15s;
}
a.chip:hover {
background: var(--accent-soft);
color: var(--accent);
}
.badge-pin {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: 500;
padding: 4px 11px;
background: var(--clay-soft);
color: var(--clay);
border-radius: 999px;
white-space: nowrap;
}
.badge-rec {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: 500;
padding: 4px 11px;
background: var(--gold-soft);
color: var(--gold);
border-radius: 999px;
white-space: nowrap;
}
.badge-pending {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: 500;
padding: 4px 11px;
background: var(--accent-soft);
color: var(--accent);
border-radius: 999px;
white-space: nowrap;
}
.badge-type {
display: inline-flex;
align-items: center;
font-size: 12px;
font-weight: 500;
padding: 4px 11px;
/* 固定靛紫,不跟主题 accent,避免与状态徽章撞色 */
background: color-mix(in srgb, #5b5bd6 12%, var(--panel));
color: #4f46b8;
border-radius: 999px;
white-space: nowrap;
}
.dark .badge-type {
background: rgba(165, 180, 252, 0.16);
color: #a5b4fc;
}
.badge-access {
display: inline-flex;
align-items: center;
font-size: 12px;
font-weight: 500;
padding: 4px 11px;
background: var(--tint);
color: var(--ink-2);
border-radius: 999px;
white-space: nowrap;
}
/* 类型帖状态徽章:浅色区分,避免同一灰;状态色固定,不跟主题 */
.badge-status {
display: inline-flex;
align-items: center;
font-size: 12px;
font-weight: 500;
padding: 4px 11px;
border-radius: 999px;
white-space: nowrap;
}
.badge-status-unsolved {
/* 淡红:待解决,与推荐金 / 已解决绿区分 */
background: color-mix(in srgb, #c8281e 11%, var(--panel));
color: #b91c1c;
}
.badge-status-solved {
background: color-mix(in srgb, var(--ok) 16%, var(--panel));
color: var(--ok);
}
.badge-status-open {
/* 进行中:天空蓝,不跟主题 accent,亦区别于类型徽章 */
background: color-mix(in srgb, #0284c7 12%, var(--panel));
color: #0369a1;
}
.badge-status-closed {
background: color-mix(in srgb, #5b6b8c 12%, var(--panel));
color: #5b6b8c;
}
.badge-status-expired {
background: color-mix(in srgb, var(--danger) 12%, var(--panel));
color: var(--danger);
}
.badge-status-drawn {
background: color-mix(in srgb, #7c5cbf 14%, var(--panel));
color: #6a4aad;
}
.dark .badge-status-unsolved {
background: rgba(255, 107, 96, 0.14);
color: #fca5a5;
}
.dark .badge-status-solved {
background: color-mix(in srgb, var(--ok) 22%, transparent);
color: var(--ok);
}
.dark .badge-status-open {
background: rgba(56, 189, 248, 0.14);
color: #7dd3fc;
}
.dark .badge-status-closed {
background: rgba(170, 182, 207, 0.14);
color: #aab6cf;
}
.dark .badge-status-expired {
background: color-mix(in srgb, var(--danger) 20%, transparent);
color: var(--danger);
}
.dark .badge-status-drawn {
background: rgba(192, 168, 245, 0.16);
color: #c0a8f5;
}
/* 站点公告列表 */
.j13-anno-list {
display: flex;
flex-direction: column;
gap: 8px;
margin-top: 10px;
}
.j13-anno-item {
display: flex;
align-items: flex-start;
gap: 0;
padding: 11px 12px 11px 0;
border-radius: 12px;
border: 1px solid var(--line);
background: transparent;
transition: background 0.15s ease, border-color 0.15s ease;
overflow: hidden;
}
.j13-anno-item::before {
content: "";
flex-shrink: 0;
width: 3px;
align-self: stretch;
margin-right: 11px;
border-radius: 0 2px 2px 0;
background: color-mix(in srgb, var(--accent) 55%, transparent);
}
.j13-anno-item:hover,
.j13-anno-item:focus-visible {
background: var(--accent-soft);
border-color: color-mix(in srgb, var(--accent) 28%, var(--line));
}
.j13-anno-item:hover::before,
.j13-anno-item:focus-visible::before {
background: var(--accent);
}
.j13-anno-item-body {
min-width: 0;
flex: 1;
padding-right: 2px;
}
.j13-anno-item-title {
display: block;
font-size: 13px;
font-weight: 400;
line-height: 1.45;
color: var(--ink);
}
.j13-anno-item:hover .j13-anno-item-title,
.j13-anno-item:focus-visible .j13-anno-item-title {
color: var(--accent);
}
.j13-anno-item-meta {
display: flex;
align-items: center;
gap: 8px;
margin-top: 6px;
}
.j13-board-tag {
display: inline-flex;
align-items: center;
padding: 0 7px;
border-radius: 6px;
font-size: 11px;
font-weight: 500;
line-height: 1.65;
background: var(--tint);
color: var(--ink-2);
white-space: nowrap;
transition: background 0.15s ease, color 0.15s ease;
}
.j13-board-tag:hover {
background: var(--accent-soft);
color: var(--accent);
}
/* 站点公告标签:预设色板(浅/暗成对,文字与底色均满足 AA 对比度) */
.j13-anno-tag {
display: inline-flex;
align-items: center;
max-width: 132px;
padding: 2px 10px;
border-radius: 999px;
font-size: 11px;
font-weight: 500;
line-height: 1.55;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.j13-anno-tag.is-blue { background: rgba(52, 81, 200, 0.12); color: #3451c8; }
.j13-anno-tag.is-green { background: rgba(19, 115, 51, 0.12); color: #137333; }
.j13-anno-tag.is-orange { background: rgba(165, 66, 10, 0.12); color: #a5420a; }
.j13-anno-tag.is-red { background: rgba(200, 40, 30, 0.1); color: #c8281e; }
.j13-anno-tag.is-purple { background: rgba(109, 71, 192, 0.12); color: #6d47c0; }
.j13-anno-tag.is-gray { background: rgba(82, 96, 122, 0.13); color: #52607a; }
.dark .j13-anno-tag.is-blue { background: rgba(169, 184, 255, 0.18); color: #a9b8ff; }
.dark .j13-anno-tag.is-green { background: rgba(88, 209, 138, 0.16); color: #58d18a; }
.dark .j13-anno-tag.is-orange { background: rgba(240, 135, 90, 0.17); color: #f0875a; }
.dark .j13-anno-tag.is-red { background: rgba(255, 107, 96, 0.16); color: #ff6b60; }
.dark .j13-anno-tag.is-purple { background: rgba(192, 168, 245, 0.18); color: #c0a8f5; }
.dark .j13-anno-tag.is-gray { background: rgba(170, 182, 207, 0.17); color: #aab6cf; }
/* 后台颜色选择器圆点 */
.j13-anno-dot {
width: 22px;
height: 22px;
border-radius: 999px;
border: 2px solid transparent;
cursor: pointer;
padding: 0;
transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.j13-anno-dot:hover { transform: scale(1.12); }
.j13-anno-dot[aria-pressed="true"] {
border-color: var(--panel);
box-shadow: 0 0 0 2px var(--accent);
}
.j13-anno-dot.is-blue { background: #3451c8; }
.j13-anno-dot.is-green { background: #137333; }
.j13-anno-dot.is-orange { background: #a5420a; }
.j13-anno-dot.is-red { background: #c8281e; }
.j13-anno-dot.is-purple { background: #6d47c0; }
.j13-anno-dot.is-gray { background: #52607a; }
.dark .j13-anno-dot.is-blue { background: #a9b8ff; }
.dark .j13-anno-dot.is-green { background: #58d18a; }
.dark .j13-anno-dot.is-orange { background: #f0875a; }
.dark .j13-anno-dot.is-red { background: #ff6b60; }
.dark .j13-anno-dot.is-purple { background: #c0a8f5; }
.dark .j13-anno-dot.is-gray { background: #aab6cf; }
/* ----- 分页 ----- */
.pager-btn {
background: var(--panel);
border-color: var(--line-2);
color: var(--ink-2);
}
.pager-btn:hover {
border-color: var(--accent);
color: var(--accent);
transform: translateY(-1px);
}
/* 当前页:与全站选中态一致的主题色淡化底(而非实心填充) */
.pager-btn.is-current,
.pager-btn.is-current:hover {
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
font-weight: 600;
}
/* ----- 辅助 ----- */
.meta {
font-family: var(--font-sans);
font-size: 12.5px;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
}
.link-accent { color: var(--accent); }
.link-accent:hover { color: var(--accent-hi); }
.alert-error {
padding: 12px 15px;
border: 1px solid color-mix(in srgb, var(--danger) 30%, transparent);
background: var(--danger-soft);
color: var(--danger);
border-radius: var(--r-sm);
font-size: 14px;
font-weight: 500;
}
.alert-ok {
padding: 12px 15px;
border: 1px solid color-mix(in srgb, var(--ok) 30%, transparent);
background: var(--ok-soft);
color: var(--ok);
border-radius: var(--r-sm);
font-size: 14px;
font-weight: 500;
}
/* ============================================================
工作台组件(WORKSPACE EDITION)
============================================================ */
/* 信息流小 tab:描边小圆角按钮,选中为 accent 浅底描边(布局类走 Tailwind,此处不写 display) */
.j13-tab {
appearance: none;
border: 1px solid var(--line);
background: var(--panel);
border-radius: 999px;
padding: 4.5px 12px;
font-family: var(--font-sans);
font-size: 12.5px;
font-weight: 500;
line-height: 1.35;
color: var(--ink-3);
cursor: pointer;
white-space: nowrap;
transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease;
}
.j13-tab:hover {
color: var(--ink);
border-color: var(--line-2);
background: var(--panel-2);
}
.j13-tab[aria-selected="true"] {
background: var(--accent-soft);
border-color: color-mix(in srgb, var(--accent) 38%, var(--line));
color: var(--accent);
font-weight: 600;
}
.j13-tab:active {
transform: scale(0.97);
}
/* 帖子流「有新内容」提示条(三期) */
.j13-feed-new-tip:hover {
filter: brightness(0.97);
}
.j13-feed-new-tip:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
.j13-feed-new-tip {
transition: none;
}
}
/* 侧栏导航项 */
.j13-raillink {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border: 1px solid transparent;
border-radius: var(--r-sm);
font-size: 14px;
font-weight: 500;
color: var(--ink-2);
transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease;
}
.j13-raillink:hover {
background: var(--panel-2);
color: var(--ink);
}
.j13-raillink[aria-current="page"] {
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
font-weight: 600;
}
/* 首页左栏「全部讨论 / 板块目录」卡片:与面包屑的纯文字位置指引区分,
承载讨论量等发现型信息,点击在工作台内筛选帖子流 */
.j13-bcard {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
padding: 9px 10px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r-sm);
transition: border-color 0.16s ease, background 0.16s ease;
}
.j13-bcard:hover {
border-color: var(--nav-active-line);
background: var(--panel-2);
}
.j13-bcard:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
/* 选中态:全站统一使用主题色淡化底(--nav-active-bg,随站点主题色联动),
与 raillink / chip / tab / 顶部导航 pill 的选中表达保持一致 */
.j13-bcard[aria-current="page"],
.j13-bcard[aria-current="page"]:hover {
border-color: var(--nav-active-line);
background: var(--nav-active-bg);
}
.j13-bcard-name {
color: var(--ink);
font-size: 14px;
font-weight: 500;
}
.j13-bcard[aria-current="page"] .j13-bcard-name {
color: var(--nav-active-ink);
}
.j13-bcard-ico {
width: 34px;
height: 34px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 800;
flex-shrink: 0;
}
@media (prefers-reduced-motion: reduce) {
.j13-bcard {
transition: none;
}
}
/* 工作台模块卡 */
.j13-module {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow-sm);
padding: 16px;
}
.j13-module-title {
display: flex;
align-items: center;
gap: 7px;
font-size: 13.5px;
font-weight: 600;
letter-spacing: 0.02em;
color: var(--ink);
}
/* 统计数字格:白底细线,避免灰块 */
.j13-stat {
display: flex;
flex-direction: column;
gap: 3px;
min-width: 0;
padding: 11px 13px;
background: transparent;
border: 1px solid var(--line);
border-radius: var(--r-sm);
}
.j13-stat .j13-stat-num {
font-size: 22px;
font-weight: 500;
line-height: 1.15;
letter-spacing: -0.015em;
color: var(--ink);
font-variant-numeric: tabular-nums;
}
.j13-stat .j13-stat-lab {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
color: var(--ink-3);
white-space: nowrap;
}
/* 站点数据:无灰底瓦片,细线分隔 */
.j13-pulse {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0;
margin-top: 10px;
border: 1px solid var(--line);
border-radius: var(--r-sm);
overflow: hidden;
}
.j13-pulse-cell {
min-width: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 14px 12px;
background: transparent;
border: 0;
border-radius: 0;
}
.j13-pulse-cell:nth-child(odd) {
border-right: 1px solid var(--line);
}
.j13-pulse-cell:nth-child(-n + 2) {
border-bottom: 1px solid var(--line);
}
.j13-pulse-lab {
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
font-size: 11.5px;
font-weight: 400;
color: var(--ink-3);
white-space: nowrap;
}
.j13-pulse-num {
margin-top: 6px;
font-size: 18px;
font-weight: 500;
line-height: 1.05;
letter-spacing: -0.015em;
color: var(--ink);
font-variant-numeric: tabular-nums;
}
.j13-pulse-foot {
display: flex;
align-items: center;
justify-content: center;
gap: 3px;
margin-top: 6px;
font-size: 10.5px;
font-weight: 400;
line-height: 1;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.j13-pulse-foot.is-up {
color: var(--ok);
font-weight: 400;
}
.j13-pulse-dot {
position: relative;
width: 6px;
height: 6px;
border-radius: 9999px;
background: var(--ok);
flex-shrink: 0;
}
.j13-pulse-dot::after {
content: "";
position: absolute;
inset: -3px;
border-radius: 9999px;
background: var(--ok);
opacity: 0.4;
animation: j13-ping 1.8s cubic-bezier(0, 0, 0.2, 1) infinite;
}
@keyframes j13-ping {
0% { transform: scale(0.6); opacity: 0.5; }
70%, 100% { transform: scale(1.9); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
.j13-pulse-dot::after {
animation: none;
opacity: 0.25;
}
}
/* 卡内签到条:分隔线 + 紧凑按钮 */
.j13-pulse-checkin {
margin-top: 10px;
padding-top: 11px;
border-top: 1px solid var(--line);
}
.j13-pulse-checkin-btn {
gap: 4px;
padding: 6px 11px;
font-size: 12px;
white-space: nowrap;
}
.j13-pulse-checkin-done {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 6px 11px;
border-radius: 9999px;
font-size: 12px;
font-weight: 500;
white-space: nowrap;
}
/* 热门榜单 */
.j13-rank {
position: relative;
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 8px;
border-radius: 10px;
transition: background 0.16s ease;
}
/* 榜单行:无选中态的导航项,悬停/聚焦统一使用主题色淡化底 */
.j13-rank:hover,
.j13-rank:focus-visible {
background: var(--accent-soft);
}
.j13-rank .j13-rank-no {
width: 18px;
padding-top: 2px;
text-align: center;
font-size: 13px;
font-weight: 500;
font-variant-numeric: tabular-nums;
color: var(--ink-3);
flex-shrink: 0;
}
.j13-rank:nth-child(1) .j13-rank-no { color: var(--rank-1); }
.j13-rank:nth-child(2) .j13-rank-no { color: var(--rank-2); }
.j13-rank:nth-child(3) .j13-rank-no { color: var(--rank-3); }
/* 精选置顶卡 */
.j13-feature {
position: relative;
display: block;
padding: 15px 17px;
background: linear-gradient(135deg, var(--panel) 0%, var(--panel-2) 100%);
border: 1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow-sm);
transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
.j13-feature:hover {
transform: translateY(-2px);
box-shadow: var(--shadow);
border-color: color-mix(in srgb, var(--accent) 32%, var(--line));
}
/* 移动端横向板块条(滚动条隐藏,保留触控惯性) */
.j13-chips {
display: flex;
gap: 8px;
overflow-x: auto;
scrollbar-width: none;
-webkit-overflow-scrolling: touch;
padding-bottom: 2px;
}
.j13-chips::-webkit-scrollbar {
display: none;
}
.j13-chip {
display: inline-flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
padding: 7px 14px;
border: 1px solid var(--line-2);
background: var(--panel);
border-radius: 999px;
font-size: 13px;
font-weight: 500;
color: var(--ink-2);
white-space: nowrap;
transition: background 0.16s ease, color 0.16s ease, border-color 0.16s ease;
}
.j13-chip:hover {
border-color: var(--line-2);
color: var(--ink);
}
.j13-chip[aria-current="page"] {
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
}
/* 帖子详情侧栏内的滚动承载区(目录 / 作者帖子列表):
配合栏容器的 max-height 独立滚动,细滚动条、不产生滚动链 */
.j13-rail-scroll {
min-height: 3.5rem;
overflow-y: auto;
overscroll-behavior: contain;
scrollbar-width: thin;
}
.j13-rail-scroll::-webkit-scrollbar {
width: 6px;
}
.j13-rail-scroll::-webkit-scrollbar-thumb {
background: var(--line-2);
border-radius: 99px;
border: none;
}
.j13-rail-scroll::-webkit-scrollbar-track {
background: transparent;
}
}
/* ============================================================
Markdown 正文
============================================================ */
.prose-content { font-size: 16.5px; line-height: 1.85; color: var(--ink); }
.prose-content h1 { font-size: 1.75rem; font-weight: 800; margin: 1.6rem 0 0.8rem; }
.prose-content h2 {
font-size: 1.4rem;
font-weight: 700;
margin: 1.9rem 0 0.7rem;
padding-bottom: 0.45rem;
border-bottom: 1px solid var(--line);
}
.prose-content h3 { font-size: 1.18rem; font-weight: 700; margin: 1.5rem 0 0.6rem; }
.prose-content p { margin: 0.9rem 0; }
.prose-content ul { list-style: disc; padding-left: 1.5rem; margin: 0.9rem 0; }
.prose-content ol { list-style: decimal; padding-left: 1.5rem; margin: 0.9rem 0; }
.prose-content li { margin: 0.35rem 0; }
.prose-content code {
font-family: var(--font-mono);
background: var(--tint);
padding: 0.12rem 0.45rem;
border-radius: 6px;
font-size: 0.86em;
}
.prose-content pre,
.prose-content .md-code-pre,
.prose-content .md-code-shiki-host pre {
background: transparent !important;
border: none;
padding: 0.85rem 1.05rem;
border-radius: 0;
overflow-x: auto;
margin: 0;
font-family: var(--font-mono);
font-size: 0.84em;
line-height: 1.65;
}
.prose-content pre code,
.prose-content .md-code-pre code,
.prose-content .md-code-shiki-host code {
background: none;
padding: 0;
border-radius: 0;
font-size: inherit;
color: inherit;
min-width: 100%;
}
/* grid 代码行:勿设 min-height,否则会把行距撑得很大并在底部留白 */
.prose-content pre code[style*="grid"] {
display: grid;
width: max-content;
min-width: 100%;
}
.prose-content pre code[style*="grid"] > [data-line],
.prose-content .md-code-shiki-host code > .line,
.prose-content .md-code-shiki-host code > [data-line] {
line-height: 1.65;
}
/* 空行仍占一行高度(pretty-code onVisitLine 会塞空格) */
.prose-content pre code[style*="grid"] > [data-line]:empty::after,
.prose-content .md-code-shiki-host code > .line:empty::after {
content: " ";
white-space: pre;
}
.prose-content blockquote {
border-left: 3px solid var(--accent);
background: var(--accent-soft);
border-radius: 0 var(--r-sm) var(--r-sm) 0;
padding: 0.7rem 1.1rem;
color: var(--ink-2);
margin: 1.2rem 0;
}
.prose-content a {
color: var(--accent);
text-decoration: underline;
text-underline-offset: 3px;
font-weight: 500;
}
.prose-content img,
.prose-content .md-content-img {
max-width: 100%;
border-radius: var(--r-sm);
border: 1px solid var(--line);
cursor: zoom-in;
transition: opacity 0.15s ease, box-shadow 0.15s ease;
}
.prose-content .md-content-img:hover {
opacity: 0.92;
box-shadow: 0 4px 18px color-mix(in srgb, var(--ink) 12%, transparent);
}
.prose-content .md-img-fallback {
display: inline-block;
padding: 0.55rem 0.85rem;
border-radius: var(--r-sm);
border: 1px dashed var(--line);
background: var(--panel-2);
color: var(--ink-2);
font-size: 0.9em;
}
.prose-content hr { border: none; border-top: 1px solid var(--line); margin: 2.2rem 0; }
.prose-content strong { font-weight: 700; }
.prose-content del { color: var(--ink-2); text-decoration: line-through; }
/* GFM 表格 */
.prose-content table {
width: 100%;
border-collapse: collapse;
margin: 1.2rem 0;
font-size: 0.95em;
overflow-x: auto;
display: block;
}
.prose-content thead { background: var(--panel-2); }
.prose-content th,
.prose-content td {
border: 1px solid var(--line);
padding: 0.55rem 0.85rem;
text-align: left;
vertical-align: top;
}
.prose-content th { font-weight: 700; color: var(--ink); }
.prose-content tr:nth-child(even) td { background: color-mix(in srgb, var(--tint) 55%, transparent); }
/* GFM 任务列表 */
.prose-content ul.contains-task-list { list-style: none; padding-left: 0.25rem; }
.prose-content li.task-list-item { display: flex; align-items: flex-start; gap: 0.5rem; }
.prose-content li.task-list-item input[type="checkbox"] {
margin-top: 0.4em;
accent-color: var(--accent);
pointer-events: none;
}
/* rehype-pretty-code figure 外壳 */
.prose-content figure[data-rehype-pretty-code-figure] {
margin: 1.15rem 0;
}
.prose-content figure[data-rehype-pretty-code-figure] > .md-code-block {
margin: 0;
}
/* 代码块壳:工具栏 + 折叠 */
.prose-content .md-code-block {
margin: 1.15rem 0;
border: 1px solid var(--line);
border-radius: var(--r-sm);
background: var(--panel-2);
overflow: hidden;
/* 收起后 scrollIntoView(start) 时避开 sticky 顶栏 */
scroll-margin-top: 5.5rem;
}
.prose-content .md-code-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.4rem 0.75rem;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--panel) 70%, var(--panel-2));
}
.prose-content .md-code-lang {
font-size: 11.5px;
font-weight: 600;
letter-spacing: 0.02em;
text-transform: lowercase;
color: var(--ink-2);
font-family: var(--font-mono);
}
.prose-content .md-code-copy {
display: inline-flex;
align-items: center;
gap: 0.3rem;
padding: 0.2rem 0.55rem;
border-radius: 6px;
border: 1px solid transparent;
background: transparent;
color: var(--ink-2);
font-size: 12px;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.prose-content .md-code-copy:hover {
color: var(--ink);
background: var(--tint);
border-color: var(--line);
}
.prose-content .md-code-body {
position: relative;
overflow: hidden;
}
.prose-content .md-code-body:not(.md-code-collapsed) {
overflow-x: auto;
}
.prose-content .md-code-collapsed {
overflow: hidden;
}
.prose-content .md-code-fade {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 2.75rem;
pointer-events: none;
background: linear-gradient(to bottom, transparent, var(--panel-2));
transition: opacity 0.28s ease;
}
@media (prefers-reduced-motion: reduce) {
.prose-content .md-code-body {
transition: none !important;
}
}
.prose-content .md-code-fold {
display: flex;
width: 100%;
align-items: center;
justify-content: center;
gap: 0.35rem;
padding: 0.45rem 0.75rem;
border: none;
border-top: 1px solid var(--line);
background: color-mix(in srgb, var(--panel) 55%, var(--panel-2));
color: var(--accent);
font-size: 12.5px;
font-weight: 600;
cursor: pointer;
}
.prose-content .md-code-fold:hover {
background: var(--accent-soft);
}
/* Shiki 双主题:跟随 html.dark
注意:rehype-pretty-code 会去掉 pre 上的 .shiki class,
因此同时用 data-theme / 代码块容器命中,才能让 --shiki-* 变量真正上色 */
.prose-content .shiki,
.prose-content .shiki span,
.prose-content .md-code-block pre,
.prose-content .md-code-block pre span,
.prose-content .md-code-shiki-host .shiki,
.prose-content .md-code-shiki-host .shiki span,
.prose-content pre[data-theme],
.prose-content pre[data-theme] span {
color: var(--shiki-light, var(--ink));
background-color: transparent !important;
}
.prose-content .shiki,
.prose-content .md-code-block pre,
.prose-content .md-code-shiki-host .shiki,
.prose-content pre[data-theme] {
background: transparent !important;
}
html.dark .prose-content .shiki,
html.dark .prose-content .shiki span,
html.dark .prose-content .md-code-block pre,
html.dark .prose-content .md-code-block pre span,
html.dark .prose-content .md-code-shiki-host .shiki,
html.dark .prose-content .md-code-shiki-host .shiki span,
html.dark .prose-content pre[data-theme],
html.dark .prose-content pre[data-theme] span {
color: var(--shiki-dark, var(--ink)) !important;
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}
/* 图箱 */
.md-lightbox {
position: fixed;
inset: 0;
z-index: 1200;
display: flex;
align-items: center;
justify-content: center;
padding: 1.5rem;
background: rgba(0, 0, 0, 0.82);
backdrop-filter: blur(2px);
}
.md-lightbox-figure {
margin: 0;
max-width: min(96vw, 1200px);
max-height: 90vh;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
}
.md-lightbox-img {
max-width: 100%;
max-height: calc(90vh - 3rem);
object-fit: contain;
border-radius: 8px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.45);
user-select: none;
}
.md-lightbox-caption {
color: rgba(255, 255, 255, 0.85);
font-size: 13px;
text-align: center;
max-width: 40rem;
line-height: 1.5;
}
.md-lightbox-close,
.md-lightbox-nav {
position: absolute;
display: inline-flex;
align-items: center;
justify-content: center;
border: none;
border-radius: 999px;
background: rgba(255, 255, 255, 0.12);
color: #fff;
cursor: pointer;
transition: background 0.15s ease;
}
.md-lightbox-close:hover,
.md-lightbox-nav:hover {
background: rgba(255, 255, 255, 0.22);
}
.md-lightbox-close {
top: 1rem;
right: 1rem;
width: 42px;
height: 42px;
}
.md-lightbox-nav {
top: 50%;
transform: translateY(-50%);
width: 46px;
height: 46px;
}
.md-lightbox-prev { left: 1rem; }
.md-lightbox-next { right: 1rem; }
.md-lightbox-counter {
position: absolute;
bottom: 1.25rem;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.8);
font-size: 13px;
font-variant-numeric: tabular-nums;
letter-spacing: 0.04em;
}
/* 评论区的 Markdown 紧凑排版:继承 prose-content 全部规则,仅收紧行距与间距 */
.prose-comment { font-size: 14.5px; line-height: 1.7; }
.prose-comment p { margin: 0.35rem 0; }
.prose-comment blockquote { margin: 0.5rem 0; padding: 0.45rem 0.9rem; }
.prose-comment .md-code-block { margin: 0.6rem 0; }
.prose-comment h1, .prose-comment h2, .prose-comment h3, .prose-comment h4 {
font-size: 1em;
margin: 0.6rem 0 0.3rem;
border-bottom: none;
font-weight: 700;
}
/* 移动端浮动操作条内的点赞按钮:放大到 44px 触控标准 */
.j13-bar-like .j13-like {
height: 44px;
padding: 0 14px;
font-size: 13px;
}
/* 评论楼层树:抖音风格
主评论全宽;子回复折叠在 panel-2 背景容器内,点击"展开 X 条回复"显示
子回复之间用淡分隔线;depth≥2 时昵称后显示 ▶ 被回复者 */
/* 子回复行:紧凑布局,头像 28px */
.cmt-reply-row {
padding: 8px 0;
border-top: 1px solid var(--line);
}
.cmt-reply-row:first-child {
border-top: none;
padding-top: 0;
}
/* 子回复昵称 */
.cmt-reply-name {
font-size: 13px;
font-weight: 500;
color: var(--ink-2);
}
/* 楼层号标签(主评论昵称旁) */
.cmt-floor-label {
font-size: 11.5px;
font-weight: 500;
color: var(--ink-3);
text-decoration: none;
padding: 1px 6px;
border-radius: 6px;
background: var(--tint);
transition: color 0.15s;
}
.cmt-floor-label:hover {
color: var(--accent);
}
/* 回复文字按钮:放在时间右侧,抖音风格 */
.cmt-reply-btn {
font-size: 12px;
font-weight: 500;
color: var(--ink-3);
background: none;
border: none;
padding: 0;
cursor: pointer;
}
.cmt-reply-btn:hover {
color: var(--accent);
}
/* 右三角箭头(回复子评论时) */
.cmt-reply-arrow {
color: var(--ink-3);
flex-shrink: 0;
}
/* 被回复者名称(可点击跳转) */
.cmt-reply-target {
font-size: 13px;
font-weight: 500;
color: var(--ink-2);
text-decoration: none;
white-space: nowrap;
}
.cmt-reply-target:hover {
color: var(--accent);
}
/* 子回复容器:背景与主评论区分,圆角 */
.cmt-replies-wrap {
margin-top: 8px;
padding: 4px 12px;
background: var(--panel-2);
border-radius: 12px;
}
/* 孙评论及更深:小幅缩进 + 细引导线 */
.cmt-children {
margin-top: 2px;
padding-left: 10px;
border-left: 1px solid var(--line);
}
/* 展开/收起按钮 */
.cmt-fold-btn {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12.5px;
font-weight: 500;
color: var(--accent);
padding: 4px 10px;
border-radius: 99px;
background: var(--accent-soft);
border: none;
cursor: pointer;
transition: background 0.15s;
}
.cmt-fold-btn:hover {
background: color-mix(in srgb, var(--accent) 18%, transparent);
}
/* 评论内联回复表单:出现在目标评论正下方 */
.cmt-reply-form {
padding: 12px 14px;
border-radius: 14px;
background: var(--panel-2);
margin-top: 8px;
}
.cmt-reply-form .field {
font-size: 13.5px;
}
@media (max-width: 640px) {
.cmt-replies-wrap {
padding: 4px 8px;
}
.cmt-children {
padding-left: 8px;
}
}
@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
/* 头像配色(浅/暗各自保证可读) */
.av-0 { background: rgba(52, 81, 200, 0.12); color: #3451c8; }
.av-1 { background: rgba(10, 99, 117, 0.12); color: #0a6375; }
.av-2 { background: rgba(109, 71, 192, 0.12); color: #6d47c0; }
.av-3 { background: rgba(27, 99, 158, 0.12); color: #1b639e; }
.av-4 { background: rgba(12, 102, 95, 0.13); color: #0c665f; }
.av-5 { background: rgba(171, 56, 93, 0.12); color: #ab385d; }
.av-6 { background: rgba(133, 88, 0, 0.14); color: #855800; }
.av-7 { background: rgba(82, 96, 122, 0.13); color: #52607a; }
.dark .av-0 { background: rgba(169, 184, 255, 0.18); color: #a9b8ff; }
.dark .av-1 { background: rgba(92, 201, 224, 0.18); color: #5cc9e0; }
.dark .av-2 { background: rgba(192, 168, 245, 0.18); color: #c0a8f5; }
.dark .av-3 { background: rgba(125, 184, 238, 0.18); color: #7db8ee; }
.dark .av-4 { background: rgba(94, 211, 189, 0.18); color: #5ed3bd; }
.dark .av-5 { background: rgba(240, 147, 181, 0.18); color: #f093b5; }
.dark .av-6 { background: rgba(224, 178, 89, 0.18); color: #e0b259; }
.dark .av-7 { background: rgba(170, 182, 207, 0.18); color: #aab6cf; }
/* ============================================================
微交互
============================================================ */
@keyframes j13-toast-in {
from { opacity: 0; transform: translateY(10px) scale(0.98); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.j13-toast-in { animation: j13-toast-in 0.2s cubic-bezier(0.2, 0.9, 0.3, 1.2); }
@keyframes j13-heart-pop {
0% { transform: scale(1); }
45% { transform: scale(1.4); }
100% { transform: scale(1); }
}
.j13-heart-pop { animation: j13-heart-pop 0.18s ease-out; }
@keyframes j13-fade-up {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.j13-fade-up { animation: j13-fade-up 0.2s ease-out both; }
/* 跳到主内容 */
.skip-link {
position: fixed;
top: 10px;
left: 10px;
z-index: 10001;
padding: 10px 18px;
font-size: 13.5px;
font-weight: 500;
background: var(--accent);
color: var(--accent-on);
border-radius: 999px;
transform: translateY(-200%);
transition: transform 0.18s ease;
}
.skip-link:focus-visible {
transform: translateY(0);
outline: none;
}