2193 lines
56 KiB
CSS
2193 lines
56 KiB
CSS
@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%;
|
||
}
|
||
/* rehype-pretty-code grid 行:保证每行有高度,避免折叠/展开后大片空白 */
|
||
.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] {
|
||
min-height: 1.65em;
|
||
line-height: 1.65;
|
||
}
|
||
.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));
|
||
}
|
||
.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;变量缺省时回退到正文色,避免整块「隐形」 */
|
||
.prose-content .shiki,
|
||
.prose-content .shiki span {
|
||
color: var(--shiki-light, var(--ink));
|
||
background-color: transparent !important;
|
||
}
|
||
.prose-content .shiki {
|
||
background: transparent !important;
|
||
}
|
||
html.dark .prose-content .shiki,
|
||
html.dark .prose-content .shiki 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;
|
||
}
|