:root{
  --theme-primary:#1C3D2E; --theme-light:#B0792E; --bg:#F7F4EC; --line:#E3DDCF;
  --price:#C0392B; --ok:#2E7D32; --warn:#B0792E; --bad:#C0392B;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;background:var(--bg);color:#222}
.hidden{display:none!important}

/* login */
.login-mask{position:fixed;inset:0;background:var(--theme-primary);display:flex;align-items:center;justify-content:center}
.login-card{background:#fff;border-radius:14px;padding:32px;width:320px;box-shadow:0 10px 40px rgba(0,0,0,.25)}
.brand{font-size:22px;font-weight:800;color:var(--theme-primary);text-align:center}
.brand-sub{font-size:13px;color:#888;text-align:center;margin:6px 0 20px}
.login-card input{width:100%;padding:11px 12px;border:1px solid var(--line);border-radius:8px;margin-bottom:12px;font-size:14px}
.login-card button{width:100%;padding:11px;border:0;border-radius:8px;background:var(--theme-primary);color:#fff;font-size:15px;cursor:pointer}
.login-card .err{color:var(--bad);font-size:13px;min-height:18px;margin-top:8px}
.login-card .hint{color:#999;font-size:12px;text-align:center;margin-top:10px}

/* layout */
.app{display:flex;min-height:100vh}
.side{width:210px;background:var(--theme-primary);color:#eee;display:flex;flex-direction:column;padding:18px 0}
.side-brand{color:#fff;font-weight:800;font-size:15px;text-align:center;padding:8px 0 18px;border-bottom:1px solid rgba(255,255,255,.12)}
.side nav{display:flex;flex-direction:column;flex:1;margin-top:10px;overflow-y:auto}
.nav{background:none;border:0;color:#cfd8d2;text-align:left;padding:11px 18px;font-size:13px;cursor:pointer;white-space:nowrap}
.nav:hover{background:rgba(255,255,255,.06)}
.nav.active{background:var(--theme-light);color:#fff;font-weight:600}
.side-foot{display:flex;justify-content:space-between;align-items:center;padding:14px 18px;border-top:1px solid rgba(255,255,255,.12);font-size:12px}
.side-foot button{background:none;border:1px solid rgba(255,255,255,.3);color:#eee;border-radius:6px;padding:5px 10px;cursor:pointer}
.side-role{color:rgba(255,255,255,.55);white-space:nowrap}
.side-ver{padding:8px 18px 14px;font-size:11px;color:rgba(255,255,255,.45);border-top:1px solid rgba(255,255,255,.12)}

/* 无权限按钮：置灰禁用态 */
.btn.no-perm,.no-perm{opacity:.45;cursor:not-allowed !important;filter:grayscale(1)}
.main{flex:1;padding:24px 30px;overflow:auto}

/* cards */
.page-title{font-size:18px;font-weight:700;color:var(--theme-primary);margin-bottom:16px}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:20px}
.kpi{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px}
.kpi .v{font-size:24px;font-weight:800;color:var(--theme-primary)}
.kpi .v.price{color:var(--price)}
.kpi .l{font-size:13px;color:#777;margin-top:4px}
.kpi.warn .v{color:var(--warn)}

/* table */
table{width:100%;border-collapse:collapse;background:#fff;border-radius:10px;overflow:hidden}
th,td{padding:11px 12px;text-align:left;border-bottom:1px solid var(--line);font-size:13px}
th{background:#f0ece1;color:#555;font-weight:600}
tr:hover td{background:#faf8f2}
.tag{padding:2px 9px;border-radius:20px;font-size:12px;font-weight:600}
.tag.frozen{background:#fff3e0;color:var(--warn)}
.tag.audited{background:#e8f0fe;color:#2563eb}
.tag.settled{background:#e6f4ea;color:var(--ok)}
.tag.rejected{background:#fdecea;color:var(--bad)}
.tag.pending{background:#f1f1f1;color:#777}
.tag.applied{background:#fff3e0;color:var(--warn)}
.tag.issued{background:#e6f4ea;color:var(--ok)}
.tag.invalid{background:#fdecea;color:var(--bad)}
.tag.base{background:#e6f4ea;color:var(--ok)}
.tag.large_order{background:#fff3e0;color:var(--warn)}
.tag.refund{background:#fdecea;color:var(--bad)}
.tag.deduct{background:#fdecea;color:var(--bad)}
.tag.freeze{background:#eef2ff;color:#4f46e5}
.tag.release{background:#eef6ff;color:#0369a1}
.btn{padding:6px 12px;border:0;border-radius:7px;cursor:pointer;font-size:12px;margin-right:6px}
.btn.ok{background:var(--ok);color:#fff}
.btn.bad{background:var(--bad);color:#fff}
.btn.primary{background:var(--theme-primary);color:#fff}
.btn.ghost{background:#fff;border:1px solid var(--line);color:#444}
.section{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;margin-bottom:18px}
.section h3{font-size:15px;color:var(--theme-primary);margin-bottom:10px}
.empty{color:#999;font-size:13px;padding:20px;text-align:center}
.mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}
.code-area{width:100%;min-height:120px;border:1px solid var(--line);border-radius:8px;padding:10px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;resize:vertical;margin-bottom:4px}

/* 表单 / 筛选 / 分页 */
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}
.field{display:flex;flex-direction:column;gap:5px}
.field label{font-size:12px;color:#666}
.field input,.field select,.field textarea{padding:9px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;font-family:inherit;background:#fff}
.field textarea{min-height:64px;resize:vertical}
.filters{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
.filters input,.filters select{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;background:#fff}
.pager{display:flex;align-items:center;gap:12px;justify-content:flex-end;margin-top:12px;font-size:13px;color:#666}
.chip{display:inline-block;padding:2px 8px;border-radius:6px;background:#eee5cf;color:#6b4a15;font-size:11px;margin-right:4px}
.swatch{display:inline-block;width:46px;height:22px;border-radius:6px;vertical-align:middle;border:1px solid var(--line)}
.sub{font-size:11px;color:#999;margin-top:2px}
table td .chip{white-space:nowrap}
.row{display:flex;align-items:center;gap:10px}
.f-in{padding:8px 10px;border:1px solid var(--line);border-radius:8px;font-size:13px;width:100%;font-family:inherit;background:#fff}


/* ===== 重构新增 ===== */
/* 侧边导航：按业务域分组 */
.nav-group{margin-bottom:6px}
.nav-gname{font-size:11px;color:#9AA09D;letter-spacing:.5px;padding:10px 16px 4px;text-transform:none}
.nav-group .nav{padding-left:26px;font-size:13px}

/* 页头描述 */
.page-desc{font-size:12px;color:#6B726E;line-height:1.7;margin:-4px 0 14px;padding:10px 14px;background:#FBFAF6;border-left:3px solid #E0D6BC;border-radius:0 8px 8px 0}

/* 统一空态 */
.empty-state{padding:36px 20px;text-align:center;color:#9AA09D}
.es-icon{font-size:40px;line-height:1;margin-bottom:12px;opacity:.7}
.es-text{font-size:13px;margin-bottom:14px}
.es-act{display:flex;justify-content:center}

/* Toast 轻提示 */
.toast-wrap{position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:9999;display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{padding:10px 18px;border-radius:10px;font-size:13px;color:#fff;background:#1C3D2E;box-shadow:0 6px 20px rgba(0,0,0,.14);animation:tin .22s ease}
.toast.success{background:#2F7A52}
.toast.error{background:#B23B3B}
.toast.out{opacity:0;transition:opacity .3s}
@keyframes tin{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}

/* 页签（合并页内多数据集切换） */
.tabs{display:flex;gap:6px;border-bottom:1px solid var(--line);margin-bottom:14px}
.tab{padding:9px 16px;border:none;background:none;font-size:13px;color:#6B726E;cursor:pointer;border-bottom:2px solid transparent;font-family:inherit}
.tab.on{color:var(--theme-primary);border-bottom-color:var(--theme-primary);font-weight:600}

/* 待办卡片：可点击直达 */
.kpi.todo{cursor:pointer;border-left:3px solid var(--warn);transition:transform .12s,box-shadow .12s}
.kpi.todo:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(0,0,0,.08)}
.kpi.todo .v{color:var(--warn)}
.todo-go{margin-left:8px;color:var(--theme-primary);font-weight:600}

/* 两栏布局（标签管理：左分组右标签） */
.two-col{display:grid;grid-template-columns:minmax(220px,1fr) 2fr;gap:16px;align-items:start}
@media (max-width:900px){.two-col{grid-template-columns:1fr}}

/* 分组列表 */
.list-plain{display:flex;flex-direction:column;gap:6px}
.lp-row{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid transparent;border-radius:8px;cursor:pointer;font-size:13px}
.lp-row:hover{background:#F7F8F7}
.lp-row.on{background:#F1F6F3;border-color:#CBD9D1}
.lp-name{flex:1}
.lp-ops{display:flex;gap:6px}

/* CMS 编排：左编排 / 右手机预览 */
.cms-col{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:16px;align-items:start}
@media (max-width:1180px){.cms-col{grid-template-columns:1fr}}

/* 手机预览框 */
.phone-wrap{position:sticky;top:20px}
.phone{width:300px;max-width:100%;margin:0 auto;border:10px solid #2B2F2D;border-radius:28px;background:#fff;overflow:hidden;box-shadow:0 8px 26px rgba(0,0,0,.16)}
.phone-bar{background:var(--theme-primary);color:#fff;font-size:12px;text-align:center;padding:9px 0;font-weight:600}
.phone-body{min-height:420px;padding:12px;background:#F7F8F7;font-size:12px;line-height:1.7;color:#333}
.ph-swiper{height:132px;border-radius:10px;display:flex;flex-direction:column;justify-content:center;padding:14px;color:#fff}
.ph-sw-title{font-size:16px;font-weight:800}
.ph-sw-sub{font-size:12px;opacity:.9;margin-top:4px}
.ph-dots{display:flex;justify-content:center;gap:5px;margin:8px 0}
.ph-dot{width:6px;height:6px;border-radius:50%;background:#C7CFCB}
.ph-dot.on{background:var(--theme-primary);width:14px;border-radius:3px}
.ph-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;background:#fff;border-radius:10px;padding:12px}
.ph-cell{text-align:center}
.ph-icon{width:38px;height:38px;margin:0 auto 5px;border-radius:10px;background:#F1F6F3;display:flex;align-items:center;justify-content:center;font-size:17px;color:var(--theme-primary);overflow:hidden}
.ph-icon img{width:100%;height:100%;object-fit:cover}
.ph-cell-t{font-size:11px;color:#555}
.ph-sec-t{font-size:12px;font-weight:700;color:var(--theme-primary);margin:12px 0 6px}
.ph-tip{font-size:11px;color:#9AA09D;text-align:center;margin-top:10px}
.ph-empty{color:#9AA09D;text-align:center;padding:24px 8px;font-size:12px}
.ph-h{font-size:14px;font-weight:800;color:var(--theme-primary);margin:10px 0 6px}
.ph-p{margin-bottom:8px}
.ph-ul{margin:0 0 8px;padding-left:18px}

/* 企业 360：弹窗内分块 + 键值表 */
.modal-body{max-height:64vh;overflow:auto}
.e360-sec{margin-bottom:14px}
.e360-sec h4{font-size:13px;color:var(--theme-primary);margin-bottom:6px;padding-bottom:5px;border-bottom:1px solid var(--line)}
table.kv{width:100%;border-collapse:collapse;background:none;border-radius:0}
table.kv th{width:110px;background:none;color:#777;font-weight:500;font-size:12px;vertical-align:top;padding:6px 8px}
table.kv td{padding:6px 8px;border-bottom:1px solid var(--line);font-size:12px;line-height:1.7}

/* 弹窗卡片：覆盖 .login-card 的 320px 固定宽 */
.modal-card{width:auto}

/* 内容页编辑：左表单右预览 */
.ct-edit{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:18px;align-items:start}
.ct-edit>*{min-width:0}
@media (max-width:860px){.ct-edit{grid-template-columns:1fr}}
.ct-body{min-height:300px;resize:vertical;line-height:1.8;font-family:inherit;width:100%}
.ct-prev{position:sticky;top:0}
.ct-prev .phone{width:100%;box-sizing:border-box}
/* 弹窗内 grid/form 防溢出 */
.modal-body .form-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.modal-body table{table-layout:auto}

/* 拖拽排序表格 */
table.draggable tr.dragging{opacity:.45}
table.draggable tr.dragover{outline:2px dashed #8FB3A0;outline-offset:-2px}
.drag-handle{cursor:grab;color:#B4BAB7;text-align:center;user-select:none}
table td.ops,table th.ops{text-align:right;white-space:nowrap}

/* 图标预览（列表 / 树）：统一矢量图标与文字兜底同尺寸对齐 */
.ic-prev { display: inline-block; object-fit: contain; vertical-align: middle; }
.ic-prev-t { display: inline-block; font-size: 14px; line-height: 1; color: #6B726E; vertical-align: middle; }

/* 筛选区增强：与按钮组对齐 */
.filters .f-item{display:flex;flex-direction:column;gap:4px}
.filters .f-item label{font-size:11px;color:#6B726E}
.filters .f-btns{flex-direction:row;align-items:flex-end;gap:8px}
.filters .f-btns .btn{padding:8px 16px}

/* ===== 页面搭建（可视化搭建）===== */
/* 模块库：按分组陈列的可添加模块 */
.pb-lib{display:flex;flex-direction:column;gap:12px}
.pb-lib-g{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.pb-lib-gn{font-size:12px;color:#6B726E;min-width:52px;font-weight:600}
.pb-chip{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:#fff;cursor:pointer;transition:.15s}
.pb-chip:hover{border-color:var(--theme-primary);background:#F4F9F6}
.pb-chip b{font-size:12px;font-weight:600;color:#1F2421}
.pb-chip .mono{font-size:10px;color:#9AA09D}
table tr.off-row td{opacity:.5}

/* 手机预览：模块级还原 */
.pb-search{background:#fff;border:1px solid var(--line);padding:7px 12px;color:#9AA09D;font-size:11px;margin-bottom:8px}
.pb-notice{display:flex;gap:6px;align-items:flex-start;font-size:11px;padding:7px 10px;border-radius:6px;margin-bottom:8px;line-height:1.5}
.pb-notice-t{flex:1;min-width:0}
.pb-swiper{border-radius:8px;display:flex;flex-direction:column;justify-content:center;padding:14px;color:#fff;margin-bottom:6px;overflow:hidden}
.pb-sw-t{font-size:15px;font-weight:800;text-shadow:0 1px 4px rgba(0,0,0,.35)}
.pb-sw-s{font-size:11px;opacity:.9;margin-top:4px}
.pb-ad{margin-bottom:8px;border-radius:8px;overflow:hidden;background:#EDEEEE}
.pb-ad img{width:100%;object-fit:cover;display:block}
.pb-ad-empty{padding:22px 10px;text-align:center;color:#9AA09D;font-size:11px}
.pb-sec-t{display:flex;justify-content:space-between;align-items:center;font-size:12px;font-weight:700;color:var(--theme-primary);margin:12px 0 6px}
.pb-more{font-size:10px;font-weight:400;color:#9AA09D}
.pb-grid{display:grid;gap:10px;background:#fff;border-radius:10px;padding:12px;margin-bottom:8px}
.pb-cell{text-align:center;min-width:0}
.pb-icon{width:36px;height:36px;margin:0 auto 5px;border-radius:50%;background:linear-gradient(135deg,#1C3D2E,#3E7C5A);color:#fff;display:flex;align-items:center;justify-content:center;overflow:hidden}
.pb-ic-img{width:100%;height:100%;object-fit:cover}
.pb-cell-t{font-size:11px;color:#555;word-break:break-all}
.pb-card{background:#fff;border-radius:10px;padding:12px;margin-bottom:8px;box-shadow:0 1px 6px rgba(28,61,46,.06)}
.pb-card .pb-sec-t{margin-top:0}
.pb-row{display:flex;align-items:center;gap:8px;padding:9px 2px;border-top:1px solid #F1F3F2;font-size:12px;color:#1F2421}
.pb-row:first-child{border-top:0}
.pb-row-t{flex:1;min-width:0}
.pb-arrow{color:#C4C9C7;font-size:16px}
.pb-goods{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
.pb-g{border:1px solid var(--line);border-radius:8px;overflow:hidden}
.pb-g-img{height:62px;background:#E9EFEC center/cover no-repeat}
.pb-g-n{font-size:10px;padding:5px 6px;color:#555}
.pb-fee{border-left:4px solid #B0792E}
.pb-fee-t{font-size:13px;font-weight:700;color:#1C3D2E}
.pb-fee-s{font-size:11px;color:#6B726E;margin-top:4px}
.pb-fee-n{font-size:10px;color:#6B726E;background:#F5F6F5;padding:6px 8px;border-radius:5px;margin-top:8px}
.pb-p{font-size:11px;color:#4A504D;margin-bottom:6px;line-height:1.7}
.pb-unknown{border:1px dashed #D9A0A0;background:#FDF6F6;color:#A64B4B;font-size:11px}
.pb-tip{font-size:10px;color:#9AA09D;text-align:center;margin-top:8px}

/* 模块编辑弹窗：左表单右预览 */
.pb-edit{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:18px;align-items:start}
.pb-edit>*{min-width:0}
@media (max-width:860px){.pb-edit{grid-template-columns:1fr}}
.pb-edit-prev .phone{width:100%;box-sizing:border-box}

/* 按钮禁用态 */
.btn[disabled]{opacity:.45;cursor:not-allowed}
.btn.bad{background:#B23B3B;color:#fff;border-color:#B23B3B}

/* 功能开关面板（admin/views/features.js） */
.feat-switches{display:grid;grid-template-columns:1fr 1fr;gap:10px 24px;margin-top:6px}
@media (max-width:760px){.feat-switches{grid-template-columns:1fr}}
.feat-sw{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#fafbfa;cursor:pointer;font-size:13px}
.feat-sw-name{flex:1;line-height:1.4}
.feat-sw input{width:18px;height:18px;cursor:pointer;flex:0 0 auto}
.feat-sw-state{flex:0 0 auto;font-size:12px;color:var(--bad);font-weight:600}
.feat-sw-state.on{color:var(--ok)}
