Files
jiang13-bbs/frontend/app/globals.css
freefire 1d862a0dd3 feat: 站点媒体库与移动端底部导航,服务测试补强
- 新增媒体库:media_library/media_thumbs 服务(WebP 缩略图)、管理端 media 页面
- 移动端底部导航 MobileTabBar 替换 MobilePostBar
- 旧数据导入增强与测试、路由与登录会话/板块侧边栏测试补强
- site-doc 组件精简(移除 Breadcrumb),文档新增迁移公告说明
2026-09-27 02:36:11 +08:00

9704 lines
239 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;
/* 前台 main 纸面:纯白,与页头/页脚(--panel)连成一张白纸,画布只在页缘露出 */
--main-bg: #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);
/* 等级徽章与自定义徽章扩展色板 */
--info: #1c6ea8;
--info-soft: rgba(28, 110, 168, 0.1);
--purple: #6d3fc0;
--purple-soft: rgba(109, 63, 192, 0.1);
--teal: #0f7a6e;
--teal-soft: rgba(15, 122, 110, 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: color-mix(in srgb, var(--accent-soft) 50%, transparent);
/* 工作台语义:选中用主题色淡底 */
--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;
/* 文本控件:柔和默认边 + 贴边细聚焦(见下方 .j13-control-* / 各输入选择器) */
--control-border: var(--line);
--control-border-hover: color-mix(in srgb, var(--line-2) 40%, var(--line));
--focus-glow: color-mix(in srgb, var(--accent) 22%, transparent);
--focus-glow-danger: color-mix(in srgb, var(--danger) 18%, transparent);
/* 顶栏 56px 条 + 1px 底边;main 桌面 py-9。侧栏 sticky 必须等于
栏在 scrollY=0 时的视口 top,否则第一下滚动会先空走一截再吸住 */
--header-bar: 56px;
--header-h: calc(var(--header-bar) + 1px);
--main-pad-y: 1.25rem;
--rail-top: calc(var(--header-h) + var(--main-pad-y));
--rail-max-h: calc(100vh - var(--rail-top) - 1rem);
/* 等级徽章默认色兜底(layout.tsx 会按后台配置注入 --lv-N-* 覆盖此处;
与 lib/levels.ts 色板保持同步:灰/蓝/青/绿/红牌/黑金/鎏金,
特效档为含高光段的流动渐变,流光由高光段随 position 流动呈现) */
--lv-1-fg: #9aa3b2; --lv-1-bg: rgba(148,158,176,0.16); --lv-1-ring: transparent;
--lv-2-fg: #4d8dff; --lv-2-bg: rgba(59,118,240,0.15); --lv-2-ring: transparent;
--lv-3-fg: #12a89b; --lv-3-bg: rgba(14,148,136,0.15); --lv-3-ring: transparent;
--lv-4-fg: #27a94f; --lv-4-bg: rgba(31,156,71,0.15); --lv-4-ring: transparent;
--lv-5-fg: #ffffff; --lv-5-bg: linear-gradient(90deg, #b91c1c, #ef4444 25%, #fecaca 38%, #dc2626 52%, #991b1b 78%, #b91c1c) 0% 0% / 200% 100%; --lv-5-ring: transparent;
--lv-6-fg: #e9c46a; --lv-6-bg: linear-gradient(90deg, #16171c, #23252c 22%, #4a3d1c 36%, #23252c 52%, #16171c 78%) 0% 0% / 200% 100%; --lv-6-ring: rgba(233, 196, 106, 0.5);
--lv-7-fg: transparent; --lv-7-bg: linear-gradient(180deg, #221b0f, #100d07); --lv-7-ring: rgba(240, 200, 120, 0.45);
--lv-7-text-image: linear-gradient(90deg, #c9973f, #ffe9a8 30%, #fff6d8 46%, #f0c964 66%, #c9973f); --lv-7-text-position: 0% 0%; --lv-7-text-size: 200% 100%;
color-scheme: light;
}
.dark {
/* 近黑冷灰:面板逐层浮起,靛蓝提亮为长春花蓝 */
--bg: #0c0d10;
--panel: #181b21;
/* 暗色 main 纸面:比画布略亮一档,保持「主内容区略浮起」的层级对应 */
--main-bg: #131418;
--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);
/* 等级徽章与自定义徽章扩展色板 */
--info: #5db8f0;
--info-soft: rgba(93, 184, 240, 0.16);
--purple: #c39bf5;
--purple-soft: rgba(195, 155, 245, 0.16);
--teal: #4fd8c4;
--teal-soft: rgba(79, 216, 196, 0.16);
--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: color-mix(in srgb, var(--accent-soft) 50%, transparent);
/* 工作台语义:选中用主题色淡底 */
--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-mix 公式(依赖上方已覆写的 --line / --accent 等) */
--control-border: var(--line);
--control-border-hover: color-mix(in srgb, var(--line-2) 40%, var(--line));
--focus-glow: color-mix(in srgb, var(--accent) 22%, transparent);
--focus-glow-danger: color-mix(in srgb, var(--danger) 18%, transparent);
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;
}
/* 等级徽章特效(LevelBadge / .lv-badge):底色/前景由 SSR 注入的 --lv-N-* 变量驱动。
特效档背景为水平多段渐变(首尾同色)+ background-size 200%,
lv-flow 位移 0→200% 恰好一个图块周期(百分比 position 非线性:偏移=(100%-size)×p,
size=200% 时 p=200% 的偏移=-200% 即一个图块宽),循环首尾严格重合、无接缝。
.lv-text 为文字渐变层(--lv-N-text 存在时经 background-clip:text 呈现鎏金字,
同样走 lv-flow 流动;无渐变档 background 为 none,文字按 --lv-N-fg 正常着色) */
@keyframes lv-flow {
to {
background-position: 200% 0%;
}
}
.lv-badge {
position: relative;
overflow: hidden;
animation: lv-flow 6s linear infinite;
}
.lv-text {
animation: lv-flow 6s linear infinite;
}
/* 站点特效总开关(levels_fx 设置,layout SSR 注入 html[data-lv-fx]):
关闭时停用流光动画,徽章退化为静态配色 */
html[data-lv-fx="off"] .lv-badge,
html[data-lv-fx="off"] .lv-text {
animation: none;
}
@media (prefers-reduced-motion: reduce) {
.lv-badge,
.lv-text {
animation: none;
}
}
/* 徽章类统一禁止鼠标选择:拖选/双击正文时避免把小胶囊文字带进选区 */
.lv-badge,
.cmt-badge,
.badge-pending,
.badge-type,
.badge-access,
.badge-status,
.badge-accepted,
.j13-board-tag {
user-select: none;
-webkit-user-select: 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: pre-line;
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(--control-border);
background: var(--panel);
cursor: pointer;
}
.j13-deadline-field:last-child {
width: 8.75rem;
}
.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(--control-border);
border-radius: 12px;
color: var(--ink);
font-size: 15px;
font-family: var(--font-sans);
}
.j13-compose-field::placeholder { color: var(--ink-3); }
.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 2px var(--focus-glow-danger);
}
.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(--control-border);
border-radius: 12px;
}
.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(--control-border);
border-radius: 12px;
color: var(--ink);
text-align: left;
cursor: pointer;
}
.j13-board-trigger:focus { outline: none; }
.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(--control-border);
background: var(--bg);
color: var(--ink);
font-size: 13px;
}
.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;
}
/* 链接弹窗:高级选项折叠开关 + 站内帖子搜索区与结果行(标题 sans 字体 + 右侧标签) */
.j13-md-adv-toggle {
display: inline-flex;
align-items: center;
gap: 4px;
align-self: flex-start;
padding: 2px 0;
border: 0;
appearance: none;
-webkit-appearance: none;
background: transparent !important;
color: var(--ink-3);
font-size: 12px;
font-weight: 600;
cursor: pointer;
}
.j13-md-adv-toggle:hover {
color: var(--ink);
}
.j13-md-link-search {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: 2px;
padding-top: 8px;
border-top: 1px solid var(--line);
}
.j13-md-popover-list button.j13-md-post-row {
display: flex;
align-items: center;
gap: 8px;
font-family: inherit;
font-size: 12.5px;
font-weight: 500;
}
.j13-md-post-tag {
flex-shrink: 0;
font-size: 11px;
font-weight: 500;
color: var(--ink-3);
}
/* 插图统一弹窗:tab 行、拖拽上传区、错误行 */
.j13-md-mode.j13-img-tabs {
display: flex;
width: 100%;
}
.j13-img-tabs button {
flex: 1;
justify-content: center;
}
.j13-img-tabs button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.j13-img-dropzone {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
width: 100%;
padding: 36px 16px;
border-radius: 14px;
border: 1.5px dashed var(--control-border);
background: var(--panel-2);
color: var(--ink-3);
cursor: pointer;
appearance: none;
-webkit-appearance: none;
transition: border-color 0.15s, background 0.15s;
}
.j13-img-dropzone:hover,
.j13-img-dropzone.is-dragover {
border-color: var(--accent);
color: var(--ink-2);
}
.j13-img-dropzone:disabled {
opacity: 0.6;
cursor: progress;
}
.j13-img-dropzone-title {
font-size: 13.5px;
font-weight: 600;
color: var(--ink);
}
.j13-img-dropzone-hint {
font-size: 12px;
color: var(--ink-3);
}
.j13-img-modal-error {
margin-top: 10px;
font-size: 12.5px;
color: var(--danger, #b42318);
}
.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-2);
border-top: 1px solid var(--line);
background: transparent;
}
.j13-md-foot-hint {
min-width: 0;
}
.j13-md-foot-actions {
display: inline-flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
margin-left: auto;
flex-shrink: 0;
}
.j13-md-count {
color: var(--ink-2);
font-size: 12.5px;
}
.j13-md-upload,
.j13-md-error {
margin: 8px 0 0;
font-size: 13px;
line-height: 1.45;
}
.j13-md-upload {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
color: var(--ink-2);
}
.j13-md-upload button {
color: var(--accent);
font-weight: 600;
font-size: 13px;
}
.j13-md-upload button:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.j13-md-error {
color: var(--danger);
}
.j13-md-editor.is-comment:not(.is-fullscreen) .j13-md-textarea {
min-height: 96px;
max-height: 320px;
height: 96px;
overflow-y: auto;
padding: 0.5rem 0 0.35rem !important;
line-height: 1.65 !important;
}
.j13-md-editor.is-comment:not(.is-fullscreen) .j13-md-preview {
min-height: 96px;
max-height: 320px;
height: auto;
overflow-y: auto;
}
.j13-md-editor.is-comment .j13-md-toolbar {
flex-wrap: nowrap;
gap: 2px;
padding: 2px 0 8px;
}
.j13-md-editor.is-comment .j13-md-tool-groups {
flex-wrap: nowrap;
}
.j13-md-editor.is-comment .j13-md-mode button {
height: 32px;
padding: 0 8px;
}
/* 正文内嵌隐藏块 */
.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(--control-border);
background: var(--panel);
color: var(--ink);
font-size: 14px;
}
.j13-hide-pwd-input.is-invalid {
border-color: var(--danger);
box-shadow: 0 0 0 2px var(--focus-glow-danger);
}
.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;
}
/* 全站页脚:左 / 中 / 右三栏链接(版权固定在左栏) */
.site-footer-inner {
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: center;
gap: 0.5rem 1rem;
}
.site-footer-zone {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.75rem;
min-width: 0;
}
.site-footer-zone-left {
justify-self: start;
justify-content: flex-start;
}
.site-footer-zone-center {
justify-self: center;
justify-content: center;
}
.site-footer-zone-right {
justify-self: end;
justify-content: flex-end;
}
.site-footer-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.75rem;
min-width: 0;
}
.site-footer-links {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.75rem;
min-width: 0;
}
/* <1024px(移动/平板,底部公共菜单显示区间):三区堆叠、统一左对齐连成整体,
避免「左中右各自断开」的残缺观感;底部避让公共菜单 */
@media (max-width: 1023px) {
.site-footer {
padding-bottom: calc(4.75rem + env(safe-area-inset-bottom));
}
.site-footer-inner {
display: flex;
flex-direction: column;
align-items: stretch;
gap: 0.5rem;
}
.site-footer-zone,
.site-footer-zone-left,
.site-footer-zone-center,
.site-footer-zone-right {
justify-self: unset;
justify-content: flex-start;
width: 100%;
}
.site-footer-zone:empty {
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 的上下内边距并叠加刘海/手势区避让 */
padding-top: calc(1rem + env(safe-area-inset-top, 0px));
padding-bottom: calc(1.25rem + env(safe-area-inset-bottom, 0px));
}
.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-canvas 的媒体查询内边距 */
.admin-canvas:has(.admin-doc-editor) {
padding-top: 0;
}
/* 用户积分表头吸顶:同 admin-users-stick,画布顶内边距必须归零 sticky 才能贴紧顶栏
(内边距挪到 .admin-points-users-tab;标记类仅在用户积分标签激活时挂载,不影响其他标签) */
.admin-canvas:has(.admin-points-users-tab) {
padding-top: 0;
}
/* 移动端导航抽屉 */
.admin-drawer {
position: fixed;
inset: 0;
z-index: 60;
display: flex;
overflow: hidden;
}
.admin-drawer-backdrop {
position: absolute;
inset: 0;
border: 0;
padding: 0;
cursor: pointer;
background: color-mix(in srgb, var(--ink) 32%, transparent);
animation: admin-fade-in 0.18s ease-out;
}
@keyframes admin-drawer-in {
from {
transform: translateX(-100%);
opacity: 0.85;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes admin-drawer-out {
from {
transform: translateX(0);
opacity: 1;
}
to {
transform: translateX(-100%);
opacity: 0.85;
}
}
@keyframes admin-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes admin-fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
/* 退场:面板滑出 + 背板淡出,结束后由组件卸载 */
.admin-drawer.is-closing .admin-drawer-backdrop {
animation: admin-fade-out 0.18s ease-in forwards;
}
.admin-drawer.is-closing .admin-drawer-panel {
animation: admin-drawer-out 0.18s ease-in forwards;
}
@media (prefers-reduced-motion: reduce) {
.admin-drawer-panel,
.admin-drawer-backdrop,
.admin-drawer.is-closing .admin-drawer-panel,
.admin-drawer.is-closing .admin-drawer-backdrop {
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;
}
/* ---------- 文本控件:统一柔边 + 贴边 2px 聚焦(消双层嵌套) ----------
未分层,才能压过上方全局 :focus-visible 的 outline-offset。 */
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]):not([type="color"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="hidden"]):focus,
input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]):not([type="color"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="hidden"]):focus-visible,
textarea:focus,
textarea:focus-visible,
select:focus,
select:focus-visible {
outline: none;
}
.field,
.j13-compose-field,
.j13-search-field,
.j13-md-popover-input,
.j13-hide-pwd-input,
.j13-tl-field,
.j13-tl-urls,
.j13-tl-select,
.admin-doc-number {
border-color: var(--control-border);
transition: border-color 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
}
.field:hover:not(:focus):not(:disabled),
.j13-compose-field:hover:not(:focus):not(:disabled),
.j13-search-field:hover:not(:focus):not(:disabled),
.j13-md-popover-input:hover:not(:focus):not(:disabled),
.j13-hide-pwd-input:hover:not(:focus):not(:disabled),
.j13-tl-field:hover:not(:focus):not(:disabled),
.j13-tl-urls:hover:not(:focus):not(:disabled),
.j13-tl-select:hover:not(:focus):not(:disabled),
.admin-doc-number:hover:not(:focus):not(:disabled) {
border-color: var(--control-border-hover);
}
.field:focus,
.j13-compose-field:focus,
.j13-search-field:focus,
.j13-search-field:focus-visible,
.j13-md-popover-input:focus,
.j13-hide-pwd-input:focus,
.j13-tl-field:focus,
.j13-tl-urls:focus,
.j13-tl-select:focus,
.admin-doc-number:focus {
outline: none !important;
border-color: var(--accent);
box-shadow: 0 0 0 2px var(--focus-glow);
}
/* 壳层:边框画在父级,内层输入取消描边 */
.admin-field-shell,
.admin-stepper,
.j13-tag-field,
.j13-board-trigger,
.j13-deadline-field,
.j13-chat-search,
.j13-chat-composer,
.admin-doc-slug {
border-color: var(--control-border);
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),
.j13-tag-field:hover:not(:focus-within),
.j13-board-trigger:hover:not(:disabled):not(:focus-visible):not([aria-expanded="true"]),
.j13-deadline-field:hover:not(:focus-within),
.j13-chat-search:hover:not(:focus-within),
.j13-chat-composer:hover:not(:focus-within),
.admin-doc-slug:hover:not(:focus-within) {
border-color: var(--control-border-hover);
}
.admin-field-shell:focus-within,
.admin-stepper:focus-within,
.j13-tag-field:focus-within,
.j13-deadline-field:focus-within,
.j13-chat-search:focus-within,
.j13-chat-composer:focus-within,
.admin-doc-slug:focus-within,
.j13-board-trigger:focus-visible,
.j13-board-trigger[aria-expanded="true"] {
outline: none !important;
border-color: var(--accent) !important;
box-shadow: 0 0 0 2px var(--focus-glow);
}
.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-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);
}
/* 框选时 ::selection 前景色会盖过透明字色,露出底层真实文本(@用户名);
这里保持字形透明 + 半透明高亮,让镜像层的 @昵称 透出(宽度已补偿对齐) */
.j13-chat-composer-input.has-value::selection {
background: color-mix(in srgb, var(--accent) 24%, transparent);
color: transparent;
}
.j13-chat-composer-input.has-value::placeholder {
color: transparent;
}
.admin-field-shell,
.admin-stepper {
background: var(--bg);
border: 1px solid var(--control-border);
border-radius: 12px;
}
.admin-field-shell:focus-within,
.admin-stepper:focus-within {
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 2px var(--focus-glow-danger);
}
/* 顶栏搜索:pill 圆角,聚焦同款贴边细环 */
.j13-search-field {
width: 100%;
border: 1px solid var(--control-border);
background: var(--panel);
color: var(--ink);
}
.j13-search-field:focus,
.j13-search-field:focus-visible {
background: var(--panel);
}
/* 聊天界面滚动容器:隐藏滚动条(飞书式无滚动条外观,滚动能力保留) */
.j13-chat-scroll {
scrollbar-width: none;
-ms-overflow-style: none;
}
.j13-chat-scroll::-webkit-scrollbar {
display: none;
width: 0;
height: 0;
}
.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;
}
/* 输入镜像层:token 仅蓝色文字(胶囊样式只在发出后的气泡里显示);
基础胶囊色带 !important,此处需同权重覆盖 */
.j13-chat-composer-mirror .j13-mention-token {
display: inline;
padding: 0;
margin: 0;
line-height: inherit;
font-weight: 500;
border-radius: 0;
box-shadow: none;
background: transparent !important;
color: var(--accent) !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;
}
/* 站点设置:限宽左对齐,不写入后台公共主容器(画布保持镂空,与其他管理页一致) */
@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;
position: sticky;
top: 0;
align-self: start;
z-index: 5;
/* 画布镂空后导航改白色卡片:盖住滚动内容,并与右侧设置组卡片同语言 */
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--r);
padding: 0.5rem 0.4rem;
margin-block: -0.15rem;
}
.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;
}
#settings-identity,
#settings-brand,
#settings-footer {
scroll-margin-top: 1rem;
}
.admin-identity-studio {
display: flex;
flex-direction: column;
gap: 0.95rem;
max-width: min(36rem, 100%);
}
.admin-identity-url {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.3rem 0.65rem;
padding: 0.55rem 0.75rem;
border-radius: 10px;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-identity-url-label {
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
flex-shrink: 0;
}
.admin-identity-url-value {
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-2);
overflow-wrap: anywhere;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
.admin-identity-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.95rem 0.85rem;
}
.admin-identity-field .admin-field-head {
margin-bottom: 0.35rem;
}
.admin-identity-title-preview {
margin: -0.35rem 0 0;
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-3);
}
.admin-identity-title-preview strong {
font-weight: 600;
color: var(--ink-2);
}
.admin-identity-keywords-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 0.75rem;
margin-bottom: 0.35rem;
}
.admin-identity-keywords-box {
display: flex;
flex-direction: column;
gap: 0.55rem;
padding: 0.65rem 0.75rem;
border-radius: 12px;
background: var(--panel);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-identity-keywords-box .admin-settings-keywords {
margin-bottom: 0;
}
.admin-identity-keywords-add {
display: flex;
align-items: center;
gap: 0.5rem;
}
@container settings-form (max-width: 559px) {
.admin-identity-grid {
grid-template-columns: 1fr;
}
}
.admin-settings-meta-bar {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.35rem 0.75rem;
padding: 0.65rem 0.85rem;
border-radius: 12px;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-settings-meta-bar-label {
font-size: 12.5px;
font-weight: 600;
color: var(--ink-2);
flex-shrink: 0;
}
.admin-settings-meta-bar-value {
font-size: 12.5px;
line-height: 1.45;
color: var(--ink);
overflow-wrap: anywhere;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
.admin-settings-title-preview {
margin: 0.45rem 0 0;
font-size: 12.5px;
line-height: 1.45;
color: var(--ink-3);
}
.admin-settings-title-preview strong {
font-weight: 600;
color: var(--ink);
}
.admin-settings-row-secondary .admin-settings-row-name {
color: var(--ink-2);
font-weight: 500;
}
.admin-brand-studio {
display: flex;
flex-direction: column;
gap: 1rem;
max-width: min(44rem, 100%);
}
.admin-brand-studio-preview {
border-radius: 12px;
overflow: hidden;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-brand-studio-chrome {
display: flex;
align-items: center;
gap: 0.35rem;
padding: 0.45rem 0.75rem;
border-bottom: 1px solid var(--line);
background: color-mix(in srgb, var(--panel) 70%, var(--panel-2));
}
.admin-brand-studio-chrome span {
width: 0.55rem;
height: 0.55rem;
border-radius: 999px;
background: var(--line-2);
}
.admin-brand-studio-toolbar {
display: flex;
flex-wrap: wrap;
gap: 0.75rem 1.25rem;
align-items: center;
}
.admin-brand-studio-field {
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: 0.45rem 0.65rem;
}
.admin-brand-studio-kicker {
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
letter-spacing: 0.02em;
}
.admin-brand-size-row {
display: inline-flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.admin-brand-size-chip {
appearance: none;
border: 0;
font: inherit;
display: inline-flex;
flex-direction: column;
align-items: flex-start;
gap: 0.1rem;
padding: 0.35rem 0.7rem;
border-radius: 0.65rem;
background: var(--panel);
color: var(--ink-2);
box-shadow: inset 0 0 0 1px var(--line);
cursor: pointer;
line-height: 1.25;
}
.admin-brand-size-chip-label {
font-size: 12.5px;
font-weight: 600;
}
.admin-brand-size-chip-px {
font-size: 11px;
font-weight: 500;
font-variant-numeric: tabular-nums;
color: var(--ink-3);
}
.admin-brand-size-chip.is-on {
background: var(--accent-soft);
color: var(--accent);
box-shadow: inset 0 0 0 1px var(--accent);
}
.admin-brand-size-chip.is-on .admin-brand-size-chip-px {
color: color-mix(in srgb, var(--accent) 75%, var(--ink-3));
}
.admin-brand-size-chip:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.admin-brand-studio-assets {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.75rem;
}
.admin-brand-asset {
display: flex;
flex-direction: column;
gap: 0.55rem;
min-width: 0;
padding: 0.65rem;
border-radius: 12px;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-brand-asset.is-compact .admin-brand-swatch {
height: 4.25rem;
}
.admin-brand-asset-meta {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.admin-brand-asset-label {
font-size: 12.5px;
font-weight: 600;
color: var(--ink);
}
.admin-brand-asset-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.3rem;
}
.admin-settings-row {
display: grid;
grid-template-columns: 10.75rem minmax(0, 1fr);
gap: 0.35rem 1.5rem;
align-items: start;
}
.admin-settings-row.is-wide {
grid-template-columns: minmax(0, 1fr);
}
.admin-settings-row.is-wide .admin-settings-row-label {
padding-top: 0;
}
.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);
font-weight: 500;
overflow-wrap: anywhere;
}
.ops-savebar .admin-settings-actions-inner {
flex-direction: column;
align-items: flex-start;
}
.ops-savebar .admin-settings-actions-status.is-error {
order: -1;
width: 100%;
max-width: 40rem;
padding: 10px 12px;
border: 1px solid color-mix(in srgb, var(--danger) 30%, transparent);
background: var(--danger-soft);
border-radius: var(--r-sm);
font-size: 13px;
line-height: 1.5;
}
.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-bar {
min-height: 68px;
padding: 0.35rem 1rem 0.85rem;
display: flex;
align-items: center;
}
.admin-brand-swatch {
height: 5rem;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
padding: 0.65rem;
overflow: hidden;
font-size: 12px;
color: var(--ink-3);
}
.admin-brand-swatch img {
max-height: 3.5rem;
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);
color: var(--ink-3);
box-shadow: inset 0 0 0 1px var(--line);
}
@container settings-form (max-width: 719px) {
.admin-brand-studio-assets {
grid-template-columns: 1fr;
}
}
#settings-identity .admin-settings-actions,
#settings-brand .admin-settings-actions,
#settings-footer .admin-settings-actions {
grid-template-columns: minmax(0, 1fr);
}
#settings-identity .admin-settings-actions-inner,
#settings-brand .admin-settings-actions-inner,
#settings-footer .admin-settings-actions-inner {
grid-column: 1;
}
.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-studio {
display: flex;
flex-direction: column;
gap: 0.85rem;
max-width: min(56rem, 100%);
}
.admin-footer-align-toggle {
display: inline-flex;
align-items: stretch;
width: 100%;
border-radius: 999px;
box-shadow: inset 0 0 0 1px var(--line);
background: var(--panel-2);
overflow: hidden;
}
.admin-footer-align-opt {
appearance: none;
border: 0;
flex: 1 1 0;
background: transparent;
color: var(--ink-3);
font-size: 12px;
line-height: 1;
padding: 0.4rem 0.2rem;
text-align: center;
cursor: pointer;
}
.admin-footer-align-opt.is-on {
background: var(--panel);
color: var(--ink);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-footer-align-opt:focus-visible {
outline: 2px solid var(--accent);
outline-offset: -2px;
}
.admin-footer-preview {
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: center;
gap: 0.5rem 1rem;
padding: 0.7rem 0.95rem;
border-radius: 12px;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-footer-preview-zone {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.75rem;
min-width: 0;
}
.admin-footer-preview-zone-left {
justify-self: start;
justify-content: flex-start;
}
.admin-footer-preview-zone-center {
justify-self: center;
justify-content: center;
}
.admin-footer-preview-zone-right {
justify-self: end;
justify-content: flex-end;
}
.admin-footer-preview-copy {
font-size: 12.5px;
color: var(--ink-3);
white-space: nowrap;
}
.admin-footer-preview-links {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem 0.85rem;
min-width: 0;
}
.admin-footer-preview-link {
display: inline-flex;
align-items: center;
gap: 0.2rem;
font-size: 12.5px;
color: var(--ink-2);
overflow-wrap: anywhere;
}
.admin-footer-preview-empty {
color: var(--ink-3);
}
@media (max-width: 640px) {
.admin-footer-preview {
display: flex;
flex-direction: column;
align-items: stretch;
}
.admin-footer-preview-zone-left {
justify-content: flex-start;
}
.admin-footer-preview-zone-center {
justify-content: center;
}
.admin-footer-preview-zone-right {
justify-content: flex-end;
}
}
.admin-footer-table {
border: 1px solid var(--line);
border-radius: 12px;
overflow: hidden;
background: var(--panel);
}
.admin-footer-table-head,
.admin-footer-table-row {
display: grid;
/* 操作列固定宽:勿用 auto,否则表头空、行内图标会把「位置」列挤偏 */
grid-template-columns: 2rem minmax(0, 0.85fr) minmax(0, 1.25fr) 6.75rem 8.5rem 5.5rem;
gap: 0.5rem;
align-items: center;
padding: 0.55rem 0.75rem;
}
.admin-footer-empty {
margin: 0;
padding: 1rem 0.85rem;
font-size: 12.5px;
color: var(--ink-3);
}
.admin-footer-col-align {
min-width: 0;
width: 100%;
}
.admin-footer-table-head .admin-footer-col-align {
text-align: center;
}
.admin-footer-table-head {
background: var(--panel-2);
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
border-bottom: 1px solid var(--line);
}
.admin-footer-table-row {
border-bottom: 1px solid var(--line);
}
.admin-footer-table-row:last-child {
border-bottom: 0;
}
.admin-footer-col-idx {
text-align: center;
font-variant-numeric: tabular-nums;
}
.admin-footer-col-open {
min-width: 0;
width: 100%;
}
.admin-footer-table-head .admin-footer-col-open {
text-align: center;
}
.admin-footer-col-ops {
display: inline-flex;
align-items: center;
justify-content: flex-end;
gap: 0.1rem;
width: 100%;
}
.admin-footer-open-toggle {
display: inline-flex;
align-items: stretch;
width: 100%;
padding: 2px;
border-radius: 0.55rem;
background: var(--panel-2);
box-shadow: inset 0 0 0 1px var(--line);
}
.admin-footer-open-opt {
appearance: none;
border: 0;
flex: 1 1 0;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.2rem;
min-height: 1.7rem;
padding: 0.15rem 0.35rem;
border-radius: 0.4rem;
font: inherit;
font-size: 11.5px;
font-weight: 550;
line-height: 1.2;
color: var(--ink-3);
background: transparent;
cursor: pointer;
white-space: nowrap;
}
.admin-footer-open-opt.is-on {
color: var(--ink);
background: var(--panel);
box-shadow: 0 0 0 1px var(--line), 0 1px 2px color-mix(in srgb, var(--ink) 8%, transparent);
}
.admin-footer-open-opt:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
@container settings-form (max-width: 719px) {
.admin-footer-table-head {
display: none;
}
.admin-footer-table-row {
display: grid;
grid-template-columns: 1.75rem minmax(0, 1fr) auto;
grid-template-areas:
"idx label ops"
"idx url ops"
"idx align ops"
"idx open ops";
gap: 0.4rem 0.5rem;
padding: 0.75rem;
}
.admin-footer-col-idx {
grid-area: idx;
align-self: start;
padding-top: 0.55rem;
}
.admin-footer-table-row > .admin-footer-cell-label {
grid-area: label;
}
.admin-footer-table-row > .admin-footer-cell-url {
grid-area: url;
}
.admin-footer-col-align {
grid-area: align;
}
.admin-footer-col-open {
grid-area: open;
}
.admin-footer-open-toggle {
max-width: 11rem;
}
.admin-footer-col-ops {
grid-area: ops;
flex-direction: column;
align-self: start;
}
}
@container settings-page (max-width: 1039px) {
.admin-settings-work {
grid-template-columns: minmax(0, 1fr);
gap: 1rem;
}
.admin-settings-nav-col {
/* 窄屏菜单在上方,吸顶并留一点底边分隔 */
padding-bottom: 0.65rem;
margin-bottom: -0.15rem;
box-shadow: 0 1px 0 var(--line);
}
.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;
}
}
.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-doc-page {
width: 100%;
margin-inline: 0;
min-width: 0;
}
.admin-doc-list {
max-width: 1240px;
}
/* 编辑器本身通栏:吸顶栏背景/分隔线才能横贯整个画布,不在 1440px 处被切断 */
.admin-doc-editor {
container-type: inline-size;
container-name: doc-editor;
}
/* 编辑器吸顶操作栏:返回/标题/状态 + 发布状态/撤销/保存,滚动时始终可见。
画布镂空透出全站画布层,操作栏用白色块(同用户管理吸顶栏),滚动时干净盖住内容 */
.admin-doc-sticky {
position: sticky;
top: 0;
z-index: 20;
margin-inline: -1rem;
padding: 0.6rem 1rem;
background: var(--panel);
border-bottom: 1px solid var(--line);
}
@media (min-width: 640px) {
.admin-doc-sticky {
margin-inline: -1.5rem;
padding-inline: 1.5rem;
}
}
@media (min-width: 1024px) {
.admin-doc-sticky {
margin-inline: -2rem;
padding-inline: 2rem;
}
}
/* 栏内内容与下方 1440px 内容区对齐(编辑器已通栏) */
.admin-doc-sticky-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.5rem 1rem;
flex-wrap: wrap;
max-width: 1440px;
margin-right: auto;
}
.admin-doc-sticky-title {
display: flex;
align-items: center;
gap: 0.55rem;
flex: 1 1 auto;
min-width: 0;
}
.admin-doc-sticky-icon {
width: 2rem;
height: 2rem;
border-radius: 0.65rem;
background: var(--accent-soft);
color: var(--accent);
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.admin-doc-sticky-title h1 {
margin: 0;
font-size: 17px;
line-height: 1.3;
font-weight: 750;
letter-spacing: -0.01em;
color: var(--ink);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.admin-doc-back {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.3rem;
min-width: 2rem;
min-height: 2rem;
padding: 0 0.6rem;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--panel);
font-size: 12.5px;
color: var(--ink-2);
text-decoration: none;
flex-shrink: 0;
transition: border-color 0.15s ease, color 0.15s ease;
}
.admin-doc-back:hover {
color: var(--accent);
border-color: var(--accent);
}
.admin-doc-back:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
@media (max-width: 420px) {
.admin-doc-back-text {
display: none;
}
}
.admin-doc-sticky-actions {
display: flex;
align-items: center;
gap: 0.45rem 0.55rem;
flex-wrap: wrap;
}
.admin-doc-sticky-actions .btn {
min-height: 2.25rem;
}
.admin-doc-status {
margin: 0 0 0 0.15rem;
font-size: 12.5px;
color: var(--ink-3);
}
.admin-doc-status.is-error {
color: var(--danger);
}
.admin-doc-split {
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 1.25rem;
align-items: start;
max-width: 1440px;
}
.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-label-value {
margin-left: 0.4rem;
font-weight: 600;
color: var(--ink-3);
}
/* 主栏标题输入:正文中最大的输入项,突出「先起标题」 */
.admin-doc-title .admin-field-input {
font-size: 16.5px;
font-weight: 650;
letter-spacing: -0.01em;
min-height: 2.9rem;
}
.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-editor .admin-doc-main {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 12px;
padding: 1.1rem 1.1rem 1.2rem;
}
/* 编辑器自带白卡边框在纯白主栏内会形成双层描边,扁平化融入主卡 */
.admin-doc-editor .admin-doc-main .j13-md-editor:not(.is-fullscreen) {
background: transparent;
border: 0;
border-radius: 0;
padding: 0;
}
/* 板块管理:低信息密度列表 —— 策略/状态/帖数并入板块元信息行,6 列并 3 列并限宽,
避免宽屏下名称列吞掉全部富余空间而显得空旷 */
.boards-panel {
max-width: 60rem;
}
.boards-head,
.boards-row {
display: grid;
grid-template-columns: 44px minmax(0, 1fr) auto;
gap: 0.75rem;
align-items: center;
padding-inline: 1rem;
}
.boards-head {
padding-block: 0.65rem;
font-size: 11.5px;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--ink-3);
border-bottom: 1px solid var(--line);
}
.boards-row {
padding-block: 0.8rem;
}
.boards-row + .boards-row {
border-top: 1px solid var(--line);
}
.boards-actions {
justify-self: end;
}
.boards-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.45rem;
margin-top: 0.4rem;
}
.boards-meta-posts {
font-size: 11.5px;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
}
@media (max-width: 640px) {
.boards-head {
display: none;
}
.boards-row {
grid-template-columns: 40px minmax(0, 1fr);
}
.boards-actions {
grid-column: 2;
justify-self: start;
}
}
.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.9rem 1rem 1.05rem;
}
.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;
position: relative;
padding-right: 1.5rem;
user-select: none;
}
.admin-doc-rail > summary::-webkit-details-marker {
display: none;
}
/* 折叠箭头:桌面双栏时 summary 隐藏,仅移动端单栏可见 */
.admin-doc-rail > summary::after {
content: "";
position: absolute;
right: 0.35rem;
top: 50%;
width: 0.42rem;
height: 0.42rem;
border-right: 1.5px solid var(--ink-3);
border-bottom: 1.5px solid var(--ink-3);
transform: translateY(-70%) rotate(45deg);
transition: transform 0.15s ease;
}
.admin-doc-rail[open] > summary::after {
transform: translateY(-30%) rotate(-135deg);
}
.admin-doc-rail-body {
display: flex;
flex-direction: column;
padding-top: 0.25rem;
}
/* 设置项分组:细分隔线代替卡片套卡片 */
.admin-doc-rail-body > * + * {
margin-top: 1.05rem;
padding-top: 1.05rem;
border-top: 1px solid var(--line);
}
.admin-doc-field {
min-width: 0;
}
.admin-doc-slug {
display: flex;
align-items: center;
min-height: 2.5rem;
border: 1px solid var(--control-border);
border-radius: 0.7rem;
background: var(--panel);
overflow: hidden;
}
.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;
}
/* 标签胶囊实时预览:色块下方一条安静的展示条,与前台同款 j13-anno-tag */
.admin-doc-tagpreview {
display: flex;
align-items: center;
gap: 0.55rem;
margin-top: 0.7rem;
padding: 0.6rem 0.75rem;
border-radius: 0.7rem;
background: var(--bg);
}
.admin-doc-tagpreview::after {
content: attr(data-note);
font-size: 12px;
color: var(--ink-3);
}
.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(--control-border);
border-radius: 0.7rem;
background: var(--panel);
color: var(--ink);
font-size: 14px;
}
.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;
}
/* 双栏阈值取 72rem:保证吸顶操作栏单行放下,右侧设置栏再入列 */
@container doc-editor (min-width: 72rem) {
.admin-doc-split {
grid-template-columns: minmax(0, 1fr) 20rem;
column-gap: 1.75rem;
}
.admin-doc-main {
grid-column: 1;
grid-row: 1;
}
.admin-doc-rail {
grid-column: 2;
grid-row: 1;
align-self: start;
position: sticky;
/* 吸顶操作栏(约 3.7rem)之下留出呼吸空隙 */
top: 4.5rem;
max-height: calc(100dvh - 10rem);
overflow: auto;
}
.admin-doc-rail > summary {
display: none;
}
.admin-doc-rail:not([open]) > .admin-doc-rail-body {
display: flex;
}
/* 现代浏览器(Chrome 131+)对关闭的 details 用 content-visibility 隐藏内容,
上一条 display 规则救不回来;桌面双栏强制可见,防止移动端折叠后拉宽窗口设置凭空消失 */
.admin-doc-rail:not([open])::details-content {
content-visibility: visible;
}
}
@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 规则),吸顶 th 才能贴齐 admin-topbar */
.admin-points-users-tab {
padding-top: 1.25rem;
}
@media (min-width: 640px) {
.admin-points-users-tab {
padding-top: 1.5rem;
}
}
@media (min-width: 1024px) {
.admin-points-users-tab {
padding-top: 1.75rem;
}
}
/* 内容管理页:窄屏可整页滚;桌面高度由上方未分层的 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;
}
/* 内容管理: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(--control-border);
border-radius: var(--r-sm);
color: var(--ink);
font-size: 15px;
font-family: var(--font-sans);
}
/* 占位符不使用 opacity:透明度与底色合成后浅色仅 3.7:1,实色 ink-3 达 5.72:1 */
.field::placeholder { color: var(--ink-3); }
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: 4px;
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: 4px;
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"],
.j13-anno-dot[aria-checked="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 {
position: relative;
margin: 1rem 0 1.25rem;
padding: 0.1rem 0 0.1rem 0.1rem;
display: flex;
flex-direction: column;
gap: 1.15rem;
}
/* 连续主干:贯穿所有日分组,避免按日分段导致竖线"断树" */
.j13-timeline::before {
content: "";
position: absolute;
left: 0.38rem;
top: 0.55rem;
bottom: 0.55rem;
width: 1.5px;
border-radius: 1px;
background: color-mix(in srgb, var(--ok) 45%, var(--line));
z-index: 0;
}
.j13-timeline-day {
position: relative;
padding-left: 1.15rem;
}
.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.5rem;
height: 0.5rem;
margin-left: 0.28rem;
border-radius: 999px;
background: var(--ok);
border: 1.5px 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(--control-border);
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);
transition: border-color 0.15s ease, background 0.15s ease, opacity 0.15s ease;
}
.j13-tl-edit-card:hover {
border-color: var(--control-border-hover);
}
/* 已排除条目:降饱和度 + 虚线边,提示不会写入正文 */
.j13-tl-edit-card.is-excluded {
opacity: 0.55;
background: var(--tint);
border-style: dashed;
}
.j13-tl-tag {
display: inline-flex;
align-items: center;
padding: 0.05rem 0.4rem;
border-radius: 4px;
font-size: 10.5px;
font-weight: 600;
line-height: 1.4;
letter-spacing: 0.01em;
background: var(--ink-3);
color: var(--panel);
}
.j13-tl-count {
display: inline-flex;
align-items: center;
padding: 0.05rem 0.45rem;
border-radius: 999px;
font-size: 11.5px;
font-weight: 600;
line-height: 1.4;
font-variant-numeric: tabular-nums;
background: var(--accent-soft);
color: var(--accent);
}
.j13-tl-count.is-muted {
background: var(--tint);
color: var(--ink-3);
}
.j13-tl-empty {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.6rem;
padding: 1.6rem 1rem;
border: 1px dashed var(--line-2);
border-radius: 10px;
background: var(--tint);
color: var(--ink-3);
font-size: 13px;
text-align: center;
}
.j13-tl-hint {
margin-top: 0.35rem;
font-size: 11.5px;
color: var(--ink-3);
font-variant-numeric: tabular-nums;
}
.j13-tl-banner {
margin-top: 0.5rem;
padding: 0.45rem 0.65rem;
border-radius: 8px;
font-size: 12.5px;
line-height: 1.5;
border: 1px solid transparent;
}
.j13-tl-banner.is-warn,
.j13-tl-banner.is-err {
background: var(--danger-soft);
color: var(--danger);
border-color: color-mix(in srgb, var(--danger) 25%, transparent);
}
/* ----- 分页 ----- */
.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-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;
}
@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);
}
/* 赞助商 logo 网格:悬停 / 聚焦显示赞助说明 */
.j13-sponsors-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.j13-sponsor {
position: relative;
list-style: none;
}
.j13-sponsor-hit {
display: flex;
align-items: center;
justify-content: center;
height: 76px;
padding: 10px;
border-radius: 12px;
border: 1px solid var(--line);
background: var(--panel-2);
outline: none;
transition: border-color 0.15s ease, background 0.15s ease;
}
.j13-sponsor-hit:hover,
.j13-sponsor-hit:focus-visible {
border-color: var(--accent);
background: var(--panel);
}
.j13-sponsor-logo {
max-width: 100%;
max-height: 52px;
width: auto;
height: auto;
object-fit: contain;
}
/* 自助购买广告位:紧凑单栏卡片,色跟随主题 accent */
.j13-ads-card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 14px;
box-shadow: var(--shadow);
}
.j13-ads-card-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 14px 18px;
background: var(--accent);
color: var(--accent-on);
}
.j13-ads-card-head p {
opacity: 0.88;
}
.j13-ads-chip {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 40px;
padding: 0 12px;
border-radius: 10px;
border: 1px solid var(--line);
background: var(--panel);
color: var(--ink);
font-size: 13.5px;
font-weight: 600;
line-height: 1.2;
transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease, box-shadow 0.12s ease;
}
.j13-ads-chip:hover:not(.is-on) {
border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
background: var(--accent-soft);
}
.j13-ads-chip.is-compact {
min-height: 36px;
padding: 0 4px;
font-size: 12.5px;
}
.j13-ads-chip.is-priced {
flex-direction: column;
gap: 2px;
min-height: 0;
padding: 6px 4px;
line-height: 1.15;
}
.j13-ads-chip-price {
font-size: 11px;
font-weight: 500;
line-height: 1;
opacity: 0.75;
white-space: nowrap;
}
.j13-ads-chip.is-on {
border-color: var(--accent);
background: var(--accent);
color: var(--accent-on);
box-shadow: 0 1px 2px color-mix(in srgb, var(--accent) 28%, transparent);
}
.j13-ads-chip:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.j13-ads-field {
display: flex;
align-items: center;
gap: 8px;
min-height: 42px;
padding: 0 12px 0 10px;
border-radius: 10px;
border: 1px solid var(--line);
background: var(--panel);
}
.j13-ads-field:hover {
border-color: color-mix(in srgb, var(--line-2) 35%, var(--line));
}
.j13-ads-field:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--focus-glow);
}
.j13-ads-field-ico {
display: inline-flex;
color: var(--ink-3);
flex-shrink: 0;
}
.j13-ads-input {
flex: 1;
min-width: 0;
width: 100%;
height: 40px;
border: 0;
outline: none;
background: transparent;
color: var(--ink);
font-size: 13.5px;
}
.j13-ads-input::placeholder {
color: var(--ink-3);
}
.j13-ads-submit {
display: flex;
width: 100%;
align-items: center;
justify-content: center;
min-height: 44px;
border: 0;
border-radius: 10px;
background: var(--accent);
color: var(--accent-on);
font-size: 15px;
font-weight: 700;
letter-spacing: 0.02em;
cursor: pointer;
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.1),
0 2px 8px color-mix(in srgb, var(--accent) 26%, transparent);
transition: background 0.12s ease, transform 0.12s ease, box-shadow 0.12s ease;
}
.j13-ads-submit:hover:not(:disabled) {
background: var(--accent-hi);
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(16, 24, 40, 0.1),
0 8px 18px color-mix(in srgb, var(--accent) 32%, transparent);
}
.j13-ads-submit:active:not(:disabled) {
transform: translateY(0);
}
.j13-ads-submit:disabled {
opacity: 0.45;
cursor: not-allowed;
box-shadow: none;
transform: none;
}
/* 自助推广:购买广告位胶囊按钮 */
.j13-ad-buy-btn {
display: inline-flex;
align-items: center;
padding: 2px 11px;
border-radius: 999px;
font-size: 12px;
font-weight: 500;
line-height: 1.5;
white-space: nowrap;
color: var(--accent);
background: color-mix(in srgb, var(--accent-soft) 70%, var(--panel));
border: 1px solid color-mix(in srgb, var(--accent) 32%, var(--line));
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.j13-ad-buy-btn:hover {
background: var(--accent);
color: var(--accent-on);
border-color: var(--accent);
}
/* 自助推广侧栏占位:空槽可点去购买 */
.j13-ad-slot {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
border-radius: 8px;
border: 1px dashed color-mix(in srgb, var(--accent) 35%, var(--line));
background: color-mix(in srgb, var(--accent-soft) 55%, var(--panel));
color: var(--ink-3);
font-size: 12px;
font-weight: 500;
letter-spacing: 0.02em;
transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease, transform 0.18s ease;
}
.j13-ad-slot:hover {
border-color: var(--accent);
color: var(--accent);
background: var(--accent-soft);
}
/* 自助推广:图片宽 = 两列文字总宽(248 = 121+6+121) */
.j13-ad-promo {
width: 248px;
max-width: 100%;
margin-inline: auto;
display: flex;
flex-direction: column;
gap: 10px;
}
.j13-ad-slot-image {
width: 100%;
height: 60px;
max-width: none;
margin-inline: 0;
min-height: 0;
box-sizing: border-box;
}
.j13-ad-image {
display: block;
width: 100%;
height: 60px;
max-width: none;
margin-inline: 0;
object-fit: cover;
border-radius: 8px;
box-sizing: border-box;
}
.j13-ad-image-link {
display: block;
width: 100%;
max-width: none;
margin-inline: 0;
overflow: hidden;
border-radius: 8px;
border: 1px solid var(--line);
transition: opacity 0.15s ease, transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
.j13-ad-image-link:hover {
opacity: 1;
border-color: color-mix(in srgb, var(--accent) 55%, var(--line));
box-shadow: 0 6px 16px -4px color-mix(in srgb, var(--accent) 32%, transparent);
}
.j13-ad-text-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
width: 100%;
min-width: 0;
}
.j13-ad-text-grid > li {
min-width: 0;
}
.j13-ad-slot-text {
min-height: 34px;
padding: 0 6px;
font-size: 11.5px;
border-radius: 6px;
}
.j13-ad-text {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
min-width: 0;
overflow: hidden;
border-radius: 6px;
padding: 8px 0;
text-decoration: none;
white-space: nowrap;
line-height: 1.2;
transition: opacity 0.15s ease, transform 0.18s ease, box-shadow 0.18s ease;
}
.j13-ad-text.is-overflow {
justify-content: flex-start;
}
.j13-ad-text:hover,
.j13-ad-text:focus-visible {
opacity: 1;
box-shadow: 0 4px 12px -3px color-mix(in srgb, var(--accent) 30%, transparent);
}
.j13-ad-text:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
.j13-ad-text-track {
display: inline-flex;
}
.j13-ad-text-track.is-overflow {
width: max-content;
transform: translateX(0);
transition: transform 0.4s ease;
}
.j13-ad-text:hover .j13-ad-text-track.is-overflow,
.j13-ad-text:focus-visible .j13-ad-text-track.is-overflow {
animation: j13-ad-marquee 10s linear infinite;
}
.j13-ad-text-run {
display: inline-block;
padding: 0 12px;
font-size: 12.5px;
font-weight: 400;
}
@keyframes j13-ad-marquee {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
}
@media (prefers-reduced-motion: reduce) {
.j13-ad-text-track {
animation: none;
width: 100%;
justify-content: center;
}
.j13-ad-text-run[aria-hidden] {
display: none;
}
.j13-ad-text-run {
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
}
@media (prefers-reduced-motion: no-preference) {
.j13-ad-image-link:hover,
.j13-ad-text:hover {
transform: translateY(-2px);
}
.j13-ad-slot:hover {
transform: translateY(-1px);
}
}
/* ── 后台「推广与赞助」工作台 ── */
/* 复用站点设置骨架(.admin-settings-*):左粘性菜单 + 右内容,此处仅补充区块样式 */
/* 锚点跳转时为粘性导航留出避让空间,避免遮挡标题 */
[data-section] {
scroll-margin-top: 64px;
}
/* 申购行:缩略 + 信息 + 操作同一行,操作始终紧邻数据 */
.j13-ads-adrow {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
background: var(--surface);
border: 1px solid var(--line);
border-radius: 12px;
transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.j13-ads-adrow:hover {
border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
box-shadow: 0 4px 14px -6px color-mix(in srgb, var(--ink) 18%, transparent);
}
@media (max-width: 640px) {
.j13-ads-adrow {
flex-wrap: wrap;
}
.j13-ads-adrow > div:last-child {
width: 100%;
justify-content: flex-end;
padding-top: 2px;
}
}
.j13-ads-thumb {
width: 88px;
height: 44px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
background: var(--panel-2);
border: 1px solid var(--line);
border-radius: 8px;
}
.j13-ads-thumb img {
max-width: 100%;
max-height: 100%;
}
/* 编辑器行(时长档位) */
.j13-ads-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
padding: 8px 10px;
background: var(--surface);
border: 1px solid var(--line);
border-radius: 10px;
}
/* 收款码 / 赞助商编辑器:左侧预览 + 右侧字段 */
.j13-ads-editor {
display: flex;
gap: 14px;
align-items: flex-start;
padding: 14px;
background: var(--surface);
border: 1px solid var(--line);
border-radius: 12px;
transition: opacity 0.15s ease, border-color 0.15s ease;
}
.j13-ads-editor.is-off {
opacity: 0.6;
}
.j13-ads-qrbox {
width: 96px;
height: 96px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
background: #fff;
border: 1px dashed var(--line);
border-radius: 10px;
transition: border-color 0.15s ease, transform 0.15s ease;
}
.j13-ads-qrbox:hover {
border-color: var(--accent);
border-style: solid;
}
.j13-ads-logo {
width: 120px;
height: 56px;
max-width: 100%;
background: #fff;
}
@media (max-width: 520px) {
.j13-ads-editor {
flex-direction: column;
}
.j13-ads-qrbox,
.j13-ads-logo {
width: 100%;
max-width: 140px;
margin-inline: auto;
}
}
/* 关于本站:右栏底部署录式目录,与内容模块区分开 */
.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 12px;
/* 无框 chip:透明边框占位,选中/悬停切底色时尺寸不跳 */
border: 1px solid transparent;
background: transparent;
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;
}
.j13-chip:hover,
.j13-chip:focus-visible {
background: var(--item-hover-bg);
color: var(--accent);
}
.j13-chip[aria-current="page"],
.j13-chip[aria-current="page"]:hover,
.j13-chip[aria-current="page"]:focus-visible {
background: var(--accent-soft);
color: var(--accent);
font-weight: 600;
}
.j13-chip:focus-visible {
outline-offset: -2px;
}
/* 板块条两端渐隐:提示「可左右滑动」,滚动到头时对应侧隐藏 */
.j13-chip-fade {
position: absolute;
top: 0;
bottom: 0;
width: 2.5rem;
pointer-events: none;
opacity: 0;
transition: opacity 0.18s ease;
}
.j13-chip-fade.is-on {
opacity: 1;
}
.j13-chip-fade-left {
left: -1rem;
border-radius: 1rem 0 0 1rem;
background: linear-gradient(
to right,
color-mix(in srgb, var(--main-bg) 92%, transparent) 20%,
transparent
);
}
.j13-chip-fade-right {
right: -1rem;
border-radius: 0 1rem 1rem 0;
background: linear-gradient(
to left,
color-mix(in srgb, var(--main-bg) 92%, transparent) 20%,
transparent
);
}
/* 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;
overflow-wrap: anywhere;
}
/* 正文内嵌按钮链接:未分层的 .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: 15.5px; line-height: 1.7; overflow-wrap: anywhere; }
.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;
}
@media (min-width: 640px) {
.j13-back-top {
right: 1.35rem;
bottom: 1.5rem;
}
}
@media (min-width: 1024px) {
.j13-back-top {
bottom: 1.5rem;
}
}
/* 移动端抬高避开底部公共菜单(lg 以下显示底栏);置于最后以覆盖上面的 bottom */
@media (max-width: 1023px) {
.j13-back-top {
bottom: calc(4.75rem + env(safe-area-inset-bottom));
}
}
/* 首页移动端:板块条白底上贴页头(#main 顶部不留白,板块条与帖子框连成一张白纸) */
@media (max-width: 1023px) {
body:has(.j13-fluid-home) #main {
padding-top: 0;
}
}
/* 首页桌面:顶部留白 20px → 8px,中栏信息流上移贴页头;
sticky 侧栏的 --rail-top/--rail-max-h 在 #main 上重算(custom property
在声明处求值,:root 的 --rail-max-h 不会因子级重定义 --rail-top 而更新) */
@media (min-width: 1024px) {
body:has(.j13-fluid-home) #main {
padding-top: 0.5rem;
--rail-top: calc(var(--header-h) + 0.5rem);
--rail-max-h: calc(100vh - var(--rail-top) - 1rem);
}
}
/* ============================================================
前台 main 纸面 + 首页三栏「白纸一体」
main 铺 --main-bg(浅色纯白 / 暗色比画布略亮一档),左右外缘
1px --line 描边与页头下边线围合成框;站长配置了自定义站点
背景图时让位(保持透出画布)。左栏与窄屏下沉面板无框化,
内容直接坐在纸面上;右栏保留卡片板块感(j13-module 原样)。
============================================================ */
html:not(.j13-has-site-bg) #main {
background: var(--main-bg);
border-left: 1px solid var(--line);
border-right: 1px solid var(--line);
}
/* 左栏模块去框:j13-module 退化为无底小节,内容直接坐在纸面上 */
.j13-rail-left .j13-module {
background: transparent;
border: 0;
border-radius: 0;
box-shadow: none;
padding: 0;
}
/* 左栏小节分隔:任意块相邻时画发丝线(含站长自定义工具块) */
.j13-rail-left > * + *,
.j13-fluid-home .j13-flat-rail > * + * {
margin-top: 1.25rem;
padding-top: 1.25rem;
border-top: 1px solid var(--line);
}
/* 左栏小节标题:纸面小节标(弱化为 meta 级),标题图标随之缩小 */
.j13-rail-left .j13-module-title {
font-size: 12px;
letter-spacing: 0.05em;
color: var(--ink-3);
}
.j13-rail-left .j13-module-title > svg {
width: 14px;
height: 14px;
}
/* 栏内图标无底色:只留彩色字形本身(收成图标实际大小,避免隐形占位拉大间距) */
.j13-rail-left .j13-bcard-ico,
.j13-fluid-home .j13-flat-rail .j13-bcard-ico {
background: transparent !important; /* 覆盖「全部讨论/管理面板」图标的内联底色 */
border-radius: 0;
width: 20px;
height: 20px;
font-size: 13px;
}
/* 首页三栏竖向分隔线:与页头下边线同色同宽,居中于栏间距(gap-6 / xl:gap-7),
画在中栏伪元素上与左右栏共用一条;类名跟随左右栏显隐,避免悬空线 */
.j13-home-sep-l,
.j13-home-sep-r {
position: relative;
}
@media (min-width: 1024px) {
.j13-home-sep-l::before,
.j13-home-sep-r::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
width: 1px;
background: var(--line);
}
.j13-home-sep-l::before {
left: calc(-0.75rem - 0.5px);
}
.j13-home-sep-r::after {
right: calc(-0.75rem - 0.5px);
}
}
@media (min-width: 1280px) {
.j13-home-sep-l::before {
left: calc(-0.875rem - 0.5px);
}
.j13-home-sep-r::after {
right: calc(-0.875rem - 0.5px);
}
}
/* 左栏分组标题:小号灰字,纸面风格的段落断点 */
.j13-rail-left .j13-rail-group,
.j13-fluid-home .j13-flat-rail .j13-rail-group {
padding: 10px 8px 4px;
font-size: 11px;
font-weight: 500;
color: var(--ink-3);
letter-spacing: 0.02em;
}
.j13-rail-left .j13-rail-group:first-child,
.j13-fluid-home .j13-flat-rail .j13-rail-group:first-child {
padding-top: 2px;
}
/* 手机端下沉面板:推广占位放开到整栏宽(248 定宽是桌面右栏尺寸,
窄屏居中两侧大片空白显得稀疏);/ads/buy 购买页预览保持真实尺寸不受影响 */
@media (max-width: 1023px) {
.j13-fluid-home .j13-flat-rail .j13-ad-promo {
width: 100%;
}
}
/* 左栏板块导航:当前项 accent 竖条 + 浅色底 */
.j13-rail-left .j13-module .j13-bcard {
position: relative;
}
.j13-rail-left .j13-module .j13-bcard[aria-current="page"],
.j13-rail-left .j13-module .j13-bcard[aria-current="page"]:hover,
.j13-rail-left .j13-module .j13-bcard[aria-current="page"]:focus-visible {
background: var(--nav-active-bg);
border-color: transparent;
}
.j13-rail-left .j13-module .j13-bcard[aria-current="page"]::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 3px;
height: 55%;
border-radius: 2px;
background: var(--accent);
}
/* 中栏排序 Tab:描边胶囊改下划线式,active 下划线压在首行发丝线上 */
.j13-feed-head [role="tablist"] {
align-items: stretch;
}
.j13-feed-head .j13-tab {
position: relative;
border: 0;
background: transparent;
border-radius: 0;
/* 上下对称,Tab 文字与右侧 meta(self-center)垂直居中对齐;下划线仍贴行底 */
padding: 7px 2px;
}
.j13-feed-head .j13-tab::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 2px;
border-radius: 1px 1px 0 0;
background: transparent;
}
.j13-feed-head .j13-tab:hover,
.j13-feed-head .j13-tab:focus-visible {
background: transparent;
border: 0;
}
.j13-feed-head .j13-tab[aria-selected="true"] {
background: transparent;
border: 0;
}
.j13-feed-head .j13-tab[aria-selected="true"]::after {
background: var(--accent);
}
/* 评论楼层树
主评论全宽;子回复默认折叠。视觉缩进最多两级,更深靠「回复谁」说明。 */
.cmt-item {
padding: 16px 0;
border-top: 1px solid var(--line);
min-width: 0;
}
.cmt-item:first-child {
border-top: none;
padding-top: 2px;
}
.cmt-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px 8px;
min-width: 0;
margin-bottom: 6px;
}
.cmt-meta-lead {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px 8px;
min-width: 0;
flex: 1 1 auto;
}
.cmt-name-link {
min-width: 0;
max-width: 100%;
}
.cmt-name {
display: block;
max-width: 16em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 14.5px;
font-weight: 600;
line-height: 1.35;
color: var(--ink);
}
.cmt-time {
font-size: 12.5px;
line-height: 1.4;
color: var(--ink-2);
background: none;
border: 0;
padding: 0;
cursor: default;
}
.cmt-time:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
border-radius: 4px;
}
.cmt-edited {
font-size: 12.5px;
font-weight: 600;
color: var(--ink-2);
background: none;
border: 0;
padding: 0;
}
button.cmt-edited {
cursor: pointer;
text-decoration: underline;
text-underline-offset: 2px;
}
/* 评论编辑历史:git diff 风格修订视图 */
.cmt-diff {
display: flex;
flex-direction: column;
gap: 4px;
}
.cmt-diff-stat {
display: flex;
gap: 8px;
font-size: 11.5px;
font-weight: 600;
line-height: 1;
font-variant-numeric: tabular-nums;
}
.cmt-diff-stat-add {
color: var(--ok);
}
.cmt-diff-stat-del {
color: var(--danger);
}
.cmt-diff-body {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-size: 12.5px;
line-height: 1.55;
background: var(--panel);
border: 1px solid var(--line);
border-radius: 6px;
padding: 4px 0;
}
.cmt-diff-line {
display: flex;
gap: 8px;
padding: 0 10px;
white-space: pre-wrap;
word-break: break-word;
min-height: 1.55em;
}
.cmt-diff-sign {
flex-shrink: 0;
width: 1ch;
user-select: none;
opacity: 0.65;
}
.cmt-diff-text {
min-width: 0;
flex: 1;
}
.cmt-diff-line.is-del {
background: color-mix(in srgb, var(--danger-soft) 60%, transparent);
}
.cmt-diff-line.is-add {
background: color-mix(in srgb, var(--ok-soft) 60%, transparent);
}
.cmt-diff-line.is-ctx {
color: var(--ink-2);
}
.cmt-diff-chg {
border-radius: 3px;
padding: 0 1px;
background: color-mix(in srgb, var(--danger) 24%, transparent);
color: inherit;
}
.cmt-diff-line.is-add .cmt-diff-chg {
background: color-mix(in srgb, var(--ok) 24%, transparent);
}
.cmt-diff-fold {
padding: 2px 10px;
font-size: 11.5px;
text-align: center;
color: var(--ink-2);
background: color-mix(in srgb, var(--ink) 3%, transparent);
}
.cmt-badge {
display: inline-flex;
align-items: center;
height: 18px;
padding: 0 6px;
border-radius: 999px;
font-size: 11px;
font-weight: 600;
line-height: 1;
color: var(--accent);
background: var(--accent-soft);
flex-shrink: 0;
}
.cmt-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 2px 10px;
margin-top: 8px;
min-width: 0;
}
.cmt-more {
position: relative;
}
.cmt-more-btn,
.cmt-reply-btn {
min-height: 32px;
padding: 0 4px;
}
.cmt-more-btn {
font-size: 13px;
font-weight: 600;
color: var(--ink-2);
background: none;
border: 0;
cursor: pointer;
border-radius: 8px;
}
.cmt-more-btn:hover,
.cmt-more-btn[aria-expanded="true"] {
color: var(--accent);
}
.cmt-more-menu {
position: absolute;
z-index: 30;
top: calc(100% + 4px);
left: 0;
min-width: 148px;
padding: 4px;
border-radius: 12px;
background: var(--panel);
border: 1px solid var(--line);
box-shadow: var(--shadow-lg);
}
.cmt-more-menu button {
display: flex;
width: 100%;
text-align: left;
padding: 8px 10px;
border: 0;
border-radius: 8px;
background: transparent;
color: var(--ink);
font-size: 13px;
font-weight: 500;
cursor: pointer;
}
.cmt-more-menu button:hover,
.cmt-more-menu button:focus-visible {
background: var(--panel-2);
outline: none;
}
.cmt-more-menu button.is-danger {
color: var(--danger);
}
.cmt-more-sep {
height: 1px;
margin: 4px 6px;
background: var(--line);
}
.cmt-posted-note {
margin-top: 10px;
font-size: 13px;
color: var(--ink-2);
}
.cmt-posted-note a {
color: var(--accent);
font-weight: 600;
}
.cmt-submit {
height: 38px;
padding: 0 16px;
font-size: 14px;
}
.cmt-submit:disabled {
background: var(--tint);
color: var(--ink-2);
box-shadow: none;
opacity: 1;
}
/* 子回复行:紧凑布局,头像 32px */
.cmt-reply-row {
padding: 14px 0;
border-top: 1px solid var(--line);
min-width: 0;
}
.cmt-reply-row:first-child {
border-top: none;
padding-top: 0;
}
/* 子回复昵称 */
.cmt-reply-name {
font-size: 14px;
font-weight: 600;
color: var(--ink);
}
/* 楼层号标签(主评论昵称旁) */
.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: 13px;
font-weight: 600;
color: var(--ink-2);
background: none;
border: none;
padding: 0 4px;
min-height: 32px;
cursor: pointer;
border-radius: 8px;
}
.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-children .cmt-children .cmt-children {
padding-left: 0;
border-left: 0;
}
/* 展开/收起按钮 */
.cmt-fold-btn {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12.5px;
font-weight: 500;
color: var(--accent);
padding: 4px 10px;
border-radius: 99px;
background: var(--accent-soft);
border: none;
cursor: pointer;
transition: background 0.15s;
}
.cmt-fold-btn:hover {
background: color-mix(in srgb, var(--accent) 18%, transparent);
}
/* 评论内联回复表单:出现在目标评论正下方 */
.cmt-reply-form {
padding: 12px 14px;
border-radius: 14px;
background: var(--panel-2);
margin-top: 8px;
}
/* 评论区编辑器:矮输入区,底栏含提交 */
.cmt-md-editor {
border: 1px solid var(--line);
border-radius: 12px;
padding: 0.25rem 0.75rem 0.55rem;
background: var(--panel);
container-type: inline-size;
}
.cmt-md-editor .j13-md-editor:not(.is-fullscreen) {
min-height: 0;
}
.cmt-md-editor .j13-md-toolbar {
padding-bottom: 8px;
}
.cmt-md-editor .j13-md-foot {
font-size: 12.5px;
padding-top: 8px;
flex-wrap: wrap;
}
@container (max-width: 420px) {
.cmt-md-editor .j13-md-editor.is-comment .j13-md-tool {
width: 36px;
height: 36px;
}
.cmt-md-editor .j13-md-mode button {
padding: 0 6px;
}
}
/* 软删占位:匿名马赛克(不含真实头像/昵称) */
.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,
.cmt-children .cmt-children {
padding-left: 0;
border-left: 0;
}
.cmt-reply-btn,
.cmt-more-btn,
.cmt-more-menu button {
min-height: 44px;
}
.cmt-name {
max-width: 9.5em;
}
}
@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; }
.av-8 { background: rgba(5, 150, 105, 0.13); color: #059669; }
.av-9 { background: rgba(2, 132, 199, 0.13); color: #0284c7; }
.av-10 { background: rgba(67, 56, 202, 0.13); color: #4338ca; }
.av-11 { background: rgba(190, 24, 93, 0.13); color: #be185d; }
.av-12 { background: rgba(180, 83, 9, 0.14); color: #b45309; }
.av-13 { background: rgba(77, 124, 3, 0.14); color: #4d7c03; }
.av-14 { background: rgba(157, 23, 158, 0.13); color: #9d179e; }
.av-15 { background: rgba(159, 0, 51, 0.13); color: #9f0033; }
.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; }
.dark .av-8 { background: rgba(110, 231, 183, 0.18); color: #6ee7b7; }
.dark .av-9 { background: rgba(125, 211, 252, 0.18); color: #7dd3fc; }
.dark .av-10 { background: rgba(165, 180, 252, 0.18); color: #a5b4fc; }
.dark .av-11 { background: rgba(251, 113, 133, 0.18); color: #fb7185; }
.dark .av-12 { background: rgba(252, 211, 77, 0.18); color: #fcd34d; }
.dark .av-13 { background: rgba(190, 242, 100, 0.18); color: #bef264; }
.dark .av-14 { background: rgba(232, 121, 249, 0.18); color: #e879f9; }
.dark .av-15 { background: rgba(248, 113, 113, 0.18); color: #f87171; }
/* ============================================================
微交互
============================================================ */
@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; }
/* 深链/目录跳转落点高亮:先铺主题色浅底再渐隐(lib/flash.ts 挂载,超时自动摘除) */
@keyframes j13-flash-fade {
from { background-color: var(--accent-soft); }
to { background-color: transparent; }
}
.j13-flash-target {
animation: j13-flash-fade 1.8s ease-out both;
border-radius: 10px;
}
/* 跳到主内容 */
.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;
}
/* Operational settings reuse the existing theme tokens in both themes. */
.ops-panel { width: 100%; display: grid; gap: 1rem; }
.ops-fields { border: 0; padding: 0; min-width: 0; display: grid; gap: 1rem; }
.ops-summary, .ops-actions { display: flex; gap: 0.65rem; align-items: center; flex-wrap: wrap; }
.ops-actions { margin-top: 0.35rem; }
.ops-summary { color: var(--ink-3); font-size: 12.5px; }
.ops-panel .field {
padding: 0.45rem 0.7rem;
font-size: 13.5px;
line-height: 1.4;
border-radius: 0.5rem;
}
.ops-panel textarea.field {
font-size: 13.5px;
line-height: 1.55;
}
.ops-secret { display: flex; flex-direction: column; align-items: flex-start; gap: 0.4rem; max-width: min(22rem, 100%); }
.ops-secret .field { width: 100%; }
.ops-secret-card { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; width: 100%; padding: 0.55rem 0.75rem; border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--tint); }
.ops-secret-card.is-remove { background: var(--danger-soft); border-color: color-mix(in srgb, var(--danger) 28%, transparent); }
.ops-secret-title { margin: 0; font-size: 13px; font-weight: 600; color: var(--ink); }
.ops-secret-card.is-remove .ops-secret-title { color: var(--danger); }
.ops-secret-note { margin: 2px 0 0; font-size: 12px; line-height: 1.4; color: var(--ink-3); }
.ops-secret-card.is-remove .ops-secret-note { color: var(--danger); }
.ops-secret-actions { display: flex; align-items: center; gap: 0.25rem; flex-shrink: 0; }
.ops-text-btn { appearance: none; border: 0; background: none; padding: 0.35rem 0.45rem; font: inherit; font-size: 12.5px; line-height: 1.2; color: var(--ink-2); cursor: pointer; }
.ops-text-btn:hover { color: var(--ink); }
.ops-text-btn.is-danger { color: var(--danger); }
.ops-text-btn.is-danger:hover { text-decoration: underline; }
.ops-text-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
.ops-savebar .admin-settings-group-body { padding-top: 1rem; }
.ops-preview { padding: 0.85rem 1.1rem 1.1rem; background: var(--panel); border: 1px solid var(--line); border-radius: var(--r); }
.ops-preview summary { cursor: pointer; font-size: 13.5px; font-weight: 600; color: var(--ink); }
.ops-template { width: 100%; max-width: 100%; min-height: 12rem; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12.5px; line-height: 1.55; }
.ops-input { width: 100%; max-width: 22rem; }
.ops-number { width: 7.5rem; }
.ops-select {
width: 100%;
max-width: 18rem;
appearance: none;
background-color: var(--panel);
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%236b7280' d='M1.2 1.3L6 6.1l4.8-4.8 1.1 1.1L6 8.3.1 2.4z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.7rem center;
background-size: 0.7rem;
padding-right: 2rem;
cursor: pointer;
}
.ops-select:focus {
outline: none;
border-color: var(--accent);
box-shadow: 0 0 0 2px var(--focus-glow);
}
.ops-datetime { display: flex; flex-direction: column; gap: 0.35rem; max-width: min(22rem, 100%); }
.ops-datetime-input { width: 100%; max-width: 16rem; }
.ops-datetime-actions { display: flex; align-items: center; gap: 0.5rem; }
.ops-hint { color: var(--ink-3); font-size: 12px; line-height: 1.5; margin: 0; overflow-wrap: anywhere; }
.ops-mail-vars-lead {
margin: 0.35rem 0 0;
font-size: 12.5px;
line-height: 1.5;
color: var(--ink-3);
}
.ops-mail-vars {
display: grid;
gap: 0.35rem 1rem;
margin: 0.45rem 0 0;
padding: 0.55rem 0.7rem;
border-radius: 0.5rem;
background: var(--panel-2);
border: 1px solid var(--line);
font-size: 12.5px;
line-height: 1.45;
}
.ops-mail-vars > div {
display: grid;
grid-template-columns: minmax(7.5rem, max-content) minmax(0, 1fr);
gap: 0.25rem 0.75rem;
align-items: baseline;
}
.ops-mail-vars dt {
margin: 0;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 12px;
font-weight: 600;
color: var(--ink);
white-space: nowrap;
}
.ops-mail-vars dd {
margin: 0;
color: var(--ink-3);
}
@media (max-width: 520px) {
.ops-mail-vars > div {
grid-template-columns: minmax(0, 1fr);
gap: 0.1rem;
}
}
.ops-alert { margin: 0; padding: 0.65rem 0.85rem; border-radius: var(--r-sm); background: var(--danger-soft); color: var(--danger); font-size: 13px; }
.ops-advanced { padding: 0.35rem 0; }
.ops-advanced summary { cursor: pointer; margin-bottom: 0.65rem; font-size: 13px; color: var(--ink-2); display: inline-flex; align-items: center; gap: 0.35rem; }
.ops-busy { display: inline-flex; align-items: center; gap: 0.4rem; margin: 0; font-size: 13px; color: var(--ink-2); }
.ops-tool-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(11.5rem, 1fr));
gap: 0.65rem;
}
.ops-tool-card {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.25rem;
text-align: left;
padding: 0.85rem 0.95rem;
border-radius: 0.75rem;
border: 1px solid var(--line);
background: var(--panel-2);
color: var(--ink);
font-family: inherit;
cursor: pointer;
}
.ops-tool-card:hover:not(:disabled) {
border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
background: var(--accent-soft);
}
.ops-tool-card:disabled { opacity: 0.55; cursor: not-allowed; }
.ops-tool-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ops-tool-title { font-size: 13.5px; font-weight: 600; }
.ops-tool-desc { font-size: 12px; color: var(--ink-3); line-height: 1.4; }
.ops-result-panel {
border: 1px solid var(--line);
border-radius: var(--r);
background: var(--panel);
overflow: hidden;
}
.ops-result-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.65rem 0.9rem;
border-bottom: 1px solid var(--line);
font-size: 13px;
}
.ops-result-body {
max-height: 18rem;
overflow: auto;
padding: 0.65rem 0.9rem;
}
.ops-records {
max-height: 22rem;
overflow: auto;
border: 1px solid var(--line);
border-radius: 0.75rem;
background: var(--panel);
}
.ops-record { border-bottom: 1px solid var(--line); margin: 0; padding: 0; }
.ops-record:last-child { border-bottom: 0; }
.ops-record-summary {
display: grid;
grid-template-columns: minmax(5rem, 8rem) minmax(0, 1fr) auto;
gap: 0.5rem 0.85rem;
align-items: center;
padding: 0.55rem 0.85rem;
cursor: pointer;
list-style: none;
font-size: 13px;
}
.ops-record-summary::-webkit-details-marker { display: none; }
.ops-record-kind { font-weight: 600; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ops-record-extra { color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ops-record-when { white-space: nowrap; }
.ops-record-body {
max-height: 12rem;
overflow: auto;
padding: 0 0.85rem 0.75rem;
border-top: 1px dashed var(--line);
}
.ops-results { font-size: 12.5px; padding: 0; margin: 0; overflow-wrap: anywhere; }
.ops-results > div { display: grid; grid-template-columns: 7.5rem minmax(0,1fr); gap: 0.35rem 0.75rem; margin: 0.3rem 0; }
.ops-results dt { color: var(--ink-3); margin: 0; }
.ops-results dd { margin: 0; color: var(--ink); }
.ops-results-list { margin: 0; padding-left: 1.1rem; }
.ops-truncate { display: inline; }
.ops-filter { display: grid; gap: 0.75rem; }
.ops-filter-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
.ops-filter-toolbar .ops-input { max-width: 16rem; flex: 1 1 12rem; }
.ops-filter-bulk { display: flex; flex-wrap: wrap; align-items: center; gap: 0.45rem; }
.ops-filter-table {
border: 1px solid var(--line);
border-radius: 0.75rem;
overflow: hidden;
background: var(--panel);
}
.ops-filter-head,
.ops-filter-row {
display: grid;
grid-template-columns: 2rem minmax(6rem, 1fr) minmax(7rem, 1.2fr) 4.5rem 3.5rem auto;
gap: 0.5rem;
align-items: center;
padding: 0.55rem 0.75rem;
}
.ops-filter-head {
background: var(--panel-2);
font-size: 12px;
font-weight: 600;
color: var(--ink-3);
border-bottom: 1px solid var(--line);
}
.ops-filter-row { border-bottom: 1px solid var(--line); font-size: 13px; }
.ops-filter-row:last-child { border-bottom: 0; }
.ops-filter-check { display: inline-flex; align-items: center; justify-content: center; }
.ops-filter-word { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
.ops-filter-state { font-size: 12px; color: var(--ink-3); }
.ops-filter-state.is-on { color: var(--ok, #137333); font-weight: 550; }
.ops-filter-row-actions { display: inline-flex; align-items: center; gap: 0.25rem; justify-content: flex-end; }
.ops-filter-empty { padding: 0.85rem; }
.ops-filter-pager { display: flex; align-items: center; gap: 0.65rem; }
.ops-filter-import summary { list-style: none; }
.ops-filter-import-opt { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 13px; margin: 0.5rem 0; }
.ops-filter-editor { display: grid; gap: 0.85rem; }
.ops-filter-editor label { display: grid; gap: 0.35rem; font-size: 13px; color: var(--ink-2); }
.ops-filter-editor fieldset { border: 1px solid var(--line); border-radius: 0.65rem; padding: 0.65rem 0.85rem; margin: 0; }
.ops-filter-editor legend { padding: 0 0.25rem; font-size: 12.5px; color: var(--ink-3); }
@media (max-width: 720px) {
.ops-results > div { grid-template-columns: 5.5rem minmax(0,1fr); }
.ops-filter-head { display: none; }
.ops-filter-row {
grid-template-columns: 2rem minmax(0, 1fr) auto;
grid-template-areas:
"check word actions"
"check meta actions";
}
.ops-filter-check { grid-area: check; }
.ops-filter-word { grid-area: word; }
.ops-filter-row-actions { grid-area: actions; }
.ops-filter-row > .meta,
.ops-filter-state { grid-area: meta; }
.ops-record-summary { grid-template-columns: minmax(0, 1fr); }
.ops-secret-card { flex-direction: column; align-items: flex-start; }
}
.ops-mail-preview {
width: 100%;
height: 120px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
margin-top: 0.65rem;
overflow: hidden;
display: block;
}
.settings-nav-item small { margin-left:8px; }
/* ===== 访问统计:横向 Tab 导航 ===== */
.admin-analytics-page {
width: 100%;
max-width: 1120px;
}
.admin-analytics-tabs {
display: flex;
align-items: stretch;
gap: 0.15rem;
overflow-x: auto;
scrollbar-width: thin;
border-bottom: 1px solid var(--line);
margin-bottom: 1.25rem;
padding: 0 0.25rem;
}
.admin-analytics-tab {
position: relative;
white-space: nowrap;
padding: 0.55rem 0.9rem;
font-size: 13.5px;
font-weight: 500;
line-height: 1.35;
color: var(--ink-2);
text-decoration: none;
border-radius: 0.6rem 0.6rem 0 0;
transition: background 0.15s ease, color 0.15s ease;
}
.admin-analytics-tab:hover {
background: var(--panel-2);
color: var(--ink);
}
.admin-analytics-tab:visited {
color: var(--ink-2);
}
.admin-analytics-tab[aria-current="page"],
.admin-analytics-tab[aria-current="page"]:visited {
color: var(--nav-active-ink);
background: var(--nav-active-bg);
font-weight: 600;
}
.admin-analytics-tab[aria-current="page"]::after {
content: "";
position: absolute;
left: 0.5rem;
right: 0.5rem;
bottom: 0;
height: 2px;
background: var(--accent);
border-radius: 2px 2px 0 0;
}
.admin-analytics-tab:focus-visible {
outline: 2px solid var(--accent);
outline-offset: -2px;
}
/* ── 侧栏管理:站长自定义工具容器 ──
不附加面板底色/边框,视觉完全交给工具自带的 HTML/CSS;
仅保证在侧栏列内不横向溢出。 */
.j13-widget-body {
min-width: 0;
}
.j13-widget-body > .j13-widget-html {
min-width: 0;
}