:root{
  --green:#2e7d4f;--green-d:#236140;--green-l:#e8f3ec;
  --amber:#b8860b;--amber-l:#fdf6e3;
  --red:#c0392b;--red-l:#fdeeec;
  --blue:#2b6cb0;--blue-l:#ebf3fb;
  --ink:#1f2937;--ink-2:#4b5563;--ink-3:#8b95a1;
  --line:#e5e8ec;--bg:#f5f7f9;--card:#ffffff;
  --radius:10px;--shadow:0 1px 3px rgba(16,24,40,.06),0 4px 12px rgba(16,24,40,.04);
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,sans-serif;
  background:var(--bg);color:var(--ink);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;
}
a{color:var(--blue);text-decoration:none}
button{font-family:inherit;font-size:14px;cursor:pointer}
input,select,textarea{font-family:inherit;font-size:14px}
.btn{border:1px solid var(--line);background:#fff;color:var(--ink);padding:7px 14px;border-radius:8px;transition:.15s}
.btn:hover{border-color:var(--green);color:var(--green)}
.btn.primary{background:var(--green);border-color:var(--green);color:#fff}
.btn.primary:hover{background:var(--green-d)}
.btn.danger{background:#fff;border-color:#f0c8c2;color:var(--red)}
.btn.danger:hover{background:var(--red-l)}
.btn.sm{padding:3px 9px;font-size:12px;border-radius:6px}
.btn:disabled{opacity:.5;cursor:not-allowed}
.tag{display:inline-block;padding:1px 8px;border-radius:999px;font-size:12px;line-height:19px;white-space:nowrap}
.tag.g{background:var(--green-l);color:var(--green-d)}
.tag.a{background:var(--amber-l);color:#8a6508}
.tag.r{background:var(--red-l);color:var(--red)}
.tag.b{background:var(--blue-l);color:var(--blue)}
.tag.n{background:#eef0f3;color:var(--ink-2)}

/* ---- 布局 ---- */
/* 侧栏「不随主界面同步滚动」：把侧栏从文档流里钉住（sticky + 100vh），
   主内容在右侧独立滚动。以前侧栏是普通 flex 子项，页面一长它就被卷走了，
   滚到表格底部想换个页面还得先滚回顶部 —— 这是琊哥这次提的第一条。 */
.shell{display:flex;min-height:100vh;align-items:flex-start}
.side{width:214px;background:#1f2a33;color:#c7d0d8;flex:0 0 214px;display:flex;flex-direction:column;
  position:sticky;top:0;height:100vh;overflow:hidden}
.side .brand{padding:16px 16px 12px;font-size:15px;font-weight:600;color:#fff;letter-spacing:.5px;border-bottom:1px solid #2c3944}
.side .brand small{display:block;font-weight:400;font-size:11px;color:#7f8c99;letter-spacing:0}
.side nav{flex:1;overflow-y:auto;padding:8px 0;max-height:calc(100vh - 120px)}
/* v1.3：分组可折叠。原来分组标题只是个不可点的标签，菜单多了就得一路往下滚；
   折起来之后「不上下滑动就能点到功能模块」才成立。
   整行都是可点区域（不是只有那 4 个字）—— 点小字最容易点空。 */
.side .grp .gttl{display:flex;align-items:center;gap:6px;padding:9px 16px 5px;font-size:11px;
  color:#6f7d8a;letter-spacing:1px;cursor:pointer;user-select:none}
.side .grp .gttl:hover{color:#c7d0d8}
.side .grp .gttl .arw{display:inline-block;font-size:9px;transition:transform .15s}
.side .grp:not(.open) .gttl .arw{transform:rotate(-90deg)}
.side .grp .gitems{display:none}
.side .grp.open .gitems{display:block}
.side .it{display:block;padding:8px 16px;color:#c7d0d8;font-size:13.5px;border-left:3px solid transparent}
.side .it:hover{background:#26323c;color:#fff}
.side .it.on{background:#26323c;color:#fff;border-left-color:var(--green)}
.side .foot{padding:10px 16px;border-top:1px solid #2c3944;font-size:11.5px;color:#7f8c99}
.main{flex:1;min-width:0;display:flex;flex-direction:column}
.top{height:52px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;padding:0 18px;gap:12px;position:sticky;top:0;z-index:20}
.top h1{font-size:16px;margin:0;font-weight:600}
.top .sp{flex:1}
.top .who{font-size:13px;color:var(--ink-2)}
.content{padding:16px 18px 40px;flex:1}
@media(max-width:900px){
  .shell{display:block}
  .side{position:static;height:auto;width:auto;flex:none}
  .side nav{max-height:none;display:flex;flex-wrap:wrap}
  /* 窄屏（手机看后台）不折叠：横向平铺本来就不用滚，折起来反而多一次点击。
     display:contents 让分组容器不生成盒子，菜单项直接参与上面的 flex 换行。 */
  .side .grp,.side .grp .gitems,.side .grp.open .gitems{display:contents}
  .side .grp .gttl{display:none}
  .side .it{border-left:none;padding:6px 10px;font-size:12.5px}
}

/* ---- 卡片 ---- */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:14px}
.card>h3{margin:0;padding:12px 16px;border-bottom:1px solid var(--line);font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px}
.card>h3 .sp{flex:1}
.card .bd{padding:14px 16px}
.card .bd.p0{padding:0}
.grid{display:grid;gap:14px}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
@media(max-width:1100px){.g4{grid-template-columns:repeat(2,minmax(0,1fr))}.g3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:760px){.g4,.g3,.g2{grid-template-columns:1fr}}

.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}
.kpi .l{font-size:12.5px;color:var(--ink-3)}
.kpi .v{font-size:25px;font-weight:600;margin-top:4px;letter-spacing:-.5px}
.kpi .v small{font-size:13px;font-weight:400;color:var(--ink-3);margin-left:3px}
.kpi .s{font-size:12px;color:var(--ink-3);margin-top:2px}
.kpi.up .v{color:var(--red)}
.kpi.dn .v{color:var(--green)}

/* ---- 表格 ---- */
table{width:100%;border-collapse:collapse;font-size:13.5px}
th{text-align:left;padding:9px 12px;background:#fafbfc;color:var(--ink-2);font-weight:600;font-size:12.5px;border-bottom:1px solid var(--line);white-space:nowrap}
td{padding:9px 12px;border-bottom:1px solid #f0f2f5;vertical-align:middle}
tr:hover td{background:#fafcfa}
.tw{overflow:auto;max-width:100%}
.num{text-align:right;font-variant-numeric:tabular-nums}
.mono{font-family:var(--mono);font-size:12.5px}
.empty{padding:36px;text-align:center;color:var(--ink-3);font-size:13px}

/* ---- 表单 ---- */
.frm{display:grid;gap:12px}
.frm.g2c{grid-template-columns:repeat(2,minmax(0,1fr))}
.f{margin-left:0}
.f label{display:block;font-size:12.5px;color:var(--ink-2);margin-bottom:4px}
.f input,.f select,.f textarea{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;outline:none;background:#fff}
.f input:focus,.f select:focus,.f textarea:focus{border-color:var(--green);box-shadow:0 0 0 3px var(--green-l)}
.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.bar .sp{flex:1}
.hint{font-size:12px;color:var(--ink-3);line-height:1.7}
.warn{background:var(--amber-l);border:1px solid #f0e0b0;color:#7a5c07;padding:9px 12px;border-radius:8px;font-size:12.5px;line-height:1.7}
.err{background:var(--red-l);border:1px solid #f2c8c2;color:#8f2b20;padding:9px 12px;border-radius:8px;font-size:12.5px}
.info{background:var(--blue-l);border:1px solid #cfe0f2;color:#20517f;padding:9px 12px;border-radius:8px;font-size:12.5px;line-height:1.7}
.okbox{background:var(--green-l);border:1px solid #c8e3d3;color:var(--green-d);padding:9px 12px;border-radius:8px;font-size:12.5px}

/* ---- AI 提交前核查弹框（v1.3） ----
   四级色：绿=没问题 / 灰=一般情况 / 黄=值得看一眼 / 红=提交也会被拒。
   用颜色区分级别，但**每一条都带图标与文字**：只靠颜色的话，色弱的人看不出区别，
   而这里最差的那种情况（红色）恰恰是不能漏看的。 */
.aichk .aihead{padding:9px 12px;border-radius:8px;font-size:13.5px;font-weight:600;margin-bottom:10px}
.aichk .aihead.g{background:var(--green-l);border:1px solid #c8e3d3;color:var(--green-d)}
.aichk .aihead.n{background:#f2f5f7;border:1px solid var(--line);color:var(--ink-2)}
.aichk .aihead.a{background:var(--amber-l);border:1px solid #f0e0b0;color:#7a5c07}
.aichk .aihead.r{background:var(--red-l);border:1px solid #f2c8c2;color:#8f2b20}
.aichk .aiitems{list-style:none;padding:0;margin:0}
.aichk .aiitems li{display:flex;gap:8px;padding:7px 0;font-size:13px;line-height:1.6;border-bottom:1px dashed var(--line)}
.aichk .aiitems li:last-child{border-bottom:0}
.aichk .aiitems .ico{flex:0 0 15px;text-align:center;font-weight:700}
.aichk .aiitems li.g .ico{color:var(--green)}
.aichk .aiitems li.n .ico{color:#8a97a3}
.aichk .aiitems li.a .ico{color:var(--amber)}
.aichk .aiitems li.r .ico{color:var(--red)}
.chksilent{display:flex;align-items:center;gap:5px;margin-right:auto;cursor:pointer}

/* ---- 弹窗 ---- */
.mask{position:fixed;inset:0;background:rgba(17,24,39,.45);display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}
/* 核查弹框叠在表单之上（表单还在下面，取消核查后填的内容不丢） */
#modal2 .mask{z-index:200;background:rgba(17,24,39,.55)}
.modal{background:#fff;border-radius:12px;max-width:760px;width:100%;max-height:88vh;overflow:auto;box-shadow:0 20px 60px rgba(0,0,0,.25)}
.modal h3{margin:0;padding:14px 18px;border-bottom:1px solid var(--line);font-size:15px;display:flex;align-items:center}
.modal h3 .sp{flex:1}
.modal .bd{padding:16px 18px}
.modal .ft{padding:12px 18px;border-top:1px solid var(--line);display:flex;gap:8px;justify-content:flex-end;position:sticky;bottom:0;background:#fff}
.toast{position:fixed;top:16px;left:50%;transform:translateX(-50%);background:#1f2a33;color:#fff;padding:10px 18px;border-radius:8px;font-size:13.5px;z-index:200;box-shadow:0 8px 24px rgba(0,0,0,.2);max-width:80vw}
.toast.err{background:#8f2b20}
.toast.ok{background:var(--green-d)}

/* ---- 订单状态看板 ---- */
.kanban{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px}
@media(max-width:1200px){.kanban{grid-template-columns:repeat(2,minmax(0,1fr))}}
.col{background:#f0f3f6;border-radius:10px;padding:8px;min-height:140px}
.col h4{margin:0 0 8px;font-size:13px;display:flex;align-items:center;gap:6px}
.col h4 .n{background:#fff;border-radius:999px;padding:0 7px;font-size:11.5px;color:var(--ink-2)}
.ocard{background:#fff;border-radius:8px;padding:9px 10px;margin-bottom:8px;border:1px solid var(--line);cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.04)}
.ocard:hover{border-color:var(--green)}
.ocard .no{font-family:var(--mono);font-size:11.5px;color:var(--ink-3)}
.ocard .cn{font-weight:600;font-size:13.5px;margin:2px 0}
.ocard .am{color:var(--red);font-weight:600;font-size:13.5px}
.ocard .mt{font-size:11.5px;color:var(--ink-3);display:flex;justify-content:space-between;margin-top:3px}
.ocard .late{color:#fff;background:var(--red);border-radius:4px;padding:0 5px;font-size:11px}

/* ---- 时间轴 ---- */
.tl{position:relative;padding-left:22px}
.tl:before{content:"";position:absolute;left:6px;top:6px;bottom:6px;width:2px;background:var(--line)}
.tl .n{position:relative;margin-bottom:14px}
.tl .n:before{content:"";position:absolute;left:-20px;top:5px;width:11px;height:11px;border-radius:50%;background:#fff;border:2px solid var(--line)}
.tl .n.on:before{border-color:var(--green);background:var(--green)}
.tl .n .t{font-weight:600;font-size:13.5px}
.tl .n .d{font-size:12px;color:var(--ink-3)}

/* ---- 地块示意图 ---- */
.mapzone{border:1px solid var(--line);border-radius:10px;padding:10px;background:#fff;margin-bottom:12px}
.mapzone h4{margin:0 0 8px;font-size:13.5px;display:flex;gap:8px;align-items:center}
.plotgrid{display:flex;flex-wrap:wrap;gap:3px}
.plot{width:34px;height:30px;border-radius:4px;font-size:9.5px;display:flex;align-items:center;justify-content:center;cursor:pointer;border:1px solid rgba(0,0,0,.06);color:#fff;text-align:center;line-height:1.1;overflow:hidden}
.plot:hover{outline:2px solid var(--ink);outline-offset:1px}
.legend{display:flex;flex-wrap:wrap;gap:10px;font-size:12px;color:var(--ink-2);margin-top:8px}
.legend i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:4px;vertical-align:-2px}

/* ---- AI ---- */
.ai{padding:11px 13px;border-radius:9px;border:1px solid var(--line);margin-bottom:9px;background:#fff}
.ai.high{border-left:4px solid var(--red)}
.ai.warn{border-left:4px solid var(--amber)}
.ai.info{border-left:4px solid var(--blue)}
.ai .t{font-weight:600;font-size:13.5px}
.ai .e{font-size:12.5px;color:var(--ink-2);margin-top:3px}
.ai .ad{font-size:12.5px;color:var(--green-d);margin-top:4px}
.ai .m{font-size:11.5px;color:var(--ink-3);margin-top:4px}
.chat{height:340px;overflow:auto;border:1px solid var(--line);border-radius:10px;padding:12px;background:#fafbfc}
.msg{margin-bottom:10px;display:flex;gap:8px}
.msg .b{padding:8px 12px;border-radius:10px;max-width:78%;font-size:13.5px;line-height:1.7;white-space:pre-wrap}
.msg.u{justify-content:flex-end}
.msg.u .b{background:var(--green);color:#fff}
.msg.a .b{background:#fff;border:1px solid var(--line)}

/* ---- 手机端 ---- */
.mbody{background:#eef1f4;max-width:520px;margin:0 auto;min-height:100vh;display:flex;flex-direction:column}
.mhead{background:var(--green);color:#fff;padding:12px 14px;position:sticky;top:0;z-index:10}
.mhead .t{font-size:16px;font-weight:600}
.mhead .s{font-size:12px;opacity:.85}
.mtabs{display:flex;background:#fff;border-top:1px solid var(--line);position:sticky;bottom:0;z-index:10}
.mtabs a{flex:1;text-align:center;padding:9px 0 8px;font-size:11.5px;color:var(--ink-3);border-top:2px solid transparent}
.mtabs a.on{color:var(--green);border-top-color:var(--green);font-weight:600}
.mtabs a b{display:block;font-size:17px;font-weight:400;line-height:1.2}
.mbody .content{padding:12px}
.mcard{background:#fff;border-radius:10px;padding:12px;margin-bottom:10px;box-shadow:0 1px 2px rgba(0,0,0,.05)}
.mcard h4{margin:0 0 8px;font-size:14px}
.bigbtn{display:block;width:100%;background:var(--green);color:#fff;border:none;border-radius:10px;padding:13px;font-size:15.5px;font-weight:600;margin-top:10px}
.bigbtn:active{background:var(--green-d)}
.list-it{display:flex;align-items:center;gap:10px;padding:10px 0;border-bottom:1px solid #f0f2f5}
.list-it:last-child{border-bottom:none}
.list-it .sp{flex:1;min-width:0}
.list-it .t{font-size:14px}
.list-it .s{font-size:12px;color:var(--ink-3)}

/* ---- 顾客端 ---- */
.shop{max-width:480px;margin:0 auto;background:#fff;min-height:100vh;padding-bottom:64px}
.shead{background:linear-gradient(135deg,#2e7d4f,#3f9a63);color:#fff;padding:16px 14px 14px}
.shead h1{margin:0;font-size:19px}
.shead p{margin:2px 0 0;font-size:12.5px;opacity:.9}
.scats{display:flex;gap:8px;overflow-x:auto;padding:10px 14px;position:sticky;top:0;background:#fff;border-bottom:1px solid var(--line);z-index:5}
.scats span{padding:4px 12px;border-radius:999px;background:#f0f3f6;font-size:13px;white-space:nowrap}
.scats span.on{background:var(--green);color:#fff}
.pit{display:flex;gap:11px;padding:12px 14px;border-bottom:1px solid #f2f4f6}
.pit .im{width:66px;height:66px;border-radius:9px;background:var(--green-l);display:flex;align-items:center;justify-content:center;font-size:24px;flex:0 0 66px}
.pit .sp{flex:1;min-width:0}
.pit .nm{font-size:14.5px;font-weight:600}
.pit .sp2{font-size:12px;color:var(--ink-3);margin-top:1px}
.pit .pr{color:var(--red);font-size:16px;font-weight:700;margin-top:5px}
.pit .pr small{font-size:12px;font-weight:400;color:var(--ink-3)}
.pit .src{font-size:11.5px;color:var(--green);margin-top:2px}
.sbar{position:fixed;bottom:0;left:0;right:0;max-width:480px;margin:0 auto;background:#fff;border-top:1px solid var(--line);display:flex}
.sbar a{flex:1;text-align:center;padding:8px 0;font-size:11px;color:var(--ink-3)}
.sbar a.on{color:var(--green);font-weight:600}
.sbar a b{display:block;font-size:18px;font-weight:400}
.cartbar{position:fixed;bottom:52px;left:0;right:0;max-width:480px;margin:0 auto;background:#1f2a33;color:#fff;padding:9px 14px;display:flex;align-items:center;gap:10px;font-size:13.5px}
.steps{display:flex;padding:16px 8px;background:#fff}
.steps .st{flex:1;text-align:center;position:relative;font-size:11.5px;color:var(--ink-3)}
.steps .st:before{content:"";position:absolute;top:9px;left:0;right:0;height:2px;background:var(--line);z-index:0}
.steps .st:first-child:before{left:50%}
.steps .st:last-child:before{right:50%}
.steps .st .dot{width:20px;height:20px;border-radius:50%;background:#fff;border:2px solid var(--line);margin:0 auto 5px;position:relative;z-index:1}
.steps .st.on{color:var(--green);font-weight:600}
.steps .st.on .dot{border-color:var(--green);background:var(--green)}
.steps .st.done .dot{border-color:var(--green);background:var(--green-l)}

.login{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(140deg,#1f2a33,#2e7d4f)}
.login .box{background:#fff;border-radius:14px;padding:30px 28px;width:360px;box-shadow:0 20px 60px rgba(0,0,0,.3)}
.login h1{margin:0 0 4px;font-size:20px}
.login p{margin:0 0 20px;color:var(--ink-3);font-size:13px}
.login .btn{width:100%;padding:11px;font-size:15px;margin-top:6px}
.login .demo{margin-top:14px;font-size:12px;color:var(--ink-3);line-height:1.8;border-top:1px dashed var(--line);padding-top:10px}
.spin{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.4);border-top-color:#fff;border-radius:50%;animation:sp .7s linear infinite;vertical-align:-2px}
@keyframes sp{to{transform:rotate(360deg)}}

/* ============================================================
   v1.1 新增组件
   ============================================================ */

/* ---- 总览：四域塞进一张紧凑卡 ----
   琊哥的原话是「当前排版太占空间了」。所以每个域给一行标题 + 一行 KPI，
   KPI 用 14px 的小字而不是 25px 的大数字：一屏能看完四个域，不用滚。 */
.ovsec{border-bottom:1px solid var(--line);padding:9px 14px}
.ovsec:last-child{border-bottom:none}
.ovsec h4{margin:0 0 6px;font-size:12.5px;color:var(--ink-2);font-weight:600;display:flex;align-items:center;gap:6px}
.ovrow{display:flex;flex-wrap:wrap;gap:6px}
.ovk{display:flex;align-items:baseline;gap:5px;background:#fafbfc;border:1px solid var(--line);
  border-radius:8px;padding:5px 10px;min-width:118px;flex:1 1 118px}
.ovk .l{font-size:11.5px;color:var(--ink-3)}
.ovk .v{font-size:15px;font-weight:600;letter-spacing:-.3px}
.ovk .v small{font-size:11px;font-weight:400;color:var(--ink-3);margin-left:2px}
.ovk .s{font-size:11px;color:var(--ink-3);flex:1 1 100%;margin-top:-1px}
.ovk.up .v{color:var(--red)}
.ovk.dn .v{color:var(--green)}
a.ovk{text-decoration:none;color:inherit;transition:.15s}
a.ovk:hover{border-color:var(--green);background:#fff}
a.ovk:hover .l{color:var(--green)}
a.ovk:after{content:"›";color:var(--ink-3);font-size:13px}
.ovtip{font-size:11.5px;color:var(--ink-3);margin-left:auto}

/* ---- 页签 ---- */
.tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
.tab{padding:6px 14px;border:1px solid var(--line);background:#fff;border-radius:999px;font-size:13px;color:var(--ink-2)}
.tab:hover{border-color:var(--green);color:var(--green)}
.tab.on{background:var(--green);border-color:var(--green);color:#fff}
.tab .n{display:inline-block;margin-left:6px;background:rgba(0,0,0,.08);border-radius:999px;padding:0 6px;font-size:11.5px}
.tab.on .n{background:rgba(255,255,255,.25)}

/* ---- 分页条 ---- */
.pager{display:flex;align-items:center;gap:8px;padding:10px 14px;border-top:1px solid var(--line);flex-wrap:wrap;font-size:12.5px;color:var(--ink-2)}
.pager .sp{flex:1}
.pager b{font-variant-numeric:tabular-nums}

/* ---- 筛选条 ---- */
.fbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--line);background:#fcfdfe}
.fbar select,.fbar input{padding:5px 8px;border:1px solid var(--line);border-radius:7px;font-size:12.5px;background:#fff;max-width:190px}
.fbar label{font-size:12px;color:var(--ink-3)}

/* ---- 折线趋势图（纯 SVG，不引第三方库）---- */
.trend{position:relative}
.trend svg{display:block;width:100%;height:132px;overflow:visible}
.trend .ax{fill:var(--ink-3);font-size:9.5px}
.trend .empty{padding:22px}

/* ---- 紧凑明细表 ---- */
.mini{width:100%;border-collapse:collapse;font-size:12.5px}
.mini th{padding:5px 8px;font-size:11.5px;background:#f7f9fb}
.mini td{padding:5px 8px;border-bottom:1px solid #f2f4f6}
.mini tr:last-child td{border-bottom:none}

/* ---- 左右分栏（种植计划：左 = AI 推荐，右 = 选定方案）---- */
.split{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:14px}
@media(max-width:1250px){.split{grid-template-columns:1fr}}
.pane{background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);display:flex;flex-direction:column;min-height:280px}
.pane>h3{margin:0;padding:11px 14px;border-bottom:1px solid var(--line);font-size:13.5px;font-weight:600;display:flex;align-items:center;gap:8px}
.pane>h3 .sp{flex:1}
.pane .pbd{padding:12px 14px;flex:1}
.pane .pbd.p0{padding:0}
.pane .pft{padding:10px 14px;border-top:1px solid var(--line);display:flex;gap:8px;align-items:center;flex-wrap:wrap}

/* ---- 折线条纹（表格内的小趋势）---- */
.spark{display:inline-block;vertical-align:-2px}

/* ---- 说明块（AI 推荐理由）---- */
.why{background:#f7fbf8;border-left:3px solid var(--green);padding:7px 10px;border-radius:0 7px 7px 0;font-size:12px;line-height:1.65;color:var(--ink-2)}
.why.risk{background:var(--amber-l);border-left-color:var(--amber)}
.attr{display:inline-block;background:#f0f3f6;border-radius:5px;padding:0 6px;font-size:11.5px;color:var(--ink-2);margin:0 4px 3px 0}

/* ---- v1.1 组件补齐 ---- */

/* 筛选条里的标签与输入框（「排序」条复用同一套） */
.fbar .fl{font-size:12px;color:var(--ink-3);white-space:nowrap}
.fbar .fin{min-width:170px}
.fbar .fstat{margin-left:auto;font-size:12px;color:var(--ink-3);white-space:nowrap}
.fbar.fsort{background:#fff;border-bottom:1px dashed var(--line)}
.fbar+.fbar{border-top:none}

/* 分栏面板：种植计划左「AI 推荐」/ 右「选定方案」。
   面板内部自己滚动 —— 左边候选可能上百条，不该把右边选好的方案顶出屏幕。 */
.pane{max-height:660px;overflow:hidden}
.pane>h4{margin:0;padding:10px 14px;border-bottom:1px solid var(--line);font-size:13px;font-weight:600;
  background:#fafbfc;display:flex;align-items:center;gap:8px}
.pane>div{padding:0;overflow:auto;flex:1;max-height:600px}
.pane .fbar+.tw{max-height:480px}
.planline{display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px dashed #eef1f4;font-size:12.5px}
.planline:last-child{border-bottom:none}
.why h5{margin:0 0 3px;font-size:12px;color:var(--green-d);font-weight:600}
.why .d{font-size:12px;line-height:1.7}
.why+.why{margin-top:8px}

/* 待办：AI 提醒行 / 进度条 */
.aitip{margin-top:3px;font-size:11.5px;color:#20517f;background:var(--blue-l);border-radius:6px;padding:2px 7px;display:inline-block}
.prog{display:inline-block;width:64px;height:6px;background:#eef1f4;border-radius:999px;overflow:hidden;vertical-align:1px;margin-right:5px}
.prog i{display:block;height:100%;background:var(--green);border-radius:999px}

/* 概览小卡选中态 / 可点态 */
.ovk.on{border-color:var(--green);background:var(--green-l)}
.ovk.on .l{color:var(--green-d);font-weight:600}

/* ---- AI 与天气设置（v1.2）----
   状态条把「启用没有 / Key 填没填 / 用的哪个厂商」一行摆完。
   这三件事是配置阶段最常搞错的地方，散在各处会让人反复来回滚页面确认。 */
.aistat{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.pill{display:inline-block;padding:3px 10px;border-radius:999px;font-size:12px;line-height:18px;
  background:#f1f3f6;color:var(--ink-2);border:1px solid var(--line);white-space:nowrap}
.pill.g{background:var(--green-l);color:var(--green-d);border-color:transparent}
.pill.n{background:#eef0f3;color:var(--ink-3)}
.pill.r{background:var(--red-l);color:var(--red);border-color:transparent}
.pill.a{background:var(--amber-l);color:#8a6508;border-color:transparent}
details>summary{list-style:none}
details>summary::-webkit-details-marker{display:none}
details>summary:before{content:"▸ ";color:var(--ink-3)}
details[open]>summary:before{content:"▾ "}

/* ---- 天气卡（总览）---- */
.wx{display:flex;flex-wrap:wrap;gap:10px;align-items:stretch}
.wxnow{display:flex;align-items:baseline;gap:8px;background:#fafbfc;border:1px solid var(--line);
  border-radius:8px;padding:8px 14px;min-width:190px}
.wxnow .t{font-size:26px;font-weight:600;letter-spacing:-.5px}
.wxnow .x{font-size:13px;color:var(--ink-2)}
.wxdays{display:flex;gap:6px;flex-wrap:wrap;flex:1}
.wxday{background:#fafbfc;border:1px solid var(--line);border-radius:8px;padding:6px 9px;min-width:76px;text-align:center}
.wxday .d{font-size:11px;color:var(--ink-3)}
.wxday .c{font-size:13px;margin:2px 0}
.wxday .r{font-size:11px;color:var(--blue)}
.wxtip{font-size:12.5px;padding:6px 10px;border-radius:8px;margin-top:6px;background:#f7f9fb;border-left:3px solid var(--line)}
.wxtip.high{background:var(--red-l);border-left-color:var(--red);color:#8c2f2f}
.wxtip.warn{background:var(--amber-l);border-left-color:#d69e2e;color:#7a5b07}
.wxtip.ok{background:var(--green-l);border-left-color:var(--green);color:var(--green-d)}

/* ---- 自提点选择（顾客端结算页）----
   每个点做成一块可点的卡片而不是一行下拉：顾客必须看清地址和取货时段，
   下拉里塞不下「青羊区玉沙路157号玉沙综合楼7楼 · 18 点前自提」这么长的信息。 */
.pk{display:flex;gap:8px;align-items:flex-start;padding:10px 12px;margin-top:6px;
  border:1px solid var(--line);border-radius:10px;background:#fff;cursor:pointer;font-size:13px}
.pk:hover{border-color:var(--green)}
.pk:has(input:checked){border-color:var(--green);background:var(--green-l)}
.pk input{margin-top:3px;flex:none}
.pk .s{font-size:12px;color:var(--ink-3);line-height:1.6}

/* ---- 缺口 / 不足（备货汇总表）----
   「还差 12」要一眼看得见，所以用红色加粗；但**不加底色** ——
   这一列里同时还有「够」的绿标，整行铺色会把表格变成红绿板。 */
.neg{color:var(--red);font-weight:600}

/* ---- 明日工作计划卡片（种植总览，v1.3）---- */
/* 左右两栏加高，容纳更多行 */
.wp-split .pane{min-height:440px}
.wp-split .pane .pbd{max-height:560px;overflow:auto}
.wpline{display:flex;align-items:center;gap:10px;padding:8px 10px;border-bottom:1px dashed #eef1f4;font-size:12.5px}
.wpline:last-child{border-bottom:none}
.wpline:hover{background:#f7fbf8}
.wpline .wpchk{flex:0 0 auto;display:flex;align-items:center}
.wpline .wpchk input[type=checkbox]{width:15px;height:15px;cursor:pointer;margin:0}
.wpline .wpbody{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.wpline .wpbody b{font-weight:600;color:var(--ink);line-height:1.4}
.wpline .wpbody .hint{font-size:11.5px}
.wpline .wpreason{font-size:11.5px;color:var(--ink-3);line-height:1.5}
/* 每行右侧：工种/工时/地块 + 紧急标记 + 执行人下拉，横向排开多显示几列 */
.wpline .wpmeta{flex:0 0 auto;display:flex;align-items:center;gap:8px}
.wpline .wpmeta .hint{font-size:11.5px;white-space:nowrap}
.wpline .wpstaff{font-size:12px;padding:3px 6px;border:1px solid var(--line);border-radius:6px;background:#fff;max-width:120px}


/* 会员积分 · 价格计算规则说明面板（.mrule） */
.mrule{margin-top:14px;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:15px 17px}
.mrule-hd{display:flex;gap:10px;align-items:flex-start;padding-bottom:11px;border-bottom:1px dashed var(--line)}
.mrule-hd b{font-size:14px;color:var(--ink)}
.mrule-hi{width:30px;height:30px;flex:0 0 30px;border-radius:8px;background:var(--green-l);color:var(--green-d);display:flex;align-items:center;justify-content:center}
.mrule-form{margin:12px 0;padding:10px 13px;background:var(--green-l);color:var(--green-d);border-radius:8px;font-size:13px;font-family:var(--mono)}
.mrule-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.mrule-it{display:flex;gap:10px;padding:11px 12px;border:1px solid var(--line);border-radius:8px;background:#fcfdfc}
.mrule-ico{width:28px;height:28px;flex:0 0 28px;border-radius:8px;background:var(--green-l);color:var(--green);display:flex;align-items:center;justify-content:center}
.mrule-tx{flex:1;min-width:0}
.mrule-tx b{font-size:13px;color:var(--ink)}
.mrule-n{margin-left:6px;font-size:11.5px;color:var(--ink-3);border:1px solid var(--line);border-radius:999px;padding:0 6px;white-space:nowrap}
.mrule .hint{margin-top:3px}
@media(max-width:820px){.mrule-grid{grid-template-columns:1fr}}

/* ============ v1.8 AI 协助管理 ============ */
.ai-toggle{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-2);white-space:nowrap}
.ai-pv{border:1px solid var(--line);border-left:3px solid var(--green);border-radius:10px;padding:12px 14px;margin:6px 0;background:#fff}
.ai-pv.done{border-left-color:var(--blue);background:#fbfdff}
.ai-pv.cancelled{border-left-color:var(--ink-3);opacity:.7}
.ai-pv-hd{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.ai-pv-hd b{font-size:15px}
.ai-mod{color:var(--ink-3);font-size:12px}
.ai-pv-reply{color:var(--ink-2);margin-bottom:8px}
.ai-pv-target{margin-bottom:8px;font-size:13px}
.ai-pv-target span{display:inline-block;min-width:64px;color:var(--ink-3);margin-right:6px}
.ai-lv{display:inline-block;padding:1px 8px;border-radius:999px;font-size:12px;border:1px solid}
.ai-lv.lv-L0{color:var(--ink-3);border-color:var(--line);background:#f8fafc}
.ai-lv.lv-L1{color:var(--green);border-color:#bfe0cd;background:var(--green-l)}
.ai-lv.lv-L2{color:var(--red);border-color:#f2c5be;background:var(--red-l)}
.ai-diff{width:100%;border-collapse:collapse;font-size:13px;margin:6px 0}
.ai-diff th{text-align:left;color:var(--ink-3);font-weight:500;padding:4px 8px;border-bottom:1px solid var(--line)}
.ai-diff td{padding:5px 8px;border-bottom:1px dashed var(--line)}
.ai-diff td.old{color:var(--ink-3);text-decoration:line-through}
.ai-diff td.new{color:var(--green-d);font-weight:600;background:var(--green-l)}
.ai-pv-sum{margin-top:8px;padding:6px 10px;background:#f7f9fb;border-radius:6px;font-size:12px;color:var(--ink-2)}
.ai-pv-risk{margin-top:6px;padding:6px 10px;background:var(--amber-l);border-radius:6px;font-size:12px;color:#8a6400}
.ai-pv-ft{margin-top:10px;display:flex;gap:8px;align-items:center}
.ai-done{color:var(--green);font-weight:600}
.ai-muted{color:var(--ink-3);font-size:12px}
.ai-note{margin-top:8px;font-size:12px;color:var(--ink-3)}
.ai-tbl-wrap{overflow-x:auto;margin-top:8px}
.ai-tbl{width:100%;border-collapse:collapse;font-size:13px;background:#fff}
.ai-tbl th{text-align:left;padding:8px 10px;border-bottom:2px solid var(--line);color:var(--ink-2);font-weight:600;white-space:nowrap}
.ai-tbl td{padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top}
.ai-tbl tr:hover td{background:#fafcfb}
.ai-mono{font-family:var(--mono);font-size:12px}
.ai-choice{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.ai-cand{text-align:left;border:1px solid var(--line);background:#fff;border-radius:8px;padding:8px 12px;cursor:pointer}
.ai-cand:hover{border-color:var(--green);background:var(--green-l)}
.ai-cand b{display:block;font-weight:600}
.ai-cand span{color:var(--ink-3);font-size:12px}
.ai-cfg{display:flex;flex-wrap:wrap;gap:16px;align-items:center;padding:12px 14px;background:#fff;border:1px solid var(--line);border-radius:10px;margin-bottom:12px}
.ai-cfg label{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-2)}
.ai-roles{display:flex;flex-wrap:wrap;gap:4px}
.ai-role{display:inline-block;padding:2px 9px;border-radius:999px;border:1px solid var(--line);font-size:12px;color:var(--ink-3);cursor:pointer;user-select:none}
.ai-role:hover{border-color:var(--green)}
.ai-role.on{background:var(--green);border-color:var(--green);color:#fff}
.ai-st{display:inline-block;padding:1px 8px;border-radius:999px;font-size:12px}
.ai-st.st-executed{background:var(--green-l);color:var(--green-d)}
.ai-st.st-pending{background:var(--amber-l);color:#8a6400}
.ai-st.st-failed{background:var(--red-l);color:var(--red)}
.ai-st.st-cancelled{background:#f1f3f5;color:var(--ink-3)}
.ai-st.st-rolled_back{background:var(--blue-l);color:var(--blue)}
.ai-tools-tbl td{font-size:13px}
@media(max-width:820px){ .ai-cfg{flex-direction:column;align-items:flex-start} }

/* ---- v1.8.1 明细表格与补填卡片 ---- */
.ai-tbl-hd{font-weight:600;margin:8px 0 4px}
.ai-tbl-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:6px 0 4px}
.ai-cnt{font-size:12px;color:var(--ink-3)}
.ai-tbl-wrap{max-height:60vh;overflow:auto;border:1px solid var(--line);border-radius:8px}
.ai-tbl thead th{position:sticky;top:0;background:#fff;z-index:1;box-shadow:inset 0 -1px 0 var(--line)}
.ai-form{border:1px solid var(--line);border-left:3px solid var(--blue);border-radius:10px;padding:12px 14px;margin:6px 0;background:#fff}
.ai-form.cancelled{border-left-color:var(--ink-3);opacity:.7}
.ai-form-hd{font-weight:600;margin-bottom:4px}
.ai-form-hint{font-size:12px;color:var(--ink-3);margin-bottom:8px}
.ai-form-body{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px}
.ai-field{display:flex;flex-direction:column;gap:4px;font-size:13px}
.ai-field>span{color:var(--ink-2)}
.ai-field>span i{color:var(--red);font-style:normal;margin-left:2px}
.ai-field input,.ai-field select{padding:6px 8px;border:1px solid var(--line);border-radius:6px;font-size:13px;width:100%}
.ai-field em{font-size:11px;color:var(--ink-3);font-style:normal}
.ai-form-ft{margin-top:12px;display:flex;gap:8px}


/* ===================== v2.3 手风琴导航 =====================
   改这里的原因：原来 7 个分组 + 40 多个明细项全部平铺，一屏放不下，要滚很久。
   现在默认只显示模块名，点谁开谁，点别的自动收。
   颜色跟着原有深色侧栏走（#1f2a33），不引入新变量。 */
.side .brand{padding:14px 16px;font-size:15px;font-weight:700;color:#e8eef4;
  letter-spacing:.3px;border-bottom:1px solid rgba(255,255,255,.08);
  display:flex;flex-direction:column;gap:3px}
.side .brand small{font-size:11px;font-weight:400;color:#6f7d8a;letter-spacing:0}
.side #navbox{flex:1;overflow-y:auto;padding:8px 8px 12px;scrollbar-width:thin}
.side #navbox::-webkit-scrollbar{width:6px}
.side #navbox::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-radius:3px}
.side .foot{border-top:1px solid rgba(255,255,255,.08)}

/* ---- 一级：模块 ---- */
.side .grp{margin-bottom:2px;border-radius:9px;overflow:hidden}
.side .gttl{display:flex;align-items:center;gap:9px;height:42px;padding:0 12px;
  border-radius:9px;font-size:14px;font-weight:600;color:#dfe7ee;letter-spacing:0;
  cursor:pointer;user-select:none;transition:background .14s,color .14s;box-sizing:border-box}
.side .gttl:hover{background:rgba(255,255,255,.07);color:#fff}
.side .grp.open>.gttl{background:rgba(52,211,153,.16);color:#6ee7b7;font-weight:700}
.side .gttl .arw{font-size:10px;color:#6f7d8a;width:11px;text-align:center;flex:0 0 auto;
  display:inline-block;transition:transform .22s cubic-bezier(.4,0,.2,1)}
.side .grp.open>.gttl .arw{transform:rotate(90deg);color:#6ee7b7}
.side .gttl .cnt{margin-left:auto;flex:0 0 auto;font-size:10.5px;font-weight:700;
  color:#8b98a5;background:rgba(255,255,255,.09);border-radius:999px;padding:1px 7px;transition:.16s}
.side .grp.open>.gttl .cnt{background:rgba(52,211,153,.22);color:#8ff0c4}

/* ---- 手风琴动画：max-height 而非 display，才有滑出来的感觉 ---- */
.side .gitems{display:block;max-height:0;overflow:hidden;
  transition:max-height .28s cubic-bezier(.4,0,.2,1)}
.side .grp.open>.gitems{max-height:1400px}

/* ---- 二级：明细项 ---- */
.side .it{display:flex;align-items:center;position:relative;
  padding:8px 12px 8px 34px;margin:1px 4px;border-radius:7px;border-left:none;
  font-size:13.5px;color:#a9b7c3;line-height:1.4;box-sizing:border-box;
  transition:background .13s,color .13s}
.side .it::before{content:"";position:absolute;left:17px;width:5px;height:5px;border-radius:50%;
  background:#4a5866;transition:.16s}
.side .it:hover{background:rgba(255,255,255,.06);color:#e8eef4}
.side .it:hover::before{background:#6ee7b7;transform:scale(1.2)}
.side .it.on{background:rgba(52,211,153,.18);color:#8ff0c4;font-weight:700}
.side .it.on::before{background:#6ee7b7;box-shadow:0 0 0 3px rgba(52,211,153,.2);transform:scale(1.2)}

/* v2.7 小票配置 */
.sw2{display:inline-block;width:40px;height:22px;border-radius:999px;background:#d3dcd7;cursor:pointer;position:relative;transition:.18s;vertical-align:middle}
.sw2::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;transition:.18s;box-shadow:0 1px 3px rgba(0,0,0,.2)}
.sw2.on{background:#1f7a47}
.sw2.on::after{left:20px}
.fl{font-size:12.5px;color:#8b9994;display:block;margin-bottom:4px}
.fi{width:100%;padding:7px 10px;border:1px solid #e2e9e5;border-radius:8px;font-size:13px;box-sizing:border-box}
#rcfg .card .body{padding:14px 16px}


/* ---------- v2.7 小票打印配置：左配置 + 右预览 ---------- */
.rc-wrap{display:grid;grid-template-columns:minmax(0,1fr) 356px;gap:22px;align-items:start}
@media(max-width:1080px){.rc-wrap{grid-template-columns:1fr}}
.rc-sec{font-size:11px;color:#8b9994;font-weight:700;letter-spacing:.5px;margin:14px 0 6px}
.rc-sec:first-child{margin-top:0}
.rc-row{display:flex;align-items:center;gap:10px;margin-bottom:7px}
.rc-row label{flex:0 0 130px;font-size:12.5px;color:#5c6b65;line-height:1.35}
.rc-row label i{display:block;font-style:normal;font-size:11px;color:#a8b4af}
.rc-row input[type=text]{flex:1;min-width:0;padding:6px 10px;border:1px solid #e2e9e5;border-radius:7px;font-size:13px;background:#fbfdfc}
.rc-row input[type=text]:focus{outline:none;border-color:#1f7a47;background:#fff}
.rc-chks{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12.5px;color:#4a5a53}
.rc-chks label{display:flex;align-items:center;gap:5px;cursor:pointer}
.rsw{position:relative;width:40px;height:22px;border-radius:999px;background:#d3dcd7;cursor:pointer;transition:.18s;flex:0 0 auto}
.rsw::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;transition:.18s;box-shadow:0 1px 3px rgba(0,0,0,.2)}
.rsw.on{background:#1f7a47}
.rsw.on::after{left:20px}
/* 右侧预览：做成一台"打印机上的纸"的样子 */
.rc-prevbox{background:#f4f7f5;border:1px solid #e2e9e5;border-radius:12px;padding:12px}
.rc-prevt{font-size:12px;font-weight:700;color:#4a5a53;margin-bottom:2px;display:flex;justify-content:space-between;align-items:baseline}
.rc-prevt span{font-weight:400;font-size:11px;color:#a8b4af}
.rc-paper{margin-top:9px;display:flex;justify-content:center}
.rc-paper iframe{width:304px;height:540px;border:0;border-radius:4px;background:#fff;
  box-shadow:0 3px 14px rgba(20,50,35,.16)}
.rc-url{margin-top:9px;font-size:11px;color:#8b9994;word-break:break-all;line-height:1.5;text-align:center}
.rc-btns{display:flex;gap:9px;margin-top:12px}
.rc-btns .btn{flex:1;justify-content:center}

/* ===== v2.37 详情文案预览 ===== */
.ph-box { background:#fffdf8; border:1px solid var(--line); border-radius:10px; padding:10px; max-height:330px; overflow:auto; }
.ph-long { margin-bottom:8px; border-radius:6px; overflow:hidden; background:#f0ebe0; }
.ph-long img { width:100%; display:block; }
.ph-copy { padding:2px 2px 6px; }
.ph-head { font-size:11px; color:#a8977a; letter-spacing:2px; padding-bottom:6px; border-bottom:1px solid #f0e9da; margin-bottom:8px; }
.ph-title { font-size:14px; font-weight:700; color:#3f5c3a; margin-bottom:6px; line-height:1.5; }
.ph-para { font-size:12.5px; color:#5a5347; line-height:1.75; margin-bottom:4px; }
.ph-bullets { margin-top:8px; padding-top:8px; border-top:1px dashed #efe7d6; }
.ph-bullet { font-size:12px; color:#6b6252; line-height:1.7; }
