/* ==========================================================================
   唯枸WEGO 智算平台 · 管理控制台样式
   视觉基准：主流 ERP / MES（用友 U9、金蝶云星空、SAP Fiori、鼎捷）
   —— 深蓝灰导航 + 浅灰工作区 + 方正边框 + 高信息密度，不做渐变、不做发光、
      不做大圆角卡片。变量名沿用 2026-09 版的 cyan 系列，值已换成工业蓝，
      改色的地方只需要动这一处。
   ========================================================================== */

:root {
    --navy: #1E2B3A;
    --navy-2: #26374A;
    --navy-3: #2F4356;
    --cyan: #1F5FA8;
    --cyan-2: #2E75C4;
    --cyan-hov: #18508F;
    --cyan-soft: #EAF1FA;
    --bg: #F0F2F5;
    --panel: #FFFFFF;
    --line: #D9DEE5;
    --line-2: #EBEEF2;
    --ink: #1D2129;
    --ink-2: #4E5969;
    --ink-3: #86909C;
    --ok: #1F9254;
    --ok-soft: #E9F6EF;
    --warn: #C77800;
    --warn-soft: #FDF3E3;
    --err: #D93026;
    --err-soft: #FCECEA;
    --radius: 3px;
    --radius-sm: 2px;
    --shadow: 0 1px 0 rgba(20, 35, 50, .02);
    --shadow-hov: 0 2px 6px rgba(20, 35, 50, .08);
    --shadow-lg: 0 8px 24px rgba(20, 35, 50, .18);
    --side-w: 216px;
    --side-w-collapsed: 52px;
    --top-h: 48px;
    --font: "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Segoe UI", system-ui, -apple-system, sans-serif;
    --mono: "Cascadia Mono", Consolas, "Courier New", monospace;
}

* { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    font-family: var(--font);
    font-size: 13px;
    line-height: 1.5;
    color: var(--ink);
    background: var(--bg);
    -webkit-font-smoothing: antialiased;
}

a { color: var(--cyan); text-decoration: none; transition: color .15s; }
a:hover { color: var(--cyan-hov); text-decoration: none; }

::selection { background: rgba(31, 95, 168, .18); }

::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #CBD4DE; border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: #AEBAC7; }

/* --------------------------------------------------------------- 登录页
   ERP 做法：左侧纯深蓝品牌区，不放光斑、不放网格纹理、不做渐变文字；
   右侧白底表单，标签在上，控件紧凑。窄屏只留表单。 */

.login-wrap {
    min-height: 100vh;
    display: flex;
    background: var(--panel);
}

.login-left {
    flex: 1 1 46%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 56px 64px;
    color: #fff;
    background: var(--navy);
    border-right: 3px solid var(--cyan);
}

.login-brand {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 36px;
}

.login-brand .logo-mark {
    width: 34px;
    height: 34px;
    font-size: 17px;
    border-radius: 3px;
    box-shadow: none;
}

.login-brand b { font-size: 19px; letter-spacing: .5px; }
.login-brand span { color: #8FA3B5; font-size: 12.5px; margin-left: 2px; }

.login-slogan {
    font-size: 25px;
    font-weight: 600;
    line-height: 1.55;
    letter-spacing: .5px;
    margin: 0 0 12px;
}

.login-slogan em {
    font-style: normal;
    color: #7FB2E5;
}

.login-sub { color: #8FA3B5; font-size: 13px; margin-bottom: 36px; }

.login-feats { display: flex; flex-direction: column; gap: 14px; }

.login-feat {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    color: #C2CFDB;
    font-size: 13px;
    line-height: 1.65;
    max-width: 440px;
}

.login-feat i {
    flex: none;
    width: 20px;
    height: 20px;
    margin-top: 2px;
    border-radius: 2px;
    background: rgba(255, 255, 255, .08);
    border: 1px solid rgba(255, 255, 255, .18);
    color: #9CC3EA;
    font-style: normal;
    font-size: 11px;
    display: grid;
    place-items: center;
    font-weight: 600;
}

.login-feat b { color: #fff; font-weight: 600; margin-right: 6px; }

.login-right {
    flex: 0 0 440px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--panel);
    padding: 40px 44px;
}

.login-box { width: 100%; max-width: 320px; }

.login-box h1 {
    margin: 0 0 6px;
    font-size: 20px;
    font-weight: 600;
    letter-spacing: 0;
    color: var(--ink);
}

.login-box .sub {
    margin-bottom: 24px;
    color: var(--ink-3);
    font-size: 12.5px;
}

.login-box .field { margin-bottom: 14px; }

.login-box label {
    display: block;
    margin-bottom: 5px;
    font-size: 12.5px;
    color: var(--ink-2);
}

.login-box input {
    width: 100%;
    height: 34px;
    padding: 0 10px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-size: 13px;
    font-family: var(--font);
    background: #fff;
    transition: border-color .14s, box-shadow .14s;
}

.login-box input:hover { border-color: #B9C2CD; }

.login-box input:focus {
    outline: none;
    border-color: var(--cyan);
    box-shadow: 0 0 0 2px rgba(31, 95, 168, .14);
}

.login-box .btn { width: 100%; height: 36px; margin-top: 8px; font-size: 14px; letter-spacing: 4px; }

.login-box .err {
    margin-bottom: 10px;
    padding: 7px 10px;
    background: var(--err-soft);
    border-left: 2px solid var(--err);
    color: #9B2C23;
    border-radius: 2px;
    font-size: 12px;
}

/* 没有错误信息时不占位 */
.login-box .err:empty { display: none; }

.login-box .hint {
    margin-top: 18px;
    padding-top: 12px;
    border-top: 1px solid var(--line-2);
    color: var(--ink-3);
    font-size: 11.5px;
    line-height: 1.8;
    text-align: center;
}

@media (max-width: 880px) {
    .login-wrap { flex-direction: column; }
    .login-left { display: none; }
    .login-right { flex: 1; }
}

/* --------------------------------------------------------------- 主框架 */

.app {
    display: grid;
    grid-template-columns: var(--side-w) 1fr;
    grid-template-rows: var(--top-h) 1fr;
    grid-template-areas: "logo topbar" "side main";
    height: 100vh;
    transition: grid-template-columns .22s ease;
}

.app.collapsed { grid-template-columns: var(--side-w-collapsed) 1fr; }

.logo {
    grid-area: logo;
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 0 16px;
    background: var(--navy);
    color: #fff;
    border-bottom: 1px solid rgba(255, 255, 255, .06);
    overflow: hidden;
    white-space: nowrap;
}

.logo-mark {
    flex: 0 0 28px;
    width: 28px;
    height: 28px;
    display: grid;
    place-items: center;
    border-radius: 3px;
    background: var(--cyan);
    color: #fff;
    font-weight: 700;
    font-size: 15px;
    box-shadow: none;
}

.logo b { font-size: 15px; letter-spacing: .4px; }
.logo .tag-sub { color: #7FA0B8; font-size: 11.5px; }
.app.collapsed .logo b,
.app.collapsed .logo .tag-sub { display: none; }

.topbar {
    grid-area: topbar;
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 0 20px;
    background: var(--panel);
    border-bottom: 1px solid var(--line);
    position: relative;
    z-index: 5;
}

.topbar .who { color: var(--ink-2); font-size: 13px; }
.topbar .who b { color: var(--ink); font-weight: 600; }
.topbar .grow { flex: 1; }

/* 用户头像与消息铃铛 */
.avatar {
    width: 30px;
    height: 30px;
    border-radius: 50%;
    display: inline-grid;
    place-items: center;
    background: var(--cyan);
    color: #fff;
    font-size: 13px;
    font-weight: 700;
    flex: none;
}

.tb-user {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 4px 10px 4px 4px;
    border-radius: 2px;
    cursor: default;
    transition: background .15s;
}

.tb-user:hover { background: var(--line-2); }

.bell {
    position: relative;
    width: 34px;
    height: 34px;
    border: none;
    border-radius: var(--radius-sm);
    background: transparent;
    color: var(--ink-2);
    font-size: 16px;
    cursor: pointer;
    display: grid;
    place-items: center;
    transition: background .15s, color .15s;
}

.bell:hover { background: var(--line-2); color: var(--cyan); }

.bell .dot {
    position: absolute;
    top: 3px;
    right: 2px;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: 3px;
    background: var(--err);
    color: #fff;
    font-size: 10px;
    line-height: 16px;
    text-align: center;
    font-family: var(--mono);
    box-shadow: 0 0 0 2px #fff;
}

.bell .dot.hidden { display: none; }

.crumb { color: var(--ink-3); font-size: 13px; }
.crumb b { color: var(--ink); font-weight: 600; }
.crumb i { font-style: normal; margin: 0 7px; color: #C9D2DC; }

.chip {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    height: 24px;
    padding: 0 10px;
    border-radius: 3px;
    background: var(--cyan-soft);
    color: #18508F;
    font-size: 12px;
    white-space: nowrap;
}

.chip.warn { background: var(--warn-soft); color: var(--warn); }
.chip.err { background: var(--err-soft); color: var(--err); }
.chip.ok { background: var(--ok-soft); color: var(--ok); }

/* --------------------------------------------------------------- 侧边导航 */

.side {
    grid-area: side;
    background: var(--navy);
    overflow-y: auto;
    overflow-x: hidden;
    padding: 12px 0 24px;
}

.side::-webkit-scrollbar-thumb { background: #234A66; }

.menu-search { padding: 2px 12px 12px; }

.menu-search input {
    width: 100%;
    height: 32px;
    padding: 0 11px;
    border: 1px solid rgba(255, 255, 255, .12);
    border-radius: var(--radius-sm);
    background: rgba(255, 255, 255, .06);
    color: #E8F1F6;
    font-size: 12.5px;
    font-family: var(--font);
    transition: border-color .15s, background .15s;
}

.menu-search input::placeholder { color: #6C8CA3; }
.menu-search input:focus {
    outline: none;
    border-color: var(--cyan-2);
    background: rgba(255, 255, 255, .1);
}

.app.collapsed .menu-search { display: none; }

.mgroup { margin-bottom: 2px; }

.mgroup .gh {
    display: flex;
    align-items: center;
    gap: 9px;
    margin: 0 8px;
    padding: 7px 8px;
    border-radius: var(--radius-sm);
    color: #C3D5E1;
    font-size: 13.5px;
    font-weight: 600;
    cursor: pointer;
    user-select: none;
    transition: background .14s;
}

.mgroup .gh:hover { background: rgba(255, 255, 255, .06); }

/* 模块图标：圆角小方块 + 模块代号首字母，配色按模块哈希取自一组低饱和色 */
.mod-ico {
    flex: none;
    width: 22px;
    height: 22px;
    border-radius: 6px;
    display: grid;
    place-items: center;
    font-size: 11px;
    font-weight: 700;
    color: #fff;
    background: var(--mi, #2C5578);
}

.mgroup .caret {
    font-size: 9px;
    color: #5E86A3;
    transition: transform .16s;
}

.mgroup.open .caret { transform: rotate(90deg); }

.mgroup .cnt {
    margin-left: auto;
    min-width: 20px;
    height: 17px;
    padding: 0 5px;
    border-radius: 9px;
    background: rgba(255, 255, 255, .1);
    color: #9FBCD1;
    font-size: 10.5px;
    font-weight: 400;
    display: grid;
    place-items: center;
}

.mgroup .items { display: none; }
.mgroup.open .items { display: block; }
.app.collapsed .mgroup .items { display: none; }

.mitem {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 1px 8px;
    padding: 6px 8px 6px 39px;
    border-radius: var(--radius-sm);
    color: #9FBCD1;
    font-size: 12.5px;
    cursor: pointer;
    border-left: 2px solid transparent;
    transition: background .14s, color .14s;
}

.mitem:hover { background: rgba(255, 255, 255, .06); color: #DCE9F1; }

.mitem.active {
    background: rgba(255, 255, 255, .10);
    border-left-color: var(--cyan-2);
    color: #fff;
    font-weight: 600;
}

.mitem .tag {
    margin-left: auto;
    padding: 1px 5px;
    border-radius: 3px;
    background: rgba(255, 255, 255, .12);
    color: #9FBCD1;
    font-size: 10px;
}

.side-nav-entry {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 4px 10px 8px;
    padding: 9px 12px;
    border-radius: var(--radius-sm);
    background: rgba(255, 255, 255, .08);
    color: #fff;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: filter .14s, box-shadow .14s;
}

.side-nav-entry b {
    flex: none;
    width: 22px;
    height: 22px;
    border-radius: 6px;
    background: rgba(255, 255, 255, .18);
    display: grid;
    place-items: center;
    font-size: 11px;
}

.side-nav-entry:hover { filter: brightness(1.08); box-shadow: none; }
.side-nav-entry.active { box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .5); }
.app.collapsed .side-nav-entry span { display: none; }
.app.collapsed .side-nav-entry { justify-content: center; padding: 9px 0; }

/* --------------------------------------------------------------- 内容区 */

.main {
    grid-area: main;
    overflow-y: auto;
    padding: 22px 26px 44px;
}

.page-head {
    display: flex;
    align-items: baseline;
    gap: 12px;
    margin-bottom: 18px;
}

.page-head h2 {
    margin: 0;
    font-size: 20px;
    font-weight: 700;
    color: var(--navy);
    letter-spacing: .2px;
    position: relative;
    padding-left: 12px;
}

/* 标题左侧的品牌竖条，主流后台标题的惯用处理 */
.page-head h2::before {
    content: '';
    position: absolute;
    left: 0;
    top: 5px;
    bottom: 5px;
    width: 4px;
    border-radius: 2px;
    background: var(--cyan);
}

.page-head .path { color: var(--ink-3); font-size: 12.5px; }
.page-head .grow { flex: 1; }

.card {
    background: var(--panel);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    margin-bottom: 16px;
    overflow: hidden;
}

.card > .pad { padding: 16px 18px; }

.card-title {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 14px 18px;
    border-bottom: 1px solid var(--line-2);
    font-weight: 600;
    font-size: 14px;
    color: var(--navy);
}

.card-title .grow { flex: 1; }
.card-title .muted { font-weight: 400; }

.grid { display: grid; gap: 16px; }

.grid.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }

@media (max-width: 1180px) {
    .grid.two, .grid.three { grid-template-columns: 1fr; }
}

.muted { color: var(--ink-3); font-size: 12.5px; }
.loading { padding: 30px; text-align: center; color: var(--ink-3); font-size: 13px; }
.empty { padding: 30px; text-align: center; color: var(--ink-3); font-size: 13px; }
.num { font-family: var(--mono); }
.sm { font-size: 12px; }

/* 指标卡 */
.stat-row {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(158px, 1fr));
    gap: 14px;
    margin-bottom: 16px;
}

.stat {
    background: var(--panel);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    padding: 16px 18px;
    box-shadow: var(--shadow);
    position: relative;
    overflow: hidden;
    transition: box-shadow .18s, transform .18s;
}

.stat:hover { box-shadow: var(--shadow-hov); transform: translateY(-2px); }

.stat::after {
    content: '';
    position: absolute;
    left: 0; top: 0; bottom: 0;
    width: 4px;
    border-radius: 0 2px 2px 0;
    background: var(--sc, var(--cyan));
}

.stat .ico {
    position: absolute;
    right: 12px;
    top: 12px;
    width: 34px;
    height: 34px;
    border-radius: 3px;
    display: grid;
    place-items: center;
    font-size: 15px;
    background: rgba(31, 95, 168, .10);
    color: var(--sc, var(--cyan));
}

.stat .n {
    font-size: 26px;
    font-weight: 700;
    color: var(--navy);
    line-height: 1.25;
    font-family: var(--mono);
}

.stat .t { margin-top: 4px; color: var(--ink-3); font-size: 12.5px; }

/* 指标卡的六档配色，按序循环使用 */
.stat.c1 { --sc: #1F5FA8; }
.stat.c2 { --sc: #2E75C4; }
.stat.c3 { --sc: #5A6B80; }
.stat.c4 { --sc: #1F9254; }
.stat.c5 { --sc: #C77800; }
.stat.c6 { --sc: #D93026; }

.statbar {
    padding: 11px 15px;
    border-radius: var(--radius-sm);
    margin-bottom: 8px;
    font-size: 13px;
    background: var(--cyan-soft);
    color: #18508F;
    border: 1px solid #CDE8EB;
}

.statbar.warn { background: var(--warn-soft); color: #7A4A00; border-color: #F5DDB8; }
.statbar.err { background: var(--err-soft); color: #8E2A20; border-color: #F3CFCB; }
.statbar b { margin-right: 6px; }

/* 待办格 */
.todo {
    display: inline-flex;
    flex-direction: column;
    justify-content: center;
    min-width: 118px;
    padding: 11px 13px;
    margin: 0 8px 8px 0;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #FBFCFD;
    cursor: pointer;
    transition: border-color .14s, box-shadow .14s, transform .14s;
}

.todo:hover {
    border-color: var(--cyan);
    box-shadow: none;
    transform: translateY(-1px);
}

.todo .n {
    font-size: 20px;
    font-weight: 600;
    color: var(--ink-3);
    font-family: var(--mono);
    line-height: 1.2;
}

.todo.hit { background: var(--cyan-soft); border-color: #A9D6DB; }
.todo.hit .n { color: var(--cyan); }
.todo .t { font-size: 12.5px; color: var(--ink); }
.todo .s { font-size: 10.5px; color: var(--ink-3); font-family: var(--mono); }

/* --------------------------------------------------------------- 图表 */

.chart { width: 100%; display: block; }

.bars { display: flex; flex-direction: column; gap: 8px; }

.bar-row { display: grid; grid-template-columns: 104px 1fr 58px; align-items: center; gap: 10px; border-radius: 4px; }
.bar-row .lb { color: var(--ink-2); font-size: 12.5px; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bar-row .tr { background: #EEF2F6; height: 14px; border-radius: 7px; overflow: hidden; }
.bar-row .fl { height: 14px; border-radius: 7px; background: var(--cyan); transition: width .5s ease; }
.bar-row .vl { color: var(--ink-2); font-size: 12.5px; font-family: var(--mono); text-align: right; }
.bar-row.is-zero .fl { background: #D5DDE5; }
.bar-row.is-zero .vl { color: var(--ink-3); }

.bar-row:hover { background: #FAFBFD; }

.legend { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 12px; }
.legend span { display: inline-flex; align-items: center; gap: 6px; color: var(--ink-2); font-size: 12px; }
.legend i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }

/* --------------------------------------------------------------- 表格 */

.toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    padding: 12px 18px;
    border-bottom: 1px solid var(--line-2);
    background: #FCFDFE;
}

.toolbar .grow { flex: 1; }

/* 工具栏里的关键字搜索框 */
.kw-input {
    height: 32px;
    min-width: 210px;
    padding: 0 11px;
    border: 1px solid var(--line);
    border-radius: 2px;
    font-size: 13px;
    font-family: var(--font);
    background: #fff;
    transition: border-color .15s, box-shadow .15s;
}

.kw-input:hover { border-color: #C8D2DD; }

.kw-input:focus {
    outline: none;
    border-color: var(--cyan);
    box-shadow: 0 0 0 3px rgba(31, 95, 168, .12);
}

.query {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 12px 16px;
    padding: 16px 18px 12px;
    border-bottom: 1px dashed var(--line);
    background: #FBFCFD;
}

.query.hidden { display: none; }

.query .f { display: flex; flex-direction: column; gap: 5px; }

.query label { color: var(--ink-2); font-size: 12.5px; }

.query input, .query select {
    height: 34px;
    padding: 0 10px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-size: 13px;
    font-family: var(--font);
    background: #fff;
    width: 100%;
    transition: border-color .15s, box-shadow .15s;
}

.query input:hover, .query select:hover { border-color: #C8D2DD; }

.query input:focus, .query select:focus {
    outline: none;
    border-color: var(--cyan);
    box-shadow: 0 0 0 3px rgba(31, 95, 168, .12);
}

.query .acts {
    grid-column: 1 / -1;
    display: flex;
    gap: 8px;
    padding-bottom: 4px;
}

/* 查询区展开/收起切换（Ant Pro 的常见交互） */
.query-toggle {
    display: flex;
    justify-content: flex-end;
    padding: 6px 18px 8px;
    background: #FBFCFD;
    border-bottom: 1px dashed var(--line);
}

.query-toggle .link { font-size: 12.5px; }

.table-wrap { overflow: auto; max-height: calc(100vh - 336px); }

table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    font-size: 13px;
}

thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: #F7F9FC;
    border-bottom: 1px solid var(--line);
    padding: 10px 13px;
    text-align: left;
    font-weight: 600;
    color: var(--ink-2);
    font-size: 12.5px;
    white-space: nowrap;
}

thead th.sortable { cursor: pointer; user-select: none; }
thead th.sortable:hover { color: var(--cyan); background: #F0F5F8; }
thead th .dir { color: var(--cyan); margin-left: 3px; font-size: 10px; }

tbody td {
    padding: 9px 13px;
    border-bottom: 1px solid var(--line-2);
    color: var(--ink);
    vertical-align: middle;
}

/* 斑马纹 + 悬浮高亮，长列表阅读不串行 */
tbody tr:nth-child(even) td { background: #FCFDFE; }
tbody tr:hover td { background: #F2FAFB !important; }
tbody tr.on td { background: var(--cyan-soft) !important; }

tbody td.num, thead th.num { text-align: right; font-family: var(--mono); }
tbody td.ops { white-space: nowrap; text-align: right; }

/* 表格里的操作链接：Element 风格文字按钮，中间加细分隔线 */
td.ops .link { padding: 0 6px; position: relative; }
td.ops .link + .link::before {
    content: '';
    position: absolute;
    left: -2px;
    top: 3px;
    bottom: 3px;
    width: 1px;
    background: var(--line);
}

.cell-clip {
    display: inline-block;
    max-width: 300px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: bottom;
}

/* 批量操作条 */
.bulkbar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 18px;
    background: var(--cyan-soft);
    border-bottom: 1px solid #BFDDE1;
    color: #18508F;
    font-size: 12.5px;
}

.bulkbar .grow { flex: 1; }
.bulkbar.hidden { display: none; }

/* 分页 */
.pager {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 18px;
    border-top: 1px solid var(--line-2);
    color: var(--ink-2);
    font-size: 12.5px;
    flex-wrap: wrap;
}

.pager .grow { flex: 1; }

.pager select {
    height: 30px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-family: var(--font);
    font-size: 12.5px;
    background: #fff;
    padding: 0 6px;
}

.pager .pg { display: inline-flex; align-items: center; gap: 5px; }

.pager .pg b {
    min-width: 30px;
    height: 30px;
    padding: 0 8px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #fff;
    font-weight: 400;
    color: var(--ink-2);
    cursor: pointer;
    transition: border-color .14s, color .14s, background .14s;
}

.pager .pg b:hover { border-color: var(--cyan); color: var(--cyan); }

.pager .pg b.on {
    background: var(--cyan);
    border-color: var(--cyan);
    color: #fff;
    font-weight: 500;
    box-shadow: none;
}

.pager .pg b.dis { opacity: .4; cursor: not-allowed; }
.pager .pg b.dis:hover { border-color: var(--line); color: var(--ink-2); }

/* 跳页输入框 */
.pager .jump {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-left: 6px;
    color: var(--ink-3);
}

.pager .jump input {
    width: 52px;
    height: 30px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    text-align: center;
    font-family: var(--mono);
    font-size: 12.5px;
    background: #fff;
}

.pager .jump input:focus { outline: none; border-color: var(--cyan); }

/* 小角标 */
.badge {
    display: inline-block;
    margin-left: 6px;
    padding: 1px 8px;
    border-radius: 9px;
    background: var(--cyan-soft);
    color: var(--cyan);
    font-size: 11px;
    font-weight: 400;
    vertical-align: 1px;
}

.badge.auto { background: var(--warn-soft); color: #8A5A00; }

/* --------------------------------------------------------------- 按钮 */

.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 5px;
    height: 34px;
    padding: 0 16px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #fff;
    color: var(--ink);
    font-size: 13px;
    font-family: var(--font);
    cursor: pointer;
    white-space: nowrap;
    transition: background .15s, border-color .15s, color .15s, box-shadow .15s;
}

.btn:hover { border-color: #C6D2DC; background: #F7F9FB; }
.btn:active { transform: translateY(1px); }
.btn:disabled { opacity: .5; cursor: not-allowed; }

.btn.primary {
    background: var(--cyan);
    border-color: var(--cyan);
    color: #fff;
    font-weight: 600;
    box-shadow: none;
}

.btn.primary:hover { background: var(--cyan-hov); border-color: var(--cyan-hov); box-shadow: none; }

.btn.ghost { background: transparent; border-color: transparent; color: var(--ink-2); }
.btn.ghost:hover { background: var(--line-2); color: var(--ink); }

.btn.danger { color: var(--err); border-color: #F0CBC7; }
.btn.danger:hover { background: var(--err-soft); border-color: var(--err); }

.btn.sm { height: 28px; padding: 0 11px; font-size: 12.5px; border-radius: 6px; }
.btn.wide { width: 100%; }

/* 次级业务动作按钮：描边青色，与白底按钮区分但不抢主按钮 */
.btn.biz { color: #006974; border-color: #9FD2D8; background: #F4FBFC; }
.btn.biz:hover { border-color: var(--cyan); color: var(--cyan); background: var(--cyan-soft); }

.link {
    color: var(--cyan);
    cursor: pointer;
    font-size: 12.5px;
    background: none;
    border: none;
    padding: 0 4px;
    font-family: var(--font);
    transition: color .14s;
}

.link:hover { color: var(--cyan-hov); text-decoration: underline; }
.link.danger { color: var(--err); }
.link.danger:hover { color: #B91C1C; }

/* --------------------------------------------------------------- 表单与弹窗 */

.mask {
    position: fixed;
    inset: 0;
    background: rgba(6, 24, 38, .5);
    backdrop-filter: blur(2px);
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding: 46px 20px 40px;
    overflow-y: auto;
    z-index: 50;
    animation: fadein .14s ease;
}

.dialog {
    width: 100%;
    max-width: 720px;
    background: var(--panel);
    border-radius: 3px;
    box-shadow: var(--shadow-lg);
    overflow: hidden;
    animation: pop .18s ease;
}

@keyframes pop {
    from { opacity: 0; transform: translateY(-10px) scale(.985); }
    to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes fadein {
    from { opacity: 0; }
    to { opacity: 1; }
}

.dialog h3 {
    margin: 0;
    padding: 16px 20px;
    border-bottom: 1px solid var(--line-2);
    font-size: 15.5px;
    color: var(--navy);
    display: flex;
    align-items: center;
    gap: 8px;
}

.dialog h3 .grow { flex: 1; }

.dialog .pad { padding: 18px 20px; }

.dialog .foot {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    padding: 13px 20px;
    border-top: 1px solid var(--line-2);
    background: #FBFCFD;
}

.dialog.wide { max-width: 960px; }

.form-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 16px 20px;
}

.form-grid .field.span-2 { grid-column: 1 / -1; }

.form-group-title {
    grid-column: 1 / -1;
    margin-top: 4px;
    padding-bottom: 6px;
    border-bottom: 1px solid var(--line-2);
    color: var(--navy);
    font-weight: 600;
    font-size: 13.5px;
}

.field label {
    display: block;
    margin-bottom: 5px;
    color: var(--ink-2);
    font-size: 12.5px;
}

.field label .req { color: var(--err); margin-left: 3px; }

.field input, .field select, .field textarea {
    width: 100%;
    height: 36px;
    padding: 0 11px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-size: 13.5px;
    font-family: var(--font);
    background: #fff;
    transition: border-color .15s, box-shadow .15s;
}

.field textarea { height: 80px; padding: 9px 11px; resize: vertical; line-height: 1.6; }

.field input:hover, .field select:hover, .field textarea:hover { border-color: #C8D2DD; }

.field input:focus, .field select:focus, .field textarea:focus {
    outline: none;
    border-color: var(--cyan);
    box-shadow: 0 0 0 3px rgba(31, 95, 168, .12);
}

.field input:disabled, .field select:disabled {
    background: #F2F5F8;
    color: var(--ink-3);
    cursor: not-allowed;
}

.field .hint { margin-top: 3px; color: var(--ink-3); font-size: 11.5px; }
.field.invalid input, .field.invalid select, .field.invalid textarea { border-color: var(--err); }
.field .why { margin-top: 4px; color: var(--err); font-size: 12px; }

.kv { display: grid; grid-template-columns: 150px 1fr; gap: 10px 16px; }
.kv .k { color: var(--ink-3); font-size: 12.5px; }
.kv .v { color: var(--ink); word-break: break-all; }
.kv .v.empty-v { color: #B9C4CE; }

.switch {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    cursor: pointer;
    font-size: 12.5px;
    color: var(--ink-2);
}

.switch .track {
    width: 36px;
    height: 20px;
    border-radius: 3px;
    background: #CDD7E0;
    position: relative;
    transition: background .16s;
}

.switch .track::after {
    content: '';
    position: absolute;
    top: 2px; left: 2px;
    width: 16px; height: 16px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .2);
    transition: transform .16s;
}

.switch.on .track { background: var(--cyan); }
.switch.on .track::after { transform: translateX(16px); }

/* 授权树 */
.gtree { max-height: 460px; overflow: auto; border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 10px 12px; background: #fff; }
.gnode { padding: 2px 0; display: flex; align-items: center; gap: 7px; }
.gnode.lv1 { font-weight: 600; color: var(--ink); margin-top: 6px; }
.gnode.lv2 { padding-left: 22px; color: var(--ink-2); }
.gnode.lv3 { padding-left: 44px; color: var(--ink-2); font-size: 12.5px; }
.gnode label { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; }
.gnode .muted { font-size: 11.5px; }
.toggle {
    width: 14px;
    text-align: center;
    color: var(--ink-3);
    cursor: pointer;
    font-size: 10px;
    user-select: none;
    flex: none;
}
.toggle:hover { color: var(--cyan); }
.gchildren { display: block; }
.gtree input[type=checkbox] { width: 14px; height: 14px; accent-color: var(--cyan); cursor: pointer; flex: none; }
.grant-bar { display: flex; align-items: center; gap: 12px; padding: 8px 0 12px; }

/* 标签 */
.tag-pill {
    display: inline-block;
    padding: 1px 9px;
    border-radius: 3px;
    font-size: 11.5px;
    line-height: 19px;
    background: var(--line-2);
    color: var(--ink-2);
    white-space: nowrap;
}

.tag-pill.ok { background: var(--ok-soft); color: var(--ok); }
.tag-pill.warn { background: var(--warn-soft); color: var(--warn); }
.tag-pill.err { background: var(--err-soft); color: var(--err); }
.tag-pill.info { background: var(--cyan-soft); color: #18508F; }

/* --------------------------------------------------------------- AI 助手 */

.ai-wrap {
    display: grid;
    grid-template-columns: 272px minmax(0, 1fr);
    gap: 16px;
    align-items: start;
}

@media (max-width: 1080px) {
    .ai-wrap { grid-template-columns: 1fr; }
}

.ai-side .card { margin-bottom: 12px; }

.ai-scenes { display: flex; flex-direction: column; gap: 6px; }

.ai-scene {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 11px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    cursor: pointer;
    font-size: 12.5px;
    background: #fff;
    transition: border-color .14s, background .14s;
}

.ai-scene:hover { border-color: #B9D5D9; background: #FAFDFD; }
.ai-scene.on { border-color: var(--cyan); background: var(--cyan-soft); color: #18508F; font-weight: 600; }
.ai-scene.off { opacity: .62; }
.ai-scene .dot { width: 7px; height: 7px; border-radius: 50%; background: #C9D4DE; flex: 0 0 7px; }
.ai-scene.on .dot { background: var(--cyan); }
.ai-scene.off .dot { background: #D8A15C; }
.ai-scene .lv { margin-left: auto; font-size: 10.5px; color: var(--ink-3); font-weight: 400; }

.ai-sess {
    display: flex;
    align-items: center;
    gap: 7px;
    padding: 7px 10px;
    border-radius: var(--radius-sm);
    cursor: pointer;
    font-size: 12.5px;
    color: var(--ink-2);
}

.ai-sess:hover { background: var(--line-2); }
.ai-sess.on { background: var(--cyan-soft); color: #18508F; font-weight: 600; }
.ai-sess .t { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ai-sess .n { font-size: 10.5px; color: var(--ink-3); font-family: var(--mono); }

.ai-log {
    min-height: 380px;
    max-height: calc(100vh - 400px);
    overflow-y: auto;
    padding: 18px 20px;
    background: #FBFCFD;
}

.ai-msg { display: flex; gap: 11px; margin-bottom: 18px; }
.ai-msg.user { flex-direction: row-reverse; }

.ai-avatar {
    flex: 0 0 30px;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    font-size: 12px;
    font-weight: 700;
    color: #fff;
    background: var(--navy-3);
}

.ai-msg.assistant .ai-avatar { background: var(--cyan); }

.ai-body { max-width: 76%; }

.ai-msg.user .ai-body { display: flex; flex-direction: column; align-items: flex-end; }

.ai-bubble {
    padding: 11px 14px;
    border-radius: 3px;
    background: #fff;
    border: 1px solid var(--line);
    white-space: pre-wrap;
    word-break: break-word;
    line-height: 1.72;
    font-size: 13.5px;
    box-shadow: 0 1px 2px rgba(6, 31, 50, .04);
}

.ai-msg.user .ai-bubble {
    background: var(--cyan);
    border-color: var(--cyan);
    color: #fff;
    border-top-right-radius: 4px;
}

.ai-msg.assistant .ai-bubble { border-top-left-radius: 4px; }

.ai-bubble-err {
    background: var(--err-soft);
    border-color: #F0CBC7;
    color: var(--ink);
}

.ai-bubble-err b { color: var(--err); }

.ai-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-top: 6px;
    color: var(--ink-3);
    font-size: 11.5px;
}

.ai-meta .kv-mono { font-family: var(--mono); }
.ai-meta .sp { color: #C3CDD8; }

.ai-acts { display: flex; gap: 6px; margin-top: 7px; }

.ai-input {
    border-top: 1px solid var(--line-2);
    padding: 12px 18px 14px;
    background: #fff;
}

.ai-input .row {
    display: flex;
    gap: 8px;
    align-items: flex-end;
}

.ai-input textarea {
    flex: 1;
    height: 64px;
    padding: 9px 11px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-family: var(--font);
    font-size: 13.5px;
    resize: vertical;
    line-height: 1.6;
}

.ai-input textarea:focus {
    outline: none;
    border-color: var(--cyan);
    box-shadow: 0 0 0 3px rgba(31, 95, 168, .12);
}

.ai-input .opts {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin-bottom: 8px;
    color: var(--ink-3);
    font-size: 12px;
}

.ai-input select {
    height: 30px;
    max-width: 260px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-family: var(--font);
    font-size: 12.5px;
    background: #fff;
    color: var(--ink);
}

.ai-tools { display: flex; flex-wrap: wrap; gap: 7px; }

.ai-tool {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border: 1px solid var(--line);
    border-radius: 3px;
    background: #fff;
    font-size: 11.5px;
    color: var(--ink-2);
    cursor: default;
}

.ai-tool.write { border-color: #F0D9AE; background: var(--warn-soft); color: #7A4A00; }

.ai-empty {
    padding: 46px 20px;
    text-align: center;
    color: var(--ink-3);
}

.ai-empty .big { font-size: 15px; color: var(--ink-2); margin-bottom: 6px; }

.ai-typing span {
    display: inline-block;
    width: 6px; height: 6px;
    margin-right: 3px;
    border-radius: 50%;
    background: var(--cyan);
    animation: blink 1.1s infinite;
}

.ai-typing span:nth-child(2) { animation-delay: .18s; }
.ai-typing span:nth-child(3) { animation-delay: .36s; }

@keyframes blink {
    0%, 60%, 100% { opacity: .25; }
    30% { opacity: 1; }
}

/* --------------------------------------------------------------- 提示条 */

.toasts {
    position: fixed;
    right: 22px;
    bottom: 22px;
    z-index: 90;
    display: flex;
    flex-direction: column;
    gap: 8px;
    align-items: flex-end;
}

.toast {
    min-width: 180px;
    max-width: 440px;
    padding: 11px 15px;
    border-radius: var(--radius-sm);
    background: var(--navy);
    color: #EAF3F8;
    font-size: 13px;
    box-shadow: var(--shadow-lg);
    animation: slidein .18s ease;
    border-left: 3px solid var(--cyan-2);
}

.toast.err { background: #8E2A20; border-left-color: #E58C82; }
.toast.ok { background: #14532D; border-left-color: #4ADE80; }

@keyframes slidein {
    from { opacity: 0; transform: translateX(14px); }
    to { opacity: 1; transform: translateX(0); }
}

/* 折叠按钮 */
.side-toggle {
    width: 30px;
    height: 30px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #fff;
    color: var(--ink-2);
    cursor: pointer;
    display: grid;
    place-items: center;
    font-size: 13px;
    line-height: 1;
    transition: border-color .14s, color .14s, background .14s;
}

.side-toggle:hover { border-color: var(--cyan); color: var(--cyan); background: var(--cyan-soft); }

/* ==========================================================================
   业务动作回执
   动作执行完，把「顺带产生的下游结果」摊在列表上方：生成了哪些单据、库存过账多少、
   哪些汇总被回写。没有这块，操作员只能看到状态位变了一下，不知道后面发生了什么。
   ========================================================================== */

.fx {
    margin: 10px 12px 0;
    padding: 9px 12px 10px;
    border: 1px solid var(--line);
    border-left: 3px solid var(--cyan);
    border-radius: var(--radius-sm);
    background: #FFFFFF;
    animation: fxin .2s ease;
}

.fx.bad {
    border-left-color: var(--err);
    background: #FFFFFF;
}

.fx-head {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 12.5px;
    color: var(--ink-2);
}

.fx-head b { color: var(--navy); font-size: 13px; font-weight: 600; }

.fx-head .fx-close {
    cursor: pointer;
    padding: 0 3px;
    font-size: 16px;
    line-height: 1;
    color: var(--ink-3);
}

.fx-head .fx-close:hover { color: var(--err); }

.fx-list {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin-top: 7px;
}

.fx-row {
    display: flex;
    align-items: baseline;
    gap: 8px;
    font-size: 12.5px;
}

.fx-row .t {
    flex: none;
    min-width: 42px;
    height: 18px;
    padding: 0 6px;
    border-radius: 3px;
    background: var(--cyan-soft);
    color: #00666F;
    font-size: 11px;
    line-height: 18px;
    text-align: center;
}

.fx-row .t.DERIVE { background: #E8EFFA; color: #25538F; }
.fx-row .t.STOCK { background: var(--ok-soft); color: #14663A; }
.fx-row .t.ROLLUP { background: #F1E9FA; color: #5B3A8E; }
.fx-row .t.PATCH { background: var(--warn-soft); color: #8A5200; }

.fx-row .n { flex: none; color: var(--ink); }
.fx-row .d { color: var(--ink-3); }
.fx-row.skip { opacity: .58; }
.fx-row.skip .n { color: var(--ink-3); }

.fx-sum {
    margin-top: 7px;
    font-size: 12px;
    color: var(--ink-3);
}

@keyframes fxin {
    from { opacity: 0; transform: translateY(-4px); }
    to { opacity: 1; transform: none; }
}

/* 选项多的外键才长得出来的筛选框：小一号，压在下拉上面，不抢主样式。
   一千多项的功能点、物料这类目标表，光靠在下拉里滚是选不出来的。 */
.fk-filter {
    display: block;
    width: 100%;
    height: 26px;
    margin-bottom: 4px;
    padding: 0 8px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #FFFFFF;
    color: var(--ink);
    font-size: 12px;
    line-height: 26px;
}

.fk-filter:focus {
    border-color: var(--cyan);
    outline: none;
}

.fk-filter::placeholder { color: var(--ink-3); }

/* ==========================================================================
   关联钻取：条件条（从驾驶舱或上级单据钻进来时的筛选提示）+ 详情里的关联单据
   ========================================================================== */

.fchips {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px dashed var(--line);
}

.fchip-lead { color: var(--ink-3); font-size: 12px; }

.fchip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 9px;
    border: 1px solid var(--cyan);
    border-radius: 2px;
    background: var(--cyan-soft);
    color: #075E68;
    font-size: 12px;
}

.fchip b { cursor: pointer; color: #075E68; font-weight: 700; }
.fchip b:hover { color: var(--err); }

.fchip-sub {
    padding: 2px 8px;
    border: 1px solid var(--line);
    border-radius: 2px;
    background: #F7F9FB;
    color: var(--ink-2);
    font-size: 11.5px;
    cursor: pointer;
}

.fchip-sub:hover { border-color: var(--err); color: var(--err); background: var(--err-soft); }

/* 列表里的外键列：点一下跳到被引用的主数据 */
.grid td.fkcell { color: var(--cyan); cursor: pointer; text-decoration: underline dotted; }
.grid td.fkcell:hover { color: #005C66; text-decoration: underline; background: var(--cyan-soft); }

/* 详情里的值 */
.kv dt { margin: 0; color: var(--ink-3); font-size: 12.5px; }
.kv dd { margin: 0; color: var(--ink); word-break: break-all; }
.kv dd.jl { color: var(--cyan); cursor: pointer; }
.kv dd.jl:hover { text-decoration: underline; }

.rel {
    margin-top: 14px;
    padding-top: 12px;
    border-top: 1px solid var(--line);
}

.rel-h { margin-bottom: 8px; color: var(--navy); font-size: 13px; font-weight: 700; }
.rel-self { margin-left: 8px; color: var(--ink-3); font-weight: 400; font-size: 12px; }
.rel-sec { margin: 10px 0 6px; color: var(--ink-3); font-size: 11.5px; letter-spacing: .5px; }
.rel-row { display: flex; flex-wrap: wrap; gap: 6px; }

.rel-item {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #FBFCFD;
    font-size: 12px;
    cursor: pointer;
    transition: border-color .14s, background .14s;
}

.rel-item i { font-style: normal; color: var(--ink-2); }
.rel-item b.rel-n { color: var(--cyan); font-weight: 600; }
.rel-item:hover { border-color: var(--cyan); background: var(--cyan-soft); }
.rel-item:hover i { color: #075E68; }
.rel-item.is-zero { opacity: .55; }
.rel-item.up { background: #FFFBEF; border-color: #F0E1BE; }
.rel-item.up:hover { border-color: var(--warn); background: var(--warn-soft); }

.rel-empty { color: var(--ink-3); font-size: 12px; line-height: 1.7; }

/* ==========================================================================
   弹窗的三个分区
   ========================================================================== */

.dialog header {
    display: flex;
    align-items: center;
    border-bottom: 1px solid var(--line-2);
}
.dialog header h3 { flex: 1; border-bottom: none; }
.dialog header h3 .grow { flex: 1; }

.dialog .x {
    margin: -4px -4px -4px 8px;
    padding: 0 6px;
    color: var(--ink-3);
    font-size: 21px;
    line-height: 1;
    cursor: pointer;
    user-select: none;
    border-radius: 6px;
    transition: color .14s, background .14s;
}

.dialog .x:hover { color: var(--err); background: var(--err-soft); }

.dialog .body { padding: 18px 20px; }
.dialog .body > .rel:first-child { margin-top: 0; border-top: none; padding-top: 0; }

.dialog footer {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    padding: 13px 20px;
    border-top: 1px solid var(--line-2);
    background: #FBFCFD;
}

/* 弹窗标题栏底边：header 包住 h3 时由 header 画，否则 h3 自己画 */

/* ==========================================================================
   批量导入
   ========================================================================== */

.imp-paste {
    width: 100%;
    min-height: 168px;
    padding: 10px 12px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    font-family: var(--mono);
    font-size: 12px;
    line-height: 1.65;
    resize: vertical;
}

.imp-paste:focus { outline: none; border-color: var(--cyan); box-shadow: 0 0 0 3px rgba(31, 95, 168, .12); }

.imp-tip { margin-top: 9px; color: var(--ink-3); font-size: 12.5px; line-height: 1.85; }
.imp-tip b { color: var(--navy); font-weight: 600; }
.imp-tip code { padding: 1px 5px; border-radius: 3px; background: #F1F4F8; font-family: var(--mono); font-size: 11.5px; }

.imp-bar { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.imp-bar .grow { flex: 1; }

.imp-stat { display: flex; flex-wrap: wrap; align-items: center; gap: 16px; color: var(--ink-2); font-size: 12.5px; }
.imp-stat i { font-style: normal; font-weight: 700; font-size: 15px; }
.imp-stat .ok i { color: var(--ok); }
.imp-stat .bad i { color: var(--err); }

.imp-wrap { max-height: 336px; overflow: auto; border: 1px solid var(--line); border-radius: var(--radius-sm); }
.imp-wrap table { width: 100%; border-collapse: collapse; font-size: 12px; }
.imp-wrap th {
    position: sticky;
    top: 0;
    z-index: 1;
    padding: 7px 9px;
    border-bottom: 1px solid var(--line);
    background: #F7F9FB;
    color: var(--ink-2);
    font-weight: 600;
    text-align: left;
    white-space: nowrap;
}
.imp-wrap th.req { color: var(--err); }
.imp-wrap td { padding: 6px 9px; border-bottom: 1px solid var(--line-2); color: var(--ink); white-space: nowrap; }
.imp-wrap tr.bad { background: var(--err-soft); }
.imp-wrap tr.bad td { color: #8A2A20; }
.imp-wrap td.why { color: var(--err); white-space: normal; min-width: 200px; }
.imp-wrap td.ln { color: var(--ink-3); font-family: var(--mono); }

/* ==========================================================================
   单据附件
   ========================================================================== */

.fbox { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line); }
.fbox-h { display: flex; align-items: center; gap: 8px; color: var(--navy); font-size: 13px; font-weight: 700; }
.fbox-h .grow { flex: 1; }
.fbox-h .n { color: var(--ink-3); font-size: 12px; font-weight: 400; }

.flist { display: flex; flex-direction: column; gap: 6px; margin-top: 9px; }
.fitem {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 7px 11px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #FBFCFD;
    font-size: 12.5px;
}
.fitem .nm { flex: 1; color: var(--navy); word-break: break-all; }
.fitem .mt { color: var(--ink-3); font-size: 11.5px; white-space: nowrap; }
.fitem .op { color: var(--cyan); cursor: pointer; white-space: nowrap; }
.fitem .op:hover { text-decoration: underline; }
.fitem .op.danger { color: var(--err); }
.fempty { margin-top: 9px; color: var(--ink-3); font-size: 12px; }

/* ==========================================================================
   删除被拒（记录还被别的单据引用着）
   ========================================================================== */

.blk-tip {
    padding: 10px 12px;
    border: 1px solid #F3D9A8;
    border-left: 3px solid var(--warn);
    border-radius: var(--radius-sm);
    background: var(--warn-soft);
    color: #6B4200;
    font-size: 12.5px;
    line-height: 1.85;
}

.blk-list { display: flex; flex-direction: column; gap: 6px; margin-top: 11px; max-height: 300px; overflow: auto; }

.blk {
    padding: 8px 11px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #FBFCFD;
    font-size: 12.5px;
}
.blk .nm { color: var(--navy); font-weight: 600; }
.blk .nm .id { color: var(--ink-3); font-family: var(--mono); font-weight: 400; font-size: 11.5px; }
.blk .why { margin-top: 4px; color: var(--err); line-height: 1.8; }

.refuse { color: var(--ink-2); font-size: 13px; line-height: 1.9; word-break: break-word; }

/* ==========================================================================
   单据打印视图（新窗口打开，不继承控制台的深色导航）
   ========================================================================== */

.print-body { margin: 0; padding: 26px 30px; background: #fff; color: #17202A;
    font-family: var(--font); font-size: 12.5px; line-height: 1.7; }
.print-h { display: flex; align-items: flex-end; gap: 12px; padding-bottom: 10px; border-bottom: 2px solid var(--navy); }
.print-h h1 { margin: 0; font-size: 20px; color: var(--navy); }
.print-h .co { color: var(--ink-3); font-size: 12px; }
.print-h .grow { flex: 1; }
.print-h .no { color: var(--ink-2); font-size: 12.5px; }
.print-meta { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; margin: 14px 0 16px; }
.print-meta div { padding: 6px 10px; border: 1px solid var(--line); margin: -1px 0 0 -1px; }
.print-meta s { display: block; text-decoration: none; color: var(--ink-3); font-size: 11px; }
.print-meta b { color: var(--ink); font-weight: 600; }
.print-tb { width: 100%; border-collapse: collapse; font-size: 12px; }
.print-tb th, .print-tb td { padding: 6px 9px; border: 1px solid var(--line); text-align: left; }
.print-tb th { background: #F7F9FB; color: var(--ink-2); font-weight: 600; }
.print-sign { display: flex; gap: 40px; margin-top: 30px; color: var(--ink-2); font-size: 12.5px; }
.print-foot { margin-top: 22px; padding-top: 9px; border-top: 1px solid var(--line); color: var(--ink-3); font-size: 11px; }
@media print {
    .print-body { padding: 0; }
    .no-print { display: none !important; }
}

/* ------------------------------------------------ 场景工作台 */
.scene-tabs {
    display: flex;
    gap: 8px;
    margin-bottom: 14px;
}
.scene-tab {
    padding: 8px 18px;
    border-radius: 2px;
    border: 1px solid var(--line);
    background: #fff;
    color: var(--text);
    font-size: 13px;
    text-decoration: none;
    transition: all .15s;
}
.scene-tab:hover { border-color: var(--cyan); color: var(--cyan); }
.scene-tab.on {
    background: var(--navy);
    border-color: transparent;
    color: #fff;
    font-weight: 600;
}
.scene-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
    gap: 12px;
}
.scene-card {
    border: 1px solid var(--line);
    border-radius: 3px;
    padding: 13px 15px;
    background: #fff;
    transition: box-shadow .15s, transform .15s;
}
.scene-card:hover {
    box-shadow: 0 6px 18px rgba(6, 31, 50, .08);
    transform: translateY(-2px);
}
.sc-head {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 6px;
}
.sc-head b { font-size: 13.5px; }
.sc-head .unit { margin-left: auto; color: var(--text-sub); font-size: 12px; }
.sc-line { color: var(--text-sub); font-size: 12px; margin-bottom: 8px; }
.sc-nums { display: flex; gap: 14px; font-size: 12px; color: var(--text-sub); }
.sc-nums b { color: var(--text); font-size: 14px; }
.sc-acts { display: flex; gap: 8px; margin-top: 10px; }
.scene-card.dev { text-align: center; padding: 15px 12px; }
.dev-val {
    font-size: 26px;
    font-weight: 700;
    color: var(--navy);
    font-variant-numeric: tabular-nums;
    margin: 4px 0;
}
.dev-val.ok { color: #00796B; }
.dev-val.bad { color: #C62828; font-size: 15px; font-weight: 600; }
.dev-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
.dev-note { margin-top: 10px; color: var(--text-sub); font-size: 12px; }
.auto-poll {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 12px;
    color: var(--text-sub);
    cursor: pointer;
}
.sec-title {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 14px;
    font-weight: 700;
    color: var(--navy);
    margin-bottom: 12px;
}
.empty-hint { color: var(--text-sub); font-size: 12.5px; padding: 14px 0; }
.scene-kpis {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 12px;
    margin-bottom: 14px;
}
.funnel { display: flex; flex-direction: column; gap: 8px; }
.funnel-item { display: flex; align-items: center; gap: 10px; font-size: 12.5px; }
.funnel-item .k { width: 120px; color: var(--text-sub); }
.funnel-item .bar {
    flex: 1;
    height: 14px;
    border-radius: 7px;
    background: #EEF3F7;
    overflow: hidden;
}
.funnel-item .bar i {
    display: block;
    height: 100%;
    border-radius: 7px;
    background: var(--cyan);
}
.funnel-item .n { width: 36px; text-align: right; font-weight: 700; }

/* ================= 豆包式 AI 对话界面（#/ai） ================= */

.ai-shell {
    display: flex;
    gap: 0;
    height: calc(100vh - var(--top-h) - 34px);
    min-height: 520px;
    background: #fff;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    overflow: hidden;
}

/* ---- 左栏：品牌 / 新建 / 场景 / 会话 ---- */
.ai-side {
    flex: 0 0 264px;
    width: 264px;
    display: flex;
    flex-direction: column;
    border-right: 1px solid var(--line-2);
    background: #FAFBFC;
    min-height: 0;
}

.ai-brand {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 15px 16px 10px;
    font-size: 14.5px;
    color: var(--navy);
}

.ai-brand .logo {
    width: 30px;
    height: 30px;
    border-radius: 9px;
    display: grid;
    place-items: center;
    color: #fff;
    font-weight: 800;
    font-size: 12px;
    background: var(--navy-3);
}

.ai-newbtn {
    margin: 4px 14px 10px;
    padding: 9px 0;
    border: 1px dashed var(--cyan);
    border-radius: var(--radius-sm);
    background: var(--cyan-soft);
    color: #18508F;
    font-family: var(--font);
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: background .14s, box-shadow .14s;
}

.ai-newbtn:hover { background: #D5EFF2; box-shadow: none; }

.ai-side-sec {
    display: flex;
    align-items: center;
    padding: 8px 16px 4px;
    color: var(--ink-3);
    font-size: 11.5px;
    letter-spacing: .06em;
}

.ai-scenes {
    padding: 2px 10px 8px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    max-height: 262px;
    overflow-y: auto;
    flex: 0 0 auto;
}

.ai-shell .ai-scene { border-color: transparent; background: transparent; padding: 7px 10px; }
.ai-shell .ai-scene:hover { background: #F0F3F6; }
.ai-shell .ai-scene.on { background: var(--cyan-soft); }

.ai-sesslist {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: 2px 10px 12px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    border-top: 1px solid var(--line-2);
}

.ai-shell .ai-sess { position: relative; padding-right: 52px; }
.ai-sess-acts {
    position: absolute;
    right: 6px;
    top: 50%;
    transform: translateY(-50%);
    display: none;
    gap: 2px;
}

.ai-sess:hover .ai-sess-acts { display: flex; }

.ai-act-ico {
    width: 20px;
    height: 20px;
    border: 0;
    border-radius: 5px;
    background: transparent;
    color: var(--ink-3);
    font-size: 11px;
    cursor: pointer;
    line-height: 1;
}

.ai-act-ico:hover { background: #E3E9EF; color: var(--navy); }
.ai-act-ico.del:hover { background: var(--err-soft); color: var(--err); }

.ai-rename {
    width: 100%;
    height: 24px;
    padding: 0 6px;
    border: 1px solid var(--cyan);
    border-radius: 5px;
    font-family: var(--font);
    font-size: 12.5px;
}

.ai-rename:focus { outline: none; }

.ai-sess-empty {
    padding: 18px 8px;
    color: var(--ink-3);
    font-size: 12px;
    text-align: center;
    line-height: 1.7;
}

/* ---- 右侧：顶栏 / 消息流 / 输入区 ---- */
.ai-main {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    background: #FBFCFD;
}

.ai-top {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 11px 20px;
    border-bottom: 1px solid var(--line-2);
    background: #fff;
    flex: 0 0 auto;
}

.ai-top-scene { font-size: 14.5px; font-weight: 700; color: var(--navy); }

.ai-model {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 3px 10px;
    border-radius: 2px;
    background: var(--ok-soft);
    color: #0B7A3E;
    font-size: 11.5px;
    font-weight: 600;
}

.ai-model i {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--ok);
}

.ai-model.bad { background: var(--err-soft); color: var(--err); }
.ai-model.bad i { background: var(--err); }

.ai-shell .ai-log {
    flex: 1;
    min-height: 0;
    max-height: none;
    padding: 22px 26px 12px;
}

/* ---- 欢迎页与推荐问法 ---- */
.ai-welcome {
    max-width: 640px;
    margin: 6vh auto 0;
    text-align: center;
}

.ai-w-logo {
    width: 52px;
    height: 52px;
    margin: 0 auto 14px;
    border-radius: 3px;
    display: grid;
    place-items: center;
    color: #fff;
    font-weight: 800;
    font-size: 19px;
    background: var(--navy-3);
    box-shadow: none;
}

.ai-w-title { font-size: 19px; font-weight: 700; color: var(--navy); }
.ai-w-sub { margin-top: 7px; color: var(--ink-3); font-size: 12.5px; line-height: 1.8; }

.ai-suggrid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
    margin-top: 22px;
    text-align: left;
}

.ai-sug {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 12px 14px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: #fff;
    font-size: 12.8px;
    color: var(--ink-2);
    cursor: pointer;
    transition: border-color .14s, box-shadow .14s, transform .14s;
}

.ai-sug:hover {
    border-color: var(--cyan);
    box-shadow: none;
    transform: translateY(-1px);
}

.ai-sug .ic {
    flex: 0 0 22px;
    height: 22px;
    border-radius: 6px;
    display: grid;
    place-items: center;
    font-size: 11px;
    color: var(--cyan);
    background: var(--cyan-soft);
}

/* ---- 输入区 ---- */
.ai-composer {
    flex: 0 0 auto;
    margin: 0 18px 16px;
    border: 1px solid var(--line);
    border-radius: 3px;
    background: #fff;
    box-shadow: 0 4px 16px rgba(6, 31, 50, .07);
    transition: border-color .14s, box-shadow .14s;
}

.ai-composer:focus-within {
    border-color: var(--cyan);
    box-shadow: 0 4px 18px rgba(31, 95, 168, .16);
}

.ai-comp-opts {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 14px 0;
    color: var(--ink-3);
    font-size: 12px;
}

.ai-comp-opts select {
    height: 26px;
    max-width: 220px;
    border: 1px solid var(--line);
    border-radius: 6px;
    font-family: var(--font);
    font-size: 12px;
    color: var(--ink-2);
    background: #fff;
}

.ai-comp-row {
    display: flex;
    align-items: flex-end;
    gap: 10px;
    padding: 8px 12px 12px;
}

.ai-comp-row textarea {
    flex: 1;
    max-height: 132px;
    padding: 8px 6px;
    border: 0;
    font-family: var(--font);
    font-size: 13.5px;
    line-height: 1.65;
    resize: none;
    background: transparent;
}

.ai-comp-row textarea:focus { outline: none; }

.ai-sendbtn {
    flex: 0 0 40px;
    width: 40px;
    height: 40px;
    border: 0;
    border-radius: 3px;
    color: #fff;
    font-size: 15px;
    cursor: pointer;
    background: var(--cyan);
    box-shadow: none;
    transition: filter .14s, transform .14s;
}

.ai-sendbtn:hover { filter: brightness(1.06); transform: translateY(-1px); }
.ai-sendbtn:disabled { filter: grayscale(.45); cursor: not-allowed; transform: none; }

/* ---- 消息动作 / 打字机 ---- */
.ai-act {
    padding: 3px 10px;
    border: 1px solid var(--line);
    border-radius: 2px;
    background: #fff;
    color: var(--ink-2);
    font-family: var(--font);
    font-size: 11.5px;
    cursor: pointer;
    transition: border-color .12s, color .12s;
}

.ai-act:hover { border-color: var(--cyan); color: var(--cyan); }

.ai-caret {
    display: inline-block;
    width: 7px;
    height: 14px;
    margin-left: 2px;
    vertical-align: -2px;
    background: var(--cyan);
    animation: aiCaretBlink .9s steps(1) infinite;
}

@keyframes aiCaretBlink {
    50% { opacity: 0; }
}

@media (max-width: 1080px) {
    .ai-shell { flex-direction: column; height: auto; }
    .ai-side { flex: 0 0 auto; width: 100%; border-right: 0; border-bottom: 1px solid var(--line-2); }
    .ai-scenes { flex-direction: row; flex-wrap: wrap; max-height: none; }
    .ai-sesslist { max-height: 180px; }
    .ai-log { min-height: 340px; max-height: 52vh; }
    .ai-suggrid { grid-template-columns: 1fr; }
}

/* ==========================================================================
   2026-10 工业主题精调层
   参考用友 U9 / 金蝶云星空 / SAP Fiori：方角、细边、密排、无装饰动效。
   这里只覆盖观感（间距、边框、密度、状态色），不改布局结构，
   上面各段仍保留原有规则，便于回退。
   ========================================================================== */

/* ---- 主框架：内容区更紧凑，顶栏与侧栏之间一条硬分界 ---- */
.main { padding: 14px 18px 32px; }
.topbar { padding: 0 14px; gap: 10px; background: #fff; border-bottom: 1px solid var(--line); }
.logo { padding: 0 14px; }
.logo-mark { border-radius: 3px; background: var(--cyan); box-shadow: none; }
.avatar { border-radius: 3px; background: var(--cyan); }
.bell { border-radius: 2px; }
.side-nav-entry { border-radius: 2px; background: rgba(255, 255, 255, .07); }
.side-nav-entry b { border-radius: 2px; }
.mod-ico { border-radius: 2px; }
.mgroup .cnt { border-radius: 2px; }
.mitem { border-left-width: 3px; margin: 0; padding-left: 42px; }
.mitem.active { background: rgba(255, 255, 255, .10); border-left-color: #4C8FD4; }

/* ---- 页头：标题收小，竖条改细 ---- */
.page-head { margin-bottom: 12px; align-items: center; }
.page-head h2 { font-size: 16px; font-weight: 600; color: var(--ink); padding-left: 9px; }
.page-head h2::before { width: 3px; top: 3px; bottom: 3px; border-radius: 0; }
.page-head .path { font-size: 12px; }

/* ---- 卡片：无阴影，标题栏更矮 ---- */
.card { box-shadow: none; }
.card > .pad { padding: 12px 14px; }
.card-title { padding: 10px 14px; font-size: 13px; }

/* ---- 指标卡：去掉悬浮位移与描边光效 ---- */
.stat { padding: 13px 15px; transition: border-color .14s; }
.stat:hover { box-shadow: none; transform: none; border-color: #C3CDDA; }
.stat::after { width: 3px; }
.stat .n { font-size: 23px; }
.stat .ico { width: 28px; height: 28px; font-size: 13px; top: 10px; right: 10px; border-radius: 2px; }
.stat .t { font-size: 12px; }
.todo { transition: border-color .14s; background: #fff; }
.todo:hover { box-shadow: none; transform: none; border-color: var(--cyan); }

/* ---- 表格：表头灰底、行高压缩、悬浮淡蓝 ---- */
thead th { padding: 8px 10px; font-size: 12px; background: #F5F7FA; border-bottom: 1px solid var(--line); color: var(--ink-2); }
tbody td { padding: 7px 10px; font-size: 12.5px; }
tbody tr:nth-child(even) td { background: #FBFCFD; }
tbody tr:hover td { background: #F0F5FB !important; }
tbody tr.on td { background: #E8F0FA !important; }
.table-wrap { max-height: calc(100vh - 300px); }

/* ---- 表单控件：统一 30px 高，直角 ---- */
.btn { height: 30px; padding: 0 12px; border-radius: 2px; font-size: 12.5px; }
.btn.sm { height: 26px; padding: 0 9px; font-size: 12px; border-radius: 2px; }
.btn.primary { box-shadow: none; }
.btn.primary:hover { box-shadow: none; }
.kw-input, .query input, .query select, .field input, .field select, .pager select,
.ai-input select, .menu-search input { border-radius: 2px; }
.kw-input, .query input, .query select, .field input, .field select { height: 30px; font-size: 12.5px; }
.field textarea { border-radius: 2px; font-size: 12.5px; }
.chip { border-radius: 2px; height: 22px; font-size: 11.5px; }
.badge { border-radius: 2px; }
.tag-pill { border-radius: 2px; }

/* ---- 弹窗：小圆角、克制的投影 ---- */
.dialog { border-radius: 3px; box-shadow: var(--shadow-lg); }
.mask { background: rgba(20, 30, 42, .42); }

/* ---- AI 助手：改成工作面板的观感，不做聊天气泡那套 ---- */
.ai-avatar { border-radius: 3px; }
.ai-msg.assistant .ai-avatar { background: var(--navy-3); }
.ai-msg.user .ai-avatar { background: #8C9AAB; }
.ai-bubble { border-radius: 3px; box-shadow: none; }
.ai-msg.user .ai-bubble {
    background: var(--cyan-soft);
    border-color: #C6D8EE;
    color: var(--ink);
    border-top-right-radius: 3px;
}
.ai-msg.assistant .ai-bubble { border-top-left-radius: 3px; }
.ai-msg { margin-bottom: 14px; }
.ai-log { background: #FAFBFC; padding: 14px 16px; }
.ai-scene { border-radius: 2px; }
.ai-scene:hover { border-color: #B9C2CD; background: #F5F8FC; }
.ai-scene.on { border-color: var(--cyan); background: var(--cyan-soft); }
.ai-input textarea { border-radius: 2px; font-size: 13px; }

/* ---- 图表：柱条方角 ---- */
.bar-row .tr, .bar-row .fl { border-radius: 0; }
.legend i { border-radius: 1px; }
