Files
jiang13-bbs/frontend/app/globals.css

7515 lines
179 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: #fafbfc;
--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);
/* 积分看板最近流水:金额与类型标签 */
--ledger-in: #16a34a;
--ledger-out: #dc2626;
--ledger-checkin-bg: #dcfce7;
--ledger-checkin-fg: #15803d;
--ledger-bounty-bg: #ffedd5;
--ledger-bounty-fg: #c2410c;
--ledger-file-bg: #dbeafe;
--ledger-file-fg: #1d4ed8;
--ledger-typed-bg: #f3e8ff;
--ledger-typed-fg: #7e22ce;
/* 积分存量概览:分段条与健康徽章 */
--stock-circ: #07c05f;
--stock-spent: #d1d5db;
--stock-frozen: #f59e0b;
--stock-frozen-stripe: rgba(255, 255, 255, 0.35);
--stock-badge-ok-bg: #07c05f;
--stock-badge-ok-fg: #ffffff;
--stock-badge-hot-bg: #f59e0b;
--stock-badge-hot-fg: #ffffff;
--stock-badge-low-bg: var(--tint);
--stock-badge-low-fg: var(--ink-3);
/* 工作台可点块悬停底:左栏、帖子行、右栏公告/热门/友链/关于本站、目录等共用。
改这一处即可全局换悬停色;选中态仍走 --nav-active-*。按钮/菜单等控件不要绑这个。 */
--item-hover-bg: var(--accent-soft);
/* 工作台语义:选中用主题色淡底 */
--nav-active-bg: var(--accent-soft);
--nav-active-ink: var(--accent);
--nav-active-line: rgba(59, 91, 219, 0.38);
--rank-1: #96620f;
--rank-2: #5d6676;
--rank-3: #a05a2c;
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 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);
/* 页面画布:主题色柔光 + 发丝网格(纯 CSS,随 --accent 换肤) */
--bg-halo: color-mix(in srgb, var(--accent) 8%, transparent);
--bg-mesh: color-mix(in srgb, var(--ink) 3.2%, transparent);
--bg-grid-line: rgba(15, 23, 42, 0.05);
--bg-grid-size: 28px;
/* 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: 12px;
--r-sm: 12px;
/* 顶栏 68px 条 + 1px 底边;main 桌面 py-9。侧栏 sticky 必须等于
栏在 scrollY=0 时的视口 top,否则第一下滚动会先空走一截再吸住 */
--header-bar: 68px;
--header-h: calc(var(--header-bar) + 1px);
--main-pad-y: 2.25rem;
--rail-top: calc(var(--header-h) + var(--main-pad-y));
--rail-max-h: calc(100vh - var(--rail-top) - 1rem);
color-scheme: light;
}
.dark {
/* 近黑冷灰:面板逐层浮起,靛蓝提亮为长春花蓝 */
--bg: #0c0d10;
--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);
--ledger-in: #4ade80;
--ledger-out: #f87171;
--ledger-checkin-bg: rgba(22, 163, 74, 0.22);
--ledger-checkin-fg: #86efac;
--ledger-bounty-bg: rgba(194, 65, 12, 0.28);
--ledger-bounty-fg: #fdba74;
--ledger-file-bg: rgba(29, 78, 216, 0.28);
--ledger-file-fg: #93c5fd;
--ledger-typed-bg: rgba(126, 34, 206, 0.28);
--ledger-typed-fg: #e9d5ff;
--stock-circ: #34d399;
--stock-spent: #4b5563;
--stock-frozen: #fbbf24;
--stock-frozen-stripe: rgba(0, 0, 0, 0.22);
--stock-badge-ok-bg: #059669;
--stock-badge-ok-fg: #ecfdf5;
--stock-badge-hot-bg: #d97706;
--stock-badge-hot-fg: #fffbeb;
--stock-badge-low-bg: var(--tint);
--stock-badge-low-fg: var(--ink-3);
--item-hover-bg: var(--accent-soft);
/* 工作台语义:选中用主题色淡底 */
--nav-active-bg: var(--accent-soft);
--nav-active-ink: #a9b8ff;
--nav-active-line: rgba(141, 163, 255, 0.38);
--rank-1: #e3bf74;
--rank-2: #b9c1cd;
--rank-3: #e0a06e;
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4);
--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);
--bg-halo: color-mix(in srgb, var(--accent) 14%, transparent);
--bg-mesh: color-mix(in srgb, var(--ink) 5%, transparent);
--bg-grid-line: rgba(238, 241, 246, 0.045);
--bg-grid-size: 28px;
color-scheme: dark;
}
html {
scrollbar-color: var(--line-2) transparent;
background-color: var(--bg); /* 橡皮筋 overscroll 与画布同色 */
--j13-bg-site-image: none;
--j13-bg-site-size: cover;
--j13-bg-site-repeat: no-repeat;
--j13-bg-site-position: center;
--j13-bg-admin-image: none;
--j13-bg-admin-size: cover;
--j13-bg-admin-repeat: no-repeat;
--j13-bg-admin-position: center;
}
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; /* 禁止伪粗,避免缺档字重糊成一团 */
isolation: isolate; /* 让 z-index:-1 的画布层停在内容之下、html 之上 */
}
/* 画布纹饰:固定层(不用 background-attachment:fixed,避免移动端掉帧)。
柔光 + 发丝网格均为静态 CSS,无 JS、无 SVG 滤镜、无持续动画。 */
body::before {
content: "";
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(ellipse 78% 48% at 16% -14%, var(--bg-halo), transparent 62%),
radial-gradient(ellipse 52% 36% at 96% 0%, var(--bg-mesh), transparent 58%);
}
body::after {
content: "";
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
background-image:
repeating-linear-gradient(
to right,
var(--bg-grid-line) 0,
var(--bg-grid-line) 1px,
transparent 1px,
transparent var(--bg-grid-size)
),
repeating-linear-gradient(
to bottom,
var(--bg-grid-line) 0,
var(--bg-grid-line) 1px,
transparent 1px,
transparent var(--bg-grid-size)
);
-webkit-mask-image: radial-gradient(ellipse 92% 78% at 50% 16%, #000 12%, transparent 74%);
mask-image: radial-gradient(ellipse 92% 78% at 50% 16%, #000 12%, transparent 74%);
}
@media print {
body::before,
body::after {
display: none;
}
}
@media (prefers-contrast: more) {
body::before,
body::after {
display: none;
}
}
/* 自定义背景图:改写 canvas 的 ::before 固定层,关闭发丝网格。
前台 / 后台用 data-j13-chrome 分轨,软导航只改该属性即可切换。 */
html.j13-has-site-bg[data-j13-chrome="site"] body::before {
background-color: var(--bg);
background-image: var(--j13-bg-site-image);
background-size: var(--j13-bg-site-size);
background-repeat: var(--j13-bg-site-repeat);
background-position: var(--j13-bg-site-position);
}
html.j13-has-admin-bg[data-j13-chrome="admin"] body::before {
background-color: var(--bg);
background-image: var(--j13-bg-admin-image);
background-size: var(--j13-bg-admin-size);
background-repeat: var(--j13-bg-admin-repeat);
background-position: var(--j13-bg-admin-position);
}
html.j13-has-site-bg[data-j13-chrome="site"] body::after,
html.j13-has-admin-bg[data-j13-chrome="admin"] body::after {
display: 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-toolbar {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 1.25rem;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--panel) 92%, var(--panel-2));
position: sticky;
top: 3.5rem;
z-index: 20;
border-radius: var(--r) var(--r) 0 0;
}
@media (min-width: 640px) {
.j13-compose-toolbar {
padding: 0.85rem 1.75rem;
}
}
.j13-compose-toolbar-title {
margin: 0;
font-size: 15px;
font-weight: 700;
color: var(--ink);
letter-spacing: -0.01em;
}
.j13-compose-toolbar-actions {
display: flex;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
}
.j13-compose-body {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
padding: 1.15rem 1.15rem 0.75rem;
gap: 0.85rem;
}
@media (min-width: 640px) {
.j13-compose-body {
padding: 1.25rem 1.4rem 0.85rem;
gap: 0.95rem;
}
}
/* 发帖分区卡片:轻分隔,不过度割裂也不糊成一片 */
.j13-compose-section {
display: flex;
flex-direction: column;
gap: 0.85rem;
padding: 1rem 1.1rem 1.1rem;
border-radius: 14px;
border: 1px solid var(--line);
background: color-mix(in srgb, var(--bg) 70%, var(--panel));
}
.j13-compose-section-title {
margin: 0;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.05em;
color: var(--ink-3);
}
.j13-compose-section-writing {
background: var(--panel);
border-color: color-mix(in srgb, var(--line) 85%, var(--accent) 15%);
box-shadow: 0 1px 0 color-mix(in srgb, var(--ink) 3.5%, transparent);
flex: 1 1 auto;
min-height: 0;
}
/* 类型面板已在分区内,去掉二次描边避免套娃 */
.j13-compose-section .j13-compose-typepanel {
padding: 0;
border: 0;
border-radius: 0;
background: transparent;
}
.j13-compose-actions {
flex-shrink: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 0.75rem 1rem;
padding: 1rem 1.5rem 1.25rem;
border-top: 1px solid var(--line);
background: var(--panel);
}
.j13-compose-actions-error {
flex: 1 1 12rem;
margin: 0;
max-width: min(100%, 28rem);
}
.j13-compose-actions-end {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.65rem;
margin-left: auto;
}
@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-direction: column;
gap: 6px;
}
.j13-compose-typeopt {
width: 100%;
display: flex;
align-items: center;
gap: 6px;
padding: 2px 3px 2px 2px;
border-radius: 10px;
border: 1px solid var(--line);
background: var(--panel);
color: var(--ink);
transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.j13-compose-typeopt:hover:not(:has(.j13-compose-typeopt-hit:disabled)) {
border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
}
.j13-compose-typeopt.is-on {
background: var(--accent-soft);
border-color: color-mix(in srgb, var(--accent) 42%, var(--line));
}
.j13-compose-typeopt.is-on.is-warn {
background: color-mix(in srgb, var(--danger-soft) 70%, var(--panel));
border-color: color-mix(in srgb, var(--danger) 36%, var(--line));
}
.j13-compose-typeopt:has(.j13-compose-typeopt-hit:disabled):not(.is-on) {
opacity: 0.45;
}
.j13-compose-typeopt-hit {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
padding: 5px 4px 5px 6px;
border: 0;
border-radius: 8px;
background: transparent;
color: inherit;
text-align: left;
cursor: pointer;
appearance: none;
}
.j13-compose-typeopt-hit:disabled {
cursor: not-allowed;
}
.j13-compose-typeopt-hit:focus-visible,
.j13-compose-typeopt-setup:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
.j13-compose-typeopt-ico {
width: 28px;
height: 28px;
border-radius: 8px;
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: var(--panel-2);
color: var(--ink-2);
}
.j13-compose-typeopt.is-on .j13-compose-typeopt-ico {
background: var(--accent);
color: var(--accent-on);
}
.j13-compose-typeopt.is-on.is-warn .j13-compose-typeopt-ico {
background: var(--danger);
color: #fff;
}
.j13-compose-typeopt-copy {
min-width: 0;
flex: 1;
}
.j13-compose-typeopt-label {
display: block;
font-size: 13px;
font-weight: 700;
line-height: 1.25;
color: var(--ink);
letter-spacing: -0.01em;
}
.j13-compose-typeopt-hint {
display: block;
margin-top: 1px;
font-size: 11.5px;
font-weight: 500;
line-height: 1.3;
color: var(--ink-3);
}
.j13-compose-typebar.is-compact {
gap: 4px;
}
.j13-compose-typeopt.is-on .j13-compose-typeopt-hint.is-status {
color: color-mix(in srgb, var(--accent) 58%, var(--ink-2));
font-variant-numeric: tabular-nums;
}
.j13-compose-typeopt-hint.is-warn {
color: var(--danger);
font-weight: 650;
}
.j13-compose-typeopt-setup {
flex-shrink: 0;
height: 26px;
padding: 0 9px;
margin-right: 2px;
border-radius: 999px;
border: 1px solid color-mix(in srgb, var(--accent) 32%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 80%, var(--panel));
color: var(--accent);
font-size: 11.5px;
font-weight: 700;
letter-spacing: 0.02em;
line-height: 1;
white-space: nowrap;
cursor: pointer;
}
.j13-compose-typeopt-setup:hover {
background: var(--accent);
color: var(--accent-on);
border-color: var(--accent);
}
.j13-compose-typeopt-setup.is-warn {
border-color: color-mix(in srgb, var(--danger) 40%, var(--line));
background: color-mix(in srgb, var(--danger-soft) 85%, var(--panel));
color: var(--danger);
}
.j13-compose-typeopt-setup.is-warn:hover {
background: var(--danger);
color: #fff;
border-color: var(--danger);
}
.dark .j13-compose-typeopt.is-on.is-warn .j13-compose-typeopt-ico,
.dark .j13-compose-typeopt-setup.is-warn:hover {
color: #1a0c0b;
}
.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-lottery-prize-table-wrap {
overflow-x: auto;
border-radius: 10px;
border: 1px solid var(--line);
background: var(--panel);
}
.j13-lottery-prize-table {
width: 100%;
border-collapse: collapse;
font-size: 13.5px;
}
.j13-lottery-prize-table th,
.j13-lottery-prize-table td {
padding: 8px 10px;
text-align: left;
vertical-align: middle;
border-bottom: 1px solid var(--line);
}
.j13-lottery-prize-table th {
font-weight: 600;
color: var(--ink-2);
background: var(--panel-2);
white-space: nowrap;
}
.j13-lottery-prize-table tbody tr:last-child td {
border-bottom: none;
}
.j13-lottery-prize-table .col-idx {
width: 2.5rem;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
}
.j13-lottery-prize-table .col-count {
width: 6.5rem;
}
.j13-lottery-prize-table .col-actions {
width: 5.25rem;
text-align: right;
}
.j13-lottery-prize-table .col-actions > span {
display: inline-flex;
}
.j13-lottery-prize-table .col-actions .btn:disabled {
pointer-events: none;
}
.j13-lottery-prize-table .j13-compose-field {
width: 100%;
padding: 7px 10px;
font-size: 13.5px;
}
.j13-lottery-prize-table .j13-compose-field-count {
width: 100%;
max-width: 5.5rem;
}
.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-compose-attach-section {
background: var(--panel);
border-color: color-mix(in srgb, var(--line) 80%, var(--accent) 20%);
}
.j13-compose-attach-title {
display: inline-flex;
align-items: center;
gap: 0.45rem;
font-size: 13px !important;
letter-spacing: 0.02em;
color: var(--ink-2) !important;
}
.j13-compose-attach-badge {
display: inline-flex;
align-items: center;
padding: 0.1rem 0.45rem;
border-radius: 999px;
font-size: 11.5px;
font-weight: 700;
font-variant-numeric: tabular-nums;
color: var(--accent);
background: var(--accent-soft);
}
.j13-compose-drop {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.35rem;
min-height: 7.5rem;
padding: 1.15rem 1rem;
border-radius: 14px;
border: 1.5px dashed color-mix(in srgb, var(--accent) 42%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 55%, var(--panel));
cursor: pointer;
text-align: center;
transition: border-color 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;
}
.j13-compose-drop:hover,
.j13-compose-drop:focus-visible {
border-color: var(--accent);
outline: none;
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);
}
.j13-compose-drop.is-over {
border-color: var(--accent);
border-style: solid;
background: color-mix(in srgb, var(--accent-soft) 85%, var(--panel));
}
.j13-compose-drop.is-disabled {
opacity: 0.55;
pointer-events: none;
}
.j13-compose-drop-icon {
color: var(--accent);
opacity: 0.85;
}
.j13-compose-drop-lead {
margin: 0;
font-size: 14px;
font-weight: 650;
color: var(--ink);
}
.j13-compose-drop-hint {
margin: 0;
font-size: 12px;
line-height: 1.45;
color: var(--ink-3);
max-width: 36rem;
}
.j13-compose-att-list,
.j13-compose-att-queue {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 0.55rem;
}
.j13-compose-att-pending {
margin-top: 0.75rem;
padding: 12px;
border-radius: 14px;
border: 1.5px solid color-mix(in srgb, var(--accent) 40%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 70%, var(--panel));
display: flex;
flex-direction: column;
gap: 0.65rem;
}
.j13-compose-att-pending-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
flex-wrap: wrap;
}
.j13-compose-att-pending-title {
margin: 0;
font-size: 13.5px;
font-weight: 600;
color: var(--ink);
}
.j13-compose-att-upload-btn {
width: 100%;
justify-content: center;
gap: 0.45rem;
min-height: 42px;
font-size: 14.5px;
font-weight: 600;
/* 次于发布主 CTA:白底 + 实线 accent,在 soft 待传区里仍清晰 */
color: var(--accent);
background: var(--panel);
border-color: var(--accent);
border-width: 1.5px;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.06),
0 2px 8px color-mix(in srgb, var(--accent) 14%, transparent);
}
.j13-compose-att-upload-btn:hover:not(:disabled) {
color: var(--accent-on);
background: var(--accent);
border-color: var(--accent);
}
.j13-compose-att-upload-btn:active:not(:disabled) {
background: var(--accent-hi);
border-color: var(--accent-hi);
color: var(--accent-on);
}
.j13-compose-att-card {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel);
}
.j13-compose-att-card.is-error {
border-color: color-mix(in srgb, var(--danger, #c44) 45%, var(--line));
}
.j13-compose-att-name {
font-size: 13.5px;
font-weight: 600;
color: var(--ink);
}
.j13-compose-att-bar {
margin-top: 6px;
height: 4px;
border-radius: 999px;
background: var(--panel-2);
overflow: hidden;
}
.j13-compose-att-bar > span {
display: block;
height: 100%;
border-radius: inherit;
background: var(--accent);
transition: width 0.2s ease;
}
.j13-ext-editor.is-disabled {
opacity: 0.55;
pointer-events: none;
}
.j13-ext-warn {
margin: 0 0 0.75rem;
padding: 0.55rem 0.75rem;
border-radius: 10px;
font-size: 12.5px;
line-height: 1.45;
color: color-mix(in srgb, var(--gold) 85%, var(--ink));
background: color-mix(in srgb, var(--gold) 14%, var(--panel));
border: 1px solid color-mix(in srgb, var(--gold) 28%, var(--line));
}
.j13-ext-groups {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-bottom: 0.65rem;
}
.j13-ext-wall {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
align-items: center;
min-height: 2.75rem;
padding: 0.55rem 0.65rem;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel-2);
cursor: text;
}
.j13-ext-chip {
display: inline-flex;
align-items: center;
gap: 0.2rem;
padding: 0.2rem 0.35rem 0.2rem 0.55rem;
border-radius: 999px;
font-size: 12.5px;
font-weight: 650;
font-variant-numeric: tabular-nums;
color: var(--ink);
background: var(--panel);
border: 1px solid var(--line);
}
.j13-ext-chip-x {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.15rem;
height: 1.15rem;
border: 0;
border-radius: 999px;
background: transparent;
color: var(--ink-3);
cursor: pointer;
}
.j13-ext-chip-x:hover {
color: var(--ink);
background: color-mix(in srgb, var(--ink) 8%, transparent);
}
.j13-ext-input-wrap {
display: inline-flex;
align-items: center;
gap: 0.25rem;
min-width: 9rem;
flex: 1 1 8rem;
}
.j13-ext-input {
flex: 1;
min-width: 0;
border: 0;
outline: none;
background: transparent;
font-size: 13px;
color: var(--ink);
padding: 0.2rem 0;
}
.j13-compose-att-paid {
color: var(--gold);
font-weight: 650;
}
.j13-compose-att-paid .j13-compose-field {
color: var(--gold);
font-weight: 700;
font-variant-numeric: tabular-nums;
border-color: color-mix(in srgb, var(--gold) 38%, var(--line-2));
}
.j13-interact-card {
padding: 14px 16px;
border-radius: 14px;
border: 1px solid var(--line);
background: var(--panel);
}
/* 抽奖卡:对齐截图结构,落在站点石墨/令牌体系内 */
/* 类型帖交互卡(投票 / 悬赏 / 抽奖)共用壳 */
.j13-typed-card {
padding: 16px 18px 14px;
}
.j13-typed-head {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 10px 14px;
}
.j13-typed-head-main {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
min-width: 0;
}
.j13-typed-title {
display: inline-flex;
align-items: center;
gap: 7px;
margin: 0;
font-size: 15px;
font-weight: 700;
letter-spacing: -0.01em;
color: var(--ink);
}
.j13-typed-title svg {
flex-shrink: 0;
}
.j13-typed-title.is-question {
color: var(--ink);
}
.j13-typed-title.is-poll {
color: var(--accent);
}
.j13-typed-title.is-bounty {
color: var(--clay);
}
.j13-typed-title.is-lottery {
color: var(--gold);
}
.j13-typed-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.j13-typed-actions-row {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 12px;
}
.j13-typed-meta,
.j13-typed-empty {
margin: 8px 0 0;
font-size: 12.5px;
line-height: 1.5;
color: var(--ink-3);
}
.j13-typed-foot {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 8px 16px;
margin-top: 14px;
padding-top: 12px;
border-top: 1px solid var(--line);
font-size: 12.5px;
color: var(--ink-3);
}
.j13-typed-foot-status {
display: inline-flex;
align-items: center;
gap: 6px;
font-weight: 550;
}
.j13-typed-foot-status svg {
flex-shrink: 0;
color: var(--ink-2);
}
.j13-typed-foot-time {
font-variant-numeric: tabular-nums;
}
.j13-bounty-points {
font-weight: 700;
color: var(--clay);
}
.j13-poll-options {
display: flex;
flex-direction: column;
gap: 8px;
margin: 12px 0 0;
padding: 0;
list-style: none;
}
.j13-poll-option {
position: relative;
display: block;
width: 100%;
text-align: left;
overflow: hidden;
padding: 10px 12px;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel);
transition: border-color 0.15s ease, background 0.15s ease;
}
.j13-poll-option:disabled {
cursor: default;
}
.j13-poll-option:not(:disabled):hover {
border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
}
.j13-poll-option.is-on {
border-color: var(--accent);
background: var(--accent-soft);
}
.j13-poll-option-bar {
position: absolute;
inset: 0 auto 0 0;
opacity: 0.28;
background: var(--accent);
pointer-events: none;
}
.j13-poll-option-row {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.j13-poll-option-text {
font-size: 14px;
color: var(--ink);
}
.j13-poll-option-stat {
flex-shrink: 0;
font-size: 12.5px;
color: var(--ink-3);
}
.j13-poll-voters {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin: 6px 0 0;
padding: 0 2px;
list-style: none;
}
.j13-poll-voter {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 2px 8px 2px 3px;
border-radius: 999px;
font-size: 12px;
background: var(--accent-soft);
color: var(--accent);
text-decoration: none;
}
.j13-poll-voter:hover {
text-decoration: underline;
}
.j13-lottery-card {
padding: 16px 18px 14px;
}
.j13-lottery-head {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 10px 14px;
}
.j13-lottery-head-main {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
min-width: 0;
}
.j13-lottery-title {
display: inline-flex;
align-items: center;
gap: 7px;
margin: 0;
font-size: 15px;
font-weight: 700;
letter-spacing: -0.01em;
color: var(--gold);
}
.j13-lottery-title svg {
flex-shrink: 0;
}
.j13-lottery-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.j13-lottery-meta,
.j13-lottery-empty {
margin: 8px 0 0;
font-size: 12.5px;
line-height: 1.5;
color: var(--ink-3);
}
/* 截止倒计时:投票 / 悬赏 / 抽奖共用 */
.j13-deadline-countdown {
margin-top: 12px;
padding: 12px 14px 11px;
border-radius: 14px;
border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 55%, var(--panel));
}
.j13-deadline-countdown.is-expired {
border-color: color-mix(in srgb, var(--ink-3) 35%, var(--line));
background: color-mix(in srgb, var(--tint) 70%, var(--panel));
}
.j13-deadline-countdown-label {
display: inline-flex;
align-items: center;
gap: 6px;
margin: 0 0 8px;
font-size: 12.5px;
font-weight: 650;
color: var(--accent);
}
.j13-deadline-countdown.is-expired .j13-deadline-countdown-label {
color: var(--ink-2);
}
.j13-deadline-countdown-digits {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 8px;
}
.j13-deadline-countdown-unit {
display: inline-flex;
align-items: baseline;
gap: 4px;
padding: 6px 10px 5px;
border-radius: 10px;
background: var(--panel);
border: 1px solid var(--line);
box-shadow: var(--shadow-sm);
}
.j13-deadline-countdown-unit.is-sec {
border-color: color-mix(in srgb, var(--accent) 28%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 45%, var(--panel));
}
.j13-deadline-countdown-num {
font-family: var(--font-mono);
font-size: clamp(1.35rem, 3.2vw, 1.75rem);
font-weight: 750;
line-height: 1;
letter-spacing: -0.02em;
color: var(--ink);
}
.j13-deadline-countdown-suf {
font-size: 12px;
font-weight: 650;
color: var(--ink-3);
}
.j13-deadline-countdown-unit.is-sec .j13-deadline-countdown-num {
color: var(--accent);
}
.j13-deadline-countdown-expired {
margin: 0;
font-size: 1.15rem;
font-weight: 750;
letter-spacing: -0.01em;
color: var(--ink);
}
.j13-deadline-countdown-ends {
margin: 8px 0 0;
font-size: 12px;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
}
.dark .j13-deadline-countdown-unit {
background: var(--panel-2);
box-shadow: none;
}
.j13-deadline-picker {
display: flex;
flex-direction: column;
gap: 10px;
}
.j13-deadline-picker-head {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.j13-deadline-picker-label {
font-size: 13px;
font-weight: 650;
color: var(--ink);
}
.j13-deadline-picker-modes {
display: inline-flex;
align-self: flex-start;
gap: 2px;
padding: 3px;
border-radius: 999px;
background: var(--tint);
border: 1px solid color-mix(in srgb, var(--line) 80%, transparent);
}
.j13-deadline-mode {
border: 0;
background: transparent;
color: var(--ink-2);
font-size: 12.5px;
font-weight: 600;
padding: 5px 12px;
border-radius: 999px;
cursor: pointer;
transition: background 0.12s ease, color 0.12s ease, box-shadow 0.12s ease;
}
.j13-deadline-mode.is-on {
background: var(--panel);
color: var(--ink);
box-shadow: var(--shadow-sm);
}
.j13-deadline-mode:hover:not(:disabled):not(.is-on) {
color: var(--ink);
}
.j13-deadline-mode:disabled {
opacity: 0.55;
cursor: not-allowed;
}
.j13-deadline-presets,
.j13-deadline-quick-chips {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.j13-deadline-chip {
height: 32px;
padding: 0 13px;
border-radius: 999px;
border: 1px solid var(--line);
background: var(--panel);
color: var(--ink-2);
font-size: 13px;
font-weight: 500;
font-variant-numeric: tabular-nums;
transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.j13-deadline-chip-sm {
height: 28px;
padding: 0 10px;
font-size: 12.5px;
}
.j13-deadline-chip:hover:not(:disabled) {
border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
color: var(--accent);
}
.j13-deadline-chip.is-on {
background: var(--accent-soft);
border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
color: var(--accent);
}
.j13-deadline-chip:disabled {
opacity: 0.45;
cursor: not-allowed;
}
.j13-deadline-custom {
display: flex;
flex-direction: column;
gap: 10px;
}
.j13-deadline-fields {
display: flex;
flex-wrap: wrap;
align-items: stretch;
gap: 8px;
}
.j13-deadline-field {
display: inline-flex;
align-items: center;
gap: 8px;
/* 合适宽度:比半行窄、比内容贴边宽,留一点点击余量 */
width: 11.75rem;
max-width: 100%;
flex: 0 0 auto;
min-width: 0;
padding: 8px 10px;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel);
cursor: pointer;
transition: border-color 0.12s ease, box-shadow 0.12s ease;
}
.j13-deadline-field:last-child {
width: 8.75rem;
}
.j13-deadline-field:focus-within {
border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-deadline-field-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border-radius: 8px;
flex-shrink: 0;
color: var(--accent);
background: var(--accent-soft);
}
.j13-deadline-field-meta {
display: flex;
flex-direction: column;
gap: 1px;
min-width: 0;
flex: 1 1 auto;
position: relative;
}
.j13-deadline-field-label {
font-size: 11px;
font-weight: 650;
letter-spacing: 0.04em;
color: var(--ink-3);
}
.j13-deadline-field-input {
display: block;
width: 100%;
min-width: 0;
border: 0;
padding: 0;
margin: 0;
background: transparent;
color: var(--ink);
font-size: 13.5px;
font-weight: 600;
font-variant-numeric: tabular-nums;
font-family: var(--font-sans);
outline: none;
color-scheme: light dark;
}
.j13-deadline-field-input:disabled {
opacity: 0.55;
cursor: not-allowed;
}
/* 左侧已有图标:隐藏原生指示器,避免双图标与多余空白 */
.j13-deadline-field-input::-webkit-calendar-picker-indicator {
opacity: 0;
position: absolute;
inset: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
.j13-deadline-quick {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px 10px;
}
.j13-deadline-quick-label {
flex-shrink: 0;
font-size: 12px;
font-weight: 650;
color: var(--ink-3);
min-width: 2em;
}
.j13-deadline-preview {
margin: 0;
padding: 9px 12px;
border-radius: 10px;
background: color-mix(in srgb, var(--accent-soft) 70%, var(--panel));
border: 1px solid color-mix(in srgb, var(--accent) 18%, var(--line));
color: var(--ink-2);
font-size: 12.5px;
line-height: 1.45;
}
.j13-deadline-preview strong {
color: var(--ink);
font-weight: 650;
}
.j13-deadline-hint {
margin: 0;
font-size: 12px;
line-height: 1.45;
color: var(--ink-3);
}
/* 奖品 / 中奖者:横向排布,放不下换行 */
.j13-lottery-prize-row,
.j13-lottery-winner-row {
display: flex;
flex-wrap: wrap;
align-items: stretch;
gap: 8px 10px;
margin: 12px 0 0;
padding: 0;
list-style: none;
}
.j13-lottery-prize-row > li,
.j13-lottery-winner-row > li {
min-width: 0;
}
/* 奖品胶囊:淡金底 + 深金字 + 奖杯徽标 */
.j13-lottery-prize-chip {
display: inline-flex;
align-items: center;
gap: 6px;
max-width: min(100%, 28rem);
padding: 6px 13px 6px 11px;
border-radius: 999px;
font-size: 13px;
font-weight: 650;
line-height: 1.25;
background: var(--gold-soft);
color: var(--gold);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold) 28%, transparent);
}
.j13-lottery-prize-chip svg {
flex-shrink: 0;
}
.j13-lottery-prize-chip-text {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.j13-lottery-prize-chip-count {
margin-left: 0.3em;
font-variant-numeric: tabular-nums;
font-weight: 700;
}
.j13-lottery-winners-label {
margin: 14px 0 0;
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
}
.j13-lottery-winner-row {
margin-top: 8px;
}
/* 中奖者:横向胶囊卡片,内容定宽、可换行 */
.j13-lottery-winner {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
align-items: center;
column-gap: 10px;
width: min(100%, 15.5rem);
min-height: 52px;
padding: 8px 14px 8px 8px;
border-radius: 14px;
border: 1px solid var(--line);
background: var(--panel);
box-shadow: var(--shadow-sm);
}
.j13-lottery-winner-avatar {
grid-column: 1;
}
.j13-lottery-winner-body {
grid-column: 2;
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.j13-lottery-winner-name {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 13px;
font-weight: 650;
line-height: 1.25;
color: var(--ink);
text-decoration: none;
}
.j13-lottery-winner-name:hover {
color: var(--accent);
}
.j13-lottery-winner-prize {
display: block;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 11.5px;
font-weight: 600;
color: var(--gold);
}
.dark .j13-lottery-winner {
background: var(--panel-2);
box-shadow: none;
}
.j13-lottery-foot {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 8px 16px;
margin-top: 14px;
padding-top: 12px;
border-top: 1px solid var(--line);
font-size: 12.5px;
color: var(--ink-3);
}
.j13-lottery-foot-status {
display: inline-flex;
align-items: center;
gap: 6px;
font-weight: 550;
}
.j13-lottery-foot-status svg {
flex-shrink: 0;
color: var(--ink-2);
}
.j13-lottery-foot-time {
font-variant-numeric: tabular-nums;
}
.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));
}
/* 正文下方已采纳答案:与类型帖 typed-card 同框,配色克制 */
.j13-accepted-answer {
margin-top: 1.75rem;
}
.j13-accepted-answer.is-question,
.j13-accepted-answer.is-bounty {
/* 覆盖旧绿底/左边条;沿用 interact-card 面板 */
border-color: var(--line);
background: var(--panel);
box-shadow: none;
}
.j13-accepted-answer__author {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
margin-top: 12px;
}
.j13-accepted-answer__chip {
display: inline-flex;
align-items: center;
gap: 4px;
flex-shrink: 0;
padding: 3px 9px;
border-radius: 999px;
font-size: 12px;
font-weight: 600;
background: var(--ok-soft);
color: var(--ok);
}
.j13-accepted-answer__body {
min-width: 0;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--line);
}
/* 正文下方类型特殊块(投票/悬赏/抽奖/问答状态) */
.j13-interact-below {
margin-top: 1.75rem;
}
.j13-interact-below + .j13-accepted-answer,
.j13-interact-below + .j13-question-below {
margin-top: 1rem;
}
.j13-question-below {
margin-top: 1.75rem;
}
.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-field-invalid {
border-color: color-mix(in srgb, var(--danger) 55%, var(--line));
box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 14%, transparent);
}
.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;
min-height: 3.25rem;
padding: 8px 10px 8px 8px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
color: var(--ink);
text-align: left;
transition: background 0.12s ease, border-color 0.12s ease, box-shadow 0.15s ease;
cursor: pointer;
}
.j13-board-trigger:hover:not(:disabled) {
border-color: color-mix(in srgb, var(--accent) 35%, 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.is-invalid {
border-color: #dc2626;
background: color-mix(in srgb, #dc2626 8%, var(--panel));
}
.j13-board-trigger.is-invalid .j13-board-trigger-hint {
color: #dc2626;
font-weight: 650;
}
html.dark .j13-board-trigger.is-invalid {
border-color: #f87171;
background: color-mix(in srgb, #f87171 12%, var(--panel));
}
html.dark .j13-board-trigger.is-invalid .j13-board-trigger-hint {
color: #f87171;
}
.j13-board-trigger-copy {
min-width: 0;
flex: 1;
}
.j13-board-trigger-name {
display: block;
font-size: 13.5px;
font-weight: 700;
line-height: 1.3;
letter-spacing: -0.01em;
}
.j13-board-trigger-hint {
display: block;
margin-top: 2px;
font-size: 12px;
font-weight: 500;
line-height: 1.35;
color: var(--ink-3);
}
.j13-board-trigger-ico {
width: 32px;
height: 32px;
border-radius: 9px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 800;
flex-shrink: 0;
}
.j13-board-trigger-ico.is-placeholder {
background: var(--panel-2);
color: var(--ink-3);
}
.j13-board-option .j13-board-trigger-ico {
width: 24px;
height: 24px;
border-radius: 7px;
font-size: 11px;
}
.j13-compose-req {
margin-left: 6px;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.06em;
color: var(--accent);
vertical-align: 0.05em;
}
.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.is-active {
background: var(--accent-soft);
color: var(--accent);
}
.j13-md-sep {
width: 1px;
height: 18px;
margin: 0 4px;
background: var(--line);
flex-shrink: 0;
}
.j13-md-popover-anchor {
position: relative;
}
.j13-md-popover {
position: absolute;
top: calc(100% + 6px);
left: 0;
z-index: 40;
min-width: 168px;
padding: 6px;
border-radius: 12px;
background: var(--panel);
border: 1px solid var(--line);
box-shadow: var(--shadow-lg);
display: flex;
flex-direction: column;
gap: 2px;
}
.j13-md-popover-wide {
min-width: 200px;
max-height: 280px;
}
.j13-md-popover-form {
min-width: 260px;
padding: 10px;
gap: 8px;
}
.j13-md-popover button[role="menuitem"],
.j13-md-menu-item {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
text-align: left;
padding: 8px 10px;
border-radius: 8px;
border: 0;
appearance: none;
-webkit-appearance: none;
font-size: 13px;
font-weight: 500;
line-height: 1.35;
cursor: pointer;
/* 强制可读对比:避免暗色下系统 buttonface 浅底 + 浅字 */
color: var(--ink) !important;
background: transparent !important;
}
.j13-md-popover button[role="menuitem"]:hover,
.j13-md-menu-item:hover {
background: var(--panel-2) !important;
color: var(--ink) !important;
}
.j13-md-menu-item:disabled,
.j13-md-menu-item[aria-disabled="true"] {
opacity: 0.45;
cursor: not-allowed;
color: var(--ink-3) !important;
}
.j13-md-menu-item:disabled:hover,
.j13-md-menu-item[aria-disabled="true"]:hover {
background: transparent !important;
color: var(--ink-3) !important;
}
.j13-md-menu-item-hint {
margin-left: auto;
font-size: 11.5px;
font-weight: 500;
color: var(--ink-3);
}
.j13-md-popover button[role="menuitem"]:focus-visible,
.j13-md-menu-item:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 0;
}
.j13-md-popover-input {
width: 100%;
height: 34px;
padding: 0 10px;
border-radius: 8px;
border: 1px solid var(--line);
background: var(--bg);
color: var(--ink);
font-size: 13px;
}
.j13-md-popover-input:focus {
outline: 2px solid var(--accent);
outline-offset: 0;
}
.j13-md-popover-list {
max-height: 200px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 1px;
}
.j13-md-popover-list button {
text-align: left;
padding: 7px 10px;
border-radius: 8px;
border: 0;
appearance: none;
-webkit-appearance: none;
font-size: 12.5px;
font-family: var(--font-mono, ui-monospace, monospace);
cursor: pointer;
color: var(--ink-2) !important;
background: transparent !important;
}
.j13-md-popover-list button:hover {
background: var(--panel-2) !important;
color: var(--ink) !important;
}
.j13-md-field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 12px;
color: var(--ink-3);
}
.j13-md-popover-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 2px;
}
.btn-sm {
height: 30px;
padding: 0 12px;
font-size: 12.5px;
}
.j13-md-write-wrap {
position: relative;
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
min-width: 0;
height: 100%;
}
.j13-md-write-wrap.is-dragover .j13-md-textarea {
opacity: 0.35;
}
.j13-md-drop-mask {
position: absolute;
inset: 8px 0;
z-index: 5;
display: flex;
align-items: center;
justify-content: center;
border-radius: 12px;
border: 2px dashed var(--accent);
background: color-mix(in srgb, var(--accent-soft) 80%, transparent);
color: var(--accent);
font-weight: 600;
font-size: 14px;
pointer-events: none;
}
.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 10px;
border-radius: 999px;
border: 0;
appearance: none;
-webkit-appearance: none;
font-size: 12.5px;
font-weight: 500;
display: inline-flex;
align-items: center;
gap: 5px;
cursor: pointer;
color: var(--ink-2);
background: transparent;
}
.j13-md-mode button.is-on {
background: color-mix(in srgb, var(--accent) 18%, var(--panel));
color: var(--accent);
font-weight: 600;
}
.j13-md-panes {
flex: 1 1 auto;
display: grid;
grid-template-columns: 1fr;
grid-template-rows: minmax(0, 1fr);
min-height: 0;
gap: 0;
}
.j13-md-panes > [hidden] {
display: none !important;
}
.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;
height: 100%;
overflow-y: auto;
padding: 0.65rem 0 0.75rem;
background: transparent;
min-width: 0;
}
.j13-md-preview-label {
font-size: 11.5px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
margin-bottom: 0.35rem;
color: var(--ink-3);
}
.j13-md-panes.is-preview .j13-md-preview-label,
.j13-md-panes.is-write .j13-md-preview-label {
display: none;
}
.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-hide-block {
margin: 1.1rem 0;
border-radius: 14px;
border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 55%, var(--panel));
overflow: hidden;
}
.j13-hide-block-bar {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 14px;
border-bottom: 1px solid color-mix(in srgb, var(--accent) 14%, var(--line));
}
.j13-hide-badge {
display: inline-flex;
align-items: center;
height: 22px;
padding: 0 9px;
border-radius: 999px;
font-size: 11.5px;
font-weight: 600;
color: var(--accent-on);
background: var(--accent);
}
.j13-hide-block-body {
padding: 12px 16px 14px;
}
.j13-hide-block-body > :first-child { margin-top: 0; }
.j13-hide-block-body > :last-child { margin-bottom: 0; }
.j13-hide-gate {
margin: 1.1rem 0;
border-radius: 14px;
padding: 1.35rem 1.25rem;
text-align: center;
background: var(--accent-soft);
border: 1px dashed color-mix(in srgb, var(--accent) 35%, transparent);
}
.j13-hide-gate-icon {
margin: 0 auto 0.55rem;
color: var(--accent);
}
.j13-hide-gate-title {
font-weight: 700;
font-size: 15px;
color: var(--ink);
margin-bottom: 0.25rem;
}
.j13-hide-gate-desc {
margin-bottom: 0.9rem;
font-size: 13px;
}
.j13-hide-gate-actions {
display: flex;
justify-content: center;
gap: 8px;
flex-wrap: wrap;
}
.j13-hide-pwd-wrap {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
width: 100%;
max-width: 360px;
margin: 0 auto;
}
.j13-hide-pwd-form {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
justify-content: center;
width: 100%;
}
.j13-hide-pwd-input {
flex: 1 1 160px;
min-width: 140px;
height: 36px;
padding: 0 12px;
border-radius: 10px;
border: 1px solid var(--line-2);
background: var(--panel);
color: var(--ink);
font-size: 14px;
}
.j13-hide-pwd-input:focus {
outline: 2px solid var(--accent);
outline-offset: 0;
}
.j13-hide-pwd-input.is-invalid {
border-color: var(--danger);
outline: none;
box-shadow: 0 0 0 2px color-mix(in srgb, var(--danger) 22%, transparent);
}
.j13-hide-pwd-error {
margin: 0;
width: 100%;
text-align: center;
font-size: 13px;
font-weight: 600;
line-height: 1.4;
color: var(--danger);
}
/* 帖子附件:积分数独立成列,付费卡用金色语义 */
.j13-att {
margin-top: 2rem;
padding-top: 1.35rem;
border-top: 1px solid var(--line);
}
.j13-att-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
margin-bottom: 12px;
}
.j13-att-title {
display: inline-flex;
align-items: center;
gap: 7px;
margin: 0;
font-size: 15px;
font-weight: 800;
letter-spacing: -0.01em;
color: var(--ink);
}
.j13-att-title svg {
color: var(--accent);
}
.j13-att-list {
display: flex;
flex-direction: column;
gap: 10px;
margin: 0;
padding: 0;
list-style: none;
}
.j13-att-card {
appearance: none;
display: grid;
grid-template-columns: 46px minmax(0, 1fr) auto auto;
align-items: center;
column-gap: 14px;
row-gap: 10px;
width: 100%;
min-width: 0;
padding: 14px 16px;
border-radius: 14px;
text-align: left;
text-decoration: none;
color: inherit;
font: inherit;
cursor: default;
border: 1px solid var(--line);
background: var(--panel);
box-shadow: var(--shadow-sm);
transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s, background 0.15s;
}
.j13-att-card:hover {
transform: translateY(-1px);
box-shadow: var(--shadow);
border-color: color-mix(in srgb, var(--accent) 28%, var(--line));
}
.j13-att-card:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.j13-att-card.is-paid {
border-color: color-mix(in srgb, var(--gold) 34%, var(--line));
background: color-mix(in srgb, var(--gold-soft) 48%, var(--panel));
}
.j13-att-card.is-paid:hover {
border-color: color-mix(in srgb, var(--gold) 52%, var(--line));
}
.j13-att-card.is-unlocked {
border-color: color-mix(in srgb, var(--ok) 30%, var(--line));
background: color-mix(in srgb, var(--ok-soft) 42%, var(--panel));
}
.j13-att-card.is-unlocked:hover {
border-color: color-mix(in srgb, var(--ok) 46%, var(--line));
}
.j13-att-card.is-busy {
opacity: 0.92;
}
.j13-att-card.is-fresh {
animation: j13-att-unlock 0.7s ease-out;
}
.j13-att-type {
width: 46px;
height: 46px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
font-size: 11px;
font-weight: 800;
letter-spacing: 0.04em;
font-variant-numeric: tabular-nums;
color: var(--ink-2);
background: var(--tint);
}
.j13-att-type[data-kind="image"] {
color: var(--accent);
background: var(--accent-soft);
}
.j13-att-type[data-kind="archive"] {
color: var(--gold);
background: var(--gold-soft);
}
.j13-att-type[data-kind="doc"] {
color: var(--clay);
background: var(--clay-soft);
}
.j13-att-type[data-kind="media"] {
color: var(--ok);
background: var(--ok-soft);
}
.j13-att-main {
min-width: 0;
overflow: hidden;
}
.j13-att-name {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14.5px;
font-weight: 700;
line-height: 1.3;
color: var(--ink);
}
.j13-att-meta {
display: block;
margin-top: 3px;
font-size: 12px;
line-height: 1.4;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
}
.j13-att-price {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-width: 5.25rem;
padding: 8px 12px 7px;
border-radius: 12px;
line-height: 1;
background: var(--panel);
border: 1px solid color-mix(in srgb, var(--gold) 42%, var(--line));
box-shadow: var(--shadow-sm);
}
.j13-att-price-num {
font-size: 28px;
font-weight: 800;
letter-spacing: -0.04em;
font-variant-numeric: tabular-nums;
color: var(--gold);
line-height: 1;
}
.j13-att-price-unit {
display: inline-flex;
align-items: center;
gap: 3px;
margin-top: 5px;
font-size: 11.5px;
font-weight: 650;
color: var(--gold);
}
.j13-att-price.is-unlocked {
border-color: color-mix(in srgb, var(--ok) 42%, var(--line));
}
.j13-att-price.is-unlocked .j13-att-price-unit {
color: var(--ok);
}
.j13-att-price.is-free {
min-width: auto;
padding: 8px 12px;
border-color: var(--line);
}
.j13-att-price.is-free .j13-att-price-unit {
margin-top: 0;
font-size: 13.5px;
font-weight: 700;
color: var(--ink-2);
}
.j13-att-cta {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
height: 34px;
padding: 0 14px;
border-radius: 999px;
font-size: 13px;
font-weight: 600;
line-height: 1;
flex-shrink: 0;
cursor: pointer;
border: 1px solid var(--line-2);
background: var(--panel);
color: var(--ink);
white-space: nowrap;
font-family: inherit;
text-decoration: none;
appearance: none;
}
a.j13-att-cta:hover {
color: var(--ink);
}
.j13-att-cta:hover:not(:disabled):not(.is-primary) {
border-color: var(--accent);
color: var(--accent);
}
.j13-att-cta:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.j13-att-cta.is-primary {
border-color: transparent;
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);
}
.j13-att-cta.is-primary:hover:not(:disabled) {
background: var(--accent-hi);
color: var(--accent-on);
}
.j13-att-pay {
display: flex;
flex-direction: column;
gap: 4px;
}
.j13-att-pay-file {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel-2);
}
.j13-att-pay-name {
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14px;
font-weight: 700;
color: var(--ink);
}
.j13-att-pay-hero {
text-align: center;
padding: 18px 8px 6px;
}
.j13-att-pay-num {
display: block;
font-size: 48px;
font-weight: 800;
letter-spacing: -0.05em;
font-variant-numeric: tabular-nums;
color: var(--gold);
line-height: 1;
}
.j13-att-pay-unit {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
margin-top: 8px;
font-size: 13px;
font-weight: 650;
color: var(--gold);
}
@keyframes j13-att-unlock {
0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--ok) 38%, transparent); }
100% { box-shadow: 0 0 0 12px transparent; }
}
@media (max-width: 560px) {
.j13-att-card {
grid-template-columns: 46px minmax(0, 1fr) auto;
}
.j13-att-cta {
grid-column: 1 / -1;
width: 100%;
height: 40px;
}
}
@media (prefers-reduced-motion: reduce) {
.j13-att-card,
.j13-att-card.is-fresh {
transition: none;
animation: none;
}
.j13-att-card:hover {
transform: none;
}
}
.j13-compose-shell {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
box-shadow: var(--shadow);
overflow: visible;
}
/* 发帖/编辑工作台:锁一屏、隐藏页脚,高度全部给编辑画布 */
body:has([data-compose-viewport]) {
height: 100dvh;
max-height: 100dvh;
overflow: hidden;
}
body:has([data-compose-viewport]) > footer {
display: none;
}
body:has([data-compose-viewport]) #main {
flex: 1 1 0;
min-height: 0;
display: flex;
flex-direction: column;
padding-top: 0.55rem;
padding-bottom: 0.55rem;
overflow: hidden;
}
body:has([data-compose-viewport]) #main > [data-compose-viewport] {
flex: 1 1 auto;
display: flex;
flex-direction: column;
min-height: 0;
}
/* 发帖工作台:左画布 + 右设置栏(窄屏设置收入抽屉) */
.j13-compose-stage.is-studio {
overflow: hidden;
}
.j13-compose-stage.is-studio:not(:has(.j13-compose-studio)) {
align-items: center;
justify-content: center;
}
.j13-compose-stage.is-studio .j13-compose-toolbar {
position: relative;
top: auto;
z-index: 8;
padding: 0.7rem 1rem 0.7rem 0.85rem;
background: var(--panel);
border-radius: var(--r) var(--r) 0 0;
}
.j13-compose-toolbar-lead {
display: flex;
align-items: center;
gap: 0.65rem;
min-width: 0;
}
.j13-compose-toolbar-copy {
display: flex;
flex-direction: column;
gap: 0.1rem;
min-width: 0;
}
.j13-compose-toolbar-sub {
margin: 0;
font-size: 12px;
line-height: 1.3;
color: var(--ink-3);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.j13-compose-back {
width: 34px;
height: 34px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 10px;
color: var(--ink-2);
background: transparent;
border: 0;
flex-shrink: 0;
transition: background 0.12s ease, color 0.12s ease;
}
.j13-compose-back:hover,
.j13-compose-back:focus-visible {
background: var(--accent-soft);
color: var(--accent);
}
.j13-compose-toolbar-hint {
font-size: 12px;
color: var(--ink-3);
max-width: 14rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.j13-compose-rail-toggle {
display: inline-flex;
align-items: center;
gap: 0.35rem;
}
.j13-compose-rail-toggle-count {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 1.15rem;
height: 1.15rem;
padding: 0 0.3rem;
border-radius: 999px;
font-size: 11px;
font-weight: 700;
color: var(--accent);
background: var(--accent-soft);
}
.j13-compose-draft {
flex-shrink: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.7rem 1.1rem;
font-size: 13px;
color: var(--ink);
background: var(--accent-soft);
border-bottom: 1px solid color-mix(in srgb, var(--accent) 18%, transparent);
}
.j13-compose-banner-error {
flex-shrink: 0;
margin: 0;
border-radius: 0;
border-left: 0;
border-right: 0;
}
.j13-compose-studio {
flex: 1 1 auto;
min-height: 0;
display: grid;
grid-template-columns: minmax(0, 1fr);
grid-template-rows: minmax(0, 1fr);
position: relative;
}
.j13-compose-studio-canvas {
min-width: 0;
min-height: 0;
display: flex;
flex-direction: column;
padding: 0.2rem 1.15rem 0.7rem;
overflow: hidden;
}
.j13-compose-title-row {
display: flex;
align-items: flex-end;
gap: 0.75rem;
flex-shrink: 0;
}
.j13-compose-title-count {
font-size: 12px;
color: var(--ink-3);
padding-bottom: 0.8rem;
flex-shrink: 0;
}
.j13-compose-stage.is-studio .j13-compose-canvas,
.j13-compose-stage.is-studio .j13-md-editor {
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
}
.j13-compose-stage.is-studio .j13-md-textarea,
.j13-compose-stage.is-studio .j13-md-preview {
min-height: 0;
}
.j13-compose-rail-backdrop {
display: none;
}
.j13-compose-studio-rail {
min-height: 0;
min-width: 0;
display: flex;
flex-direction: column;
gap: 1.15rem;
padding: 1rem 1.05rem 1.35rem;
overflow-y: auto;
background: color-mix(in srgb, var(--bg) 62%, var(--panel));
border-left: 1px solid var(--line);
}
.j13-compose-rail-head {
display: none;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
margin: -0.15rem 0 0.15rem;
}
.j13-compose-rail-head-title {
margin: 0;
font-size: 15px;
font-weight: 700;
color: var(--ink);
}
.j13-compose-rail-block {
display: flex;
flex-direction: column;
gap: 0.7rem;
flex-shrink: 0;
}
.j13-compose-studio-rail .j13-compose-meta {
flex-direction: column;
gap: 0.85rem;
}
.j13-compose-studio-rail .j13-compose-meta-board,
.j13-compose-studio-rail .j13-compose-meta-tags {
width: 100%;
max-width: none;
flex: none;
}
.j13-compose-studio-rail .j13-compose-typebar {
display: flex;
flex-direction: column;
gap: 6px;
}
.j13-compose-studio-rail .j13-compose-section {
padding: 0;
border: 0;
background: transparent;
border-radius: 0;
}
.j13-compose-studio-rail .j13-compose-drop {
min-height: 5.5rem;
padding: 0.8rem 0.7rem;
}
.j13-compose-studio-rail .j13-compose-drop-lead {
font-size: 13px;
}
.j13-compose-studio-rail .j13-compose-typepanel {
padding: 0.85rem 0.9rem;
}
.j13-compose-typemodal-body {
max-height: min(78vh, 42rem);
overflow-y: auto;
padding-right: 2px;
}
.j13-compose-typemodal-body .j13-compose-typepanel {
padding: 0;
border: 0;
border-radius: 0;
background: transparent;
}
@media (max-width: 1279px) {
.j13-compose-rail-backdrop {
display: block;
position: fixed;
inset: 0;
z-index: 69;
border: 0;
padding: 0;
cursor: pointer;
background: color-mix(in srgb, var(--ink) 28%, transparent);
}
.j13-compose-studio-rail {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: auto;
width: min(100%, 24.5rem);
z-index: 70;
border-left: 1px solid var(--line);
box-shadow: var(--shadow-lg);
transform: translateX(100%);
visibility: hidden;
pointer-events: none;
transition: transform 0.22s ease, visibility 0.22s ease;
}
.j13-compose-studio-rail.is-open {
transform: translateX(0);
visibility: visible;
pointer-events: auto;
}
.j13-compose-rail-head {
display: flex;
}
}
@media (min-width: 1280px) {
.j13-compose-studio {
grid-template-columns: minmax(0, 1fr) minmax(18.5rem, 21.5rem);
}
.j13-compose-studio-canvas {
padding: 0.25rem 1.5rem 0.85rem 1.6rem;
}
.j13-compose-rail-toggle {
display: none;
}
.j13-compose-rail-head {
display: none;
}
.j13-compose-rail-backdrop {
display: none !important;
}
}
@media (max-width: 639px) {
.j13-compose-toolbar-hint {
display: none;
}
.j13-compose-studio-canvas {
padding-left: 0.9rem;
padding-right: 0.9rem;
}
}
/* 聊天页:整页锁在视口内,避免「页面滚动 + 对话区滚动」双滚动条 */
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;
}
/* ── 管理后台独立壳:全高侧栏 + 顶栏 + 可滚主区(不依赖公开 Header/Footer) ── */
body:has([data-admin-viewport]) {
height: 100dvh;
max-height: 100dvh;
overflow: hidden;
}
.admin-shell {
display: flex;
height: 100dvh;
max-height: 100dvh;
min-height: 0;
overflow: hidden;
background: transparent; /* 透出全站画布层 */
}
.admin-rail {
width: 15.5rem;
flex-shrink: 0;
display: flex;
flex-direction: column;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
padding: 1rem 0.75rem 1.25rem;
background: var(--panel);
border-right: 1px solid var(--line);
}
/* 桌面常驻侧栏;窄屏改用抽屉,避免与 .admin-rail 的 display 冲突 */
.admin-rail-desktop {
display: none;
}
@media (min-width: 1024px) {
.admin-rail-desktop {
display: flex;
}
}
@media (min-width: 1280px) {
.admin-rail {
width: 16.5rem;
}
}
.admin-drawer-panel {
position: relative;
z-index: 1;
display: flex;
width: min(18rem, 86vw);
height: 100%;
box-shadow: var(--shadow-lg);
animation: admin-drawer-in 0.18s ease-out;
}
.admin-rail-brand {
display: flex;
align-items: center;
gap: 0.625rem;
padding: 0.35rem 0.5rem 1rem;
margin-bottom: 0.35rem;
border-bottom: 1px solid var(--line);
}
.admin-rail-brand-mark {
width: 2.25rem;
height: 2.25rem;
border-radius: 0.75rem;
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: var(--accent);
color: var(--accent-on);
}
.admin-rail-nav {
display: flex;
flex-direction: column;
gap: 1rem;
padding: 0.75rem 0 0.25rem;
flex: 1;
}
.admin-rail-group-title {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--ink-3);
padding: 0 0.65rem 0.4rem;
margin: 0;
}
.admin-rail-link {
display: flex;
align-items: center;
gap: 0.625rem;
padding: 0.55rem 0.75rem;
border-radius: 0.75rem;
font-size: 13.5px;
font-weight: 500;
color: var(--ink-2);
transition: background-color 0.15s ease, color 0.15s ease;
}
.admin-rail-link:hover {
background: var(--panel-2);
color: var(--ink);
}
.admin-rail-link.is-active {
background: var(--nav-active-bg);
color: var(--nav-active-ink);
}
.admin-rail-link.is-active svg {
color: var(--nav-active-ink);
}
.admin-rail-link:not(.is-active) svg {
color: var(--ink-3);
}
.admin-main-col {
flex: 1 1 0;
min-width: 0;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.admin-topbar {
height: 3.5rem;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0 1rem;
background: color-mix(in srgb, var(--bg) 88%, transparent);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
border-bottom: 1px solid var(--line);
z-index: 30;
}
@media (min-width: 640px) {
.admin-topbar {
padding: 0 1.5rem;
}
}
.admin-topbar-left,
.admin-topbar-right {
display: flex;
align-items: center;
gap: 0.5rem;
min-width: 0;
}
.admin-topbar-back {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.4rem 0.75rem;
border-radius: 999px;
font-size: 13px;
font-weight: 500;
color: var(--ink-2);
transition: background-color 0.15s ease, color 0.15s ease;
}
.admin-topbar-back:hover {
background: var(--panel);
color: var(--ink);
}
.admin-topbar-user {
display: inline-flex;
align-items: center;
gap: 0.5rem;
border-radius: 999px;
padding: 0.2rem 0.55rem 0.2rem 0.2rem;
border: 1px solid var(--line);
transition: border-color 0.15s ease, background-color 0.15s ease;
}
.admin-canvas {
flex: 1 1 0;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
padding: 1.25rem 1rem 2rem;
}
/* 内容管理:桌面禁整页滚动,三栏底部落在视口内 */
@media (min-width: 1024px) {
.admin-canvas:has(.admin-content-page) {
display: flex;
flex-direction: column;
overflow: hidden;
padding-bottom: 1.25rem;
}
}
@media (min-width: 640px) {
.admin-canvas {
padding: 1.5rem 1.5rem 2.5rem;
}
}
@media (min-width: 1024px) {
.admin-canvas {
padding: 1.75rem 2rem 2.75rem;
}
.admin-canvas:has(.admin-content-page) {
padding-bottom: 1.25rem;
}
}
/* 用户管理吸顶:顶内边距挪到 .admin-users-page,sticky 才能贴紧顶栏而不提前定住 */
.admin-canvas:has(.admin-users-stick) {
padding-top: 0;
}
/* 移动端导航抽屉 */
.admin-drawer {
position: fixed;
inset: 0;
z-index: 60;
display: flex;
}
.admin-drawer-backdrop {
position: absolute;
inset: 0;
border: 0;
padding: 0;
cursor: pointer;
background: color-mix(in srgb, var(--ink) 28%, transparent);
}
@keyframes admin-drawer-in {
from {
transform: translateX(-100%);
opacity: 0.85;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@media (prefers-reduced-motion: reduce) {
.admin-drawer-panel {
animation: none;
}
}
::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;
}
/* skip-link / 点击主栏空白会聚焦 #main(tabIndex=-1)。
本文件 :focus-visible 未分层,会压过 Tailwind .outline-none,画出整栏主题色描边。 */
#main:focus,
#main:focus-visible,
.admin-canvas:focus,
.admin-canvas:focus-visible {
outline: none;
}
/* 消息侧栏搜索:单层描边,避免外框 + 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;
}
/* 后台输入:与聊天搜索同一套壳层聚焦(未分层,才能压过全局 :focus-visible 双线) */
.admin-field-shell,
.admin-stepper {
background: var(--bg);
border: 1px solid var(--line);
border-radius: 12px;
transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
}
.admin-field-shell:hover:not(:focus-within),
.admin-stepper:hover:not(:focus-within) {
border-color: color-mix(in srgb, var(--line-2) 40%, var(--line));
}
.admin-field-shell:focus-within,
.admin-stepper:focus-within {
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
background: var(--panel);
}
.admin-field-input,
.admin-field-input:focus,
.admin-field-input:focus-visible,
.admin-stepper-input,
.admin-stepper-input:focus,
.admin-stepper-input:focus-visible {
outline: none !important;
box-shadow: none !important;
border: 0 !important;
background: transparent !important;
}
.admin-stepper-btn:focus,
.admin-stepper-btn:focus-visible {
outline: none !important;
box-shadow: none !important;
}
.admin-field-shell.is-invalid {
border-color: var(--danger) !important;
}
.admin-field-shell.is-invalid:focus-within {
box-shadow: 0 0 0 3px var(--danger-soft);
}
.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;
}
/* 标题本身在 overflow 里会被裁半圈;焦点画在铺满整行的 ::after 内侧 */
.stretch-link:focus-visible {
outline: none;
}
.stretch-link:focus-visible::after {
box-shadow: inset 0 0 0 2.5px var(--accent);
}
.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; }
/* ----- 成功操作(审核通过等) ----- */
.btn-ok {
background: var(--ok-soft);
color: var(--ok);
}
.btn-ok:hover:not(:disabled) {
background: var(--ok);
color: #fff;
}
.dark .btn-ok:hover:not(:disabled) {
color: #0a1a10;
}
/* ============================================================
管理后台控件(仅 /admin;颜色全部走令牌)
============================================================ */
.admin-switch {
position: relative;
flex-shrink: 0;
width: 2.75rem;
height: 1.625rem;
border-radius: 999px;
border: none;
padding: 0;
cursor: pointer;
transition: background 0.15s ease;
background: var(--line-2);
}
.admin-switch[aria-checked="true"] {
background: var(--accent);
}
.admin-switch:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.admin-switch:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-switch-knob {
position: absolute;
top: 0.125rem;
left: 0.125rem;
width: 1.375rem;
height: 1.375rem;
border-radius: 999px;
background: var(--panel);
box-shadow: var(--shadow-sm);
transition: transform 0.15s ease;
}
.admin-switch[aria-checked="true"] .admin-switch-knob {
transform: translateX(1.125rem);
}
.admin-seg {
display: inline-flex;
align-items: center;
gap: 0.375rem;
padding: 0.5rem 0.875rem;
border-radius: 999px;
border: none;
font-size: 13px;
font-weight: 500;
line-height: 1.35;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
color: var(--ink-2);
background: var(--panel-2);
}
.admin-seg:hover:not(:disabled):not([aria-selected="true"]):not([aria-pressed="true"]) {
color: var(--ink);
background: var(--tint);
}
.admin-seg[aria-selected="true"],
.admin-seg[aria-pressed="true"],
.admin-seg[aria-current="page"] {
background: var(--nav-active-bg);
color: var(--nav-active-ink);
}
.admin-seg:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.admin-seg:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-seg-count {
min-width: 1.25rem;
padding: 0 0.375rem;
border-radius: 999px;
font-size: 11px;
font-variant-numeric: tabular-nums;
line-height: 1.7;
background: var(--panel);
color: var(--ink-3);
}
.admin-seg[aria-selected="true"] .admin-seg-count,
.admin-seg[aria-pressed="true"] .admin-seg-count,
.admin-seg[aria-current="page"] .admin-seg-count {
color: var(--nav-active-ink);
}
.admin-seg-sm {
padding: 0.375rem 0.75rem;
font-size: 12.5px;
}
/* 站点设置:限宽左对齐,不写入后台公共主容器 */
.admin-canvas:has(.admin-settings-page) {
background: var(--bg);
}
@media (min-width: 1920px) {
.admin-canvas:has(.admin-settings-page) {
padding-left: 3rem; /* 宽屏距主导航最多约 48px;1024+ 默认 2rem */
}
}
.admin-settings-page {
width: 100%;
max-width: 1120px;
margin-inline: 0;
container-type: inline-size;
container-name: settings-page;
}
.admin-settings-page > .mb-5 {
margin-bottom: 1.25rem;
}
.admin-settings-work {
display: grid;
grid-template-columns: 10rem minmax(0, 1fr);
gap: 1.5rem;
align-items: start;
}
.admin-settings-nav-col {
min-width: 0;
}
.admin-settings-nav {
display: flex;
flex-direction: column;
gap: 0.15rem;
}
.admin-settings-nav-link {
display: flex;
align-items: center;
width: 100%;
min-height: 2.25rem;
padding: 0.4rem 0.7rem;
border-radius: 0.65rem;
font-size: 13.5px;
font-weight: 500;
line-height: 1.35;
color: var(--ink-2);
text-align: left;
border: none;
background: transparent;
cursor: pointer;
font-family: inherit;
text-decoration: none;
}
.admin-settings-nav-link:hover {
background: var(--panel-2);
color: var(--ink);
}
.admin-settings-nav-link:visited {
color: var(--ink-2);
}
.admin-settings-nav-link[aria-current="page"],
.admin-settings-nav-link[aria-current="page"]:visited {
background: var(--nav-active-bg);
color: var(--nav-active-ink);
font-weight: 600;
}
.admin-settings-nav-link:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-settings-nav-soon {
margin-top: 0.5rem;
padding-top: 0.5rem;
border-top: 1px solid var(--line);
}
.admin-settings-nav-soon-summary {
display: flex;
align-items: center;
gap: 0.35rem;
width: 100%;
min-height: 2rem;
padding: 0.3rem 0.7rem;
border-radius: 0.5rem;
font-size: 12px;
font-weight: 550;
line-height: 1.35;
color: var(--ink-3);
cursor: pointer;
list-style: none;
font-family: inherit;
}
.admin-settings-nav-soon-summary::-webkit-details-marker,
.admin-settings-nav-soon-summary::marker {
display: none;
content: "";
}
.admin-settings-nav-soon-summary::before {
content: "";
width: 0.35rem;
height: 0.35rem;
border-right: 1.5px solid currentColor;
border-bottom: 1.5px solid currentColor;
transform: rotate(-45deg);
flex-shrink: 0;
}
.admin-settings-nav-soon[open] .admin-settings-nav-soon-summary::before {
transform: rotate(45deg);
}
.admin-settings-nav-soon-summary:hover {
background: var(--panel-2);
color: var(--ink-2);
}
.admin-settings-nav-soon-summary:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-settings-nav-soon-list {
margin: 0.15rem 0 0;
padding: 0 0.7rem 0.2rem;
list-style: none;
display: flex;
flex-direction: column;
gap: 0.15rem;
}
.admin-settings-nav-soon-list li {
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-3);
pointer-events: none;
}
.admin-settings-main {
min-width: 0;
display: flex;
flex-direction: column;
gap: 1.25rem;
container-type: inline-size;
container-name: settings-form;
}
.admin-settings-stack {
display: flex;
flex-direction: column;
gap: 1.25rem;
min-width: 0;
}
.admin-settings-group {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
overflow: hidden;
}
.admin-settings-group-head {
padding: 1.25rem 1.25rem 0.75rem;
}
.admin-settings-group-title {
margin: 0;
font-size: 15px;
font-weight: 650;
color: var(--ink);
}
.admin-settings-group-desc {
margin: 0.3rem 0 0;
font-size: 12.5px;
line-height: 1.5;
color: var(--ink-3);
}
.admin-settings-group-body {
display: flex;
flex-direction: column;
gap: 1rem;
padding: 0 1.25rem 1.25rem;
}
.admin-settings-group-footer {
padding: 0 1.25rem 1.25rem;
}
.admin-settings-group:has(.admin-settings-group-footer) .admin-settings-group-body {
padding-bottom: 0.75rem;
}
.admin-settings-git-json-wrap {
min-width: 0;
display: flex;
flex-direction: column;
min-height: 12rem;
}
.admin-settings-git-json {
min-height: 12rem;
width: 100%;
resize: vertical;
}
.admin-settings-md {
min-width: 0;
min-height: 16rem;
display: flex;
flex-direction: column;
border: 1px solid var(--line);
border-radius: 12px;
padding: 0.35rem 0.85rem 0.55rem;
background: var(--panel);
}
.admin-settings-git-summary {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.85rem;
margin-top: 0.75rem;
padding-top: 0.75rem;
border-top: 1px solid var(--line);
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-3);
}
.admin-settings-git-summary-kicker {
font-weight: 600;
color: var(--ink-2);
}
.admin-settings-git-summary-src {
display: inline-flex;
align-items: center;
gap: 0.3rem;
color: var(--ink-2);
}
.admin-settings-git-summary-src strong {
font-weight: 600;
color: var(--ink);
}
.admin-settings-row {
display: grid;
grid-template-columns: 10.75rem minmax(0, 1fr);
gap: 0.35rem 1.5rem;
align-items: start;
}
.admin-settings-row-label {
min-width: 0;
padding-top: 0.5rem;
}
.admin-settings-row-name {
display: block;
font-size: 14px;
font-weight: 550;
line-height: 1.4;
color: var(--ink);
overflow-wrap: anywhere;
}
.admin-settings-row-hint {
margin: 0.25rem 0 0;
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-3);
}
.admin-settings-row-hint.is-below {
margin-top: 0.4rem;
}
.admin-settings-row-error {
margin: 0.35rem 0 0;
font-size: 12.5px;
line-height: 1.45;
color: var(--danger);
}
.admin-settings-row-control {
min-width: 0;
}
.admin-settings-control-text {
max-width: min(32.5rem, 100%);
}
.admin-settings-control-long {
max-width: min(40rem, 100%);
}
.admin-settings-control-select {
max-width: min(22.5rem, 100%);
}
.admin-settings-control-num {
max-width: min(11.25rem, 100%);
}
.admin-settings-actions {
display: grid;
grid-template-columns: 10.75rem minmax(0, 1fr);
gap: 0.35rem 1.5rem;
align-items: center;
}
.admin-settings-actions-inner {
grid-column: 2;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.75rem 1rem;
min-width: 0;
}
.admin-settings-actions-status {
margin: 0;
font-size: 12.5px;
line-height: 1.4;
color: var(--ink-3);
}
.admin-settings-actions-status.is-error {
color: var(--danger);
}
.admin-settings-actions-btns {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.admin-settings-actions .btn:disabled {
opacity: 0.72;
}
.admin-settings-instant {
font-size: 12.5px;
color: var(--ink-3);
}
.admin-settings-divider {
height: 1px;
background: var(--line);
margin: 0.1rem 0;
}
.admin-brand-lockup-preview {
max-width: min(32.5rem, 100%);
border-radius: 12px;
overflow: hidden;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-brand-lockup-preview-bar {
min-height: 68px;
padding: 0 1rem;
display: flex;
align-items: center;
}
.admin-brand-slots {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.admin-brand-slot-card {
flex: 1 1 11.5rem;
max-width: 16rem;
min-width: 10.5rem;
}
.admin-brand-swatch {
height: 5.5rem;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
padding: 0.75rem;
overflow: hidden;
}
.admin-brand-swatch img {
max-height: 4rem;
max-width: 100%;
object-fit: contain;
}
.admin-brand-swatch-light {
background: #f4f6f3;
color: #3d4a44;
box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.08);
}
.admin-brand-swatch-dark {
background: #1a221e;
color: #c5d0ca;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
}
.admin-brand-swatch-neutral {
background: var(--panel-2);
color: var(--ink-3);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-settings-keywords {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
margin-bottom: 0.65rem;
}
.admin-settings-kw {
display: inline-flex;
align-items: center;
gap: 0.25rem;
max-width: 100%;
border-radius: 999px;
padding: 0.2rem 0.65rem;
font-size: 12.5px;
color: var(--ink);
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
overflow-wrap: anywhere;
}
.admin-footer-item {
border-radius: 12px;
padding: 0.85rem;
box-shadow: inset 0 0 0 1px var(--line);
display: flex;
flex-direction: column;
gap: 0.85rem;
}
.admin-footer-preview {
max-width: min(40rem, 100%);
border-radius: 12px;
padding: 0.75rem 1rem;
background: var(--panel-2);
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 0.5rem 1rem;
}
@container settings-page (max-width: 1039px) {
.admin-settings-work {
grid-template-columns: minmax(0, 1fr);
gap: 1rem;
}
.admin-settings-nav {
flex-direction: row;
flex-wrap: wrap;
gap: 0.35rem;
}
.admin-settings-nav-link {
width: auto;
min-height: 2rem;
padding: 0.3rem 0.7rem;
background: var(--panel-2);
}
.admin-settings-nav-soon {
flex: 1 1 100%;
margin-top: 0.15rem;
padding-top: 0.5rem;
}
.admin-settings-nav-soon-list {
flex-direction: row;
flex-wrap: wrap;
gap: 0.35rem 0.85rem;
padding: 0.15rem 0.15rem 0;
}
}
@container settings-form (max-width: 719px) {
.admin-settings-row,
.admin-settings-actions {
grid-template-columns: minmax(0, 1fr);
gap: 0.35rem;
}
.admin-settings-row-label {
padding-top: 0;
}
.admin-settings-actions-inner {
grid-column: 1;
}
}
/* 填满可视区:提交导入 JSON / 公告与单页正文,底部操作钉在视口内 */
@media (min-width: 1024px) {
.admin-canvas:has(.admin-settings-page.is-fill) {
display: flex;
flex-direction: column;
overflow: hidden;
padding-bottom: 1.25rem;
}
.admin-settings-page.is-fill {
flex: 1 1 auto;
min-height: 0;
display: flex;
flex-direction: column;
}
.admin-settings-page.is-fill > .mb-5 {
flex-shrink: 0;
}
.admin-settings-page.is-fill .admin-settings-work {
flex: 1 1 auto;
min-height: 0;
align-items: stretch;
}
.admin-settings-page.is-fill .admin-settings-main,
.admin-settings-page.is-fill .admin-settings-stack {
flex: 1 1 auto;
min-height: 0;
display: flex;
flex-direction: column;
}
.admin-settings-page.is-fill .admin-settings-stack {
overflow: auto;
}
.admin-settings-page.is-fill .admin-settings-group.is-fill {
flex: 1 1 auto;
min-height: 0;
display: flex;
flex-direction: column;
}
.admin-settings-page.is-fill .admin-settings-group.is-fill .admin-settings-group-head,
.admin-settings-page.is-fill .admin-settings-group.is-fill .admin-settings-group-footer {
flex-shrink: 0;
}
.admin-settings-page.is-fill .admin-settings-group.is-fill .admin-settings-group-body {
flex: 1 1 auto;
min-height: 0;
display: flex;
flex-direction: column;
}
.admin-settings-git-editor,
.admin-settings-md-editor {
flex: 1 1 auto;
min-height: 12rem;
align-items: stretch;
}
.admin-settings-git-editor .admin-settings-row-control,
.admin-settings-md-editor .admin-settings-row-control {
min-height: 0;
height: 100%;
display: flex;
flex-direction: column;
}
.admin-settings-git-json-wrap,
.admin-settings-md {
flex: 1 1 auto;
min-height: 0;
max-width: none;
}
.admin-settings-md {
display: flex;
flex-direction: column;
border: 1px solid var(--line);
border-radius: 12px;
padding: 0.35rem 0.85rem 0.55rem;
background: var(--panel);
}
.admin-settings-md .j13-md-editor {
flex: 1 1 auto;
min-height: 0;
}
.admin-settings-md .j13-md-textarea,
.admin-settings-md .j13-md-preview {
min-height: 0;
}
.admin-settings-git-json {
flex: 1 1 auto;
min-height: 0;
height: 100%;
overflow: auto;
resize: none;
}
@container settings-form (max-width: 719px) {
.admin-settings-git-editor,
.admin-settings-md-editor {
grid-template-rows: auto minmax(0, 1fr);
}
}
}
.admin-field-shell.has-count .admin-field-input {
padding-right: 0.5rem;
}
.admin-field-count.is-infield {
flex-shrink: 0;
padding: 0 10px 0 4px;
}
.admin-field-shell.is-area.has-count {
position: relative;
}
.admin-field-shell.is-area .admin-field-count.is-infield {
position: absolute;
top: 8px;
right: 10px;
padding: 0;
z-index: 1;
}
.admin-field-shell.is-area.has-count .admin-field-input {
padding-right: 3.5rem;
padding-top: 10px;
}
.j13-brand-slot {
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
}
.j13-brand-slot[data-frame="1"] {
border-radius: 8px;
background: color-mix(in srgb, var(--panel) 70%, transparent);
box-shadow: inset 0 0 0 1px var(--line);
}
.j13-brand-logo {
width: 100%;
height: 100%;
max-width: none;
object-fit: contain;
display: block;
}
.j13-brand-slot[data-fit="cover"] > .j13-brand-logo:not(.j13-brand-logo-tile) {
object-fit: cover;
}
.j13-brand-slot[data-fit="stretch"] > .j13-brand-logo:not(.j13-brand-logo-tile) {
object-fit: fill;
}
.j13-brand-logo-tile {
background-repeat: repeat;
background-size: auto;
background-position: left top;
}
.j13-brand-bubble {
width: 36px;
height: 36px;
}
.j13-brand-logo-dark {
display: none;
}
html.dark .j13-brand-logo-light {
display: none;
}
html.dark .j13-brand-logo-dark {
display: block;
}
.admin-icon-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2rem;
height: 2rem;
border-radius: 999px;
border: none;
padding: 0;
cursor: pointer;
color: var(--ink-3);
background: transparent;
transition: background 0.15s ease, color 0.15s ease;
}
.admin-icon-btn:hover:not(:disabled) {
background: var(--accent-soft);
color: var(--accent);
}
.admin-icon-btn.is-danger:hover:not(:disabled) {
background: var(--danger-soft);
color: var(--danger);
}
.admin-icon-btn.is-danger.is-active,
.admin-icon-btn.is-danger[aria-pressed="true"] {
color: var(--danger);
}
.admin-icon-btn.is-accent {
color: var(--accent);
}
.admin-icon-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.admin-icon-btn:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
/* 单页管理:列表与编辑各自限宽,不套用设置页 1120px */
.admin-canvas:has(.admin-doc-page) {
background: var(--bg);
}
.admin-doc-page {
width: 100%;
margin-inline: 0;
min-width: 0;
}
.admin-doc-list {
max-width: 1240px;
}
.admin-doc-editor {
max-width: 1440px;
container-type: inline-size;
container-name: doc-editor;
}
.admin-doc-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 0.75rem 1rem;
margin-bottom: 1.25rem;
flex-wrap: wrap;
}
.admin-doc-back {
display: inline-flex;
align-items: center;
gap: 0.3rem;
min-height: 2rem;
font-size: 13px;
color: var(--ink-2);
text-decoration: none;
}
.admin-doc-back:hover {
color: var(--accent);
}
.admin-doc-back:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
border-radius: 0.4rem;
}
.admin-doc-head-title {
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
margin-top: 0.15rem;
}
.admin-doc-head-title h1 {
margin: 0;
font-size: 22px;
line-height: 1.25;
font-weight: 800;
letter-spacing: -0.02em;
color: var(--ink);
}
.admin-doc-split {
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 1.25rem;
align-items: start;
}
.admin-doc-main {
min-width: 0;
display: flex;
flex-direction: column;
gap: 1rem;
}
.admin-doc-label {
display: block;
margin: 0 0 0.4rem;
font-size: 13px;
font-weight: 600;
line-height: 1.4;
color: var(--ink-2);
}
.admin-doc-hint {
margin: 0.35rem 0 0;
font-size: 12.5px;
line-height: 1.5;
color: var(--ink-3);
overflow-wrap: anywhere;
}
.admin-doc-md .j13-md-editor:not(.is-fullscreen) {
height: clamp(16rem, calc(100dvh - 22rem), 40rem);
min-height: 0;
border: 1px solid var(--line);
border-radius: 12px;
padding: 0.35rem 0.85rem 0.15rem;
background: var(--panel);
}
.admin-doc-md .j13-md-textarea,
.admin-doc-md .j13-md-preview {
min-height: 0;
overflow-y: auto;
}
.admin-doc-rail {
min-width: 0;
border: 1px solid var(--line);
border-radius: 12px;
background: var(--panel);
padding: 0.85rem 0.9rem 1rem;
}
.admin-doc-rail > summary {
cursor: pointer;
font-size: 14px;
font-weight: 650;
color: var(--ink);
list-style: none;
min-height: 2.25rem;
display: flex;
align-items: center;
}
.admin-doc-rail > summary::-webkit-details-marker {
display: none;
}
.admin-doc-rail-body {
display: flex;
flex-direction: column;
gap: 1rem;
padding-top: 0.35rem;
}
.admin-doc-field {
min-width: 0;
}
.admin-doc-slug {
display: flex;
align-items: center;
min-height: 2.5rem;
border: 1px solid var(--line);
border-radius: 0.7rem;
background: var(--panel);
overflow: hidden;
}
.admin-doc-slug:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.admin-doc-slug.is-invalid {
border-color: var(--danger);
}
.admin-doc-slug-prefix {
flex-shrink: 0;
padding-left: 0.75rem;
font-size: 14px;
color: var(--ink-3);
font-family: var(--font-mono, ui-monospace, monospace);
}
.admin-doc-slug-input {
flex: 1 1 auto;
min-width: 0;
height: 2.5rem;
border: 0;
background: transparent;
padding: 0 0.75rem 0 0.15rem;
font-size: 14px;
color: var(--ink);
font-family: var(--font-mono, ui-monospace, monospace);
}
.admin-doc-slug-input:focus {
outline: none;
}
.admin-doc-copy {
margin-top: 0.55rem;
min-height: 2.25rem;
}
.admin-doc-switchline {
display: flex;
align-items: center;
gap: 0.6rem;
min-height: 2.25rem;
font-size: 14px;
color: var(--ink);
}
.admin-doc-colors {
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
}
.admin-doc-colors .j13-anno-dot {
width: 2.25rem;
height: 2.25rem;
}
.admin-doc-number {
width: 7.5rem;
height: 2.5rem;
padding: 0 0.75rem;
border: 1px solid var(--line);
border-radius: 0.7rem;
background: var(--panel);
color: var(--ink);
font-size: 14px;
}
.admin-doc-number:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.admin-doc-actions {
min-width: 0;
}
.admin-doc-actions-btns {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.6rem 0.75rem;
}
.admin-doc-actions .btn {
min-height: 2.5rem;
}
.admin-doc-status {
margin: 0;
font-size: 12.5px;
color: var(--ink-3);
}
.admin-doc-status.is-error {
color: var(--danger);
}
.admin-doc-table-wrap {
min-width: 0;
}
.admin-doc-table {
width: 100%;
border-collapse: collapse;
font-size: 14px;
color: var(--ink);
}
.admin-doc-table th {
text-align: left;
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
padding: 0.55rem 0.85rem;
border-bottom: 1px solid var(--line);
white-space: nowrap;
}
.admin-doc-table td {
padding: 0.75rem 0.85rem;
border-bottom: 1px solid var(--line);
vertical-align: top;
font-size: 13.5px;
color: var(--ink-2);
}
.admin-doc-table tr:last-child td {
border-bottom: 0;
}
.admin-doc-title {
display: inline;
font-size: 14.5px;
font-weight: 650;
color: var(--ink);
text-decoration: none;
overflow-wrap: anywhere;
}
.admin-doc-title:hover {
color: var(--accent);
}
.admin-doc-title:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-doc-path {
margin: 0.2rem 0 0;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.4rem;
}
.admin-doc-path code {
font-size: 12px;
color: var(--ink-3);
font-family: var(--font-mono, ui-monospace, monospace);
}
.admin-doc-excerpt {
margin: 0.25rem 0 0;
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-3);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.admin-doc-row-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.15rem;
}
.admin-doc-textbtn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.25rem;
min-height: 2.25rem;
min-width: 2.25rem;
padding: 0 0.55rem;
border: 0;
border-radius: 0.55rem;
background: transparent;
color: var(--ink-2);
font-size: 13.5px;
font-weight: 550;
text-decoration: none;
cursor: pointer;
font-family: inherit;
}
.admin-doc-textbtn:hover {
background: var(--accent-soft);
color: var(--accent);
}
.admin-doc-textbtn:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-doc-more {
position: relative;
}
.admin-doc-menu {
position: absolute;
right: 0;
top: calc(100% + 0.2rem);
z-index: 5;
min-width: 7.5rem;
padding: 0.3rem;
border: 1px solid var(--line);
border-radius: 0.7rem;
background: var(--panel);
box-shadow: var(--shadow);
}
.admin-doc-menu.is-up {
top: auto;
bottom: calc(100% + 0.2rem);
}
.admin-doc-menu-item {
display: flex;
width: 100%;
min-height: 2.25rem;
align-items: center;
padding: 0 0.7rem;
border: 0;
border-radius: 0.45rem;
background: transparent;
color: var(--ink);
font-size: 13.5px;
cursor: pointer;
font-family: inherit;
text-align: left;
}
.admin-doc-menu-item.is-danger {
color: var(--danger);
}
.admin-doc-menu-item:hover:not(:disabled) {
background: var(--danger-soft);
}
.admin-doc-menu-item:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
.admin-doc-menu-item:disabled {
opacity: 0.5;
cursor: not-allowed;
}
@container doc-editor (min-width: 64rem) {
.admin-doc-split {
grid-template-columns: minmax(0, 1fr) 19rem;
column-gap: 1.5rem;
row-gap: 0.85rem;
}
.admin-doc-main {
grid-column: 1;
grid-row: 1;
}
.admin-doc-rail {
grid-column: 2;
grid-row: 1 / span 2;
position: sticky;
top: 0;
max-height: calc(100dvh - 6rem);
overflow: auto;
}
.admin-doc-rail > summary {
display: none;
}
.admin-doc-rail:not([open]) > .admin-doc-rail-body {
display: flex;
}
.admin-doc-actions {
grid-column: 1;
grid-row: 2;
}
}
@media (max-width: 760px) {
.admin-doc-table thead {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
}
.admin-doc-table,
.admin-doc-table tbody,
.admin-doc-table tr,
.admin-doc-table td {
display: block;
width: 100%;
}
.admin-doc-table tr {
padding: 0.35rem 0 0.6rem;
border-bottom: 1px solid var(--line);
}
.admin-doc-table td {
border-bottom: 0;
padding: 0.3rem 0.85rem;
}
.admin-doc-table td::before {
content: attr(data-label);
display: block;
margin-bottom: 0.15rem;
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
}
.admin-doc-table tr:last-child {
border-bottom: 0;
}
}
.admin-status {
display: inline-flex;
align-items: center;
gap: 0.25rem;
padding: 0.125rem 0.5rem;
border-radius: 999px;
font-size: 11px;
font-weight: 500;
line-height: 1.55;
white-space: nowrap;
}
.admin-status.is-ok {
background: var(--ok-soft);
color: var(--ok);
}
.admin-status.is-warn {
background: var(--gold-soft);
color: var(--gold);
}
.admin-status.is-danger {
background: var(--danger-soft);
color: var(--danger);
}
.admin-status.is-muted {
background: var(--tint);
color: var(--ink-3);
}
.admin-status.is-accent {
background: var(--accent-soft);
color: var(--accent);
}
.ledger-row {
display: flex;
align-items: center;
gap: 10px;
height: 64px;
padding: 12px 20px;
border-top: 1px solid var(--line);
}
.ledger-row:first-child {
border-top: none;
}
.ledger-kind-icon {
width: 30px;
height: 30px;
border-radius: 999px;
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
font-size: 14px;
line-height: 1;
}
.ledger-kind-tag {
font-size: 11px;
padding: 2px 8px;
border-radius: 4px;
font-weight: 500;
line-height: 1.4;
white-space: nowrap;
flex-shrink: 0;
}
.ledger-kind-icon.is-checkin,
.ledger-kind-tag.is-checkin {
background: var(--ledger-checkin-bg);
color: var(--ledger-checkin-fg);
}
.ledger-kind-icon.is-bounty,
.ledger-kind-tag.is-bounty {
background: var(--ledger-bounty-bg);
color: var(--ledger-bounty-fg);
}
.ledger-kind-icon.is-file,
.ledger-kind-tag.is-file {
background: var(--ledger-file-bg);
color: var(--ledger-file-fg);
}
.ledger-kind-icon.is-typed,
.ledger-kind-tag.is-typed {
background: var(--ledger-typed-bg);
color: var(--ledger-typed-fg);
}
.ledger-kind-icon.is-system,
.ledger-kind-tag.is-system {
background: var(--tint);
color: var(--ink-2);
}
.ledger-amount {
width: 80px;
flex-shrink: 0;
text-align: right;
font-size: 15px;
font-weight: 600;
font-variant-numeric: tabular-nums;
line-height: 1.2;
}
/* 积分存量概览 */
.stock-card {
display: flex;
flex-direction: column;
min-height: 160px;
padding: 20px;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
}
.stock-card-body {
display: flex;
flex-direction: column;
gap: 12px;
}
.stock-badge {
display: inline-flex;
align-items: center;
font-size: 11px;
font-weight: 600;
line-height: 1.3;
padding: 4px 10px;
border-radius: 999px;
white-space: nowrap;
font-variant-numeric: tabular-nums;
}
.stock-badge.is-low {
background: var(--stock-badge-low-bg);
color: var(--stock-badge-low-fg);
}
.stock-badge.is-ok {
background: var(--stock-badge-ok-bg);
color: var(--stock-badge-ok-fg);
}
.stock-badge.is-hot {
background: var(--stock-badge-hot-bg);
color: var(--stock-badge-hot-fg);
}
.stock-bar {
display: flex;
height: 10px;
border-radius: 8px;
overflow: hidden;
background: var(--tint);
}
.stock-bar-seg {
height: 100%;
min-width: 0;
}
.stock-bar-seg.is-circ {
background: var(--stock-circ);
}
.stock-bar-seg.is-spent {
background: var(--stock-spent);
}
.stock-bar-seg.is-frozen {
background-color: var(--stock-frozen);
background-image: repeating-linear-gradient(
-45deg,
var(--stock-frozen-stripe) 0 3px,
transparent 3px 7px
);
}
.admin-toolbar {
display: flex;
flex-direction: column;
gap: 0.75rem;
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--line);
background: var(--panel);
}
@media (min-width: 640px) {
.admin-toolbar {
padding: 0.875rem 1.25rem;
}
}
/* 用户管理:搜索栏 + 列头贴齐 admin-topbar(滚动容器是 .admin-canvas) */
.admin-users-page {
padding-top: 1.25rem;
}
@media (min-width: 640px) {
.admin-users-page {
padding-top: 1.5rem;
}
}
@media (min-width: 1024px) {
.admin-users-page {
padding-top: 1.75rem;
}
}
.admin-users-stick {
position: sticky;
top: 0;
z-index: 20;
background: var(--panel);
box-shadow: var(--shadow-sm);
}
/* 内容管理页:窄屏可整页滚;桌面高度由上方未分层的 canvas:has 规则锁定 */
.admin-content-page {
display: flex;
flex-direction: column;
gap: 0.75rem;
min-height: 0;
}
@media (min-width: 1024px) {
.admin-content-page {
flex: 1 1 auto;
min-height: 0;
height: 100%;
}
}
.admin-content-page > .mb-5 {
margin-bottom: 0 !important;
flex-shrink: 0;
}
.admin-content-page > .mb-5 h1 {
font-size: 1.25rem;
}
@media (min-width: 640px) {
.admin-content-page > .mb-5 h1 {
font-size: 1.375rem;
}
}
.admin-content-page > .mb-5 .meta {
margin-top: 0.25rem;
}
/* 策略条:横向排布,压缩垂直占用 */
.admin-content-policy {
display: flex;
align-items: flex-start;
gap: 0.65rem 0.85rem;
flex-wrap: wrap;
flex-shrink: 0;
padding: 0.55rem 0.75rem;
border: 1px solid var(--line);
border-radius: 12px;
background: var(--panel);
}
.admin-content-policy-lead {
display: flex;
flex-direction: column;
gap: 0.15rem;
flex: 0 1 13.5rem;
min-width: 8.5rem;
padding-top: 0.2rem;
}
.admin-content-policy-title {
font-size: 12px;
font-weight: 650;
color: var(--ink-3);
}
.admin-content-policy-scope {
font-size: 11.5px;
line-height: 1.4;
color: var(--ink-3);
}
.admin-content-policy-row {
display: flex;
align-items: center;
gap: 0.35rem 0.5rem;
flex: 1 1 18rem;
min-width: 0;
flex-wrap: wrap;
}
.admin-content-policy-chip {
display: inline-flex;
align-items: center;
flex-wrap: nowrap;
gap: 0.5rem;
padding: 0.28rem 0.55rem;
border-radius: 10px;
background: var(--panel-2);
border: 1px solid transparent;
min-height: 2.25rem;
max-width: 100%;
flex: 0 1 auto;
}
.admin-content-policy-chip-copy {
display: flex;
flex-direction: column;
min-width: 0;
gap: 0.05rem;
}
.admin-content-policy-chip-label {
font-size: 12.5px;
font-weight: 600;
color: var(--ink);
white-space: nowrap;
}
.admin-content-policy-chip-how {
font-size: 11px;
font-weight: 500;
color: var(--ink-3);
white-space: nowrap;
}
.admin-content-policy-chip-ctrl {
flex-wrap: nowrap;
}
/* 内容管理:PC 左中右三栏等高;仅列表区滚动 */
.admin-content-triptych {
display: grid;
gap: 0.85rem;
align-items: stretch;
min-height: 18rem;
}
@media (min-width: 1024px) {
.admin-content-triptych {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1rem;
flex: 1 1 auto;
min-height: 0;
height: auto;
}
}
.admin-messages-panel {
flex: 1 1 auto;
min-height: 0;
}
/* 私聊监管:方向条与正文同一卡片,无间隙 */
.admin-dm-row {
min-width: 0;
}
.admin-dm-card {
display: flex;
flex-direction: column;
min-width: 0;
border-radius: 0.55rem;
background: var(--panel-2);
border: 1px solid var(--line);
overflow: hidden;
}
.admin-dm-card-head {
padding: 0.4rem 0.65rem;
border-bottom: 1px solid var(--line);
}
.admin-dm-card-body {
padding: 0.55rem 0.7rem 0.65rem;
}
.admin-dm-pair-meta {
display: flex;
align-items: center;
gap: 0.45rem;
flex: 1 1 auto;
min-width: 0;
}
.admin-dm-pair-names {
display: inline-flex;
align-items: center;
gap: 0.35rem;
min-width: 0;
flex: 1 1 auto;
}
.admin-dm-person {
display: inline-flex;
align-items: center;
gap: 0.35rem;
min-width: 0;
}
.admin-dm-person-name {
font-size: 12.5px;
font-weight: 600;
letter-spacing: 0.01em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 7.5rem;
}
.admin-dm-arrow {
flex-shrink: 0;
font-weight: 500;
color: var(--ink-3);
font-size: 11px;
}
.admin-content-col {
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden;
}
@media (min-width: 1024px) {
.admin-content-col {
height: 100%;
}
}
.admin-content-col-head,
.admin-content-col-toolbar,
.admin-content-col-pager {
flex-shrink: 0;
}
.admin-content-col-body {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
overscroll-behavior: contain;
}
.admin-content-col-toolbar {
display: flex;
flex-direction: column;
gap: 0.55rem;
padding: 0.65rem 0.75rem;
border-bottom: 1px solid var(--line);
background: var(--panel);
}
.admin-content-action {
display: inline-flex;
align-items: center;
gap: 0.3rem;
padding: 0.28rem 0.55rem;
border-radius: 8px;
border: 1px solid var(--line);
background: var(--panel);
color: var(--ink-2);
font-size: 12px;
font-weight: 600;
line-height: 1.2;
cursor: pointer;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
.admin-content-action:hover:not(:disabled) {
background: var(--panel-2);
color: var(--ink);
border-color: var(--line-2);
}
.admin-content-action:disabled {
opacity: 0.55;
cursor: not-allowed;
}
.admin-content-action.is-danger {
color: var(--danger);
border-color: color-mix(in srgb, var(--danger) 28%, var(--line));
background: color-mix(in srgb, var(--danger) 6%, var(--panel));
}
.admin-content-action.is-danger:hover:not(:disabled) {
background: color-mix(in srgb, var(--danger) 12%, var(--panel));
}
.admin-content-action.is-ok {
color: var(--ok);
border-color: color-mix(in srgb, var(--ok) 28%, var(--line));
background: color-mix(in srgb, var(--ok) 6%, var(--panel));
}
.admin-content-clamp {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
word-break: break-word;
}
.admin-content-clamp.is-open {
display: block;
-webkit-line-clamp: unset;
}
/* 三栏宽度下状态条横向滚动,避免折行难看 */
.admin-content-col-toolbar .admin-content-status-scroll {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: thin;
}
.admin-content-col-toolbar .admin-content-status-scroll > div {
flex-wrap: nowrap !important;
}
.admin-content-col-toolbar .admin-content-status-scroll .admin-seg {
flex-shrink: 0;
}
.admin-content-kind {
display: inline-flex;
align-items: center;
gap: 0.2rem;
padding: 0.2rem;
border-radius: 999px;
background: var(--panel-2);
flex-shrink: 0;
}
.admin-content-kind-btn {
display: inline-flex;
align-items: center;
gap: 0.375rem;
padding: 0.4rem 0.8rem;
border: none;
border-radius: 999px;
background: transparent;
color: var(--ink-3);
font-size: 13px;
font-weight: 600;
line-height: 1.3;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
}
.admin-content-kind-btn:hover:not([aria-selected="true"]) {
color: var(--ink);
}
.admin-content-kind-btn[aria-selected="true"] {
background: var(--panel);
color: var(--ink);
box-shadow: 0 0 0 1px var(--line);
}
.admin-content-kind-btn:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-content-kind-count {
min-width: 1.15rem;
padding: 0 0.35rem;
border-radius: 999px;
font-size: 11px;
font-weight: 500;
font-variant-numeric: tabular-nums;
line-height: 1.65;
background: var(--panel);
color: var(--ink-3);
}
.admin-content-kind-btn[aria-selected="true"] .admin-content-kind-count {
background: var(--accent-soft);
color: var(--accent);
}
.admin-field-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 0.75rem;
margin-bottom: 0.5rem;
}
.admin-field-head .field-label {
margin-bottom: 0;
}
.admin-field-count {
font-size: 12px;
font-variant-numeric: tabular-nums;
color: var(--ink-3);
flex-shrink: 0;
}
.admin-field-shell {
display: flex;
align-items: center;
width: 100%;
}
.admin-field-shell.is-area {
display: block;
}
.admin-field-input {
width: 100%;
min-width: 0;
padding: 10px 12px;
color: var(--ink);
font-size: 14px;
line-height: 1.5;
font-family: var(--font-sans);
}
.admin-field-input::placeholder {
color: var(--ink-3);
}
.admin-field-input:disabled {
opacity: 0.6;
cursor: not-allowed;
}
textarea.admin-field-input {
display: block;
font-family: var(--font-sans);
font-size: 14px;
line-height: 1.7;
resize: vertical;
}
.admin-search-shell {
display: flex;
align-items: center;
gap: 0.625rem;
min-height: 2.875rem;
height: 2.875rem;
padding: 0 0.875rem;
}
.admin-search-shell .admin-field-input {
padding: 0;
height: 100%;
font-size: 14px;
line-height: 1.4;
}
.admin-stepper {
display: inline-flex;
align-items: stretch;
flex-shrink: 0;
height: 2.5rem;
overflow: hidden;
}
.admin-stepper.is-disabled {
opacity: 0.6;
}
.admin-stepper-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.25rem;
border: none;
padding: 0;
background: transparent;
color: var(--ink-2);
cursor: pointer;
}
.admin-stepper-btn:hover:not(:disabled) {
background: var(--tint);
color: var(--ink);
}
.admin-stepper-btn:disabled {
opacity: 0.35;
cursor: not-allowed;
}
.admin-stepper-input {
width: 3.25rem;
min-width: 0;
padding: 0;
margin: 0;
text-align: center;
color: var(--ink);
font-size: 14px;
font-weight: 600;
font-variant-numeric: tabular-nums;
font-family: var(--font-sans);
}
.admin-stepper-unit {
display: inline-flex;
align-items: center;
padding-right: 0.25rem;
font-size: 12.5px;
color: var(--ink-3);
user-select: none;
}
/* ----- 点赞按钮:未赞描边态,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;
}
.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;
}
/* 评论区成就徽标:实心底,比类型/状态浅底更醒目 */
.badge-accepted {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: 600;
padding: 4px 11px;
border-radius: 999px;
white-space: nowrap;
background: var(--ok);
color: #ffffff;
}
.dark .badge-accepted {
background: var(--ok);
color: #0c1a10;
}
.badge-winner {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: 600;
padding: 4px 11px;
border-radius: 999px;
white-space: nowrap;
/* 中奖:明亮类金色(不用偏棕的 --gold 实心白字) */
background: color-mix(in srgb, #d4a017 22%, var(--panel));
color: #8a6d00;
box-shadow: inset 0 0 0 1px color-mix(in srgb, #d4a017 42%, transparent);
}
.dark .badge-winner {
background: color-mix(in srgb, #e8c56b 26%, transparent);
color: #f5dfa0;
box-shadow: inset 0 0 0 1px color-mix(in srgb, #e8c56b 48%, transparent);
}
/* 站点公告列表 */
.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(--item-hover-bg);
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;
}
/* 板块胶囊:仅标识,不可点(列表行点击由 stretch-link 进帖) */
.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;
pointer-events: none;
user-select: none;
}
/* 站点公告标签:预设色板(浅/暗成对,文字与底色均满足 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; }
.j13-anno-tag.is-teal { background: rgba(15, 118, 110, 0.12); color: #0f766e; }
.j13-anno-tag.is-cyan { background: rgba(14, 116, 144, 0.12); color: #0e7490; }
.j13-anno-tag.is-pink { background: rgba(190, 24, 93, 0.11); color: #be185d; }
.j13-anno-tag.is-amber { background: rgba(180, 83, 9, 0.12); color: #b45309; }
.j13-anno-tag.is-indigo { background: rgba(67, 56, 202, 0.12); color: #4338ca; }
.j13-anno-tag.is-rose { background: rgba(190, 18, 60, 0.11); color: #be123c; }
.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; }
.dark .j13-anno-tag.is-teal { background: rgba(94, 234, 212, 0.16); color: #5eead4; }
.dark .j13-anno-tag.is-cyan { background: rgba(103, 232, 249, 0.16); color: #67e8f9; }
.dark .j13-anno-tag.is-pink { background: rgba(251, 113, 133, 0.16); color: #fb7185; }
.dark .j13-anno-tag.is-amber { background: rgba(252, 211, 77, 0.16); color: #fcd34d; }
.dark .j13-anno-tag.is-indigo { background: rgba(165, 180, 252, 0.18); color: #a5b4fc; }
.dark .j13-anno-tag.is-rose { background: rgba(251, 113, 133, 0.16); color: #fb7185; }
/* 后台颜色选择器圆点 */
.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; }
.j13-anno-dot.is-teal { background: #0f766e; }
.j13-anno-dot.is-cyan { background: #0e7490; }
.j13-anno-dot.is-pink { background: #be185d; }
.j13-anno-dot.is-amber { background: #b45309; }
.j13-anno-dot.is-indigo { background: #4338ca; }
.j13-anno-dot.is-rose { background: #be123c; }
.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; }
.dark .j13-anno-dot.is-teal { background: #5eead4; }
.dark .j13-anno-dot.is-cyan { background: #67e8f9; }
.dark .j13-anno-dot.is-pink { background: #fb7185; }
.dark .j13-anno-dot.is-amber { background: #fcd34d; }
.dark .j13-anno-dot.is-indigo { background: #a5b4fc; }
.dark .j13-anno-dot.is-rose { background: #fb7185; }
/* ----- 正文时间线:日志行样式(非标题墙);日徽章为唯一强层级 ----- */
.j13-timeline {
margin: 1rem 0 1.25rem;
padding: 0.1rem 0 0.1rem 0.1rem;
display: flex;
flex-direction: column;
gap: 1.15rem;
}
.j13-timeline-day {
position: relative;
padding-left: 1.15rem;
}
.j13-timeline-day::before {
content: "";
position: absolute;
left: 0.28rem;
top: 1.7rem;
bottom: 0.2rem;
width: 1.5px;
border-radius: 1px;
background: color-mix(in srgb, var(--ok) 32%, var(--line));
}
.j13-timeline-day:last-child::before {
bottom: 0.85rem;
}
.j13-timeline-day-label {
display: inline-flex;
align-items: center;
gap: 0.45rem;
margin: 0 0 0.65rem -0.1rem;
padding: 0.32rem 0.75rem 0.32rem 0.6rem;
border-radius: 999px;
background: var(--ok-soft);
color: var(--ok);
font-size: 14px;
font-weight: 700;
letter-spacing: 0.015em;
font-variant-numeric: tabular-nums;
line-height: 1.35;
position: relative;
z-index: 1;
}
.j13-timeline-day-label time {
color: var(--ok);
}
.j13-timeline-day-count {
font-size: 12px;
font-weight: 500;
color: var(--ink-3);
letter-spacing: 0;
font-variant-numeric: tabular-nums;
}
.j13-timeline-day-count::after {
content: " 项";
}
.j13-timeline-items {
list-style: none !important;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 0;
}
.j13-timeline-item {
position: relative;
list-style: none !important;
}
.j13-timeline-item::marker {
content: none;
}
.j13-timeline-dot {
position: absolute;
left: -1.15rem;
top: 0.85rem;
width: 0.42rem;
height: 0.42rem;
margin-left: 0.28rem;
border-radius: 999px;
background: var(--ok);
border: 2px solid var(--panel);
box-shadow: 0 0 0 1px color-mix(in srgb, var(--ok) 40%, var(--line));
transform: translateX(-50%);
z-index: 1;
}
.j13-timeline-card {
min-width: 0;
padding: 0.55rem 0.15rem 0.55rem 0.2rem;
border-radius: 0;
background: transparent;
border: none;
border-bottom: 1px solid var(--line);
}
.j13-timeline-item:last-child .j13-timeline-card {
border-bottom: none;
padding-bottom: 0.15rem;
}
.j13-timeline-head {
display: flex;
align-items: flex-start;
gap: 0.45rem;
}
.j13-timeline-summary {
margin: 0;
flex: 1;
min-width: 0;
font-size: 13.5px;
font-weight: 500;
line-height: 1.5;
color: var(--ink);
word-break: break-word;
}
.j13-timeline-chip {
display: inline-flex;
align-items: center;
gap: 0.05em;
flex-shrink: 0;
margin-top: 0.12rem;
padding: 0.05rem 0.35rem;
border-radius: 4px;
font-size: 10.5px;
font-weight: 600;
letter-spacing: 0.01em;
line-height: 1.4;
text-transform: lowercase;
background: var(--tint);
color: var(--ink-3);
}
.j13-timeline-chip-scope {
font-weight: 500;
opacity: 0.8;
}
.j13-timeline-chip.is-feat,
.j13-timeline-chip.is-polish {
background: var(--accent-soft);
color: var(--accent);
}
.j13-timeline-chip.is-fix {
background: var(--danger-soft);
color: var(--danger);
}
.j13-timeline-chip.is-docs,
.j13-timeline-chip.is-chore,
.j13-timeline-chip.is-refactor,
.j13-timeline-chip.is-style,
.j13-timeline-chip.is-perf,
.j13-timeline-chip.is-test {
background: var(--tint);
color: var(--ink-3);
}
.j13-timeline-src {
flex-shrink: 0;
margin-top: 0.15rem;
opacity: 0.55;
color: var(--ink-3);
transition: color 0.15s ease, opacity 0.15s ease;
}
.j13-timeline-src:hover {
opacity: 1;
color: var(--accent);
}
.j13-timeline-body {
margin-top: 0.25rem;
padding-left: 0;
font-size: 12.5px;
line-height: 1.55;
color: var(--ink-3);
}
.j13-timeline-body > :first-child { margin-top: 0; }
.j13-timeline-body > :last-child { margin-bottom: 0; }
.j13-timeline-body p {
margin: 0.2rem 0;
}
/* 时间线编辑器 */
.j13-tl-import {
padding: 0.85rem 0.95rem;
border-radius: 10px;
background: var(--tint);
border: 1px solid var(--line);
}
.j13-tl-urls,
.j13-tl-field,
.j13-tl-select {
width: 100%;
border: 1px solid var(--line-2);
border-radius: 8px;
background: var(--panel);
color: var(--ink);
font-size: 13px;
padding: 0.45rem 0.6rem;
}
.j13-tl-urls {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
resize: vertical;
min-height: 4.5rem;
}
.j13-tl-select {
width: auto;
padding: 0.25rem 0.45rem;
}
.j13-tl-edit-card {
padding: 0.75rem;
border-radius: 10px;
border: 1px solid var(--line);
background: var(--panel);
}
/* ----- 分页 ----- */
.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);
}
/* 当前页:主题色实心底,字色走 --accent-on 保证对比 */
.pager-btn.is-current,
.pager-btn.is-current:hover {
background: var(--accent);
border-color: var(--accent);
color: var(--accent-on);
font-weight: 600;
transform: none;
}
.pager-btn.is-current:hover {
background: var(--accent-hi);
border-color: var(--accent-hi);
}
/* ----- 辅助 ----- */
.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(--item-hover-bg);
}
.j13-tab[aria-selected="true"] {
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
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;
}
}
/* 侧栏导航项:无选中态的悬停/聚焦与榜单、公告一致,走 --item-hover-bg */
.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,
.j13-raillink:focus-visible {
background: var(--item-hover-bg);
color: var(--ink);
}
.j13-raillink[aria-current="page"],
.j13-raillink[aria-current="page"]:hover,
.j13-raillink[aria-current="page"]:focus-visible {
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
font-weight: 600;
}
/* 正文内嵌面包屑:无独立底块,靠所在面板保证对比 */
.j13-page-crumb {
color: var(--ink-3);
}
.j13-page-crumb.is-ruled {
padding-bottom: 14px;
margin-bottom: 20px;
border-bottom: 1px solid var(--line);
}
/* 板块导航行:默认独立卡片;落入 j13-module 后收成内嵌列表 */
.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;
}
/* 悬停/选中必须叠在不透明 --panel 上:半透明 accent-soft 会把网格透出来 */
.j13-bcard:hover,
.j13-bcard:focus-visible {
border-color: var(--nav-active-line);
background: color-mix(in srgb, var(--accent) 10%, var(--panel));
}
.j13-bcard:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.j13-bcard[aria-current="page"],
.j13-bcard[aria-current="page"]:hover,
.j13-bcard[aria-current="page"]:focus-visible {
border-color: var(--nav-active-line);
background: color-mix(in srgb, var(--accent) 12%, var(--panel));
}
.j13-bcard-name {
color: var(--ink);
font-size: 13.5px;
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;
}
.j13-module .j13-bcard {
background: transparent;
border-color: transparent;
padding: 7px 8px;
border-radius: 10px;
}
.j13-module .j13-bcard:hover,
.j13-module .j13-bcard:focus-visible {
border-color: transparent;
background: color-mix(in srgb, var(--accent) 10%, var(--panel));
}
/* 滚动容器会把外扩 outline 裁成半圈:描边改画在条目内侧 */
.j13-module .j13-bcard:focus-visible {
outline: 2.5px solid var(--accent);
outline-offset: -2px;
}
.j13-module .j13-bcard[aria-current="page"],
.j13-module .j13-bcard[aria-current="page"]:hover,
.j13-module .j13-bcard[aria-current="page"]:focus-visible {
border-color: var(--nav-active-line);
background: color-mix(in srgb, var(--accent) 12%, var(--panel));
}
.j13-module .j13-bcard[aria-current="page"]:focus-visible {
outline: 2.5px solid var(--accent);
outline-offset: -2px;
}
.j13-module .j13-bcard-ico {
width: 30px;
height: 30px;
border-radius: 8px;
font-size: 12px;
}
.j13-board-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.j13-board-split {
height: 1px;
background: var(--line);
margin: 2px 4px;
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-about-lead {
margin-top: 8px;
font-size: 12.5px;
line-height: 1.55;
color: var(--ink-2);
}
.j13-about-list {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: 12px;
}
.j13-about-item {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
padding: 9px 10px;
background: var(--panel-2);
border: 1px solid var(--line);
border-radius: var(--r-sm);
transition: background 0.16s ease, border-color 0.16s ease;
}
.j13-about-item:hover,
.j13-about-item:focus-visible {
background: var(--item-hover-bg);
border-color: var(--nav-active-line);
}
.j13-about-item:focus-visible {
outline-offset: -2px;
}
.j13-about-ico {
width: 30px;
height: 30px;
border-radius: 9px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: var(--panel);
color: var(--accent);
border: 1px solid var(--line);
}
.j13-about-item:hover .j13-about-ico,
.j13-about-item:focus-visible .j13-about-ico {
border-color: var(--nav-active-line);
}
.j13-about-body {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.j13-about-name {
font-size: 13px;
font-weight: 600;
line-height: 1.35;
color: var(--ink);
}
.j13-about-excerpt {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
font-size: 12px;
line-height: 1.5;
color: var(--ink-3);
}
.j13-about-chev {
flex-shrink: 0;
color: var(--ink-3);
transition: color 0.16s ease, transform 0.16s ease;
}
.j13-about-item:hover .j13-about-chev,
.j13-about-item:focus-visible .j13-about-chev {
color: var(--accent);
transform: translateX(2px);
}
@media (prefers-reduced-motion: reduce) {
.j13-about-item,
.j13-about-chev {
transition: none;
}
.j13-about-item:hover .j13-about-chev,
.j13-about-item:focus-visible .j13-about-chev {
transform: none;
}
}
/* 统计数字格:白底细线,避免灰块 */
.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):nth-last-child(n + 3) {
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-checkin-flow:focus-visible {
outline-offset: 1px;
}
/* 热门榜单 */
.j13-rank {
position: relative;
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 8px;
border-radius: 10px;
transition: background 0.16s ease;
}
/* 榜单行:无选中态的导航项,悬停/聚焦走 --item-hover-bg */
.j13-rank:hover,
.j13-rank:focus-visible {
background: var(--item-hover-bg);
}
.j13-rank:focus-visible {
outline-offset: -2px;
}
.j13-rank-title {
display: block;
color: var(--ink);
font-size: 13px;
font-weight: 500;
line-height: 1.375;
transition: color 0.16s ease;
}
.j13-rank:hover .j13-rank-title,
.j13-rank:focus-visible .j13-rank-title {
color: var(--accent);
}
.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,
.j13-chip:focus-visible {
background: var(--item-hover-bg);
border-color: color-mix(in srgb, var(--accent) 38%, var(--line));
color: var(--accent);
}
.j13-chip[aria-current="page"],
.j13-chip[aria-current="page"]:hover,
.j13-chip[aria-current="page"]:focus-visible {
background: var(--nav-active-bg);
border-color: var(--nav-active-line);
color: var(--nav-active-ink);
}
.j13-chip:focus-visible {
outline-offset: -2px;
}
/* overflow:hidden 的列表面板:整行链接外描边会被圆角裁切 */
.panel.overflow-hidden > a:focus-visible {
outline-offset: -2px;
}
/* 帖子详情侧栏内的滚动承载区(目录 / 作者帖子列表):
配合栏容器的 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;
}
.j13-rail-scroll :focus-visible {
outline-offset: -2px;
}
/* 文章目录项:悬停/聚焦与侧栏其他可点块统一走 --item-hover-bg */
.j13-toc-link {
display: block;
padding: 6px 4px 6px 12px;
margin-left: -1px;
font-size: 12.5px;
line-height: 1.375;
color: var(--ink-2);
border-left: 2px solid transparent;
border-radius: 0 8px 8px 0;
transition: color 0.16s ease, background 0.16s ease, border-color 0.16s ease;
}
.j13-toc-link.is-h3 {
padding-left: 20px;
}
.j13-toc-link:hover,
.j13-toc-link:focus-visible {
color: var(--accent);
background: var(--item-hover-bg);
}
.j13-toc-link.is-active,
.j13-toc-link.is-active:hover,
.j13-toc-link.is-active:focus-visible {
color: var(--accent);
font-weight: 600;
border-left-color: var(--accent);
background: transparent;
}
}
/* ============================================================
Markdown 正文
============================================================ */
.prose-content { font-size: 16.5px; line-height: 1.85; color: var(--ink); }
/* 时间线嵌在 prose 内:压住 ul/p 默认,避免列表圆点与段落撑大 */
.prose-content .j13-timeline-items,
.prose-content .j13-timeline-item {
list-style: none;
padding-left: 0;
margin: 0;
}
.prose-content .j13-timeline-summary {
margin: 0;
font-size: 13.5px;
font-weight: 500;
line-height: 1.5;
color: var(--ink);
}
.prose-content .j13-timeline-body,
.prose-content .j13-timeline-body p {
font-size: 12.5px;
line-height: 1.55;
color: var(--ink-3);
}
.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 a 会盖掉 @layer 的 .btn-primary 字色 */
.prose-content a.btn,
.prose-content a.btn-primary,
.prose-content a.btn-accent {
color: var(--accent-on) !important;
text-decoration: none;
font-weight: 500;
}
.prose-content a.btn-line {
color: var(--ink) !important;
text-decoration: none;
}
.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;
}
}
html.j13-reduce-motion .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;
flex-direction: column;
background: rgba(0, 0, 0, 0.82);
backdrop-filter: blur(2px);
}
.md-lightbox-stage {
flex: 1;
min-height: 0;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
touch-action: none;
}
.md-lightbox-stage.is-zoomed { cursor: grab; }
.md-lightbox-stage.is-panning { cursor: grabbing; }
.md-lightbox-figure {
margin: 0;
display: flex;
align-items: center;
justify-content: center;
}
.md-lightbox-img {
max-width: min(92vw, 1200px);
max-height: calc(100vh - 8.5rem);
object-fit: contain;
border-radius: 8px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.45);
user-select: none;
transform-origin: center center;
transition: transform 0.15s ease, filter 0.15s ease;
}
.md-lightbox-img.is-odd-rot {
max-width: calc(100vh - 8.5rem);
max-height: min(92vw, 1200px);
}
.md-lightbox-stage.is-panning .md-lightbox-img,
.md-lightbox-img.is-snap {
transition: none;
}
.md-lightbox-footer {
position: absolute;
bottom: 1rem;
left: 50%;
transform: translateX(-50%);
z-index: 2;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
max-width: calc(100vw - 2rem);
}
.md-lightbox-caption {
color: rgba(255, 255, 255, 0.85);
font-size: 13px;
text-align: center;
max-width: 40rem;
line-height: 1.5;
margin: 0;
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.55);
}
.md-lightbox-toolbar {
display: flex;
align-items: center;
gap: 2px;
padding: 5px;
border-radius: 999px;
background: rgba(0, 0, 0, 0.48);
backdrop-filter: blur(10px);
max-width: 100%;
overflow-x: auto;
}
.md-lightbox-tool,
.md-lightbox-zoom-label {
display: inline-flex;
align-items: center;
justify-content: center;
border: none;
border-radius: 999px;
background: transparent;
color: #fff;
cursor: pointer;
transition: background 0.15s ease;
}
.md-lightbox-tool {
width: 36px;
height: 36px;
flex-shrink: 0;
}
.md-lightbox-zoom-label {
min-width: 3.25rem;
height: 36px;
padding: 0 0.35rem;
font-size: 12px;
font-variant-numeric: tabular-nums;
letter-spacing: 0.02em;
}
.md-lightbox-tool:hover,
.md-lightbox-zoom-label:hover {
background: rgba(255, 255, 255, 0.14);
}
.md-lightbox-tool.is-on {
background: rgba(255, 255, 255, 0.22);
}
.md-lightbox-tool:disabled,
.md-lightbox-zoom-label:disabled {
opacity: 0.35;
cursor: default;
background: transparent;
}
.md-lightbox-tool:focus-visible,
.md-lightbox-zoom-label:focus-visible {
outline: 2px solid rgba(255, 255, 255, 0.7);
outline-offset: 1px;
}
.md-lightbox-sep {
width: 1px;
height: 16px;
margin: 0 4px;
background: rgba(255, 255, 255, 0.22);
flex-shrink: 0;
}
.md-lightbox-close,
.md-lightbox-nav {
position: absolute;
z-index: 3;
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 {
color: rgba(255, 255, 255, 0.8);
font-size: 12.5px;
font-variant-numeric: tabular-nums;
letter-spacing: 0.04em;
padding: 0 0.55rem;
white-space: nowrap;
}
/* 评论区的 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;
}
/* 长文回顶:右下角浮钮 */
.j13-back-top {
position: fixed;
right: 1rem;
bottom: 1.25rem;
z-index: 45;
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.75rem;
height: 2.75rem;
border-radius: 999px;
border: 1px solid var(--accent);
background: var(--accent);
color: var(--accent-on);
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.12),
0 4px 14px color-mix(in srgb, var(--accent) 32%, transparent);
cursor: pointer;
transition: color 0.15s ease, background 0.15s ease, border-color 0.15s ease,
box-shadow 0.15s ease;
}
.j13-back-top:hover,
.j13-back-top:focus-visible {
background: var(--accent-hi);
border-color: var(--accent-hi);
color: var(--accent-on);
outline: none;
}
/* 帖子移动端底栏上方抬高,避免遮挡 */
.j13-back-top.is-lifted {
bottom: 5.25rem;
}
@media (min-width: 1024px) {
.j13-back-top.is-lifted {
bottom: 1.25rem;
}
}
@media (min-width: 640px) {
.j13-back-top {
right: 1.35rem;
bottom: 1.5rem;
}
.j13-back-top.is-lifted {
bottom: 5.25rem;
}
}
@media (min-width: 1024px) {
.j13-back-top.is-lifted {
bottom: 1.5rem;
}
}
/* 评论楼层树:抖音风格
主评论全宽;子回复折叠在 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;
}
/* 评论区公共编辑器:矮于发帖画布,带边框贴近原 field */
.cmt-md-editor {
border: 1px solid var(--line);
border-radius: 12px;
padding: 0.35rem 0.85rem 0.55rem;
background: var(--panel);
}
.cmt-md-editor .j13-md-editor:not(.is-fullscreen) {
min-height: 0;
}
.cmt-md-editor .j13-md-textarea,
.cmt-md-editor .j13-md-preview {
min-height: 7.5rem;
overflow-y: auto;
}
.cmt-md-editor-floor .j13-md-textarea,
.cmt-md-editor-floor .j13-md-preview {
min-height: 10rem;
}
.cmt-reply-form .cmt-md-editor {
background: var(--panel);
padding: 0.25rem 0.65rem 0.4rem;
}
.cmt-reply-form .cmt-md-editor .j13-md-textarea,
.cmt-reply-form .cmt-md-editor .j13-md-preview {
min-height: 6rem;
}
.cmt-md-editor .j13-md-toolbar {
padding-bottom: 8px;
}
.cmt-md-editor .j13-md-foot {
font-size: 11.5px;
padding-top: 8px;
}
/* 软删占位:匿名马赛克(不含真实头像/昵称) */
.cmt-mosaic-avatar {
position: relative;
display: inline-flex;
border-radius: 9999px;
overflow: hidden;
pointer-events: none;
user-select: none;
flex-shrink: 0;
}
.cmt-mosaic-avatar-fill {
display: block;
width: 100%;
height: 100%;
background: color-mix(in srgb, var(--ink-3) 50%, var(--panel));
}
.cmt-mosaic-avatar::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
background-image:
repeating-linear-gradient(
0deg,
color-mix(in srgb, var(--ink) 18%, transparent) 0 1px,
transparent 1px 3px
),
repeating-linear-gradient(
90deg,
color-mix(in srgb, var(--ink) 18%, transparent) 0 1px,
transparent 1px 3px
);
mix-blend-mode: soft-light;
pointer-events: none;
}
.cmt-mosaic-name {
position: relative;
display: inline-block;
width: 4.5rem;
height: 14px;
border-radius: 4px;
overflow: hidden;
background: color-mix(in srgb, var(--ink-3) 40%, var(--panel));
pointer-events: none;
user-select: none;
vertical-align: middle;
}
.cmt-mosaic-name::after {
content: "";
position: absolute;
inset: 0;
background-image:
repeating-linear-gradient(
0deg,
color-mix(in srgb, var(--ink) 18%, transparent) 0 1px,
transparent 1px 3px
),
repeating-linear-gradient(
90deg,
color-mix(in srgb, var(--ink) 18%, transparent) 0 1px,
transparent 1px 3px
);
mix-blend-mode: soft-light;
pointer-events: none;
}
.cmt-tombstone {
border-radius: 12px;
padding: 10px 12px;
background: var(--panel-2);
border: 1px dashed color-mix(in srgb, var(--ink-3) 45%, var(--line));
}
.cmt-tombstone-title {
font-size: 13px;
font-weight: 600;
color: var(--ink-2);
}
.cmt-tombstone-reason {
margin-top: 6px;
font-size: 12.5px;
line-height: 1.5;
color: var(--ink-3);
}
.cmt-tombstone-tag {
display: inline-flex;
align-items: center;
margin-top: 8px;
padding: 2px 8px;
border-radius: 9999px;
font-size: 11px;
font-weight: 600;
background: color-mix(in srgb, var(--danger) 12%, var(--panel));
color: var(--danger);
}
.cmt-tombstone-tag-self {
background: color-mix(in srgb, var(--ink-3) 16%, var(--panel));
color: var(--ink-3);
}
.cmt-tombstone-audit {
margin-top: 8px;
padding: 8px 10px;
border-radius: 10px;
border: 1px dashed color-mix(in srgb, var(--accent) 40%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 55%, var(--panel));
}
.cmt-tombstone-audit-label {
display: inline-block;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.02em;
color: var(--accent);
}
.cmt-tombstone-orig {
margin-top: 8px;
padding: 8px 10px;
border-radius: 10px;
border: 1px solid var(--line);
background: var(--panel);
}
.cmt-tombstone-orig .prose-comment {
font-size: 13px;
opacity: 0.92;
}
.cmt-tombstone-mod {
margin-top: 8px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
font-size: 12.5px;
color: var(--ink-2);
}
.cmt-tombstone-mod a {
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--accent);
font-weight: 600;
}
.cmt-tombstone-mod a:hover {
text-decoration: underline;
}
/* 评论管理操作:紧凑文字按钮组,取代孤立图标 */
.cmt-mod-actions {
display: inline-flex;
align-items: center;
gap: 2px;
padding: 2px;
border-radius: 10px;
background: var(--panel-2);
border: 1px solid var(--line);
}
.cmt-mod-btn {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 10px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
line-height: 1;
color: var(--ink-2);
transition: background 0.15s, color 0.15s;
}
.cmt-mod-btn:hover:not(:disabled) {
background: color-mix(in srgb, var(--danger) 10%, var(--panel));
color: var(--danger);
}
.cmt-mod-btn:disabled {
opacity: 0.5;
}
.cmt-mod-btn-danger:hover:not(:disabled) {
background: color-mix(in srgb, var(--danger) 16%, var(--panel));
color: var(--danger);
}
@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; }
}
/* 站点关闭界面动画总开关(与系统 reduce 等效) */
html.j13-reduce-motion * {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
/* 仅关闭装饰入场子开关 */
html.j13-reduce-chrome .j13-fade-up,
html.j13-reduce-chrome .j13-toast-in,
html.j13-reduce-chrome .j13-heart-pop,
html.j13-reduce-chrome .j13-pulse-dot,
html.j13-reduce-chrome .j13-tip-bubble,
html.j13-reduce-chrome .j13-tip-in,
html.j13-reduce-chrome .j13-att-card.is-fresh {
animation: none !important;
transition: none !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;
}
/* 单页编辑器:未分层才能盖过 .j13-md-textarea 的 min-height: 320px */
.admin-doc-md .j13-md-editor:not(.is-fullscreen) {
height: clamp(16rem, calc(100dvh - 22rem), 40rem);
min-height: 0;
}
.admin-doc-md .j13-md-textarea,
.admin-doc-md .j13-md-preview {
min-height: 0;
overflow-y: auto;
}