/* ========================================================================== 评论后台样式 —— 对齐 post.usj.cc(写作后台)的视觉语言 色板与度量照抄 write-server/src/app/globals.css 原则:可读性优先 · 暖白底 + 深蓝墨字(不是纯黑,降低长时间阅读的刺眼感) · 1px 细边框代替投影,只有弹层才用阴影 · 字号偏小但层级明确:11 / 12 / 13 / 15 / 22 · 圆角克制:6px(控件)/ 8px(卡片)/ 16px(登录卡) · 无装饰性动效,只保留 hover 的颜色过渡 ========================================================================== */ /* ---------------------------------------------------------- 色板 */ /* 参考 EWD 后台:白色侧栏 + 中性浅灰内容底 + 蓝色点缀 */ :root{ color-scheme: light; --bg:#f5f8f6; /* 内容区底 · 带一点绿意的浅灰 */ --surface:#edf2ee; /* 次级面 · hover / 代码底 */ --card:#ffffff; /* 卡片 / 侧栏 · 纯白 */ --text:#253830; /* 正文 · 深灰绿 */ --muted:#8b9a91; /* 次要文字 */ --line:#e3eae5; /* 分隔线 */ --accent:#2f9e63; /* 主色 · 清新绿 */ --accent-hover:#288a56; --danger:#d75a4a; --danger-hover:#c45151; --success:#39b86f; --warning:#c09a46; --on-accent:#fff; --accent-soft:rgba(47,158,99,.09); --accent-line:rgba(47,158,99,.20); --danger-soft:rgba(215,90,74,.10); --danger-line:rgba(215,90,74,.24); --ok-soft:rgba(57,184,111,.12); --pend-fg:#92400e; --pend-bg:#fef3c7; --pend-line:#fde68a; --err-fg:#991b1b; --err-bg:#fee2e2; --err-line:#fecaca; --shadow-card:0 1px 2px rgba(24,48,36,.04); --shadow-pop:0 12px 32px rgba(24,48,36,.16); --side-w:216px; --font:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; } /* 夜间模式:护眼向 —— 暖墨绿黑底、降对比、柔绿点缀,不用纯黑纯白 */ :root[data-theme="dark"]{ color-scheme: dark; --bg:#141916; /* 暖墨绿黑,比纯黑柔和 */ --surface:#1d2420; /* hover / 代码底 */ --card:#191f1b; /* 卡片 / 侧栏 */ --text:#d6ded7; /* 正文 · 柔白(不用纯白,降低刺眼感) */ --muted:#8fa093; /* 次要文字 · 灰绿 */ --line:#2a332c; /* 分隔线 · 低对比 */ --accent:#7cc9a0; /* 主色 · 柔和绿 */ --accent-hover:#98d8b4; --danger:#e39a8f; --danger-hover:#f0b6ad; --success:#8fd4a8; --warning:#e3c98f; /* 柔绿底上用深墨绿字,保证可读 */ --on-accent:#12241a; --accent-soft:rgba(124,201,160,.12); --accent-line:rgba(124,201,160,.28); --danger-soft:rgba(227,154,143,.13); --danger-line:rgba(227,154,143,.28); --ok-soft:rgba(143,212,168,.14); --pend-fg:#e3c98f; --pend-bg:rgba(227,201,143,.10); --pend-line:rgba(227,201,143,.26); --err-fg:#e39a8f; --err-bg:rgba(227,154,143,.10); --err-line:rgba(227,154,143,.26); --shadow-card:0 1px 2px rgba(0,0,0,.20); --shadow-pop:0 12px 32px rgba(0,0,0,.45); } /* ---------------------------------------------------------- 基础 */ *{box-sizing:border-box} /* 必须放最前面:.gate / .app / .modal 的 display 会盖掉 [hidden] 的 UA 样式 */ [hidden]{display:none!important} html,body{margin:0;padding:0;height:100%} body{ background:var(--bg); color:var(--text); font-family:var(--font); font-size:13px; line-height:1.65; -webkit-font-smoothing:antialiased; } h1,h2,h3,h4{margin:0;font-weight:700;line-height:1.4} a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline} ::selection{background:var(--accent-soft)} ::-webkit-scrollbar{width:6px;height:6px} ::-webkit-scrollbar-track{background:transparent} ::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px} ::-webkit-scrollbar-thumb:hover{background:var(--muted)} *:focus-visible{outline:2px solid var(--accent);outline-offset:2px} .px{font-size:11px;letter-spacing:.04em;color:var(--muted);text-transform:uppercase} .mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace} /* ---------------------------------------------------------- 按钮 */ .btn{ display:inline-flex;align-items:center;justify-content:center;gap:6px; padding:7px 12px; font-family:inherit;font-size:12px;font-weight:500;line-height:1.4; color:var(--text); background:var(--card); border:1px solid var(--line); border-radius:6px; cursor:pointer;white-space:nowrap; transition:background-color .15s,color .15s,border-color .15s; } .btn:hover:not(:disabled){background:var(--surface);color:var(--accent);border-color:var(--accent-line)} .btn:disabled{opacity:.45;cursor:not-allowed} .btn.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent);font-weight:600} .btn.primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover);color:var(--on-accent)} .btn.danger:hover:not(:disabled){color:var(--danger);border-color:var(--danger-line);background:var(--danger-soft)} .btn.tiny{padding:5px 9px;font-size:11px} .btn.block{display:flex;width:100%;padding:9px 12px} .btn[data-busy]{opacity:.5;pointer-events:none} .icon-btn{ display:inline-flex;align-items:center;justify-content:center; width:28px;height:28px;padding:0; color:var(--muted);background:transparent; border:1px solid transparent;border-radius:6px; font-size:14px;line-height:1;cursor:pointer; transition:background-color .15s,color .15s; } .icon-btn:hover{background:var(--bg);color:var(--text)} /* ---------------------------------------------------------- 表单 */ input,select,textarea{ width:100%;padding:9px 11px; font-family:inherit;font-size:13px;color:var(--text); background:var(--bg); border:1px solid var(--line);border-radius:6px; outline:none; transition:border-color .15s; } input:focus,select:focus,textarea:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px var(--accent-soft)} input::placeholder,textarea::placeholder{color:var(--muted);opacity:.7} textarea{resize:vertical;min-height:88px;line-height:1.7} select{appearance:none;cursor:pointer;padding-right:28px; background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%); background-position:calc(100% - 15px) 50%,calc(100% - 10px) 50%; background-size:5px 5px,5px 5px;background-repeat:no-repeat; } .lbl{display:block;margin-bottom:6px;font-size:12px;font-weight:500;color:var(--text)} .field{display:block;margin-bottom:14px} .field-k{display:block;margin-bottom:6px;font-size:12px;font-weight:500;color:var(--text)} .alert{ padding:10px 13px;margin-bottom:16px; font-size:12px;line-height:1.6; color:var(--err-fg);background:var(--err-bg); border:1px solid var(--err-line);border-radius:6px; } .form-err{ margin:14px 0 0;padding:10px 13px; font-size:12px;color:var(--err-fg);background:var(--err-bg); border:1px solid var(--err-line);border-radius:6px; } /* ---------------------------------------------------------- 登录 */ .gate{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--bg)} .login-card{ width:100%;max-width:340px;padding:32px; background:var(--card); border:1px solid var(--line);border-radius:16px; box-shadow:var(--shadow-pop); } .login-card h1{font-size:19px;color:var(--accent)} .login-card .sub{margin:3px 0 26px;font-size:12px;color:var(--muted)} .login-card form{margin-top:0} .login-card .btn{margin-top:6px} .login-card .hint{margin:18px 0 0;font-size:11px;line-height:1.7;color:var(--muted);text-align:center} /* ---------------------------------------------------------- 主框架 */ .app{display:flex;min-height:100vh;background:var(--bg)} .sidebar{ width:var(--side-w);flex:none; display:flex;flex-direction:column; background:var(--card); border-right:1px solid var(--line); position:fixed;inset:0 auto 0 0;z-index:50; } .side-head{ display:flex;align-items:center;gap:10px; padding:16px 16px 14px; border-bottom:1px solid var(--line); } .logo{ flex:none;width:30px;height:30px; display:flex;align-items:center;justify-content:center; background:var(--accent);color:var(--on-accent); font-size:14px;font-weight:700;border-radius:8px; } .side-tt h1{font-size:14px;color:var(--text);letter-spacing:.02em} .side-tt p{margin:0;font-size:11px;color:var(--muted)} .side-nav{flex:1;padding:10px;display:flex;flex-direction:column;gap:2px;overflow-y:auto} .tab{ display:flex;align-items:center;gap:10px;width:100%; padding:8px 11px; font-family:inherit;font-size:13px;font-weight:400;text-align:left; color:var(--text);background:transparent; border:0;border-radius:7px;cursor:pointer; transition:background-color .15s,color .15s; } .tab svg{flex:none;opacity:.75} .tab:hover{background:var(--surface);color:var(--accent)} .tab.on{background:var(--accent-soft);color:var(--accent);font-weight:500} .tab.on:hover{background:var(--accent-soft);color:var(--accent)} .tab.on svg{opacity:1} .tab .n{ margin-left:auto;padding:1px 6px; font-size:10px;line-height:1.5; background:var(--danger);color:#fff;border-radius:999px; } .tab.on .n{background:var(--danger);color:#fff} .nav-group{ padding:12px 11px 4px; font-size:10.5px;font-weight:600;letter-spacing:.6px; color:var(--muted); } .nav-sep{height:1px;margin:6px 8px;background:var(--line)} .side-foot{padding:10px 12px 12px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:2px} .sfoot-btn{ display:flex;align-items:center;gap:9px;width:100%; padding:7px 10px; font-family:inherit;font-size:12px;color:var(--muted); background:transparent;border:0;border-radius:7px;cursor:pointer; transition:background-color .15s,color .15s; } .sfoot-btn:hover{background:var(--surface);color:var(--accent)} .main{ flex:1;min-width:0;margin-left:var(--side-w); display:flex;flex-direction:column; padding:0 28px; } /* 顶栏:面包屑 + 登录身份 */ .topbar{ position:sticky;top:0;z-index:30; margin:0 -28px;padding:13px 28px; display:flex;align-items:center;gap:10px; background:var(--card); border-bottom:1px solid var(--line); } .crumb{display:flex;align-items:center;gap:7px;font-size:13px} .crumb .cg{color:var(--muted)} .crumb .sp{color:var(--line)} .crumb .pg{color:var(--text);font-weight:500} .top-right{margin-left:auto} .side-name{font-size:12px;color:var(--muted)} #view{padding-top:22px} .mobile-bar{display:none} .scrim{display:none} .foot{ margin-top:auto;padding:20px 0 24px; display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap; font-size:11px;color:var(--muted); } /* ---------------------------------------------------------- 页头 */ .page-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:0 0 18px} .page-head h2{font-size:18px} .page-head .sub{font-size:12px;color:var(--muted)} .page-head .right{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap} /* ---------------------------------------------------------- 卡片 */ .card{ background:var(--card); border:1px solid var(--line);border-radius:8px; box-shadow:var(--shadow-card); overflow:hidden; } .card-head{ display:flex;align-items:center;gap:8px; padding:12px 16px;border-bottom:1px solid var(--line); } .card-head h3{font-size:13px;font-weight:700} .card-body{padding:16px} /* ---------------------------------------------------------- 统计卡 */ .stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px} .stat{ padding:16px;text-align:center; background:var(--card); border:1px solid var(--line);border-radius:8px; } .stat .k{font-size:11px;color:var(--muted);margin-bottom:4px} .stat .v{font-size:22px;font-weight:700;line-height:1.3;color:var(--accent)} .stat .x{margin-top:2px;font-size:11px;color:var(--muted)} .grid2{display:grid;grid-template-columns:1.3fr 1fr;gap:14px;margin-top:14px;align-items:start} /* ---------------------------------------------------------- 小列表 */ .mini{display:flex;flex-direction:column} .mini-i{ display:flex;align-items:baseline;gap:10px; padding:8px 0;border-bottom:1px solid var(--line); font-size:13px; } .mini-i:last-child{border-bottom:0} .mini-i .n{flex:none;width:62px;font-size:11px;color:var(--muted);white-space:nowrap} .mini-i .b{flex:1;min-width:0} .mini-i .b .nm{font-weight:500} .mini-i .b .tx{margin-left:6px;font-size:12px;color:var(--muted)} .mini-i .c{flex:none;font-weight:500;color:var(--accent)} /* ---------------------------------------------------------- 标签 */ .tag{ display:inline-block;padding:1px 6px; font-size:10px;line-height:1.6;border-radius:4px; white-space:nowrap; } .tag.acc{color:var(--accent);background:var(--accent-soft)} .tag.pink{color:var(--accent);background:var(--accent-soft)} .tag.blue{color:var(--accent);background:var(--accent-soft)} .tag.warn{color:var(--pend-fg);background:var(--pend-bg)} .tag.dang{color:var(--danger);background:var(--danger-soft)} .tag.line{color:var(--muted);border:1px solid var(--line)} /* ---------------------------------------------------------- 评论列表 */ .ctool{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:14px} .ctool .grow{flex:1;min-width:180px} .ctool input,.ctool select{height:36px;padding-top:0;padding-bottom:0} .clist{display:flex;flex-direction:column;gap:8px} .citem{ padding:14px 16px; background:var(--card); border:1px solid var(--line);border-radius:10px; transition:border-color .15s; } .citem:hover{border-color:var(--accent-line)} .citem.pend{border-left:3px solid var(--warning)} .citem.pin{border-left:3px solid var(--accent)} .citem.hid{opacity:.55} /* 头像 + 内容 横排;回复嵌套画树状线,不用 margin hack */ .crow{display:flex;gap:12px;align-items:flex-start} .cavatar{ flex:none;width:38px;height:38px; border-radius:50%;object-fit:cover; background:var(--surface); border:1px solid var(--line); } .cmain{flex:1;min-width:0} .chead{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:5px} .chead .nick{font-size:13px;font-weight:600} .chead .t{margin-left:auto;font-size:11px;color:var(--muted);white-space:nowrap} .cbody{ font-size:14px;line-height:1.75;color:var(--text); word-break:break-word;white-space:pre-wrap; } .cbody .ph{color:var(--muted)} .creplies{ margin-top:11px;padding-left:14px; border-left:2px solid var(--line); display:flex;flex-direction:column;gap:8px; } .creplies .citem{background:var(--bg);border-radius:8px} .creplies .citem.pend{border-left-color:var(--warning)} .creplies .citem.pin{border-left-color:var(--accent)} .cfoot{ display:flex;align-items:center;gap:10px;flex-wrap:wrap; margin-top:9px;padding-top:9px; border-top:1px solid var(--line); font-size:11px;color:var(--muted); } .cfoot a{color:var(--muted)} .cfoot a:hover{color:var(--accent)} .cfoot .acts{margin-left:auto;display:flex;gap:6px;flex-wrap:wrap} /* ---------------------------------------------------------- 表格 */ .tblwrap{ background:var(--card); border:1px solid var(--line);border-radius:8px; overflow-x:auto; } table{width:100%;border-collapse:collapse;font-size:13px;min-width:620px} thead th{ padding:10px 14px;text-align:left; font-size:11px;font-weight:500;color:var(--muted); border-bottom:1px solid var(--line);white-space:nowrap; } tbody td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:middle} tbody tr:last-child td{border-bottom:0} tbody tr:hover{background:var(--surface)} td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap} td .lk{font-size:12px;color:var(--muted)} .ell{display:block;max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} /* ---------------------------------------------------------- 分页 */ .pager{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;margin:20px 0 4px} .pager .info{font-size:12px;color:var(--muted)} .pager .info b{color:var(--text);font-weight:600} /* ---------------------------------------------------------- 空态 / 加载 */ .empty{ padding:48px 20px;text-align:center; font-size:13px;color:var(--muted); background:var(--card); border:1px dashed var(--line);border-radius:8px; } .empty b{display:block;margin-bottom:6px;font-size:12px;color:var(--text)} .loading{padding:40px;text-align:center;font-size:13px;color:var(--muted)} /* ---------------------------------------------------------- 键值表 */ .kv{display:grid;grid-template-columns:auto 1fr;gap:9px 18px;margin:0;font-size:13px} .kv dt{font-size:12px;color:var(--muted)} .kv dd{margin:0;word-break:break-all} .kv dd.ok{color:var(--success);font-weight:500} .kv dd.bad{color:var(--danger)} pre.code{ margin:0;padding:14px; background:var(--surface);color:var(--text); border:1px solid var(--line);border-radius:6px; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:12px;line-height:1.7; overflow:auto;max-height:320px;white-space:pre; } textarea.code{ display:block;margin:0;padding:14px; background:var(--surface);color:var(--text); border:1px solid var(--line);border-radius:6px; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:12px;line-height:1.7; white-space:pre;tab-size:2; } textarea.code:focus{outline:none;border-color:var(--accent)} /* ---------------------------------------------------------- 提示 / 模态 */ .toast{ position:fixed;left:50%;bottom:24px;transform:translateX(-50%); z-index:600;max-width:86vw; padding:10px 16px; font-size:13px; color:var(--text);background:var(--card); border:1px solid var(--line);border-radius:8px; box-shadow:var(--shadow-pop); } .toast.bad{color:var(--danger);border-color:var(--danger-line)} .modal{ position:fixed;inset:0;z-index:500; display:flex;align-items:center;justify-content:center;padding:20px; background:rgba(24,48,36,.30); backdrop-filter:blur(2px); } :root[data-theme="dark"] .modal{background:rgba(0,0,0,.55)} .modal-card{ width:100%;max-width:520px;max-height:86vh; display:flex;flex-direction:column; background:var(--card); border:1px solid var(--line);border-radius:12px; box-shadow:var(--shadow-pop); } .modal-head{ display:flex;align-items:center;gap:10px; padding:14px 18px;border-bottom:1px solid var(--line); } .modal-head h3{flex:1;font-size:14px;font-weight:700} .modal-body{padding:18px;overflow-y:auto} /* ---------------------------------------------------------- 响应式 */ @media (max-width:1000px){ .stats{grid-template-columns:repeat(2,1fr)} .grid2{grid-template-columns:1fr} .main{padding:0 20px} .topbar{margin:0 -20px;padding:13px 20px} } @media (max-width:760px){ .mobile-bar{ display:flex;align-items:center;gap:8px; position:sticky;top:0;z-index:40; height:48px;padding:0 12px; background:var(--card);border-bottom:1px solid var(--line); } .mobile-title{font-size:13px;font-weight:700;color:var(--accent)} .scrim{display:block;position:fixed;inset:0;z-index:45;background:rgba(18,30,23,.32)} :root[data-theme="dark"] .scrim{background:rgba(0,0,0,.5)} .sidebar{ width:78%;max-width:280px; transform:translateX(-100%); transition:transform .2s ease-out; box-shadow:var(--shadow-pop); } .sidebar.open{transform:translateX(0)} .main{margin-left:0;padding:0 16px} .topbar{margin:0 -16px;padding:12px 16px;top:48px} #view{padding-top:16px} .stats{grid-template-columns:1fr 1fr;gap:10px} .stat{padding:13px 10px} .stat .v{font-size:19px} .cavatar{width:32px;height:32px} .ell{max-width:170px} .page-head h2{font-size:16px} .login-card{padding:26px 22px} } @media (prefers-reduced-motion:reduce){ *{transition:none!important} }