Files
freedakandDevin 63dda2fb4c fix: UI 优化 · 门户无侧边栏 + 政策落地表格紧凑 + 结算/质量用表格布局
- index.html 已登录也不显示侧边栏(公开展示页)
- 政策落地三栏表格精简为 3 列,加 word-break: keep-all 防止中文竖排
- 结算总览和质量与信用从 list 改为表格布局,更紧凑
- 智能体服务菜单移到「服务与政策」分组
- 门户"我要接订单"恢复为 login.html(先选角色)

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-14 09:17:33 +08:00

369 lines
16 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
:root {
--primary: #f97316;
--primary-dark: #ea580c;
--primary-light: #fb923c;
--primary-50: #fff7ed;
--primary-100: #ffedd5;
--primary-200: #fed7aa;
--bg: #faf9f7;
--bg-gradient: linear-gradient(135deg, #faf9f7 0%, #fff7ed 50%, #faf9f7 100%);
--card: rgba(255, 255, 255, 0.82);
--card-solid: #ffffff;
--border: #f0ebe5;
--border-strong: #e8e0d6;
--text: #292524;
--text-2: #78716c;
--text-3: #a8a29e;
--success: #059669;
--warning: #d97706;
--danger: #e11d48;
--info: #0284c7;
--radius: 0.75rem;
--shadow: 0 4px 24px rgba(120, 90, 50, 0.08);
--shadow-lg: 0 8px 32px rgba(120, 90, 50, 0.12);
--glass-blur: blur(12px);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
background: var(--bg-gradient);
background-attachment: fixed;
color: var(--text);
line-height: 1.6;
}
a { color: var(--primary); text-decoration: none; }
a:hover { color: var(--primary-dark); }
/* ===== 顶部精简栏 + 侧边导航 ===== */
.topnav {
position: sticky; top: 0; z-index: 100;
height: 52px;
background: rgba(255, 255, 255, 0.75);
backdrop-filter: var(--glass-blur);
-webkit-backdrop-filter: var(--glass-blur);
border-bottom: 1px solid var(--border);
display: flex; align-items: center;
padding: 0 20px; gap: 16px;
}
.topnav .brand { font-weight: 700; font-size: 15px; color: var(--text); white-space: nowrap; }
.topnav .brand span { color: var(--primary); }
.topnav .role-badge {
font-size: 12px; padding: 4px 10px;
border-radius: 999px; background: var(--primary-100); color: var(--primary-dark);
border: 1px solid var(--primary-200);
}
.topnav .muted { color: var(--text-2); text-decoration: none; }
.topnav .muted:hover { color: var(--primary); }
.topnav .nav-toggle {
display: none; border: 1px solid var(--border); background: #fff;
border-radius: 8px; padding: 4px 10px; font-size: 16px; cursor: pointer; color: var(--text);
}
/* 侧边栏 */
.sidebar {
position: fixed; top: 0; left: 0; bottom: 0;
width: 220px; z-index: 150;
background: #fff8f0; border-right: 1px solid var(--border);
display: flex; flex-direction: column;
overflow: hidden;
}
.sidebar-head {
display: flex; align-items: center; justify-content: space-between;
padding: 14px 18px; border-bottom: 1px solid var(--border); height: 52px;
flex-shrink: 0;
}
.sidebar-head .brand { font-weight: 700; font-size: 15px; }
.sidebar-head .brand span { color: var(--primary); }
.sidebar-head .nav-close {
display: none; border: none; background: none; font-size: 22px;
cursor: pointer; color: var(--text-2); line-height: 1;
}
.sidebar-nav { flex: 1; padding: 8px 0; overflow-y: auto; }
.nav-group { margin-bottom: 4px; }
.nav-group-title {
font-size: 11px; font-weight: 600; color: var(--text-3);
padding: 10px 18px 4px; text-transform: uppercase; letter-spacing: .5px;
}
.sidebar-nav a {
display: block; padding: 8px 18px; font-size: 13px;
color: var(--text-2); border-left: 3px solid transparent;
transition: all .15s;
}
.sidebar-nav a:hover { background: var(--primary-50); color: var(--primary-dark); }
.sidebar-nav a.active { background: var(--primary-100); color: var(--primary-dark); border-left-color: var(--primary); font-weight: 600; }
/* body 留出侧边栏空间(login/showcase 无侧边栏除外) */
body { padding-left: 220px; }
body[data-page="login"], body[data-page="index"], body.screen { padding-left: 0; }
@media (max-width: 900px) {
body { padding-left: 0; }
.topnav .nav-toggle { display: inline-block; }
.sidebar { transform: translateX(-100%); transition: transform .2s; box-shadow: 2px 0 12px rgba(0,0,0,.1); }
.sidebar.open { transform: translateX(0); }
.sidebar-head .nav-close { display: inline-block; }
.topnav .brand { margin-right: auto; }
}
/* ===== 布局 ===== */
.container { max-width: 1200px; margin: 0 auto; padding: 24px 16px 48px; }
.page-title { font-size: 22px; font-weight: 700; margin-bottom: 4px; }
.page-sub { color: var(--text-2); font-size: 13px; margin-bottom: 20px; }
.grid { display: grid; gap: 16px; }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-3 { grid-template-columns: repeat(3, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 900px) { .grid-3, .grid-4 { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 600px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } }
/* ===== 卡片(毛玻璃) ===== */
.card {
background: var(--card);
backdrop-filter: var(--glass-blur);
-webkit-backdrop-filter: var(--glass-blur);
border: 1px solid var(--border);
border-radius: var(--radius); padding: 18px;
box-shadow: var(--shadow);
transition: box-shadow .2s;
}
.card:hover { box-shadow: var(--shadow-lg); }
.card h3 { font-size: 15px; margin-bottom: 10px; display: flex; align-items: center; gap: 8px; }
.card .sub { font-size: 12px; color: var(--text-2); margin-bottom: 10px; }
.card .num { font-size: 26px; font-weight: 700; color: var(--primary-dark); }
.card .num small { font-size: 12px; font-weight: 400; color: var(--text-2); }
.section { margin-top: 24px; }
.section > h2 { font-size: 17px; margin-bottom: 12px; display: flex; align-items: center; gap: 8px; }
.section > h2 .req { font-size: 11px; font-weight: 400; color: var(--text-2); }
/* ===== 标签/徽章 ===== */
.badge {
display: inline-block; padding: 2px 8px; border-radius: 999px;
font-size: 11px; font-weight: 500;
}
.badge.ok { background: #d1fae5; color: var(--success); }
.badge.warn { background: #fef3c7; color: var(--warning); }
.badge.err { background: #ffe4e6; color: var(--danger); }
.badge.info { background: #e0f2fe; color: var(--info); }
.badge.gray { background: #f5f5f4; color: var(--text-2); }
.badge.pri { background: var(--primary-100); color: var(--primary-dark); }
.tag {
display: inline-block; padding: 2px 8px; margin: 2px 4px 2px 0;
border: 1px solid var(--border-strong); border-radius: 6px;
font-size: 11px; color: var(--text-2); background: #fff;
}
/* ===== 表格 ===== */
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th, td { padding: 9px 10px; text-align: left; border-bottom: 1px solid var(--border); word-break: keep-all; }
th { color: var(--text-2); font-weight: 600; font-size: 12px; background: var(--primary-50); white-space: nowrap; }
tr:hover td { background: var(--primary-50); }
/* 三栏卡片中的表格:紧凑布局 */
.three-col .card table, .two-col .card table { font-size: 12px; }
.three-col .card th, .three-col .card td,
.two-col .card th, .two-col .card td { padding: 6px 8px; }
/* ===== 按钮 ===== */
.btn {
display: inline-block; padding: 8px 16px; border-radius: 8px;
font-size: 13px; font-weight: 500; cursor: pointer; border: none;
background: var(--primary); color: #fff;
transition: all .15s;
}
.btn:hover { background: var(--primary-dark); transform: translateY(-1px); }
.btn.ghost { background: rgba(255,255,255,0.7); color: var(--text); border: 1px solid var(--border-strong); }
.btn.ghost:hover { background: var(--primary-50); border-color: var(--primary-200); color: var(--primary-dark); }
.btn.sm { padding: 4px 10px; font-size: 12px; }
/* ===== 步骤/状态机 ===== */
.steps { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; font-size: 12px; }
.steps .step {
padding: 5px 12px; border-radius: 999px; background: #f5f5f4; color: var(--text-2);
}
.steps .step.done { background: #d1fae5; color: var(--success); }
.steps .step.cur { background: var(--primary); color: #fff; font-weight: 600; }
.steps .arrow { color: var(--text-3); }
/* ===== 进度条 ===== */
.bar { height: 8px; background: #f5f5f4; border-radius: 999px; overflow: hidden; }
.bar i { display: block; height: 100%; background: var(--primary); border-radius: 999px; }
.bar i.ok { background: var(--success); }
.bar i.warn { background: var(--warning); }
/* ===== 门户 Hero ===== */
.hero {
background: linear-gradient(135deg, #f97316 0%, #ea580c 50%, #c2410c 100%);
color: #fff; border-radius: var(--radius); padding: 40px 36px; margin-bottom: 24px;
box-shadow: 0 8px 32px rgba(234, 88, 12, 0.2);
}
.hero h1 { font-size: 28px; margin-bottom: 8px; }
.hero p { opacity: .92; font-size: 14px; max-width: 640px; }
.hero .btn { background: rgba(255,255,255,0.9); color: var(--primary-dark); }
.hero .btn:hover { background: #fff; }
.hero .btn.ghost { background: rgba(255,255,255,0.15); color: #fff; border: 1px solid rgba(255,255,255,0.3); }
.hero .btn.ghost:hover { background: rgba(255,255,255,0.25); }
.entry-cards { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; margin-top: -20px; }
@media (max-width: 800px) { .entry-cards { grid-template-columns: 1fr; } }
.entry-card {
background: var(--card);
backdrop-filter: var(--glass-blur);
-webkit-backdrop-filter: var(--glass-blur);
border-radius: var(--radius); padding: 22px;
border: 1px solid var(--border); box-shadow: var(--shadow-lg);
}
.entry-card h3 { font-size: 16px; margin-bottom: 6px; }
.entry-card p { font-size: 12px; color: var(--text-2); margin-bottom: 12px; }
/* ===== 政府端暗色顶栏 + 侧边栏 ===== */
.gov .topnav { background: #1c1410; border-bottom-color: #3a2a1e; }
.gov .topnav .brand { color: #f5f5f4; }
.gov .topnav .brand span { color: var(--primary-light); }
.gov .topnav .role-badge { background: #422006; color: #fbbf24; border-color: #92400e; }
.gov .topnav .muted { color: #a8a29e; }
.gov .topnav .muted:hover { color: var(--primary-light); }
.gov .sidebar { background: #1c1410; border-right-color: #3a2a1e; }
.gov .sidebar-head { border-bottom-color: #3a2a1e; }
.gov .sidebar-head .brand { color: #f5f5f4; }
.gov .sidebar-head .brand span { color: var(--primary-light); }
.gov .nav-group-title { color: #78716c; }
.gov .sidebar-nav a { color: #d6d3d1; }
.gov .sidebar-nav a:hover { background: #2a1f18; color: #fff; }
.gov .sidebar-nav a.active { background: #2a1f18; color: var(--primary-light); border-left-color: var(--primary); }
.gov-banner {
background: #1c1410; color: #e7e5e4; border-radius: var(--radius);
padding: 18px 22px; margin-bottom: 20px; font-size: 13px;
display: flex; gap: 10px; align-items: center;
}
.gov-banner .badge { background: var(--primary); color: #fff; font-weight: 700; }
/* ===== 其他 ===== */
.notice {
border-left: 3px solid var(--primary); background: var(--primary-50);
padding: 10px 14px; border-radius: 0 8px 8px 0; font-size: 12px; color: var(--primary-dark);
}
.muted { color: var(--text-2); font-size: 12px; }
.list { list-style: none; }
.list li { padding: 8px 0; border-bottom: 1px dashed var(--border); font-size: 13px; display: flex; justify-content: space-between; gap: 10px; }
.list li:last-child { border-bottom: none; }
.flow { font-size: 12px; color: var(--text-2); }
.two-col { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; }
@media (max-width: 900px) { .two-col { grid-template-columns: 1fr; } }
.footer { text-align: center; color: var(--text-3); font-size: 12px; padding: 24px 0; }
/* ===== 弹窗 ===== */
.modal-mask {
position: fixed; inset: 0; z-index: 200;
background: rgba(28, 20, 16, 0.5);
backdrop-filter: blur(4px);
display: flex; align-items: center; justify-content: center; padding: 16px;
}
.modal {
background: rgba(255, 255, 255, 0.92);
backdrop-filter: var(--glass-blur);
-webkit-backdrop-filter: var(--glass-blur);
border: 1px solid var(--border);
border-radius: var(--radius);
max-width: 560px; width: 100%; max-height: 85vh; overflow: auto;
padding: 20px 22px; box-shadow: 0 20px 50px rgba(0,0,0,.25);
}
.modal h3 { font-size: 16px; margin-bottom: 12px; }
.modal .modal-body { font-size: 13px; }
.modal .modal-foot { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }
.modal .close-x { float: right; cursor: pointer; color: var(--text-2); font-size: 18px; line-height: 1; }
/* ===== 表单 ===== */
.field { margin-bottom: 12px; }
.field label { display: block; font-size: 12px; color: var(--text-2); margin-bottom: 4px; }
.field input, .field select, .field textarea {
width: 100%; padding: 8px 10px; border: 1px solid var(--border-strong);
border-radius: 8px; font-size: 13px; font-family: inherit; background: rgba(255,255,255,0.8);
}
.field input:focus, .field select:focus, .field textarea:focus {
outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-100);
}
.field textarea { min-height: 72px; resize: vertical; }
.checks label { display: flex; gap: 8px; align-items: center; font-size: 13px; padding: 4px 0; }
.field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
/* ===== Toast ===== */
#toasts { position: fixed; bottom: 20px; right: 20px; z-index: 300; display: flex; flex-direction: column; gap: 8px; }
.toast {
background: #1c1410; color: #fff; padding: 10px 16px; border-radius: 8px;
font-size: 13px; box-shadow: 0 6px 18px rgba(0,0,0,.2);
animation: tin .2s ease-out; max-width: 320px;
}
.toast.ok { border-left: 3px solid var(--success); }
.toast.warn { border-left: 3px solid var(--warning); }
.toast.err { border-left: 3px solid var(--danger); }
.toast.info { border-left: 3px solid var(--info); }
@keyframes tin { from { transform: translateY(8px); opacity: 0; } to { transform: none; opacity: 1; } }
.btn.danger { background: var(--danger); }
.btn.danger:hover { background: #be123c; }
.btn.ok { background: var(--success); }
.btn.ok:hover { background: #047857; }
/* ===== 甘特图(REQ-036) ===== */
.gantt { font-size: 12px; }
.gantt-row { display: grid; grid-template-columns: 180px 1fr; gap: 10px; align-items: center; padding: 5px 0; }
.gantt-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-2); }
.gantt-axis { position: relative; height: 16px; margin-bottom: 2px; }
.gantt-axis span { position: absolute; transform: translateX(-50%); font-size: 10px; color: var(--text-2); }
.gantt-track {
position: relative; height: 24px; border-radius: 4px;
background: repeating-linear-gradient(90deg, #f5f5f4 0 1px, transparent 1px calc(100% / 20));
}
.gantt-bar {
position: absolute; top: 4px; height: 16px; border-radius: 8px;
background: var(--primary); color: #fff; font-size: 10px; line-height: 16px;
padding: 0 8px; white-space: nowrap; overflow: hidden;
}
.gantt-bar.ok { background: var(--success); }
.gantt-bar.warn { background: var(--warning); }
.gantt-bar.err { background: var(--danger); }
.gantt-today { position: absolute; top: -2px; bottom: -2px; width: 2px; background: var(--danger); opacity: .6; }
/* ===== 转化漏斗(REQ-097) ===== */
.funnel-row { display: flex; align-items: center; gap: 12px; padding: 6px 0; font-size: 13px; }
.funnel-stage { width: 90px; color: var(--text-2); flex-shrink: 0; }
.funnel-bar {
height: 28px; border-radius: 6px; background: var(--primary); color: #fff;
display: flex; align-items: center; padding: 0 10px; font-size: 12px; min-width: 60px;
}
.funnel-conv { color: var(--text-2); font-size: 11px; margin-left: auto; }
/* ===== 展览大屏(REQ-118 · 暖橙暗色) ===== */
.screen { background: #1a1410; color: #e7e5e4; }
.screen .sidebar, .screen .topnav { display: none !important; }
.screen { padding-left: 0 !important; }
.screen .container { max-width: 1400px; }
.screen .card {
background: rgba(42, 31, 24, 0.6);
backdrop-filter: var(--glass-blur);
-webkit-backdrop-filter: var(--glass-blur);
border-color: #3a2a1e; color: #e7e5e4;
}
.screen .card h3 { color: #a8a29e; }
.screen .num { color: var(--primary-light); font-size: 32px; }
.screen .muted, .screen .page-sub { color: #78716c; }
.screen table th { background: #2a1f18; color: #a8a29e; }
.screen td { border-bottom-color: #3a2a1e; }
.screen tr:hover td { background: #2a1f18; }
.screen .footer { color: #57534e; }
.screen .bar { background: #3a2a1e; }
.screen .bar i { background: var(--primary-light); }
.screen-hero { text-align: center; padding: 20px 0 8px; }
.screen-hero h1 { font-size: 26px; letter-spacing: 4px; color: var(--primary-light); }
.screen-hero p { color: #78716c; font-size: 13px; }
.ticker-wrap { overflow: hidden; background: #2a1f18; border: 1px solid #3a2a1e; border-radius: var(--radius); padding: 10px 0; }
.ticker { display: flex; gap: 48px; white-space: nowrap; animation: tick 24s linear infinite; font-size: 13px; color: var(--primary-light); }
@keyframes tick { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.screen .funnel-bar { background: var(--primary); }
.screen .badge.pri { background: rgba(249, 115, 22, 0.2); color: var(--primary-light); }
/* ===== 打印(政府报告) ===== */
@media print {
.topnav, .sidebar, .btn, .footer, #toasts, .no-print { display: none !important; }
body { padding-left: 0 !important; background: #fff; }
.card { background: #fff; box-shadow: none; border: 1px solid #999; break-inside: avoid; backdrop-filter: none; }
}