/* ============================================================
 * 业兢集团投标书生成系统 · 样式 v4「公文档案」（2026-08-27）
 *
 * 换的不是配色，是**骨架和语言**：
 *   旧  顶栏 + 左侧栏 + 灰底上堆白色圆角卡片 + 蓝色 SaaS 控件
 *   新  没有顶栏；左边一条通高操作栏（抬头/目录/落款三段）；
 *       内容直接写在白纸上，分节靠标题和留白，不再有卡片；
 *       朱红印章色、宋体标题、零圆角、细线与双线分隔、数字等宽
 *
 * 参照的是投标文件本身的样子——公文抬头、章节、批注戳、盖章——
 * 而不是通用后台模板。类名一个没改，app.js 的渲染逻辑不用动。
 * ============================================================ */
:root{
  /* 纸。整个界面的底不是「灰色画布」，而是一张纸；内容直接写在纸上，不再堆卡片 */
  --bg:#ffffff; --panel:#ffffff; --paper:#faf8f3;
  --ink:#16150f; --ink-2:#3d3a30; --muted:#7d786a; --line:#ded9cb; --hair:#ebe7db;
  /* 朱红：印章色。招投标文件上盖的就是这个红，比任何蓝/绿都贴这门生意 */
  --brand:#a8322b; --brand-deep:#7f231e; --brand-wash:#fbf1ef;
  --brand-grad:none;
  /* 侧栏是纸色偏深的一条，不是深色块，也不是纯白——像文件夹的封边 */
  --nav:#f2eee3; --nav-2:#e7e1d1; --nav-ink:#57534551; --nav-ink-hi:#16150f;
  --accent:#8a6d1f;
  --ok:#2f6b34; --okbg:#f0f5ef; --warn:#8a6d1f; --warnbg:#faf5e6;
  --danger:#a8322b; --dangerbg:#fbf1ef; --info:#3f5871; --infobg:#f0f3f7;
  --mutedbg:#f4f1e8;
  /* 零圆角。圆角是 SaaS 卡片的语言，这里要的是公文/表格的直角 */
  --radius:0px; --radius-sm:0px;
  --shadow:none;
  --shadow-lg:0 24px 60px rgba(22,21,15,.20);
  /* 标题用宋体：中文公文的字。正文仍是黑体，保证小字可读 */
  --serif:"Songti SC","STSong","SimSun","Noto Serif SC",serif;
  --mono:"JetBrains Mono",ui-monospace,Consolas,"Courier New",monospace;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{font:13.5px/1.75 "PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,sans-serif;
  color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased}
a{color:var(--brand);text-decoration:none;cursor:pointer;border-bottom:1px solid transparent}
a:hover{text-decoration:none;border-bottom-color:var(--brand)}
h1,h2,h3,h4{margin:0}
.hidden{display:none!important}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-thumb{background:#d3cdbc;border:3px solid var(--bg)}
::-webkit-scrollbar-track{background:transparent}
.sidebar::-webkit-scrollbar-thumb{background:#cfc7b2;border-color:var(--nav)}
/* 数字一律等宽：报价、限价、字数、编号——公文里这些是要对齐着看的 */
.num,.stat-num,.table .num,.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}

/* ---------- 布局：窄图标栏 + 上下文栏 + 内容 ----------
   上一版把三个分组、项目名、6 个环节、7 个流程刻度、品牌、用户全叠进一根柱子，
   两个层级的导航混在一起，进了项目就是一长条。这版拆成两级：
     rail  56px  三大块，任何时候一键可切（当前项目里也能直接跳去知识库）
     pane 210px  一次只显示**一个**上下文：本块的菜单，或当前项目的环节
   流程刻度不是导航，已挪回内容区压成一行（.stage-line）。          */
.layout{display:flex;min-height:100vh}

.rail{width:60px;background:var(--ink);flex-shrink:0;position:sticky;top:0;height:100vh;
  display:flex;flex-direction:column;align-items:center;padding:0 0 14px}
/* 标志不填红底：红色在这套里只表示「你在这里」（选中的那一项），
   标志再来一个红方块就成了第四个菜单项。改成直接画在深底上 + 一条分隔线。 */
.rail-brand{width:42px;height:42px;margin:12px 0 10px;color:#e6e0d2;
  display:flex;align-items:center;justify-content:center;flex-shrink:0}
.rail-brand+.rail-nav{border-top:1px solid #33302a;padding-top:12px}
.logo{width:28px;height:28px;display:block}
.rail-nav{flex:1;display:flex;flex-direction:column;gap:6px;width:100%;align-items:center}
/* 图标按钮：给一点圆角和呼吸，别再是硬邦邦的方格 */
.rail-item{width:42px;height:42px;display:flex;align-items:center;justify-content:center;cursor:pointer;
  color:#8d887a;border-radius:5px;transition:background .12s,color .12s}
.rail-item:hover{color:#efece2;background:#2c2921}
.rail-item.active{color:#fff;background:var(--brand)}
.rail-foot{display:flex;flex-direction:column;align-items:center;gap:4px;
  border-top:1px solid #33302a;padding-top:13px;width:38px}
.rail-out{width:34px;height:34px;display:flex;align-items:center;justify-content:center;
  color:#8d887a;cursor:pointer;border-radius:5px;transition:background .12s,color .12s}
.rail-out:hover{color:#fff;background:var(--brand)}
.avatar{width:34px;height:34px;background:#33302a;color:#cdc7b8;display:flex;align-items:center;
  justify-content:center;flex-shrink:0;cursor:pointer;border-radius:5px;transition:background .12s,color .12s}
.avatar:hover{background:#413d33;color:#efece2}
/* 统一图标尺寸；描边随字色，所以选中态自动变白 */
.ico{width:19px;height:19px;display:block;flex-shrink:0}
.rail-out .ico,.avatar .ico{width:17px;height:17px}

.pane{width:210px;background:var(--nav);border-right:1px solid var(--line);flex-shrink:0;
  position:sticky;top:0;height:100vh;display:flex;flex-direction:column}
.pane-head{padding:17px 16px 12px;border-bottom:1px solid var(--line)}
.pane-title{font-family:var(--serif);font-size:15px;font-weight:700;letter-spacing:2px;color:var(--ink)}
.pane-back{font-size:12.5px;color:var(--muted);cursor:pointer;letter-spacing:.5px}
.pane-back:hover{color:var(--brand)}
.pane-body{flex:1;overflow:auto;padding:8px 0 16px}
/* ---------- 产出物块（技术标 / 商务标共用，见 helpers 的 artifactPanel） ----------
   两边原来各写各的行内样式，商务标那张最新版卡片还留着换主题前的一套蓝
   （#eff6ff/#bfdbfe/#1e40af），压在宣纸底上很扎眼。收进这里统一按主题变量走。 */
.art-live{background:var(--paper);border:1px solid var(--hair);
  padding:7px 10px;margin-bottom:10px}
.art-cur{background:var(--okbg);border:1px solid var(--hair);border-left:3px solid var(--ok);
  padding:10px 12px}
.art-cur-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.art-cur-name{font-weight:700;color:var(--ink);word-break:break-all}
.art-hist{margin-top:8px}
.art-hist>summary{cursor:pointer;list-style:none}
.art-hist>summary::-webkit-details-marker{display:none}
.art-hist>summary::before{content:"▸ ";color:var(--muted)}
.art-hist[open]>summary::before{content:"▾ "}
.art-ver{display:flex;align-items:center;gap:8px;padding:5px 0;
  border-top:1px solid var(--hair);font-size:12.5px}

.pane-role{padding:14px 16px;border-top:1px solid var(--hair);margin-top:10px}
/* 离线演示的角色下拉（只在没登录时出现）。上一版这条规则是白字压深色顶栏，
   顶栏撤了之后它落在浅色上下文栏里，等于白字压白纸——看不见。 */
.role-select{width:100%;margin-top:6px;padding:5px 8px;font:inherit;font-size:12.5px;
  color:var(--ink);background:#fff;border:1px solid var(--hair);border-radius:0;cursor:pointer}

.nav-item{display:flex;align-items:center;gap:8px;padding:7px 16px;cursor:pointer;
  color:var(--ink-2);font-size:13px;position:relative;transition:none}
.nav-item:hover{background:var(--nav-2)}
.nav-item.active{background:var(--brand);color:#fff;font-weight:600}
.nav-dot{margin-left:auto;font-size:10px;opacity:.6}
.nav-item.nav-lock{color:#b0a996;cursor:not-allowed}
.nav-item.nav-lock:hover{background:none;color:#b0a996}

/* 上下文栏里的项目抬头 */
.pane-proj{padding:2px 16px 12px;border-bottom:1px solid var(--hair);margin-bottom:8px}
.pane-proj-name{font-size:12.5px;font-weight:700;color:var(--ink);line-height:1.55;font-family:var(--serif);
  /* 项目名很长（「XX市XX区XX道路及管网升级改造工程——XX路监理」），
     不夹的话栏会被撑出横向滚动条 */
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.pane-proj-sub{margin-top:6px;display:flex;align-items:center;gap:5px;flex-wrap:wrap}

/* 流程：内容区里的一行只读进度 */
.stage-line{margin-top:9px;font-size:11.5px;color:var(--muted);letter-spacing:.6px;
  display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.stage-line i{color:#cec8b8;font-style:normal}
.stage-line .sl.done{color:var(--ink-2)}
.stage-line .sl.cur{color:#fff;background:var(--brand);padding:1px 8px;font-weight:700}

/* 生成实时行：没在生成时是空的，空条别占位置 */
.gen-live:empty{display:none}
/* 内容区直接写在纸上，左边留出版心 */
.main{flex:1;min-width:0;padding:32px 44px 70px;max-width:1560px}

/* ---------- 页头：宋体大标题 + 双线分隔，像公文抬头 ---------- */
.page-head{display:flex;align-items:flex-start;gap:12px;margin-bottom:22px;padding-bottom:14px;
  border-bottom:3px double var(--line)}
.page-title{font-size:23px;font-weight:700;letter-spacing:2.5px;font-family:var(--serif);line-height:1.35}
.page-sub{color:var(--muted);font-size:12.5px;margin-top:7px;letter-spacing:.4px}
.page-head .spacer{flex:1}
.breadcrumb{color:var(--muted);font-size:12.5px;margin-bottom:12px;letter-spacing:.5px}
.breadcrumb a{color:var(--muted)}
.breadcrumb b{color:var(--ink)}
.api-note{font-family:ui-monospace,Consolas,monospace;font-size:12.5px;color:#5b5344;background:#efece4;border:1px dashed #d5cfc0;border-radius:var(--radius-sm);padding:5px 11px;display:inline-block;margin-bottom:14px}
.api-note b{color:var(--brand-deep)}

/* ---------- 横幅（v3：左侧 3px 色条 + 平铺底色，不再是四周圆角描边）---------- */
.banner{border-radius:0 var(--radius-sm) var(--radius-sm) 0;padding:10px 15px;font-size:13px;
  margin-bottom:15px;border:1px solid;border-left-width:3px}
.banner.readonly{background:#f0eee9;border-color:#e0dbd0;border-left-color:#a8a294;color:#54503f}
.banner.warn{background:var(--warnbg);border-color:#e9dcbd;border-left-color:var(--warn);color:var(--warn)}
.banner.danger{background:var(--dangerbg);border-color:#f2cdcb;border-left-color:var(--danger);color:var(--danger)}

/* ---------- 指标 / 分节 ----------
   卡片这个 metaphor 整个取消：指标改成横排的一条数据带，用竖线分隔，不是四张浮起的卡。 */
.cards{display:flex;flex-wrap:wrap;gap:0;margin-bottom:26px;border:1px solid var(--line);background:var(--paper)}
.stat{flex:1 1 150px;padding:14px 20px;position:relative;background:transparent;border:none;border-radius:0}
.stat+.stat{border-left:1px solid var(--line)}
.stat::before{content:none}
.stat:hover{background:#fff}
.stat-num{font-size:27px;font-weight:600;letter-spacing:0;line-height:1.2}
.stat-label{color:var(--muted);font-size:11.5px;margin-top:4px;letter-spacing:1.5px}
/* 公司业务 6 项指标：宽屏一行 6 列，窄屏自动折行 */
.biz-cards{grid-template-columns:repeat(6,minmax(118px,1fr));margin-bottom:0}
.stat.biz{padding:14px 14px 12px}
@media(max-width:1080px){.biz-cards{grid-template-columns:repeat(3,1fr)}}
@media(max-width:560px){.biz-cards{grid-template-columns:repeat(2,1fr)}}
.sel{padding:5px 9px;font-size:13px;border-radius:0}
/* 知识库权限矩阵 */
.kbp{padding:3px 6px;font-size:12px;min-width:86px;border-radius:0}
.kbp-set{border-color:var(--brand);box-shadow:0 0 0 2px rgba(15,118,110,.14)}
.kbp-table td,.kbp-table th{white-space:nowrap;padding-left:8px;padding-right:8px}
/* v2 面板是圆角 14px + 柔和阴影「浮」在底上；v3 是 6px + 1px 边框，平铺分区 */
/* 面板不再是「浮在灰底上的白盒子」，而是纸上的一节：无边框无底色，
   靠标题左侧的朱红竖条和小节间距分隔。这一条是和原来观感差别最大的地方。 */
.panel{background:transparent;border:none;border-radius:0;padding:0;margin-bottom:34px}
.panel-title{font-size:15px;font-weight:700;margin-bottom:14px;display:flex;align-items:center;gap:9px;
  flex-wrap:wrap;padding:0 0 0 11px;border:none;border-left:3px solid var(--brand);
  font-family:var(--serif);letter-spacing:1.5px;line-height:1.5}
.panel-title .spacer{flex:1}
/* 表格/列表这类需要围起来的内容，用一圈细线把它框住——框的是内容，不是整个面板 */
.panel>.table,.panel>div>.table{border:1px solid var(--line)}
.section-hint{color:var(--muted);font-size:12.5px;margin:-4px 0 12px}

/* ---------- 按钮：直角、细线、无填充为主。主按钮是朱红实心印章 ---------- */
.btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:#fff;color:var(--ink-2);
  padding:6px 15px;border-radius:0;cursor:pointer;font-size:12.5px;font-weight:600;letter-spacing:.5px;transition:none}
.btn:hover{border-color:var(--ink-2);background:var(--paper);color:var(--ink)}
.btn-primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn-primary:hover{background:var(--brand-deep);border-color:var(--brand-deep);color:#fff}
.btn-danger{background:#fff;border-color:var(--danger);color:var(--danger)}
.btn-danger:hover{background:var(--danger);color:#fff}
.btn-ghost{background:transparent;border-color:transparent;color:var(--brand)}
.btn-ghost:hover{background:var(--brand-wash);border-color:transparent}
.btn-sm{padding:3px 10px;font-size:12px}
.btn-xs{padding:1px 8px;font-size:11.5px;font-weight:600}
.btn[disabled]{opacity:.4;cursor:not-allowed;transform:none!important;box-shadow:none}
.btn-row{display:flex;gap:9px;flex-wrap:wrap;align-items:center}
/* 统一表单行：等宽列、底对齐、间距一致（替代到处内联 flex 的乱摆放） */
.frow{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-end;margin-bottom:14px}
.frow>.fld{flex:1 1 190px;margin:0}
.frow>.fld.grow2{flex:2 1 260px}
.frow>.fld.narrow{flex:0 0 120px}
.frow>.fld input,.frow>.fld select,.frow>.fld textarea{width:100%}
.frow>.btn{margin-bottom:1px}
/* 弹窗内表单字段统一满宽（对齐一致） */
.modal-body .fld>input,.modal-body .fld>select,.modal-body .fld>textarea{width:100%}
.modal-body textarea{min-height:64px}

/* ---------- 表格：账册式。表头细线双分隔，行距紧，数字等宽 ---------- */
.table{width:100%;border-collapse:collapse;font-size:13px}
.table th{text-align:left;color:var(--muted);font-weight:700;padding:8px 12px;background:var(--paper);
  border-bottom:1px solid var(--line);white-space:nowrap;font-size:11.5px;letter-spacing:1.5px}
.table td{padding:9px 12px;border-bottom:1px solid var(--hair);vertical-align:middle;font-size:13px}
.table tr:last-child td{border-bottom:none}
.table tr.click{cursor:pointer}
.table tr.click:hover td{background:var(--brand-wash)}
.table .num{text-align:right}

/* ---------- 徽标：方形描边、无填充——像文件上的批注戳 ---------- */
.badge{display:inline-flex;align-items:center;gap:4px;padding:1px 7px;border-radius:0;font-size:11.5px;
  font-weight:700;white-space:nowrap;border:1px solid;letter-spacing:.5px;background:#fff}
.badge-success{color:var(--ok);border-color:#b8ccb9;background:var(--okbg)}
.badge-warn{color:var(--warn);border-color:#ded0a8;background:var(--warnbg)}
.badge-danger{color:var(--danger);border-color:#e0b5b1;background:var(--dangerbg)}
.badge-info{color:var(--info);border-color:#c2ccd8;background:var(--infobg)}
.badge-muted{color:var(--muted);border-color:var(--line);background:var(--mutedbg)}
.dot{width:7px;height:7px;border-radius:0;display:inline-block}
.tag{display:inline-block;background:transparent;color:var(--muted);border:1px solid var(--line);border-radius:0;
  padding:0 7px;font-size:11.5px;margin:2px 4px 2px 0}
.tag-info{background:var(--infobg);color:var(--info);border-color:#bcdcf7}

/* ---------- 进度条 ---------- */
.progress{height:8px;background:var(--mutedbg);border-radius:0;overflow:hidden;min-width:70px}
.progress > i{display:block;height:100%;background:var(--brand);border-radius:0;transition:width .3s}
.progress.ok > i{background:#15803d}

/* ---------- 项目阶段条（需求分析=第一道关卡） ---------- */
.stepper{display:flex;margin:2px 0 16px;flex-wrap:wrap}
.step{display:flex;align-items:center;gap:7px;padding:7px 15px;background:#fff;border:1px solid var(--line);font-size:12.5px;color:var(--muted);white-space:nowrap}
.step:first-child{border-radius:0 0 0 10px}
.step:last-child{border-radius:0 10px 10px 0}
.step+.step{margin-left:-1px}
.step .n{width:19px;height:19px;border-radius:50%;background:var(--mutedbg);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;flex-shrink:0}
.step.done{color:var(--ok)}
.step.done .n{background:var(--okbg);color:var(--ok)}
.step.current{color:var(--brand-deep);font-weight:700;border-color:var(--brand);background:#eef4ff;z-index:1}
.step.current .n{background:var(--brand);color:#fff}

/* ---------- 选项卡 ---------- */
.tabs{display:flex;gap:4px;background:#e9edf4;border-radius:0;padding:4px;margin-bottom:18px;flex-wrap:wrap;width:fit-content;max-width:100%}
.tab{padding:7px 16px;cursor:pointer;color:#55617c;border-radius:0;font-size:13.5px;white-space:nowrap;font-weight:600;transition:all .13s}
.tab:hover{color:var(--ink)}
.tab.active{color:var(--brand-deep);background:#fff;font-weight:700;box-shadow:none}
.tab.disabled{color:#b0a996;cursor:not-allowed;font-weight:600;opacity:.75}
.tab.disabled:hover{color:#b0a996}
.tab.cur-stage{color:var(--brand-deep);box-shadow:inset 0 -2px 0 var(--brand-deep)}

/* ---------- 分栏 / 键值 ---------- */
.split{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.split-3{display:grid;grid-template-columns:240px 1fr;gap:18px}
/* 商务标：左边跟智能体聊，右边看产出。左栏吸顶，右栏滚动时对话框不跑掉 */
/* 聊天栏比产出物宽一点点（照 D:/pi/demo 的 flex:1.2 : 1）——
   原来是 .82:1.18，正好反过来，聊天挤在窄栏里 */
.biz-split{display:grid;grid-template-columns:minmax(420px,1.2fr) 1fr;gap:18px;align-items:start}
.biz-split>.col-chat{position:sticky;top:12px}
.biz-split>.col-chat .panel{margin-bottom:0}
@media(max-width:1180px){.biz-split{grid-template-columns:1fr}.biz-split>.col-chat{position:static}}
.kv{display:grid;grid-template-columns:120px 1fr;gap:7px 14px;font-size:13px}
.kv .k{color:var(--muted)}

/* ---------- 审计问题卡 ---------- */
.finding{border:1px solid var(--line);border-left:4px solid #ccc;background:#fff;border-radius:0;padding:11px 14px;margin-bottom:11px;box-shadow:var(--shadow)}
.finding.red{border-left-color:var(--danger);background:linear-gradient(90deg,#fffafa,#fff)}
.finding.yellow{border-left-color:#e0a300;background:linear-gradient(90deg,#fffdf5,#fff)}
.finding.blue{border-left-color:var(--info);background:linear-gradient(90deg,#f8fbff,#fff)}
.finding.orange{border-left-color:#e07b00;background:linear-gradient(90deg,#fff8f0,#fff)}
/* 置顶重点项：强审不满足(红) / 扣分(橙) —— 加粗左边框 + 阴影，视觉拉到最前 */
.finding.pinned{border-left-width:6px;box-shadow:0 2px 10px rgba(192,54,44,.12)}
.finding.pinned.red{background:linear-gradient(90deg,#fdecea,#fff);border-color:#f2c6bf}
.finding.pinned.orange{background:linear-gradient(90deg,#fdf1e2,#fff);border-color:#f0d3a8}
.finding.done{opacity:.55}
.crit-summary{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.crit-tag{font-size:12.5px;padding:8px 12px;border-radius:0;line-height:1.5;flex:1 1 240px}
.crit-tag.hard{background:var(--dangerbg);border:1.5px solid #f0b9b1;color:var(--danger)}
.crit-tag.dock{background:#fdf1e2;border:1.5px solid #f0d3a8;color:#9a5b00}
.badge-orange{background:#fdf1e2;color:#9a5b00;border-color:#f0d3a8}
.finding .f-top{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.finding .f-quote{color:#5b6780;font-size:12.5px;background:#f5f7fb;border:1px solid #eaeef6;border-radius:0;padding:7px 10px;margin:7px 0}

/* ---------- 章节树 ---------- */
.tree{font-size:13px}
.tree-item{padding:7px 10px;border-radius:0;cursor:pointer;display:flex;align-items:center;gap:7px;transition:all .12s}
.tree-item:hover{background:#f0eee9}
.tree-item.active{background:#eaf2f1;color:var(--brand);font-weight:700}
.tree-item.lv2{padding-left:24px;font-size:12.5px}

/* ---------- 标书正文（仿宋以贴近标书排版） ---------- */
.doc{background:#fff;border:1px solid var(--line);border-radius:0;padding:20px 24px;min-height:320px;line-height:2;font-family:"FangSong","仿宋","STFangsong",serif;font-size:15px;box-shadow:inset 0 1px 4px rgba(16,24,40,.03)}
.doc.small,.modal .doc{font-size:15px}   /* 原文阅读一律用正文字号，不被 .small 压小 */
.doc .slot{background:#e5efff;border-bottom:1.5px dashed var(--brand);padding:0 3px;border-radius:0}
.doc .flag{background:var(--dangerbg);border-bottom:2px solid var(--danger);padding:0 3px;cursor:pointer}
.hl-num{background:#fff0c2;padding:0 3px;border-radius:0;font-weight:700}
.hl-star{color:var(--danger);font-weight:800}

/* ---------- 工具条 / 表单 ---------- */
.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.filters{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
select,input:not([type]),input[type=text],input[type=number],input[type=password],input[type=date],input[type=month],input[type=search],input[type=tel],input[type=email],textarea{border:1px solid var(--line);border-radius:var(--radius-sm);padding:7px 11px;font:inherit;color:var(--ink);background:#fff;transition:border .13s,box-shadow .13s}
select:focus,input:focus,textarea:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(15,118,110,.16)}
textarea{width:100%;resize:vertical}
.fld{display:block;margin-bottom:13px}
.fld .lab{display:block;color:var(--muted);font-size:12.5px;margin-bottom:5px;font-weight:600}
.chip-x{margin-left:5px;color:#b42318;cursor:pointer;font-weight:700}
.tag input{padding:1px 5px;font-size:12.5px}
input[type=text],input[type=number]{min-width:60px}

/* ---------- 时间线 ---------- */
.timeline{border-left:2px solid #dbe2ee;margin-left:7px;padding-left:18px}
.tl{position:relative;margin-bottom:14px}
.tl::before{content:"";position:absolute;left:-25px;top:5px;width:11px;height:11px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 3px #e2ecfd}
.tl .t{font-size:12px;color:var(--muted)}

/* ---------- 弹窗 ---------- */
.modal-mask{position:fixed;inset:0;background:rgba(13,25,48,.5);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:50}
.modal{background:#fff;border-radius:0;width:min(860px,94vw);max-height:88vh;overflow:auto;box-shadow:var(--shadow-lg);animation:pop .18s ease-out}
@keyframes pop{from{transform:scale(.96);opacity:.5}to{transform:scale(1);opacity:1}}
.modal.wide{width:min(920px,94vw)}
.modal-head{padding:17px 22px;border-bottom:1px solid var(--line);font-weight:800;font-size:16px;display:flex;align-items:center}
.modal-head .x{margin-left:auto;cursor:pointer;color:var(--muted);font-size:22px;line-height:1;padding:0 4px;border-radius:0}
.modal-head .x:hover{background:#f1f4f9;color:var(--ink)}
.modal-body{padding:20px 22px}
.modal-foot{padding:15px 22px;border-top:1px solid var(--line);display:flex;gap:10px;justify-content:flex-end;background:#fafbfd;border-radius:0 0 16px 16px}

/* ---------- 其它 ---------- */
.muted{color:var(--muted)}
.small{font-size:13px}
.mono{font-family:ui-monospace,Consolas,monospace}
code{font-family:ui-monospace,Consolas,monospace;background:#eef2f7;border:1px solid #dbe2ea;border-radius:0;padding:1px 6px;font-size:12.5px;color:var(--ink-2)}
.reason{background:#f2f8ea;border:1px solid #d9e9c2;border-radius:0;padding:8px 12px;font-size:12.5px;color:#3f5a12;margin-top:7px}
.gate-bar{border-radius:0;padding:14px 18px;font-weight:700;display:flex;align-items:center;gap:10px;font-size:14.5px;box-shadow:var(--shadow)}
.gate-bar.block{background:linear-gradient(90deg,#fdeceb,#fff5f4);color:var(--danger);border:1.5px solid #f0b9b1}
.gate-bar.pass{background:linear-gradient(90deg,#e6f6ee,#f2fbf6);color:var(--ok);border:1.5px solid #b9e3cc}
.legend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--muted);margin-top:10px}
.hr{height:1px;background:var(--line);margin:15px 0}
.right{text-align:right}
.center{text-align:center}
.grow{flex:1}

/* 登录页 */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--nav)}
.login-card{background:#fff;border-radius:0;padding:34px 30px;width:340px;box-shadow:none}
.login-brand{font-size:19px;font-weight:800;color:var(--ink,#111);letter-spacing:.3px}
.login-card .fld{margin:12px 0}
.login-card .lab{font-size:12.5px}
.login-card input{width:100%}

/* 拖拽上传悬停高亮 */
.drop-hot { outline: 2px dashed var(--brand); outline-offset: -2px; background: #eaf2f1 !important; border-radius:0; }

/* 台账表：正常字号 + 冻结列（sticky 在 border-collapse:collapse 下不可靠，必须 separate） */
.lg-table { border-collapse: separate; border-spacing: 0; }
.lg-table td, .lg-table th { font-size: 13.5px; }
.lg-stick { position: sticky; z-index: 2; background: #fff; }
.lg-table thead .lg-stick { z-index: 3; background: #fff; }
.lg-table tr.click:hover .lg-stick { background: #f4f2ec; }
.lg-edge { border-right: 2px solid var(--line) !important; box-shadow: 5px 0 6px -3px rgba(15,23,42,.10); }
/* 台账筛选区：整齐网格 */
.lg-filters { display: grid; grid-template-columns: repeat(auto-fill, minmax(215px, 1fr)); gap: 10px 16px; }
.lg-filters .fld { margin: 0 }
/* 复选框不参与满宽拉伸，否则「只看有待核的」会被撑成一整条 */
.lg-filters .fld input[type=checkbox] { width: auto; height: auto; padding: 0; border: 0;
  box-shadow: none; margin: 0 6px 0 0; vertical-align: middle; accent-color: var(--brand) }
.lg-filters .fld input, .lg-filters .fld select { width: 100%; height: 32px; padding: 4px 9px; box-sizing: border-box;
  border: 1px solid var(--line); border-radius: var(--radius-sm); font: inherit; color: var(--ink); background: #fff;
  transition: border .13s, box-shadow .13s }
.lg-filters .fld input:focus, .lg-filters .fld select:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(15,118,110,.16) }
.lg-opcell { position: sticky; right: 0; z-index: 2; background: #fff; border-left: 2px solid var(--line);
  box-shadow: -5px 0 6px -3px rgba(15,23,42,.08); white-space: nowrap }
.lg-table thead .lg-opcell { z-index: 3 }
.lg-table tr.click:hover .lg-opcell { background: #f4f2ec }
.lg-opcell .btn { padding: 2px 7px; font-size: 12px }
.lg-filters .rng { display: flex; gap: 5px; align-items: center; color: var(--muted) }
.lg-filters .rng input { flex: 1 1 0; min-width: 0 }
.lg-actbar { display: flex; gap: 8px; align-items: center; margin-top: 12px; flex-wrap: wrap }

/* 只读输入框 */
input.ro,textarea.ro{background:var(--paper);color:var(--muted)}
/* 弹窗表单：字段栅格对齐 */
.modal-body .fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px 14px}
.modal-body .fgrid .fld{margin:0}
.modal-body .fgrid .fld.wide{grid-column:1/-1}
/* 弹窗表单分区标题 */
.fsec{font-weight:700;font-size:13px;color:var(--ink-2);margin:14px 0 8px;padding-left:9px;border-left:3px solid var(--brand)}

/* ---------- 招标原文 markdown 预览（AI 深度解读左栏） ---------- */
.mdview{ line-height:1.8; word-break:break-word; }
.mdview .mdp{ margin:2px 0; }
.mdview .mdsp{ height:7px; }
.mdview .mdli{ margin:2px 0; position:relative; }
.mdview .mdli::before{ content:"·"; position:absolute; left:4px; color:var(--muted); }
.mdview .mdh{ font-weight:700; color:#0f172a; margin:12px 0 5px; line-height:1.5; }
.mdview .mdh1{ font-size:16px; border-bottom:2px solid var(--line); padding-bottom:4px; }
.mdview .mdh2{ font-size:14.5px; border-left:3px solid var(--brand); padding-left:7px; }
.mdview .mdh3{ font-size:13.5px; color:var(--brand-deep); }
.mdview .mdh4{ font-size:13px; color:var(--ink-2); }
.mdview .mdq{ border-left:3px solid var(--line); padding-left:9px; color:var(--muted); margin:4px 0; }
.mdview .mdhr{ border:0; border-top:1px solid var(--line); margin:10px 0; }
.mdview table.mdt{ border-collapse:collapse; margin:8px 0; font-size:12px; display:block; overflow-x:auto; max-width:100%; }
.mdview table.mdt th,.mdview table.mdt td{ border:1px solid #dbe1ea; padding:4px 8px; text-align:left; white-space:nowrap; }
.mdview table.mdt th{ background:var(--mutedbg); font-weight:600; }

/* 智能体对话：折叠块展开后箭头转向，让人看得出状态 */
.agent-msg details > summary::-webkit-details-marker { display:none; }
.agent-msg details[open] > summary > span:first-child { transform:rotate(90deg); display:inline-block; }
.agent-msg details[open] > summary > span:last-child { display:none; }

/* ── 智能体对话：整套照搬 D:/pi/demo（用户 2026-08-17：「有得抄就抄」）──
   要点是**左对齐的卡片**，不是右对齐气泡；工具行等宽小灰字；系统提示居中。 */
.ag-bubble{background:#f6f7f9;border:1px solid var(--line);border-radius:0;padding:10px 14px;
  margin-bottom:10px;word-break:break-word;max-width:96%}
.ag-bubble.user{border-color:#2f6fce;background:#eef4fd;white-space:pre-wrap}
.ag-bubble p{margin:4px 0}
.ag-bubble h3,.ag-bubble h4,.ag-bubble h5,.ag-bubble h6{margin:10px 0 4px}
.ag-bubble h3{font-size:16px}.ag-bubble h4{font-size:15px}.ag-bubble h5,.ag-bubble h6{font-size:14px}
.ag-bubble table{border-collapse:collapse;margin:8px 0;font-size:13px;display:block;overflow-x:auto;max-width:100%}
.ag-bubble th,.ag-bubble td{border:1px solid var(--line);padding:4px 10px;text-align:left}
.ag-bubble th{background:var(--hair)}
.ag-bubble code{background:var(--hair);padding:1px 5px;border-radius:0;font-family:Consolas,monospace;font-size:12px}
.ag-bubble pre{background:#f0f1f3;border:1px solid var(--line);padding:8px 10px;border-radius:0;overflow-x:auto;margin:6px 0}
.ag-bubble pre code{background:none;padding:0}
.ag-bubble ul,.ag-bubble ol{margin:4px 0;padding-left:22px}
.ag-bubble hr{border:none;border-top:1px solid var(--line);margin:8px 0}
.ag-toolline{color:var(--muted);font:12px Consolas,monospace;padding:1px 6px}
.ag-toolline span{color:#9a6c00}
.ag-sys{color:var(--muted);font-size:12px;text-align:center;margin:8px 0}

/* 干活过程中的说明压成一行——一轮下来几十条，全展开用户根本看不完。
   只有一轮结束那条结论才铺开（.ag-bubble）。 */
.ag-step{color:var(--muted);font-size:12.5px;padding:2px 6px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;cursor:pointer}
.ag-step:hover{color:#2f6fce}
.ag-step::before{content:"💬 ";opacity:.6}
