@tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --background: 210 20% 98%; --foreground: 222 47% 11%; --card: 0 0% 100%; --card-foreground: 222 47% 11%; --popover: 0 0% 100%; --popover-foreground: 222 47% 11%; --primary: 152 72% 36%; --primary-foreground: 0 0% 100%; --secondary: 210 20% 96%; --secondary-foreground: 222 47% 11%; --muted: 210 20% 96%; --muted-foreground: 215 16% 47%; --accent: 152 45% 95%; --accent-foreground: 152 72% 28%; --destructive: 0 84% 60%; --destructive-foreground: 0 0% 100%; --border: 214 20% 91%; --input: 214 20% 91%; --ring: 152 72% 36%; --radius: 0.375rem; /* 兼容旧样式里的文本色变量 */ --color-text-1: hsl(var(--foreground)); --color-text-2: hsl(215 16% 35%); --color-text-3: hsl(var(--muted-foreground)); --color-text-4: hsl(215 12% 65%); --color-fill-3: hsl(210 20% 94%); } .dark { --background: 240 6% 10%; --foreground: 0 0% 95%; --card: 240 5% 13%; --card-foreground: 0 0% 95%; --popover: 240 5% 13%; --popover-foreground: 0 0% 95%; --primary: 152 58% 46%; --primary-foreground: 0 0% 100%; --secondary: 240 4% 16%; --secondary-foreground: 0 0% 95%; --muted: 240 4% 16%; --muted-foreground: 240 5% 65%; --accent: 152 30% 14%; --accent-foreground: 152 58% 55%; --destructive: 0 63% 45%; --destructive-foreground: 0 0% 95%; --border: 240 4% 18%; --input: 240 4% 18%; --ring: 152 58% 46%; --color-text-1: hsl(var(--foreground)); --color-text-2: hsl(240 5% 75%); --color-text-3: hsl(var(--muted-foreground)); --color-text-4: hsl(240 5% 50%); --color-fill-3: hsl(240 4% 20%); } } /* 姜十三论坛 - 清新现代主题 */ :root { /* 中文优先字体栈:避免 Inter 等西文字体回退导致中文发虚 */ --j13-font-family: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans SC", "WenQuanYi Micro Hei", system-ui, -apple-system, "Segoe UI", sans-serif; --j13-green: #18a058; --j13-green-hover: #138f4c; --j13-green-bg: rgba(24, 160, 88, 0.08); --j13-green-soft: #edfbf3; --j13-border: #e8edf2; --j13-border-light: #f0f3f7; --j13-sidebar-w: 210px; --j13-aside-w: 280px; --j13-header-h: 56px; --j13-max-w: 1400px; --j13-article-read-w: 820px; /* 层次:浅灰画布 → 工作区底 → 白色/淡色区块 */ --j13-bg-page: #f5f7fa; --j13-bg-workspace: #f8fafc; --j13-bg-surface: #ffffff; --j13-bg-block: #ffffff; --j13-bg-block-muted: #f1f4f8; --j13-bg-block-accent: #f0faf5; --j13-shadow-soft: 0 1px 2px rgba(15, 23, 42, 0.04); --j13-shadow-card: 0 2px 8px rgba(15, 23, 42, 0.05); /* 板块色标(8 色槽,按 board id 取模) */ --board-0-color: #18a058; --board-0-bg: rgba(24, 160, 88, 0.1); --board-1-color: #3498db; --board-1-bg: rgba(52, 152, 219, 0.1); --board-2-color: #9b59b6; --board-2-bg: rgba(155, 89, 182, 0.1); --board-3-color: #e67e22; --board-3-bg: rgba(230, 126, 34, 0.1); --board-4-color: #e74c3c; --board-4-bg: rgba(231, 76, 60, 0.1); --board-5-color: #1abc9c; --board-5-bg: rgba(26, 188, 156, 0.1); --board-6-color: #6366f1; --board-6-bg: rgba(99, 102, 241, 0.1); --board-7-color: #f59e0b; --board-7-bg: rgba(245, 158, 11, 0.12); } .dark { --j13-green: #23c36b; --j13-green-hover: #1fb35f; --j13-green-bg: rgba(35, 195, 107, 0.12); --j13-green-soft: rgba(35, 195, 107, 0.08); --j13-border: #2e2e32; --j13-border-light: #262629; --j13-bg-page: #141416; --j13-bg-workspace: #18181b; --j13-bg-surface: #1f1f23; --j13-bg-block: #232328; --j13-bg-block-muted: #1c1c20; --j13-bg-block-accent: rgba(35, 195, 107, 0.06); --j13-shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.2); --j13-shadow-card: 0 2px 8px rgba(0, 0, 0, 0.28); --board-0-color: #23c36b; --board-0-bg: rgba(35, 195, 107, 0.14); --board-1-color: #5dade2; --board-1-bg: rgba(93, 173, 226, 0.14); --board-2-color: #bb86fc; --board-2-bg: rgba(187, 134, 252, 0.14); --board-3-color: #f0a050; --board-3-bg: rgba(240, 160, 80, 0.14); --board-4-color: #ff7b72; --board-4-bg: rgba(255, 123, 114, 0.14); --board-5-color: #3dd6b5; --board-5-bg: rgba(61, 214, 181, 0.14); --board-6-color: #818cf8; --board-6-bg: rgba(129, 140, 248, 0.14); --board-7-color: #fbbf24; --board-7-bg: rgba(251, 191, 36, 0.14); } .dark .app-shell { background: radial-gradient(ellipse 70% 45% at 50% -10%, rgba(35, 195, 107, 0.08), transparent 70%), var(--j13-bg-page); } * { box-sizing: border-box; } html { /* 预留滚动条槽位,避免页面切换时因滚动条出现/消失导致布局抖动 */ scrollbar-gutter: stable; /* 覆盖 Arco 默认 antialiased:Windows 下用 ClearType 渲染中文更清晰 */ -webkit-font-smoothing: auto; -moz-osx-font-smoothing: auto; font-family: var(--j13-font-family); text-rendering: optimizeLegibility; } html, body, #root { height: 100%; margin: 0; } body { font-family: var(--j13-font-family); font-size: 14px; line-height: 1.5; color: var(--color-text-1); background: var(--j13-bg-page); overflow: hidden; } a { color: var(--j13-green); text-decoration: none; } a:hover { text-decoration: underline; } .app-shell { height: 100%; max-height: 100dvh; display: flex; flex-direction: column; overflow: hidden; background: radial-gradient(ellipse 70% 45% at 50% -10%, rgba(24, 160, 88, 0.07), transparent 70%), var(--j13-bg-page); } /* 顶栏 + 主体共用同一宽度容器,顶满高度、直角外框 */ .app-frame { flex: 1; min-height: 0; height: 100%; max-width: var(--j13-max-w); width: 100%; margin: 0 auto; display: flex; flex-direction: column; overflow: hidden; border-left: 1px solid var(--j13-border); border-right: 1px solid var(--j13-border); background: var(--j13-bg-surface); } .app-header { height: var(--j13-header-h); flex-shrink: 0; z-index: 100; background: var(--j13-bg-surface); border-bottom: 1px solid var(--j13-border); } .header-inner { height: 100%; width: 100%; padding: 0 20px; display: flex; align-items: center; gap: 20px; } .header-brand { display: flex; align-items: center; gap: 10px; flex-shrink: 0; border: none; background: none; padding: 4px 0; cursor: pointer; color: inherit; font: inherit; } .header-brand:hover .header-logo-text { color: var(--j13-green); } .header-logo-mark { width: 34px; height: 34px; border-radius: 10px; background: linear-gradient(135deg, var(--j13-green) 0%, #34c471 100%); color: #fff; font-weight: 700; font-size: 17px; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 8px rgba(26, 127, 75, 0.28); } .header-logo-text { font-size: 15px; font-weight: 600; letter-spacing: 0.02em; transition: color 0.15s; } .header-search-wrap { flex: 1; min-width: 0; max-width: 420px; display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 14px; border-radius: 999px; background: var(--j13-bg-block-muted); border: 1px solid var(--j13-border-light); transition: border-color 0.2s, background 0.2s, box-shadow 0.2s; } .header-search-wrap:focus-within { background: var(--j13-bg-surface); border-color: color-mix(in srgb, var(--j13-green) 30%, transparent); box-shadow: 0 0 0 3px var(--j13-green-bg); } .header-search-icon { flex-shrink: 0; font-size: 15px; color: var(--color-text-3); } .header-search-input { flex: 1; min-width: 0; border: none; outline: none; background: transparent; font-size: 14px; color: var(--color-text-1); font-family: inherit; } .header-search-input::placeholder { color: var(--color-text-4); } .header-search-input::-webkit-search-cancel-button { display: none; } .header-search-clear { flex-shrink: 0; width: 20px; height: 20px; border: none; border-radius: 50%; background: var(--color-fill-3); color: var(--color-text-3); font-size: 14px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; transition: background 0.15s, color 0.15s; } .header-search-clear:hover { background: var(--color-fill-4); color: var(--color-text-1); } .header-actions { display: flex; align-items: center; gap: 10px; flex-shrink: 0; margin-left: auto; } .header-compose-btn { display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 16px; border: none; border-radius: 999px; background: var(--j13-green); color: #fff; font-size: 13px; font-weight: 500; font-family: inherit; cursor: pointer; transition: background 0.15s, transform 0.1s, box-shadow 0.15s; box-shadow: 0 2px 6px rgba(26, 127, 75, 0.22); } .header-compose-btn:hover { background: var(--j13-green-hover); box-shadow: 0 3px 10px rgba(26, 127, 75, 0.3); } .header-compose-btn:active { transform: scale(0.97); } .header-action-group { display: flex; align-items: center; gap: 4px; padding: 3px; border-radius: 999px; background: var(--j13-bg-block-muted); border: 1px solid var(--j13-border-light); } .header-icon-btn { width: 32px; height: 32px; border: none; border-radius: 50%; background: transparent; color: var(--color-text-2); font-size: 16px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s, color 0.15s; } .header-icon-btn:hover { background: var(--color-fill-3); color: var(--color-text-1); } .header-user-btn { width: 32px; height: 32px; border: none; border-radius: 50%; padding: 0; cursor: pointer; overflow: hidden; background: var(--j13-green); display: flex; align-items: center; justify-content: center; transition: box-shadow 0.15s, transform 0.1s; } @media (hover: hover) { .header-user-btn:hover { box-shadow: 0 0 0 2px var(--j13-green-bg), 0 0 0 3px var(--j13-green); } } .header-user-btn:focus-visible { box-shadow: 0 0 0 2px var(--j13-green-bg), 0 0 0 3px var(--j13-green); } /* 鼠标点击打开/关闭下拉后 focus 会回到按钮,隐藏默认 outline 与 hover 同款高亮 */ .header-user-btn:focus:not(:focus-visible) { outline: none; box-shadow: none; } .header-user-avatar { width: 100%; height: 100%; object-fit: cover; } .header-user-initial { color: #fff; font-size: 14px; font-weight: 600; } .header-login-btn { height: 32px; padding: 0 14px; border: none; border-radius: 999px; background: transparent; color: var(--j13-green); font-size: 13px; font-weight: 500; font-family: inherit; cursor: pointer; transition: background 0.15s; } .header-login-btn:hover { background: var(--j13-green-bg); } .header-auth-slot { display: inline-block; width: 32px; height: 32px; border-radius: 50%; flex-shrink: 0; } .header-auth-slot--loading { background: var(--color-fill-3); } .app-body { flex: 1; display: flex; min-height: 0; width: 100%; overflow: hidden; background: var(--j13-bg-surface); } .sidebar { width: var(--j13-sidebar-w); flex-shrink: 0; border-right: 1px solid var(--j13-border-light); background: var(--j13-bg-surface); overflow-y: auto; padding: 12px 0; } .sidebar-section { padding: 4px 12px 8px; font-size: 11px; font-weight: 600; color: var(--color-text-3); } .sidebar-nav { display: flex; flex-direction: column; gap: 2px; padding: 0 8px; } .sidebar-nav-item { display: flex; align-items: center; gap: 8px; width: 100%; margin: 0; padding: 0 12px; height: 36px; border: none; border-radius: 6px; background: transparent; color: var(--color-text-1); font-size: 14px; cursor: pointer; text-align: left; transition: background 0.15s, color 0.15s; } .sidebar-nav-item:hover { background: var(--j13-bg-block-muted); } .sidebar-nav-item.active { background: var(--j13-green-bg); color: var(--j13-green); font-weight: 600; } .sidebar-nav-item svg { width: 16px; height: 16px; flex-shrink: 0; } .sidebar-nav-item__meta { margin-left: auto; color: var(--color-text-4); font-size: 12px; } .sidebar-nav-item--board .sidebar-board-icon { opacity: 0.88; } .sidebar-nav-item--board.active .sidebar-board-icon { opacity: 1; } .sidebar-nav-item--board.active.sidebar-nav-item--board-0 { background: var(--board-0-bg); color: var(--board-0-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-1 { background: var(--board-1-bg); color: var(--board-1-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-2 { background: var(--board-2-bg); color: var(--board-2-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-3 { background: var(--board-3-bg); color: var(--board-3-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-4 { background: var(--board-4-bg); color: var(--board-4-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-5 { background: var(--board-5-bg); color: var(--board-5-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-6 { background: var(--board-6-bg); color: var(--board-6-color); } .sidebar-nav-item--board.active.sidebar-nav-item--board-7 { background: var(--board-7-bg); color: var(--board-7-color); } .sidebar-board-icon--0 { color: var(--board-0-color); } .sidebar-board-icon--1 { color: var(--board-1-color); } .sidebar-board-icon--2 { color: var(--board-2-color); } .sidebar-board-icon--3 { color: var(--board-3-color); } .sidebar-board-icon--4 { color: var(--board-4-color); } .sidebar-board-icon--5 { color: var(--board-5-color); } .sidebar-board-icon--6 { color: var(--board-6-color); } .sidebar-board-icon--7 { color: var(--board-7-color); } .sidebar-section--boards { margin-top: 8px; } .sidebar-actions { padding: 12px; border-top: 1px solid var(--j13-border); margin-top: 8px; } .main-content { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; overflow: hidden; background: var(--j13-bg-workspace); } /* 主内容 + 右栏:与左栏同色,整块平铺 */ .content-workspace { flex: 1; display: flex; min-width: 0; min-height: 0; overflow: hidden; background: var(--j13-bg-surface); } .aside-panel { width: var(--j13-aside-w); flex-shrink: 0; border-left: 1px solid var(--j13-border-light); overflow-y: auto; padding: 0; display: flex; flex-direction: column; background: var(--j13-bg-workspace); } .aside-panel-inner { display: flex; flex-direction: column; gap: 10px; padding: 12px; flex: 1; } @media (max-width: 1100px) { .aside-panel { display: none; } } @media (max-width: 768px) { .app-frame { border-left: none; border-right: none; } .sidebar { display: none; } .header-inner { padding: 0 12px; gap: 10px; } .header-search-wrap { max-width: none; } .header-compose-btn { width: 34px; padding: 0; justify-content: center; } .feed-banner-row { flex-direction: row; gap: 10px; } .board-grid { flex-wrap: nowrap; overflow-x: auto; padding: 8px 12px; scrollbar-width: none; } .board-grid::-webkit-scrollbar { display: none; } } .page-wrap { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; scrollbar-width: none; -ms-overflow-style: none; padding: 12px; } .feed-panel { flex: 1; min-height: 0; display: flex; flex-direction: column; border: 1px solid var(--j13-border-light); border-radius: 12px; background: var(--j13-bg-block); box-shadow: var(--j13-shadow-card); overflow: hidden; } .page-wrap::-webkit-scrollbar { display: none; } .virtual-list-wrap, .post-list-scroll { flex: 1; overflow: auto; min-height: 0; scrollbar-width: none; -ms-overflow-style: none; } .virtual-list-wrap::-webkit-scrollbar, .post-list-scroll::-webkit-scrollbar { display: none; } .feed-list-footer { display: flex; justify-content: center; align-items: center; padding: 16px 12px; } .feed-list-footer--end { font-size: 12px; color: var(--color-text-3); padding: 10px 12px; } .feed-list-footer--history { flex-direction: column; gap: 10px; } .feed-list-footer__hint { margin: 0; font-size: 12px; color: var(--color-text-3); } .page-inner { padding: 20px 24px; max-width: 720px; } .page-inner-wide { padding: 20px 24px; } .page-title { font-size: 20px; font-weight: 600; margin: 0 0 4px; } .page-desc { font-size: 13px; color: var(--color-text-3); margin: 0 0 20px; } .content-surface { background: var(--j13-bg-block); border: 1px solid var(--j13-border-light); border-radius: 12px; box-shadow: var(--j13-shadow-soft); overflow: hidden; } .feed-panel .content-surface { background: transparent; border: none; border-radius: 0; box-shadow: none; } .section-card { background: var(--j13-bg-block); border: 1px solid var(--j13-border-light); border-radius: 12px; box-shadow: var(--j13-shadow-soft); padding: 20px; margin-bottom: 16px; } .section-card-title { font-size: 15px; font-weight: 600; margin: 0 0 16px; padding-bottom: 12px; border-bottom: 1px solid var(--j13-border-light); } .feed-top { flex-shrink: 0; border-bottom: 1px solid var(--j13-border-light); background: var(--j13-bg-block); position: relative; } .feed-top::after { content: ''; position: absolute; left: 16px; right: 16px; bottom: 0; height: 1px; background: linear-gradient(90deg, var(--j13-green) 0%, transparent 55%); opacity: 0.35; pointer-events: none; } @media (min-width: 900px) { .feed-top:not(:has(.feed-head--solo)) { display: flex; align-items: center; gap: 16px; padding: 6px 16px; } .feed-top:not(:has(.feed-head--solo)) .feed-head { padding: 0; flex-shrink: 0; } .feed-top:not(:has(.feed-head--solo)) .feed-toolbar { padding: 0; flex: 1; min-width: 0; } } .feed-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 16px 6px; } .feed-head--solo { padding-bottom: 8px; } .feed-head__title { display: flex; align-items: baseline; gap: 10px; min-width: 0; flex: 1; } .feed-head h2 { margin: 0; font-size: 15px; font-weight: 600; white-space: nowrap; } .feed-head__meta { font-size: 12px; color: var(--color-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .feed-head__stats { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; } .feed-stat-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px; font-size: 11px; color: var(--color-text-3); background: var(--j13-bg-block-muted); white-space: nowrap; } .feed-stat-chip svg { width: 12px; height: 12px; color: var(--j13-green); opacity: 0.85; } .feed-stat-chip strong { color: var(--j13-green); font-weight: 600; } .feed-head__meta strong { color: var(--j13-green); font-weight: 600; } .feed-head__dot { margin: 0 4px; opacity: 0.55; } .feed-head__clear { flex-shrink: 0; border: none; background: transparent; padding: 0; font-size: 12px; color: var(--j13-green); cursor: pointer; font-family: inherit; } .feed-head__clear:hover { text-decoration: underline; } .feed-toolbar { display: flex; align-items: center; gap: 10px; padding: 0 16px 8px; } .feed-toolbar__count { flex-shrink: 0; font-size: 12px; color: var(--color-text-3); white-space: nowrap; } /* 兼容旧类名,避免其他页面引用失效 */ .feed-banner { padding: 8px 16px; border-bottom: 1px solid var(--j13-border-light); } .feed-banner-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .feed-banner-title { flex: 1; min-width: 0; } .feed-banner h2 { margin: 0; font-size: 15px; font-weight: 600; } .feed-banner p { margin: 0; font-size: 12px; color: var(--color-text-3); line-height: 1.45; } .feed-stats { display: flex; flex-wrap: wrap; gap: 8px 12px; margin-top: 6px; font-size: 12px; color: var(--color-text-3); } .feed-stats strong { color: var(--j13-green); font-weight: 600; } .feed-action-slot { display: inline-block; width: 88px; height: 28px; border-radius: 4px; background: var(--color-fill-3); } .feed-actions { min-height: 28px; } .mobile-board-bar { display: none; padding: 8px 12px; gap: 8px; overflow-x: auto; border-bottom: 1px solid var(--j13-border); background: var(--j13-bg-surface); } @media (max-width: 768px) { .mobile-board-bar { display: flex; } } .board-chip { flex-shrink: 0; padding: 4px 12px; border-radius: 16px; font-size: 13px; border: 1px solid var(--j13-border-light); background: var(--j13-bg-block); cursor: pointer; } .board-chip.active { background: var(--j13-green-bg); border-color: transparent; color: var(--j13-green); font-weight: 600; } .board-chip.active.board-chip--0 { background: var(--board-0-bg); color: var(--board-0-color); } .board-chip.active.board-chip--1 { background: var(--board-1-bg); color: var(--board-1-color); } .board-chip.active.board-chip--2 { background: var(--board-2-bg); color: var(--board-2-color); } .board-chip.active.board-chip--3 { background: var(--board-3-bg); color: var(--board-3-color); } .board-chip.active.board-chip--4 { background: var(--board-4-bg); color: var(--board-4-color); } .board-chip.active.board-chip--5 { background: var(--board-5-bg); color: var(--board-5-color); } .board-chip.active.board-chip--6 { background: var(--board-6-bg); color: var(--board-6-color); } .board-chip.active.board-chip--7 { background: var(--board-7-bg); color: var(--board-7-color); } .board-grid { display: flex; flex-wrap: wrap; gap: 8px; padding: 10px 20px; border-bottom: 1px solid var(--j13-border-light); } /* 帖子排序栏:与左侧栏 active 样式保持一致 */ .feed-sort-bar { display: flex; align-items: center; gap: 2px; flex: 1; min-width: 0; overflow-x: auto; scrollbar-width: none; } .feed-sort-bar::-webkit-scrollbar { display: none; } .feed-sort-tab { display: inline-flex; align-items: center; gap: 5px; height: 28px; padding: 0 10px; border: none; border-radius: 6px; background: transparent; color: var(--color-text-2); font-family: inherit; font-size: 12px; cursor: pointer; flex-shrink: 0; white-space: nowrap; transition: background 0.15s, color 0.15s; } .feed-sort-tab:hover { background: var(--j13-bg-block-muted); color: var(--color-text-1); } .feed-sort-tab.active { background: var(--j13-green-bg); color: var(--j13-green); font-weight: 600; } .feed-sort-tab svg { width: 14px; height: 14px; flex-shrink: 0; } @media (max-width: 768px) { .feed-head { flex-wrap: wrap; padding: 8px 12px 6px; } .feed-head__meta, .feed-head__stats { display: none; } .feed-toolbar { padding: 0 12px 8px; } .page-wrap { padding: 0; } .feed-panel { border: none; border-radius: 0; box-shadow: none; } } .board-grid-empty { padding: 20px; border-bottom: 1px solid var(--j13-border-light); } .board-tab { display: flex; align-items: center; gap: 6px; height: 36px; max-width: 220px; padding: 0 14px; border: 1px solid var(--j13-border-light); border-radius: 8px; background: var(--j13-bg-block); cursor: pointer; transition: border-color 0.15s, background 0.15s; font-family: inherit; color: inherit; flex-shrink: 0; } .board-tab:hover { border-color: var(--j13-green-light, #7cb87c); background: var(--j13-bg-block-muted); } .board-tab.active { border-color: var(--j13-green); background: color-mix(in srgb, var(--j13-green) 10%, var(--j13-bg-block)); } .board-tab-icon { font-size: 14px; color: var(--j13-green); line-height: 1; flex-shrink: 0; } .board-tab-name { font-size: 13px; font-weight: 500; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; } .board-tab-count { flex-shrink: 0; min-width: 18px; padding: 0 6px; height: 20px; line-height: 20px; font-size: 11px; text-align: center; border-radius: 10px; background: var(--color-fill-2); color: var(--color-text-3); } .board-tab.active .board-tab-count { background: color-mix(in srgb, var(--j13-green) 20%, transparent); color: var(--j13-green); } .board-tab--skeleton { width: 140px; border-color: transparent; background: linear-gradient(90deg, var(--color-fill-2) 25%, var(--color-fill-3) 50%, var(--color-fill-2) 75%); background-size: 200% 100%; animation: board-skeleton-shimmer 1.2s ease-in-out infinite; pointer-events: none; } .board-grid--skeleton { pointer-events: none; } @keyframes board-skeleton-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } .post-list-bar { display: flex; justify-content: space-between; padding: 10px 20px; font-size: 13px; color: var(--color-text-3); border-bottom: 1px solid var(--j13-border-light); } .post-row { display: flex; align-items: flex-start; gap: 12px; padding: 12px 20px; border-bottom: 1px solid var(--j13-border-light); cursor: pointer; transition: background 0.15s, box-shadow 0.15s; position: relative; } .post-row::before { content: ''; position: absolute; left: 0; top: 8px; bottom: 8px; width: 3px; border-radius: 0 3px 3px 0; background: var(--j13-green); opacity: 0; transition: opacity 0.15s; } .post-row:hover { background: var(--j13-bg-block-accent); } .post-row:hover::before { opacity: 1; } .post-row:hover .post-title { color: var(--j13-green); } .post-avatar { width: 36px; height: 36px; border-radius: 50%; background: var(--j13-green); color: #fff; font-size: 14px; font-weight: 600; display: flex; align-items: center; justify-content: center; flex-shrink: 0; overflow: hidden; box-shadow: 0 0 0 2px var(--j13-bg-block), 0 0 0 3px var(--j13-border); transition: box-shadow 0.15s; } .post-row:hover .post-avatar { box-shadow: 0 0 0 2px var(--j13-bg-block), 0 0 0 3px var(--j13-green); } .post-avatar img { width: 100%; height: 100%; object-fit: cover; } .post-body { flex: 1; min-width: 0; } .post-title { font-size: 14px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 4px; color: var(--color-text-1); transition: color 0.15s; } .post-pinned-icon { display: inline-block; vertical-align: -0.15em; flex-shrink: 0; color: #e53935; stroke-width: 1.5; } .post-meta { font-size: 12px; color: var(--color-text-3); display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } .post-stats { display: flex; gap: 8px; flex-shrink: 0; padding-top: 2px; } .post-stat { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 999px; font-size: 11px; color: var(--color-text-3); background: var(--j13-bg-block-muted); transition: background 0.15s, color 0.15s; } .post-stat svg { width: 12px; height: 12px; flex-shrink: 0; } .post-row:hover .post-stat { background: var(--j13-green-bg); color: var(--j13-green); } .post-stat--zero { opacity: 0.55; } /* 板块色标 Badge */ .board-badge { display: inline-flex; align-items: center; padding: 1px 7px; border-radius: 4px; font-size: 11px; font-weight: 600; line-height: 1.5; white-space: nowrap; } .board-badge--0 { background: var(--board-0-bg); color: var(--board-0-color); } .board-badge--1 { background: var(--board-1-bg); color: var(--board-1-color); } .board-badge--2 { background: var(--board-2-bg); color: var(--board-2-color); } .board-badge--3 { background: var(--board-3-bg); color: var(--board-3-color); } .board-badge--4 { background: var(--board-4-bg); color: var(--board-4-color); } .board-badge--5 { background: var(--board-5-bg); color: var(--board-5-color); } .board-badge--6 { background: var(--board-6-bg); color: var(--board-6-color); } .board-badge--7 { background: var(--board-7-bg); color: var(--board-7-color); } /* 板块管理:图标 / 色标选择器 */ .board-manage-dialog { max-width: 520px; } .board-appearance-picker__preview { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } .board-appearance-picker__preview-icon { width: 36px; height: 36px; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; background: var(--j13-bg-block-muted); } .board-appearance-picker__preview-icon svg { width: 20px; height: 20px; } .board-appearance-picker__preview-hint { font-size: 12px; color: var(--color-text-3); } .board-icon-grid { display: grid; grid-template-columns: repeat(8, 1fr); gap: 6px; } .board-icon-option { display: flex; align-items: center; justify-content: center; width: 100%; aspect-ratio: 1; border: 1px solid var(--j13-border-light); border-radius: 8px; background: var(--j13-bg-block); color: var(--color-text-2); cursor: pointer; transition: border-color 0.15s, background 0.15s, color 0.15s; } .board-icon-option svg { width: 18px; height: 18px; } .board-icon-option:hover { border-color: var(--j13-green); background: var(--j13-bg-block-muted); } .board-icon-option--active { border-color: var(--j13-green); background: var(--j13-green-bg); color: var(--j13-green); } .board-icon-option__auto { font-size: 12px; font-weight: 700; color: var(--color-text-3); } .board-color-grid { display: flex; flex-wrap: wrap; gap: 8px; } .board-color-option { width: 28px; height: 28px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; flex-shrink: 0; transition: transform 0.12s, box-shadow 0.12s; } .board-color-option:hover { transform: scale(1.08); } .board-color-option--active { box-shadow: 0 0 0 2px var(--j13-bg-block), 0 0 0 3px var(--j13-green); } .board-color-option--auto { display: inline-flex; align-items: center; justify-content: center; background: var(--j13-bg-block-muted); font-size: 11px; font-weight: 700; color: var(--color-text-3); } .board-color-option--0 { background: var(--board-0-color); } .board-color-option--1 { background: var(--board-1-color); } .board-color-option--2 { background: var(--board-2-color); } .board-color-option--3 { background: var(--board-3-color); } .board-color-option--4 { background: var(--board-4-color); } .board-color-option--5 { background: var(--board-5-color); } .board-color-option--6 { background: var(--board-6-color); } .board-color-option--7 { background: var(--board-7-color); } .board-table-icon { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 8px; background: var(--j13-bg-block-muted); } .board-table-icon svg { width: 18px; height: 18px; } /* 帖子列表骨架屏 */ @keyframes skeleton-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } .skeleton { background: linear-gradient( 90deg, var(--j13-bg-block-muted) 0%, var(--j13-bg-block) 45%, var(--j13-bg-block-muted) 90% ); background-size: 200% 100%; animation: skeleton-shimmer 1.5s ease-in-out infinite; border-radius: 6px; } .post-row--skeleton { pointer-events: none; cursor: default; } .post-row--skeleton::before { display: none; } .post-row--skeleton:hover { background: transparent; } .skeleton--avatar { width: 36px; height: 36px; border-radius: 50%; flex-shrink: 0; } .skeleton--title { height: 14px; margin-bottom: 8px; max-width: 100%; } .skeleton-meta-row { display: flex; align-items: center; gap: 8px; } .skeleton--badge { width: 52px; height: 18px; border-radius: 4px; flex-shrink: 0; } .skeleton--meta { height: 12px; width: 56px; flex-shrink: 0; } .skeleton--meta-short { width: 72px; } .skeleton--stat { width: 36px; height: 22px; border-radius: 999px; } .empty-state { text-align: center; padding: 60px 24px; color: var(--color-text-3); } .empty-feed { text-align: center; padding: 48px 24px; color: var(--color-text-3); } .empty-feed-icon { font-size: 36px; margin-bottom: 8px; } .post-detail-loading { display: flex; align-items: center; justify-content: center; padding: 60px; flex: 1; } .post-detail-page { display: flex; flex-direction: column; min-height: 0; gap: 16px; padding: 16px 20px 24px; background: var(--j13-bg-workspace); } .post-detail-header { padding: 16px 20px 20px; background: var(--j13-bg-surface); border: 1px solid var(--j13-border-light); border-radius: 12px; box-shadow: var(--j13-shadow-card); flex-shrink: 0; } .post-detail-nav { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; } .post-detail-board-tag { margin: 0 !important; } .post-detail-head { margin-bottom: 12px; } .post-detail-title { font-size: 20px; font-weight: 600; margin: 0 0 12px; line-height: 1.45; word-break: break-word; } .post-detail-author-row { display: flex; align-items: center; gap: 10px; } .post-avatar-lg { width: 40px; height: 40px; font-size: 16px; } .post-detail-author-info { display: flex; flex-direction: column; gap: 2px; } .post-detail-author-name { font-size: 14px; font-weight: 600; color: var(--color-text-1); } .post-detail-meta-line { font-size: 12px; color: var(--color-text-3); display: flex; flex-wrap: wrap; align-items: center; gap: 4px; } .post-detail-locked-tag { display: inline-flex; align-items: center; gap: 3px; margin-left: 6px; color: hsl(var(--destructive)); font-size: 11px; } .post-detail-edit-hint { font-size: 12px; color: var(--color-text-3); align-self: center; } .post-revision-overlay { position: fixed; inset: 0; z-index: 100; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; padding: 16px; } .post-revision-overlay--fullscreen { padding: 0; } .post-revision-panel { background: hsl(var(--background)); border-radius: 12px; width: min(1080px, 100%); height: min(88vh, 900px); display: flex; flex-direction: column; box-shadow: 0 12px 48px rgba(0, 0, 0, 0.22); overflow: hidden; } .post-revision-panel--fullscreen { width: 100%; height: 100%; max-height: none; border-radius: 0; } .post-revision-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--j13-border-light); flex-shrink: 0; } .post-revision-head-left { display: flex; align-items: center; gap: 8px; min-width: 0; } .post-revision-head-left h3 { font-size: 15px; font-weight: 600; margin: 0; } .post-revision-head-sub { font-size: 12px; color: var(--color-text-3); padding-left: 8px; border-left: 1px solid var(--j13-border-light); } .post-revision-head-actions { display: flex; align-items: center; gap: 6px; flex-shrink: 0; } .post-revision-view-tabs { display: flex; gap: 2px; background: hsl(var(--muted)); border-radius: 8px; padding: 3px; } .post-revision-tab { display: inline-flex; align-items: center; gap: 4px; padding: 5px 10px; border: none; background: none; border-radius: 6px; font-size: 12px; color: var(--color-text-2); cursor: pointer; white-space: nowrap; } .post-revision-tab:hover { color: var(--color-text-1); } .post-revision-tab.active { background: hsl(var(--background)); color: var(--color-text-1); font-weight: 500; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); } .post-revision-icon-btn { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: none; background: none; border-radius: 8px; cursor: pointer; color: var(--color-text-3); } .post-revision-icon-btn:hover { background: hsl(var(--muted)); color: var(--color-text-1); } .post-revision-loading, .post-revision-empty { flex: 1; display: flex; align-items: center; justify-content: center; padding: 48px 24px; color: var(--color-text-3); font-size: 14px; } .post-revision-body { display: flex; flex: 1; min-height: 0; overflow: hidden; } .post-revision-sidebar { width: 260px; flex-shrink: 0; display: flex; flex-direction: column; border-right: 1px solid var(--j13-border-light); min-height: 0; } .post-revision-sidebar-label { padding: 10px 14px 6px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--color-text-3); } .post-revision-list { list-style: none; margin: 0; padding: 4px 8px; overflow-y: auto; flex: 1; min-height: 0; } .post-revision-item { display: flex; flex-direction: column; gap: 4px; width: 100%; text-align: left; padding: 10px 12px; border: none; background: none; border-radius: 8px; cursor: pointer; font-size: 13px; margin-bottom: 2px; } .post-revision-item:hover, .post-revision-item.active { background: hsl(var(--muted)); } .post-revision-item-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; } .post-revision-item-num { font-size: 11px; font-weight: 600; color: var(--color-text-3); } .post-revision-item-title { font-weight: 500; color: var(--color-text-1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .post-revision-item-meta { font-size: 11px; color: var(--color-text-3); } .post-revision-badge { font-size: 10px; padding: 1px 6px; border-radius: 4px; background: hsl(var(--primary) / 0.12); color: hsl(var(--primary)); font-weight: 500; } .post-revision-badge--none { background: hsl(var(--muted)); color: var(--color-text-3); } .post-revision-current { padding: 12px 14px; border-top: 1px solid var(--j13-border-light); background: hsl(var(--muted) / 0.4); flex-shrink: 0; } .post-revision-current-label { display: block; font-size: 11px; color: var(--color-text-3); margin-bottom: 4px; } .post-revision-current-title { font-size: 13px; font-weight: 500; color: var(--color-text-1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .post-revision-main { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; } .post-revision-main-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 20px; border-bottom: 1px solid var(--j13-border-light); flex-shrink: 0; } .post-revision-main-editor { font-size: 14px; font-weight: 600; color: var(--color-text-1); margin-right: 8px; } .post-revision-main-time { font-size: 12px; color: var(--color-text-3); } .post-revision-scroll { flex: 1; overflow-y: auto; overflow-x: hidden; min-height: 0; padding: 16px 20px 24px; -webkit-overflow-scrolling: touch; } /* Diff 视图 */ .revision-diff-view { display: flex; flex-direction: column; gap: 20px; } .revision-diff-section h4 { font-size: 12px; font-weight: 600; color: var(--color-text-3); text-transform: uppercase; letter-spacing: 0.04em; margin: 0 0 8px; } .revision-diff-block { padding: 12px 14px; background: hsl(var(--muted) / 0.35); border-radius: 8px; font-size: 14px; line-height: 1.6; word-break: break-word; } .revision-diff-inline del { background: hsl(0 70% 95%); color: hsl(0 60% 35%); text-decoration: line-through; border-radius: 2px; padding: 0 2px; } .revision-diff-inline ins { background: hsl(140 60% 93%); color: hsl(140 50% 28%); text-decoration: none; border-radius: 2px; padding: 0 2px; } .revision-diff-unchanged { color: var(--color-text-3); font-size: 13px; } .revision-diff-stats { display: flex; gap: 8px; margin-bottom: 8px; } .revision-diff-stat { font-size: 11px; padding: 2px 8px; border-radius: 4px; font-weight: 500; } .revision-diff-stat--add { background: hsl(140 60% 93%); color: hsl(140 50% 28%); } .revision-diff-stat--del { background: hsl(0 70% 95%); color: hsl(0 60% 35%); } .revision-diff-pre { margin: 0; font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, monospace; font-size: 13px; line-height: 1.55; border: 1px solid var(--j13-border-light); border-radius: 8px; overflow: hidden; } .revision-diff-line { display: flex; padding: 1px 0; white-space: pre-wrap; word-break: break-word; } .revision-diff-line--add { background: hsl(140 60% 95%); } .revision-diff-line--del { background: hsl(0 70% 96%); } .revision-diff-line--same { background: hsl(var(--background)); } .revision-diff-gutter { flex-shrink: 0; width: 24px; text-align: center; color: var(--color-text-3); user-select: none; font-size: 12px; } .revision-diff-line--add .revision-diff-gutter { color: hsl(140 50% 40%); } .revision-diff-line--del .revision-diff-gutter { color: hsl(0 60% 45%); } .revision-diff-text { flex: 1; padding-right: 12px; } .revision-diff-line--add .revision-diff-text { color: hsl(140 45% 22%); } .revision-diff-line--del .revision-diff-text { color: hsl(0 55% 30%); text-decoration: line-through; } /* 完整版本视图 */ .revision-full-view h4 { font-size: 18px; font-weight: 600; margin: 0 0 8px; line-height: 1.4; } .revision-full-tags { font-size: 13px; color: var(--color-text-3); margin: 0 0 16px; } @media (max-width: 768px) { .post-revision-overlay:not(.post-revision-overlay--fullscreen) { padding: 0; align-items: stretch; } .post-revision-panel:not(.post-revision-panel--fullscreen) { width: 100%; height: 100%; border-radius: 0; } .post-revision-head { flex-wrap: wrap; } .post-revision-head-actions { width: 100%; justify-content: space-between; } .post-revision-view-tabs { flex: 1; } .post-revision-tab-label { display: none; } .post-revision-tab.active .post-revision-tab-label { display: inline; } .post-revision-body { flex-direction: column; } .post-revision-sidebar { width: 100%; max-height: 180px; border-right: none; border-bottom: 1px solid var(--j13-border-light); } .post-revision-current { display: none; } } .post-detail-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; } .post-detail-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--j13-border-light); } .post-detail-content { font-size: 15px; line-height: 1.75; word-break: break-word; color: var(--color-text-1); } .post-detail-content h1, .post-detail-content h2, .post-detail-content h3, .post-detail-content h4, .post-detail-content h5, .post-detail-content h6 { font-weight: 700; line-height: 1.35; letter-spacing: -0.02em; color: var(--color-text-1); margin: 1.4em 0 0.55em; } .post-detail-content > :first-child, .post-detail-content h1:first-child, .post-detail-content h2:first-child, .post-detail-content h3:first-child, .post-detail-content h4:first-child, .post-detail-content h5:first-child, .post-detail-content h6:first-child { margin-top: 0; } .post-detail-content h1 { font-size: 1.85em; } .post-detail-content h2 { font-size: 1.55em; } .post-detail-content h3 { font-size: 1.3em; } .post-detail-content h4 { font-size: 1.12em; } .post-detail-content h5 { font-size: 1em; } .post-detail-content h6 { font-size: 0.92em; color: var(--color-text-2); font-weight: 600; } .post-detail-content ul, .post-detail-content ol { margin: 0 0 12px; padding-left: 1.6em; } .post-detail-content ul { list-style-type: disc; } .post-detail-content ol { list-style-type: decimal; } .post-detail-content li { display: list-item; margin-bottom: 4px; } .post-detail-content li > ul, .post-detail-content li > ol { margin-top: 4px; margin-bottom: 0; } .post-detail-content hr { margin: 24px 0; border: none; border-top: 1px solid var(--j13-border); } /* 会员专属内容区块 */ .post-detail-content members-only, .post-detail-content .post-members-only { display: block; margin: 20px 0; border-radius: 12px; overflow: hidden; } .post-detail-content .post-members-only--visible { border: 1px solid rgba(24, 160, 88, 0.35); background: linear-gradient(135deg, rgba(24, 160, 88, 0.06), rgba(24, 160, 88, 0.02)); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6); } .post-detail-content .post-members-only__badge { display: inline-flex; align-items: center; gap: 6px; margin: 12px 16px 0; padding: 4px 10px; border-radius: 20px; background: rgba(24, 160, 88, 0.12); color: var(--j13-green); font-size: 12px; font-weight: 600; letter-spacing: 0.02em; } .post-detail-content .post-members-only__badge-icon { display: inline-flex; align-items: center; justify-content: center; } .post-detail-content .post-members-only__body { padding: 12px 18px 18px; } .post-detail-content .post-members-only__body--empty { color: var(--color-text-4); font-style: italic; } .post-detail-content .post-members-only--locked { position: relative; border: 1px solid rgba(24, 160, 88, 0.22); background: var(--j13-bg-surface); } .post-detail-content .post-members-only__locked-wrap { position: relative; min-height: 160px; } .post-detail-content .post-members-only__badge--locked { position: relative; z-index: 2; background: rgba(24, 160, 88, 0.1); } .post-detail-content .post-members-only__preview { position: relative; z-index: 0; padding: 8px 20px 20px; filter: blur(5px); opacity: 0.45; user-select: none; pointer-events: none; } .post-detail-content .post-members-only__preview-line { height: 11px; margin-bottom: 12px; border-radius: 6px; background: linear-gradient(90deg, var(--j13-bg-block-muted) 0%, var(--color-fill-3) 100%); } .post-detail-content .post-members-only__preview-line--medium { width: 88%; } .post-detail-content .post-members-only__preview-line--short { width: 62%; margin-bottom: 0; } .post-detail-content .post-members-only__gate { position: absolute; inset: 0; z-index: 3; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 24px 20px 20px; gap: 6px; background: linear-gradient( 180deg, rgba(255, 255, 255, 0.55) 0%, rgba(255, 255, 255, 0.88) 38%, rgba(255, 255, 255, 0.92) 100% ); backdrop-filter: blur(3px); } .post-detail-content .post-members-only__gate-icon { width: 48px; height: 48px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--j13-bg-surface); color: var(--color-text-3); border: 1px solid var(--j13-border); margin-bottom: 4px; box-shadow: var(--j13-shadow-soft); } .post-detail-content .post-members-only__gate-title { margin: 0; font-size: 15px; font-weight: 600; color: var(--color-text-1); } .post-detail-content .post-members-only__gate-desc { margin: 0 0 8px; font-size: 13px; color: var(--color-text-3); line-height: 1.5; max-width: 280px; } .post-detail-content .post-members-only__gate-btn { padding: 8px 20px; border: none; border-radius: 8px; background: var(--j13-green); color: #fff; font-size: 13px; font-weight: 600; cursor: pointer; transition: background 0.15s, transform 0.1s; } .post-detail-content .post-members-only__gate-btn:hover { background: var(--j13-green-hover); transform: translateY(-1px); } .post-detail-content .post-members-only__gate-alt { margin-top: 4px; font-size: 12px; color: var(--color-text-3); } .post-detail-content .post-members-only__gate-link { padding: 0; border: none; background: none; color: var(--j13-green); font-size: 12px; font-weight: 600; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } .post-detail-content .post-members-only__gate-link:hover { color: var(--j13-green-hover); } .dark .post-detail-content .post-members-only--visible { border-color: rgba(35, 195, 107, 0.35); background: linear-gradient(135deg, rgba(35, 195, 107, 0.1), rgba(35, 195, 107, 0.03)); box-shadow: none; } .dark .post-detail-content .post-members-only--locked { border-color: rgba(35, 195, 107, 0.25); background: var(--j13-bg-surface); } .dark .post-detail-content .post-members-only__gate { background: linear-gradient( 180deg, rgba(24, 24, 27, 0.5) 0%, rgba(24, 24, 27, 0.82) 38%, rgba(24, 24, 27, 0.9) 100% ); } .dark .post-detail-content .post-members-only__preview-line { background: linear-gradient(90deg, var(--j13-bg-block-muted) 0%, rgba(255, 255, 255, 0.08) 100%); } .article-editor-tools-members { display: inline-flex; align-items: center; gap: 6px; margin-left: 4px; } .article-editor-tools-sep { display: inline-block; width: 1px; height: 20px; background: var(--j13-border-light); flex-shrink: 0; } .article-editor-tools .article-tool-btn--members { color: var(--j13-green); } .article-editor-tools .article-tool-btn--members:hover, .article-editor-tools .article-tool-btn--members.active { background: var(--j13-green-bg); color: var(--j13-green-hover); } .post-members-only__exit-btn, .post-members-only__unwrap-btn { margin-left: 4px; padding: 2px 8px; border: none; border-radius: 12px; background: rgba(24, 160, 88, 0.16); color: var(--j13-green); font-size: 11px; font-weight: 500; cursor: pointer; display: inline-flex; align-items: center; gap: 3px; transition: background 0.12s, color 0.12s; } .post-members-only__unwrap-btn { background: transparent; color: var(--color-text-3); } .post-members-only__exit-btn:hover { background: rgba(24, 160, 88, 0.28); color: var(--j13-green-hover); } .post-members-only__unwrap-btn:hover { background: var(--j13-bg-block-muted); color: var(--color-text-2); } .post-detail-content strong, .post-detail-content b { font-weight: 700; color: var(--color-text-1); } .post-detail-content em, .post-detail-content i { font-style: italic; } .post-detail-content img { max-width: 100%; border-radius: 6px; } .post-detail-content p { margin: 0 0 12px; } .post-detail-content p:last-child { margin-bottom: 0; } .post-detail-content a { color: var(--j13-green); } .post-detail-content blockquote { margin: 12px 0; padding: 8px 14px; border-left: 3px solid var(--j13-green); background: var(--j13-bg-block-muted); color: var(--color-text-3); border-radius: 0 6px 6px 0; } .post-detail-content pre, .post-detail-content code { font-family: ui-monospace, 'Cascadia Code', Consolas, monospace; font-size: 13px; } .post-detail-content pre { padding: 12px; background: var(--j13-bg-block-muted); border-radius: 6px; overflow-x: auto; } .post-detail-content code { padding: 2px 6px; background: var(--j13-bg-block-muted); border-radius: 4px; } /* 评论区 — 独立卡片板块 */ .comment-section { display: flex; flex-direction: column; background: var(--j13-bg-surface); border: 1px solid var(--j13-border-light); border-radius: 12px; box-shadow: var(--j13-shadow-card); flex-shrink: 0; overflow: hidden; } .comment-section-bar { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 20px 12px; font-size: 15px; font-weight: 600; flex-shrink: 0; border-bottom: 1px solid var(--j13-border-light); } /* 标题下方装饰横条,hover 时绿色高亮段向右延伸 */ .comment-section-bar::after { content: ''; position: absolute; bottom: -1px; left: 20px; width: 36px; height: 2px; background: var(--j13-green); border-radius: 1px; transition: width 0.35s cubic-bezier(0.4, 0, 0.2, 1); } .comment-section:hover .comment-section-bar::after { width: 52px; } .comment-section-title { color: var(--color-text-1); } .comment-section-count { font-size: 13px; font-weight: 400; color: var(--color-text-3); } .floor-jump-tools { display: flex; align-items: center; gap: 4px; } .comment-list-area { display: flex; flex-direction: column; } .comment-empty { text-align: center; padding: 48px 24px; color: var(--color-text-3); } .comment-empty-icon { font-size: 32px; margin-bottom: 8px; opacity: 0.6; } .comment-empty p { margin: 0; font-size: 13px; } /* 回复栏(旧版保留兼容) */ .reply-bar { padding: 12px 20px 16px; border-top: 1px solid var(--j13-border-light); background: var(--j13-bg-block-muted); flex-shrink: 0; } /* Waline 风格评论输入框 */ .comment-box-wrap { padding: 16px 20px; border-bottom: 1px solid var(--j13-border-light); background: var(--j13-bg-surface); flex-shrink: 0; } .comment-box-wrap.inline { padding: 12px 0 4px; border-bottom: none; background: transparent; } .comment-box-wrap.inline .comment-box-avatar, .comment-box-wrap.inline .comment-box-avatar-img, .comment-box-wrap.inline .comment-box-avatar-placeholder { width: 32px; height: 32px; font-size: 13px; } .waline-comment-reply-btn.cancel { color: #e74c3c; } .waline-comment-reply-btn.cancel:hover { color: #c0392b; } .comment-box { display: flex; gap: 12px; align-items: flex-start; } .comment-box-avatar { flex-shrink: 0; } .comment-box-avatar-img, .comment-box-avatar-placeholder { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; } .comment-box-avatar-placeholder { display: flex; align-items: center; justify-content: center; background: var(--j13-green); color: #fff; font-size: 16px; font-weight: 600; } .comment-box-avatar-placeholder.guest { background: var(--color-fill-3); color: var(--color-text-3); } .comment-box-main { flex: 1; min-width: 0; } .comment-box-reply-hint { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--j13-green); margin-bottom: 8px; } .comment-box-reply-cancel { border: none; background: none; color: var(--color-text-3); cursor: pointer; font-size: 12px; padding: 0; } .comment-box-reply-cancel:hover { color: var(--color-text-1); } .comment-box-input-wrap { position: relative; border: 1px solid var(--j13-border-light); border-radius: 10px; background: var(--j13-bg-block); transition: border-color 0.2s, background 0.2s; } .comment-box-input-wrap:focus-within { border-color: rgb(var(--primary-6)); } .comment-box-input-wrap.private-mode { background: var(--j13-bg-block-muted); border-color: var(--j13-border); } .comment-box-textarea { display: block; width: 100%; min-height: 72px; max-height: 200px; padding: 10px 48px 10px 12px; border: none; outline: none; resize: vertical; font-size: 14px; line-height: 1.6; font-family: inherit; color: var(--color-text-1); background: transparent; box-sizing: border-box; } .comment-box-textarea::placeholder { color: var(--color-text-4); } .comment-box-send { position: absolute; right: 8px; bottom: 8px; width: 32px; height: 32px; border: none; border-radius: 50%; background: #27c; color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 14px; transition: background 0.15s, opacity 0.15s; } .comment-box-send:hover:not(:disabled) { background: #1a9bd8; } .comment-box-send:disabled { opacity: 0.45; cursor: not-allowed; } .comment-box-guest-fields { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px 10px; margin-top: 8px; } .comment-box-guest-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; } .comment-box-guest-label { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--color-text-3); } .comment-box-guest-required, .comment-box-guest-optional { font-style: normal; font-size: 11px; line-height: 1; padding: 2px 6px; border-radius: 4px; } .comment-box-guest-required { color: rgb(var(--danger-6)); background: color-mix(in srgb, rgb(var(--danger-6)) 12%, transparent); } .comment-box-guest-optional { color: var(--color-text-4); background: var(--color-fill-2); } .comment-box-guest-hint { grid-column: 1 / -1; margin: 0; font-size: 12px; color: var(--color-text-4); line-height: 1.5; } .comment-box-guest-input { height: 32px; padding: 0 10px; border: 1px solid var(--j13-border); border-radius: 6px; font-size: 13px; color: var(--color-text-1); background: var(--color-bg-1); outline: none; transition: border-color 0.2s; } .comment-box-guest-input:focus { border-color: rgb(var(--primary-6)); } .comment-box-guest-input::placeholder { color: var(--color-text-4); } .comment-box-toolbar { display: flex; align-items: center; gap: 16px; margin-top: 8px; } .comment-box-owo { border: none; background: none; padding: 2px 6px; font-size: 13px; font-weight: 600; color: var(--color-text-2); cursor: pointer; border-radius: 4px; transition: background 0.15s, color 0.15s; } .comment-box-owo:hover, .comment-box-owo.active { background: rgba(39, 204, 255, 0.12); color: #27c; } .comment-box-private { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--color-text-3); cursor: pointer; user-select: none; } /* 表情面板 */ .emoji-picker { display: grid; grid-template-columns: repeat(12, 1fr); gap: 2px; margin-top: 8px; padding: 10px; border: 1px solid #dcdfe6; border-radius: 8px; background: var(--color-bg-1); max-height: 200px; overflow-y: auto; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); } .emoji-picker-item { border: none; background: none; font-size: 20px; line-height: 1; padding: 4px; cursor: pointer; border-radius: 4px; transition: background 0.1s; } .emoji-picker-item:hover { background: var(--color-fill-2); } /* Waline 嵌套评论列表 — 与正文共用 .page-wrap 滚动 */ .waline-comment { display: flex; gap: 12px; padding: 16px 20px; border-bottom: 1px solid var(--j13-border-light); } .waline-comment.nested { padding: 12px 0 0; border-bottom: none; } .waline-comment.highlight { animation: floor-highlight 2s ease-out; } @keyframes floor-highlight { 0%, 30% { background: var(--j13-green-bg); } 100% { background: transparent; } } .waline-replies { margin-top: 8px; } .waline-comment.nested .waline-comment-avatar { width: 32px; height: 32px; font-size: 13px; } .waline-comment-avatar { flex-shrink: 0; width: 40px; height: 40px; border-radius: 50%; overflow: hidden; background: var(--j13-green); color: #fff; font-size: 16px; font-weight: 600; display: flex; align-items: center; justify-content: center; } .waline-comment-avatar img { width: 100%; height: 100%; object-fit: cover; } .waline-comment-avatar.guest { background: var(--color-fill-3); color: var(--color-text-3); } .waline-comment-main { flex: 1; min-width: 0; } .waline-comment-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; } .waline-comment-author { font-size: 14px; font-weight: 600; color: var(--color-text-1); text-decoration: none; } a.waline-comment-author:hover { color: var(--j13-green); } .waline-comment-bubble { padding: 10px 14px; background: var(--j13-bg-block-muted); border-radius: 10px; font-size: 14px; line-height: 1.65; color: var(--color-text-1); word-break: break-word; } .waline-reply-at { display: block; color: #27c; font-weight: 600; margin-bottom: 4px; line-height: 1.5; } .waline-comment-private-mask { padding: 14px 16px; text-align: center; font-size: 13px; color: #999; line-height: 1.5; border-radius: 8px; background: repeating-linear-gradient( -45deg, #f6f6f6, #f6f6f6 8px, #ececec 8px, #ececec 16px ); } .waline-comment-bubble .floor-body { font-size: inherit; line-height: inherit; word-break: break-word; } .floor-body { font-size: 14px; line-height: 1.65; word-break: break-word; } .waline-comment-bubble .quote-block { margin: 6px 0; background: var(--j13-bg-block); } .waline-comment-meta { display: flex; align-items: center; gap: 16px; margin-top: 8px; font-size: 12px; color: var(--color-text-3); } .waline-comment-date { display: flex; align-items: center; gap: 4px; } .waline-comment-reply-btn { display: flex; align-items: center; gap: 4px; border: none; background: none; padding: 0; font-size: 12px; color: var(--color-text-3); cursor: pointer; transition: color 0.15s; } .waline-comment-reply-btn:hover { color: var(--j13-green); } @media (max-width: 768px) { .comment-box-wrap { padding: 12px 14px; } .comment-box-guest-fields { grid-template-columns: 1fr; } .emoji-picker { grid-template-columns: repeat(8, 1fr); } .waline-comment { padding: 12px 14px; } } .mention { color: var(--j13-green); font-weight: 600; } .quote-block { border-left: 3px solid var(--j13-green); padding: 8px 12px; margin: 6px 0 8px; background: var(--j13-bg-block-muted); font-size: 13px; color: var(--color-text-3); border-radius: 0 8px 8px 0; line-height: 1.5; white-space: pre-wrap; word-break: break-word; } .quote-block.clickable { cursor: pointer; transition: background 0.15s, border-color 0.15s; } .quote-block.clickable:hover { background: var(--j13-green-bg); border-left-color: var(--j13-green-hover); } @media (max-width: 768px) { .post-detail-page { padding: 12px 14px 20px; gap: 12px; } .post-detail-header { padding: 12px 14px 16px; } .post-detail-title { font-size: 17px; } .post-detail-actions { margin-top: 20px; padding-top: 16px; gap: 10px; } .comment-section-bar { padding: 12px 14px 10px; } .comment-section-bar::after { left: 14px; width: 32px; } .comment-section:hover .comment-section-bar::after { width: 46px; } } .widget-card { background: var(--j13-bg-block); border: 1px solid var(--j13-border-light); border-radius: 10px; box-shadow: var(--j13-shadow-soft); margin-bottom: 0; overflow: hidden; flex-shrink: 0; } .widget-card-head { display: flex; align-items: center; gap: 6px; padding: 10px 14px 8px; font-size: 13px; font-weight: 600; border-bottom: 1px solid var(--j13-border-light); background: var(--j13-bg-block-muted); color: var(--color-text-2); } .widget-card-icon { width: 15px; height: 15px; flex-shrink: 0; } .widget-card-icon--hot { color: #e74c3c; } .widget-card-icon--notice { color: #3498db; } .widget-card-icon--online { color: var(--j13-green); } .widget-head-count { color: var(--j13-green); font-weight: 700; } .widget-card-body { padding: 6px 14px 12px; } .widget-card--about { flex: 1; display: flex; flex-direction: column; border-bottom: none; min-height: 72px; } .widget-card--about .widget-card-body { flex: 1; display: flex; align-items: center; justify-content: center; text-align: center; padding: 20px 16px; } .widget-about-text { margin: 0; font-size: 12px; color: var(--color-text-3); line-height: 1.65; } .widget-about-text strong { display: block; margin-bottom: 4px; color: var(--j13-green); font-size: 13px; } .widget-item { padding: 7px 0; font-size: 13px; cursor: pointer; border-bottom: 1px solid var(--j13-border-light); display: flex; align-items: center; gap: 8px; border-radius: 4px; transition: background 0.12s, color 0.12s; } .widget-item:last-child { border-bottom: none; } .widget-item:hover { color: var(--j13-green); background: var(--j13-bg-block-accent); padding-left: 6px; padding-right: 6px; margin-left: -6px; margin-right: -6px; } .widget-item-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .widget-item-time { font-size: 11px; color: var(--color-text-4); flex-shrink: 0; } .widget-rank { min-width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center; border-radius: 4px; font-size: 11px; font-weight: 700; color: var(--color-text-3); background: var(--j13-bg-block-muted); flex-shrink: 0; } .widget-rank--1 { color: #fff; background: linear-gradient(135deg, #e74c3c, #c0392b); } .widget-rank--2 { color: #fff; background: linear-gradient(135deg, #e67e22, #d35400); } .widget-rank--3 { color: #fff; background: linear-gradient(135deg, #f1c40f, #e67e22); } .widget-empty { font-size: 13px; color: var(--color-text-3); padding: 8px 0; } .widget-empty--inline { padding: 0; } .widget-online-meta { font-size: 12px; color: var(--color-text-3); margin-bottom: 8px; } .widget-online-list { display: flex; flex-wrap: wrap; gap: 6px; } .widget-online-avatar { width: 28px; height: 28px; border-radius: 50%; background: var(--j13-green); color: #fff; font-size: 12px; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; flex-shrink: 0; } .widget-online-avatar img { width: 100%; height: 100%; object-fit: cover; } .profile-header { display: flex; align-items: center; gap: 16px; margin-bottom: 24px; } .profile-header-card { position: relative; display: flex; align-items: center; gap: 20px; padding: 24px; margin-bottom: 16px; background: var(--j13-bg-block); border: 1px solid var(--j13-border-light); border-radius: 12px; box-shadow: var(--j13-shadow-soft); transition: border-color 0.2s, box-shadow 0.2s; } .profile-header-card--dragover { border-color: color-mix(in srgb, var(--j13-green) 50%, var(--j13-border-light)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--j13-green) 15%, transparent); } .profile-drop-overlay { position: absolute; inset: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; border-radius: 12px; background: color-mix(in srgb, var(--j13-green) 12%, var(--j13-bg-block)); color: var(--j13-green); font-size: 14px; font-weight: 500; pointer-events: none; } .profile-avatar-btn { flex-shrink: 0; padding: 0; border: none; background: none; cursor: pointer; border-radius: 50%; line-height: 0; } .profile-avatar-btn:disabled { cursor: not-allowed; } .profile-avatar-lg { position: relative; width: 88px; height: 88px; border-radius: 50%; background: var(--j13-green); color: #fff; font-size: 32px; font-weight: 600; display: flex; align-items: center; justify-content: center; overflow: hidden; transition: box-shadow 0.2s; } .profile-avatar-lg--pending { box-shadow: 0 0 0 3px color-mix(in srgb, var(--j13-green) 40%, transparent); } .profile-avatar-lg img { width: 100%; height: 100%; object-fit: cover; } .profile-avatar-overlay { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.45); color: #fff; opacity: 0; transition: opacity 0.2s; } .profile-avatar-btn:hover .profile-avatar-overlay, .profile-avatar-btn:focus-visible .profile-avatar-overlay { opacity: 1; } .profile-avatar-btn:disabled .profile-avatar-overlay { opacity: 1; } .profile-header-info { flex: 1; min-width: 0; display: flex; align-items: center; justify-content: space-between; gap: 16px; } .profile-header-main { min-width: 0; } .profile-display-name { margin: 0 0 4px; font-size: 20px; font-weight: 600; line-height: 1.3; } .profile-username { font-size: 13px; color: var(--color-text-3); } .profile-avatar-tip { margin: 6px 0 0; font-size: 12px; color: var(--color-text-3); line-height: 1.4; } .profile-avatar-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .profile-avatar-hint { font-size: 13px; color: var(--color-text-3); white-space: nowrap; } .profile-form { display: flex; flex-direction: column; gap: 16px; } .profile-form-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 4px; } .profile-form-footer--end { justify-content: flex-end; } .profile-form-hint { font-size: 12px; color: var(--color-text-3); line-height: 1.4; } @media (max-width: 520px) { .profile-header-card { flex-direction: column; text-align: center; padding: 20px 16px; } .profile-header-info { flex-direction: column; align-items: center; } .profile-form-footer { flex-direction: column; align-items: stretch; } .profile-form-hint { text-align: center; } } /* 头像裁剪弹窗 */ .avatar-crop-dialog { max-width: 420px; padding: 20px; } .avatar-crop-stage { position: relative; width: 100%; height: 280px; border-radius: 8px; overflow: hidden; background: #111; } .avatar-crop-loading { display: flex; align-items: center; justify-content: center; height: 100%; } .avatar-crop-zoom { display: flex; align-items: center; gap: 12px; padding: 4px 0; } .avatar-crop-zoom-label { flex-shrink: 0; font-size: 13px; color: var(--color-text-3); width: 32px; } .avatar-crop-zoom input[type='range'] { flex: 1; height: 4px; accent-color: var(--j13-green); cursor: pointer; } .admin-entry-card { border-color: color-mix(in srgb, var(--j13-green) 25%, var(--j13-border)); background: var(--j13-bg-block-accent); } .auth-page { height: 100%; min-height: 100dvh; overflow-y: auto; display: flex; align-items: center; justify-content: center; background: var(--j13-bg-page); padding: 24px; } .auth-box { width: 100%; max-width: 400px; background: var(--j13-bg-surface); border: 1px solid var(--j13-border); border-radius: 12px; box-shadow: var(--j13-shadow-card); padding: 32px; } .auth-box .logo-mark { width: 48px; height: 48px; border-radius: 12px; background: var(--j13-green); color: #fff; font-size: 22px; font-weight: 700; display: flex; align-items: center; justify-content: center; margin: 0 auto 16px; } .auth-box h1 { text-align: center; font-size: 20px; margin: 0 0 4px; } .auth-box .subtitle { text-align: center; font-size: 13px; color: var(--color-text-3); margin-bottom: 24px; } /* 发帖页 — 沉浸式写作 */ .app-body--compose { background: var(--j13-bg-workspace); } .content-workspace--compose { background: var(--j13-bg-workspace); } .main-content--compose { overflow-y: auto; overflow-x: hidden; } .compose-page { flex: 1; display: flex; flex-direction: column; min-height: min(100%, 100vh - var(--j13-header-h)); overflow: visible; background: radial-gradient(ellipse 80% 50% at 50% -10%, var(--j13-green-bg), transparent), var(--j13-bg-workspace); } .compose-page--empty { align-items: center; justify-content: center; } .compose-empty-card { text-align: center; padding: 48px 40px; background: var(--j13-bg-surface); border: 1px solid var(--j13-border); border-radius: 16px; box-shadow: var(--j13-shadow-card); max-width: 400px; } .compose-empty-icon { width: 56px; height: 56px; margin: 0 auto 20px; border-radius: 14px; background: var(--j13-green-bg); color: var(--j13-green); font-size: 24px; display: flex; align-items: center; justify-content: center; } .compose-empty-card h2 { margin: 0 0 8px; font-size: 18px; font-weight: 600; } .compose-empty-card p { margin: 0 0 24px; font-size: 14px; color: var(--color-text-3); line-height: 1.5; } .compose-primary-btn, .compose-ghost-btn { padding: 10px 24px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; border: none; transition: background 0.15s, transform 0.1s; } .compose-primary-btn { background: var(--j13-green); color: #fff; } .compose-primary-btn:hover { background: var(--j13-green-hover); } .compose-ghost-btn { background: var(--j13-bg-block-muted); color: var(--color-text-2); } .compose-canvas { flex: 1; display: flex; flex-direction: column; min-height: min(100%, 100vh - var(--j13-header-h)); max-width: 1200px; width: 100%; margin: 0 auto; padding: 0 32px 32px; } .compose-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 0 12px; flex-shrink: 0; } .compose-back { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border: 1px solid var(--j13-border); border-radius: 8px; background: var(--j13-bg-surface); color: var(--color-text-2); font-size: 13px; cursor: pointer; transition: border-color 0.15s, color 0.15s, box-shadow 0.15s; box-shadow: var(--j13-shadow-soft); } .compose-back:hover { border-color: var(--j13-green); color: var(--j13-green); } .compose-publish-btn { display: inline-flex; align-items: center; gap: 8px; padding: 10px 22px; border: none; border-radius: 8px; background: linear-gradient(135deg, var(--j13-green), var(--j13-green-hover)); color: #fff; font-size: 14px; font-weight: 600; cursor: pointer; box-shadow: 0 2px 8px rgba(24, 160, 88, 0.3); transition: transform 0.1s, box-shadow 0.15s, opacity 0.15s; } .compose-publish-btn:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 4px 14px rgba(24, 160, 88, 0.35); } .compose-publish-btn:disabled { opacity: 0.65; cursor: not-allowed; } .compose-meta { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-bottom: 20px; flex-shrink: 0; flex-wrap: wrap; } .compose-board-pills { display: flex; flex-wrap: wrap; gap: 8px; } .compose-board-pill { padding: 6px 14px; border: 1px solid var(--j13-border); border-radius: 20px; background: var(--j13-bg-surface); color: var(--color-text-2); font-size: 13px; cursor: pointer; transition: all 0.15s; } .compose-board-pill:hover { border-color: var(--j13-green); color: var(--j13-green); } .compose-board-pill.active { background: var(--j13-green); border-color: var(--j13-green); color: #fff; font-weight: 500; } .compose-tags-field { display: flex; align-items: center; gap: 8px; padding: 6px 14px; border: 1px solid var(--j13-border); border-radius: 20px; background: var(--j13-bg-surface); min-width: 220px; transition: border-color 0.15s; } .compose-tags-field:focus-within { border-color: var(--j13-green); } .compose-tags-icon { color: var(--color-text-4); font-size: 14px; flex-shrink: 0; } .compose-tags-field input { flex: 1; border: none; background: transparent; outline: none; font-size: 13px; color: var(--color-text-1); min-width: 0; } .compose-tags-field input::placeholder { color: var(--color-text-4); } .compose-writing { flex: 1; display: flex; flex-direction: column; background: var(--j13-bg-surface); border: 1px solid var(--j13-border); border-radius: 16px; box-shadow: var(--j13-shadow-card); padding: 28px 32px 0; overflow: visible; } .compose-title { width: 100%; padding: 0; border: none; background: transparent; font-size: 32px; font-weight: 700; line-height: 1.3; letter-spacing: -0.02em; color: var(--color-text-1); outline: none; } .compose-title::placeholder { color: var(--color-text-4); } .compose-subtitle { margin-top: 8px; font-size: 13px; color: var(--color-text-3); } .compose-subtitle strong { color: var(--j13-green); font-weight: 500; } /* 文章编辑器 */ .article-editor { flex: 1; display: flex; flex-direction: column; margin-top: 24px; border-top: 1px solid var(--j13-border-light); } .article-editor-bar { position: sticky; top: 0; z-index: 30; display: flex; align-items: center; gap: 12px; margin: 0 -32px; padding: 10px 32px; flex-shrink: 0; flex-wrap: wrap; background: var(--j13-bg-surface); border-bottom: 1px solid var(--j13-border-light); box-shadow: 0 4px 12px rgba(15, 23, 42, 0.04); } /* 即时气泡提示(替代原生 title) */ .ui-tooltip { position: relative; display: inline-flex; } .ui-tooltip-bubble { position: absolute; z-index: 50; pointer-events: none; opacity: 0; visibility: hidden; width: max-content; background: var(--j13-bg-surface); border: 1px solid var(--j13-border); border-radius: 8px; box-shadow: var(--j13-shadow-card); transition: opacity 0.1s ease, transform 0.1s ease, visibility 0.1s; } .ui-tooltip-bubble--compact { padding: 5px 10px; } .ui-tooltip-bubble--rich { min-width: 148px; max-width: 220px; padding: 7px 12px; } .ui-tooltip-bubble__title { display: block; font-size: 12px; font-weight: 500; line-height: 1.4; color: var(--color-text-1); } .ui-tooltip-bubble--compact .ui-tooltip-bubble__title { white-space: nowrap; } .ui-tooltip-bubble__hint { display: block; margin-top: 3px; font-size: 11px; line-height: 1.45; color: var(--color-text-3); } .ui-tooltip-bubble--bottom { top: calc(100% + 8px); } .ui-tooltip-bubble--top { bottom: calc(100% + 8px); } .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom { left: 50%; transform: translateX(-50%) translateY(-2px); } .ui-tooltip-bubble--center.ui-tooltip-bubble--top { left: 50%; transform: translateX(-50%) translateY(2px); } .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom, .ui-tooltip-bubble--start.ui-tooltip-bubble--top { left: 0; transform: translateY(-2px); } .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom, .ui-tooltip-bubble--end.ui-tooltip-bubble--top { right: 0; left: auto; transform: translateY(-2px); } .ui-tooltip:hover .ui-tooltip-bubble, .ui-tooltip:focus-within .ui-tooltip-bubble { opacity: 1; visibility: visible; } .ui-tooltip:hover .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom, .ui-tooltip:focus-within .ui-tooltip-bubble--center.ui-tooltip-bubble--bottom { transform: translateX(-50%) translateY(0); } .ui-tooltip:hover .ui-tooltip-bubble--center.ui-tooltip-bubble--top, .ui-tooltip:focus-within .ui-tooltip-bubble--center.ui-tooltip-bubble--top { transform: translateX(-50%) translateY(0); } .ui-tooltip:hover .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom, .ui-tooltip:hover .ui-tooltip-bubble--start.ui-tooltip-bubble--top, .ui-tooltip:hover .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom, .ui-tooltip:hover .ui-tooltip-bubble--end.ui-tooltip-bubble--top, .ui-tooltip:focus-within .ui-tooltip-bubble--start.ui-tooltip-bubble--bottom, .ui-tooltip:focus-within .ui-tooltip-bubble--start.ui-tooltip-bubble--top, .ui-tooltip:focus-within .ui-tooltip-bubble--end.ui-tooltip-bubble--bottom, .ui-tooltip:focus-within .ui-tooltip-bubble--end.ui-tooltip-bubble--top { transform: translateY(0); } .article-editor-tools { display: flex; align-items: center; gap: 2px; flex-wrap: wrap; } .article-tool-btn { width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; border: none; border-radius: 6px; background: transparent; color: var(--color-text-2); font-size: 13px; cursor: pointer; transition: background 0.12s, color 0.12s; } .article-tool-btn:hover { background: var(--j13-bg-block-muted); color: var(--j13-green); } .article-tool-btn.active { background: rgba(24, 160, 88, 0.12); color: var(--j13-green); } .article-tool-btn strong { font-size: 12px; font-weight: 700; } .article-editor-body { flex: 1; display: flex; flex-direction: column; min-height: 280px; } /* 编辑面板 */ .article-editor-pane { display: flex; flex: 1; min-height: 280px; border: 1px solid var(--j13-border); border-radius: 10px; overflow: hidden; background: var(--j13-bg-block); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.65); } .article-editor-pane--source { min-height: 320px; } /* 编辑器选区:淡色高亮,避免浏览器默认深蓝 */ .article-editor-scroll ::selection, .article-editor-markdown-input::selection { background: color-mix(in srgb, var(--j13-green) 24%, #d6e8f0); color: inherit; } .article-prosemirror ::selection { background: color-mix(in srgb, var(--j13-green) 24%, #d6e8f0); color: inherit; } .article-prosemirror .ProseMirror-selectednode { outline: 2px solid color-mix(in srgb, var(--j13-green) 45%, transparent); outline-offset: 2px; } .dark .article-editor-scroll ::selection, .dark .article-editor-markdown-input::selection, .dark .article-prosemirror ::selection { background: color-mix(in srgb, var(--j13-green) 35%, #2a3f50); color: inherit; } .article-editor-scroll { flex: 1; min-width: 0; overflow: auto; background: var(--j13-bg-block); } .article-editor-content { flex: 1; display: flex; flex-direction: column; } .article-editor-content .tiptap, .article-prosemirror { flex: 1; min-height: 280px; padding: 14px 20px 20px; outline: none; } .article-prosemirror p.is-editor-empty:first-child::before { color: var(--color-text-4); content: attr(data-placeholder); float: left; height: 0; pointer-events: none; user-select: none; } /* 空文档占位段落不参与选区高亮,避免 Ctrl+A 后出现幽灵蓝条 */ .article-prosemirror p.is-editor-empty::selection, .article-prosemirror p.is-editor-empty *::selection { background: transparent; } .article-prosemirror.ProseMirror-focused p.is-editor-empty::selection { background: transparent; } .article-prosemirror a { color: var(--j13-green); text-decoration: underline; text-underline-offset: 2px; } .article-prosemirror img { max-width: 100%; height: auto; border-radius: 8px; margin: 12px 0; } .editor-members-only.post-members-only--visible { border: 1px solid rgba(24, 160, 88, 0.45); background: linear-gradient(135deg, rgba(24, 160, 88, 0.08), rgba(24, 160, 88, 0.02)); border-radius: 12px; overflow: hidden; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55); } .editor-members-only .post-members-only__badge { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin: 0; padding: 10px 14px; border-bottom: 1px dashed rgba(24, 160, 88, 0.28); border-radius: 0; background: rgba(24, 160, 88, 0.1); width: 100%; } .editor-members-only .post-members-only__body { padding: 14px 18px 18px; min-height: 96px; background: rgba(255, 255, 255, 0.45); } .dark .editor-members-only .post-members-only__body { background: rgba(0, 0, 0, 0.12); } .post-members-only__shortcut-hint { margin-left: auto; font-size: 11px; font-weight: 400; color: var(--color-text-3); } .editor-members-only { margin: 20px 0; } .editor-members-only--selected { box-shadow: 0 0 0 2px rgba(24, 160, 88, 0.35); } .article-editor-status { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0 16px; border-top: 1px solid var(--j13-border-light); font-size: 12px; color: var(--color-text-4); flex-shrink: 0; } .article-editor-status-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; min-width: 0; } .article-editor-status-sep { color: var(--color-text-4); opacity: 0.6; } .article-editor-status-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .article-editor-view-btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border: 1px solid var(--j13-border-light); border-radius: 8px; background: var(--j13-bg-block); color: var(--color-text-2); font-size: 12px; font-weight: 500; cursor: pointer; transition: background 0.12s, border-color 0.12s, color 0.12s; flex-shrink: 0; } .article-editor-view-btn:hover { border-color: var(--j13-green); color: var(--j13-green); background: rgba(24, 160, 88, 0.06); } .article-editor-view-btn.active { border-color: rgba(24, 160, 88, 0.45); color: var(--j13-green); background: rgba(24, 160, 88, 0.1); } .article-editor--fullscreen { position: fixed; inset: 0; z-index: 120; margin: 0 !important; padding: 0 32px 24px; background: var(--j13-bg-surface); border-top: none; } .article-editor--fullscreen .article-editor-bar { margin: 0; padding: 12px 0; } /* 全屏富文本:工具栏与编辑区同宽居中 */ .article-editor--fullscreen.article-editor--rich .article-editor-bar { width: 100%; max-width: var(--j13-article-read-w); margin: 0 auto; } .article-editor--fullscreen .article-editor-body { min-height: 0; flex: 1; } /* 全屏富文本:编辑区居中,宽度对齐帖子正文阅读区 */ .article-editor--fullscreen.article-editor--rich .article-editor-body { overflow-y: auto; padding: 20px 0 0; background: var(--j13-bg-workspace); } .article-editor--fullscreen.article-editor--rich .article-editor-pane { width: 100%; max-width: var(--j13-article-read-w); margin: 0 auto; min-height: calc(100vh - 176px); } .article-editor--fullscreen .article-editor-scroll, .article-editor--fullscreen .article-editor-content .tiptap, .article-editor--fullscreen .article-prosemirror { min-height: calc(100vh - 220px); } .article-editor--fullscreen .article-editor-markdown { min-height: calc(100vh - 176px); } .article-editor--fullscreen .article-editor-markdown-input, .article-editor--fullscreen .article-editor-markdown-preview, .article-editor--fullscreen .article-editor-pane--source { min-height: calc(100vh - 220px); } .article-editor-tools--markdown { display: flex; align-items: center; gap: 8px; } .article-editor-tools--markdown-hint { font-size: 12px; color: var(--color-text-3); } .article-link-dialog__footer { gap: 8px; } .article-editor-markdown { flex: 1; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 12px; min-height: 320px; } .article-editor-markdown-input { display: block; width: 100%; min-height: 100%; padding: 14px 16px 20px; border: none; outline: none; resize: none; font-family: ui-monospace, 'Cascadia Code', Consolas, monospace; font-size: 13px; line-height: 1.65; color: var(--color-text-1); background: transparent; } .article-editor-markdown-preview { display: flex; flex-direction: column; min-height: 320px; background: var(--j13-bg-surface); border: 1px solid var(--j13-border); border-radius: 10px; overflow: hidden; } .article-editor-markdown-preview-label { padding: 8px 16px; border-bottom: 1px solid var(--j13-border-light); font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--color-text-4); flex-shrink: 0; } .article-editor-markdown-preview-body { flex: 1; padding: 14px 16px; overflow-y: auto; } @media (max-width: 768px) { .compose-canvas { padding: 0 16px; } .compose-writing { padding: 20px 16px 0; border-radius: 12px; } .article-editor--fullscreen { padding: 0 16px 16px; } .article-editor--fullscreen .article-editor-bar { margin: 0; padding: 10px 0; } .article-editor-markdown { grid-template-columns: 1fr; grid-template-rows: minmax(240px, 1fr) minmax(240px, 1fr); } .article-editor-pane--source { min-height: 240px; } .article-editor--fullscreen.article-editor--rich .article-editor-pane { max-width: none; margin: 0; } .article-editor-bar { margin: 0 -16px; padding: 10px 16px; } .article-editor-status { flex-wrap: wrap; align-items: flex-start; } .article-editor-status-actions { width: 100%; justify-content: flex-end; } .compose-title { font-size: 24px; } .compose-meta { flex-direction: column; align-items: stretch; } .compose-tags-field { min-width: 0; } .compose-header { padding-top: 12px; } .compose-publish-btn span { display: none; } } /* 路由懒加载占位 */ .page-loader { display: flex; flex: 1; align-items: center; justify-content: center; gap: 8px; min-height: 240px; color: var(--j13-green); font-size: 14px; } .page-loader__dot { width: 8px; height: 8px; border-radius: 50%; background: currentColor; animation: page-loader-pulse 0.9s ease-in-out infinite; } @keyframes page-loader-pulse { 0%, 100% { opacity: 0.35; transform: scale(0.85); } 50% { opacity: 1; transform: scale(1); } } /* ========== React 管理后台 ========== */ .admin-shell { min-height: 100vh; background: hsl(var(--background)); } .admin-topbar { display: flex; align-items: center; justify-content: space-between; height: 56px; padding: 0 20px; border-bottom: 1px solid var(--j13-border); background: hsl(var(--card)); } .admin-topbar-brand { display: flex; align-items: center; gap: 10px; } .admin-topbar-mark { width: 32px; height: 32px; border-radius: 8px; background: var(--j13-green); color: #fff; display: flex; align-items: center; justify-content: center; font-weight: 700; } .admin-topbar-title { font-size: 14px; font-weight: 600; line-height: 1.2; } .admin-topbar-sub { font-size: 12px; color: hsl(var(--muted-foreground)); } .admin-topbar-actions { display: flex; align-items: center; gap: 12px; } .admin-topbar-user { font-size: 13px; color: hsl(var(--muted-foreground)); } .admin-link-btn { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--j13-green); background: none; border: none; cursor: pointer; } .admin-body { display: flex; height: calc(100vh - 56px); overflow: hidden; } .admin-sidebar { width: 200px; flex-shrink: 0; padding: 16px 10px; border-right: 1px solid var(--j13-border); background: hsl(var(--card)); overflow-y: auto; } .admin-nav-item { display: flex; align-items: center; gap: 8px; width: 100%; padding: 9px 12px; margin-bottom: 2px; border-radius: 8px; font-size: 13px; color: hsl(var(--muted-foreground)); text-decoration: none; transition: background .15s, color .15s; } .admin-nav-item:hover { background: var(--j13-green-bg); color: var(--j13-green); } .admin-nav-item.active { background: var(--j13-green-bg); color: var(--j13-green); font-weight: 600; } .admin-main { flex: 1; min-width: 0; min-height: 0; padding: 24px; overflow-y: auto; } .admin-page-head { margin-bottom: 20px; } .admin-page-head h1 { font-size: 22px; font-weight: 700; margin-bottom: 4px; } .admin-page-head p { font-size: 13px; color: hsl(var(--muted-foreground)); } .admin-stat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; margin-bottom: 20px; } .admin-stat-card { padding: 16px; border-radius: 10px; border: 1px solid var(--j13-border); background: hsl(var(--card)); } .admin-stat-value { font-size: 24px; font-weight: 700; color: var(--j13-green); } .admin-stat-label { font-size: 12px; color: hsl(var(--muted-foreground)); margin-top: 4px; } .admin-card { border: 1px solid var(--j13-border); border-radius: 10px; background: hsl(var(--card)); margin-bottom: 16px; } .admin-card-body { padding: 16px 20px 20px; } .admin-card-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--j13-border); font-weight: 600; font-size: 14px; } .admin-card-desc { padding: 12px 16px 0; font-size: 13px; color: hsl(var(--muted-foreground)); line-height: 1.5; } .admin-card .admin-card-desc + button { margin: 12px 16px 16px; } .admin-form-row { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; padding: 12px 16px 16px; font-size: 13px; } .admin-form-row label { color: hsl(var(--muted-foreground)); white-space: nowrap; } /* ========== 系统设置页 ========== */ .admin-settings-page { max-width: 880px; padding-bottom: 24px; } .admin-settings-tabs { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 20px; padding-bottom: 0; border-bottom: 1px solid var(--j13-border); } .admin-settings-tab { display: inline-flex; align-items: center; gap: 6px; padding: 10px 14px; margin-bottom: -1px; border: none; border-bottom: 2px solid transparent; background: none; font-size: 13px; font-weight: 500; color: hsl(var(--muted-foreground)); cursor: pointer; transition: color .15s, border-color .15s; } .admin-settings-tab:hover { color: hsl(var(--foreground)); } .admin-settings-tab.active { color: var(--j13-green); border-bottom-color: var(--j13-green); } .admin-settings-panel { display: flex; flex-direction: column; gap: 0; } .admin-settings-card { margin-bottom: 0; } .admin-settings-card-badge { font-size: 12px; font-weight: 500; color: hsl(var(--muted-foreground)); padding: 2px 8px; border-radius: 999px; background: hsl(var(--muted) / 0.45); } .admin-settings-sections { display: flex; flex-direction: column; gap: 20px; } .admin-settings-section-head h3 { font-size: 13px; font-weight: 600; margin-bottom: 2px; } .admin-settings-section-head p { font-size: 12px; color: hsl(var(--muted-foreground)); line-height: 1.45; margin-bottom: 10px; } .admin-settings-table { border: 1px solid var(--j13-border); border-radius: 8px; overflow: hidden; background: hsl(var(--background)); } .admin-settings-row { display: grid; grid-template-columns: 140px 140px 1fr; align-items: center; gap: 8px 16px; padding: 10px 14px; border-bottom: 1px solid var(--j13-border); font-size: 13px; } .admin-settings-row:last-child { border-bottom: none; } .admin-settings-row-label { color: hsl(var(--foreground)); font-weight: 500; } .admin-settings-row-input { display: flex; align-items: center; gap: 8px; } .admin-settings-input { width: 88px; height: 32px; padding-top: 0; padding-bottom: 0; } .admin-settings-unit { font-size: 12px; color: hsl(var(--muted-foreground)); white-space: nowrap; } .admin-settings-row-hint { font-size: 12px; color: hsl(var(--muted-foreground)); } .admin-settings-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; margin-top: 16px; padding: 14px 16px; border: 1px solid var(--j13-border); border-radius: 10px; background: hsl(var(--card)); } .admin-settings-bar p { margin: 0; font-size: 12px; color: hsl(var(--muted-foreground)); line-height: 1.45; max-width: 420px; } .admin-settings-filter-body { display: flex; flex-direction: column; gap: 12px; } .admin-settings-filter-tip { margin: 0; font-size: 12px; color: hsl(var(--muted-foreground)); line-height: 1.5; } .admin-settings-filter-tip code, .admin-settings-backup-name code { font-size: 11px; background: hsl(var(--muted)); padding: 1px 5px; border-radius: 4px; } .admin-settings-filter-textarea { min-height: 320px; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 13px; line-height: 1.55; resize: vertical; } .admin-settings-info { display: flex; flex-direction: column; gap: 0; } .admin-settings-info-row { display: grid; grid-template-columns: 88px 1fr; gap: 12px 16px; padding: 10px 0; border-bottom: 1px solid var(--j13-border); font-size: 13px; } .admin-settings-info-row:last-child { border-bottom: none; padding-bottom: 0; } .admin-settings-info-row:first-child { padding-top: 0; } .admin-settings-info-row dt { color: hsl(var(--muted-foreground)); } .admin-settings-info-row dd { margin: 0; word-break: break-all; } .admin-settings-info-row dd code { font-size: 12px; background: hsl(var(--muted)); padding: 2px 6px; border-radius: 4px; } .admin-settings-backup-body { display: flex; flex-direction: column; align-items: flex-start; gap: 10px; } .admin-settings-backup-body > p { margin: 0; font-size: 13px; color: hsl(var(--muted-foreground)); line-height: 1.5; } .admin-settings-backup-name { font-size: 12px !important; } @media (max-width: 640px) { .admin-settings-row { grid-template-columns: 1fr; gap: 6px; padding: 12px 14px; } .admin-settings-row-hint { padding-left: 0; } .admin-settings-bar { flex-direction: column; align-items: stretch; } .admin-settings-bar p { max-width: none; } .admin-settings-info-row { grid-template-columns: 1fr; gap: 4px; } } .admin-table { width: 100%; border-collapse: collapse; font-size: 13px; } .admin-table th, .admin-table td { padding: 10px 14px; text-align: left; border-bottom: 1px solid var(--j13-border); } .admin-table th { font-weight: 600; color: hsl(var(--muted-foreground)); background: hsl(var(--muted) / 0.3); } .admin-table tr:last-child td { border-bottom: none; } .admin-empty { padding: 32px; text-align: center; color: hsl(var(--muted-foreground)); font-size: 13px; } .admin-text-link { background: none; border: none; padding: 0; color: var(--j13-green); cursor: pointer; font-size: inherit; } .admin-text-link:hover { text-decoration: underline; } .admin-search-bar { display: flex; gap: 8px; margin-bottom: 16px; max-width: 480px; } .admin-pagination { display: flex; align-items: center; justify-content: center; gap: 12px; padding: 12px; border-top: 1px solid var(--j13-border); font-size: 13px; } .admin-dl { padding: 16px; display: grid; grid-template-columns: 120px 1fr; gap: 10px 16px; font-size: 13px; } .admin-dl dt { color: hsl(var(--muted-foreground)); } .admin-dl dd code { font-size: 12px; background: hsl(var(--muted)); padding: 2px 6px; border-radius: 4px; }