feat: 实时消息与管理端运营能力

新增群聊/私信与公共 WebSocket 总线,站长用户内容档案,并将通知与待审角标改为推送驱动;同步精简管理仪表盘并修复主题换肤 DOM 冲突。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-15 22:58:16 +08:00
parent 29db9ae9b5
commit 42c395a864
55 changed files with 7607 additions and 346 deletions

View File

@@ -155,6 +155,89 @@ h1, h2, h3, h4 {
border-radius: 6px;
}
/* 消息侧栏搜索:单层描边,避免外框 + focus-visible 双线 */
.j13-chat-search:focus-within {
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-chat-search-input,
.j13-chat-search-input:focus,
.j13-chat-search-input:focus-visible {
outline: none !important;
box-shadow: none !important;
}
/* 聊天输入区:与搜索框同款聚焦态 */
.j13-chat-composer:focus-within {
border-color: var(--accent) !important;
box-shadow: 0 0 0 3px var(--accent-soft);
}
.j13-chat-composer-input,
.j13-chat-composer-input:focus,
.j13-chat-composer-input:focus-visible {
outline: none !important;
box-shadow: none !important;
resize: none !important;
}
.j13-chat-composer-input.has-value {
color: transparent;
caret-color: var(--ink);
}
.j13-chat-composer-input.has-value::placeholder {
color: transparent;
}
.j13-chat-composer-mirror {
position: absolute;
inset: 0;
overflow: hidden;
pointer-events: none;
white-space: pre-wrap;
overflow-wrap: break-word;
word-break: break-word;
color: var(--ink);
}
.j13-mention-token {
display: inline-block;
padding: 2px 8px;
margin: 0 2px;
border-radius: 999px;
line-height: 1.35;
vertical-align: baseline;
/* 主题强调色加深 + 对比色字,胶囊形 */
background: color-mix(in srgb, var(--accent) 82%, #000);
color: #fff !important;
font-weight: 600;
text-decoration: none !important;
cursor: pointer;
transition: filter 0.12s ease, opacity 0.12s ease;
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
}
a.j13-mention-token:hover {
filter: brightness(1.08);
opacity: 0.95;
}
.dark .j13-mention-token {
/* 暗色下 accent 偏亮,用实心 accent + 配套字色 */
background: var(--accent);
color: var(--accent-on) !important;
}
/* 输入镜像层:不加粗/不加 padding,避免与透明 textarea 字宽错位 */
.j13-chat-composer-mirror .j13-mention-token {
display: inline;
padding: 0;
margin: 0;
line-height: inherit;
font-weight: inherit;
border-radius: 999px;
box-shadow: none;
background: color-mix(in srgb, var(--accent) 82%, #000);
}
.dark .j13-chat-composer-mirror .j13-mention-token {
background: var(--accent);
color: var(--accent-on) !important;
}
@layer components {
/* ----- 小标签(旧名 .kicker 保留兼容) ----- */
.kicker {
@@ -230,6 +313,22 @@ h1, h2, h3, h4 {
.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);
@@ -380,6 +479,18 @@ h1, h2, h3, h4 {
border-radius: 999px;
white-space: nowrap;
}
.badge-pending {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
font-weight: 700;
padding: 4px 11px;
background: var(--accent-soft);
color: var(--accent);
border-radius: 999px;
white-space: nowrap;
}
/* 帖子列表中的板块小标签:全站统一浅灰配色,避免每行多色眩目 */
.j13-board-tag {
@@ -539,6 +650,20 @@ h1, h2, h3, h4 {
transform: scale(0.97);
}
/* 帖子流「有新内容」提示条(三期) */
.j13-feed-new-tip:hover {
filter: brightness(0.97);
}
.j13-feed-new-tip:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
.j13-feed-new-tip {
transition: none;
}
}
/* 侧栏导航项 */
.j13-raillink {
display: flex;