/* /Components/Boms/ProjectBomPanel.razor.rz.scp.css */
/* 项目 BOM 明细（第十三阶段重构）。
   CSS 隔离只作用于本 .razor 标记里的元素——本组件没有 RenderTreeBuilder 手工节点，
   但 ProductBatchPicker 是子组件，它的样式在自己的 .razor.css 里，这里不去动它。 */

/* 行级审核工具条：与表格拉开层次，别让它看着像表头 */
.line-approve-bar[b-uvmsb0kbtc] {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    background: #f7faff; border: 1px solid #dbe7fb; border-radius: 8px;
    padding: 7px 12px; margin-bottom: 8px;
}
.lab-title[b-uvmsb0kbtc] { font-size: 12.5px; font-weight: 650; color: #1d4ed8; }

/* 明细表：列多，字号收一号并禁止表头换行，避免十几列挤成两行 */
.bom-grid[b-uvmsb0kbtc] { font-size: 12.5px; }
.bom-grid thead th[b-uvmsb0kbtc] { white-space: nowrap; font-size: 11.5px; color: #64748b; font-weight: 650; }
.bom-grid td[b-uvmsb0kbtc] { vertical-align: middle; }
.bom-grid .form-control-sm[b-uvmsb0kbtc], .bom-grid .form-select-sm[b-uvmsb0kbtc] { font-size: 12px; padding: 2px 6px; }

/* 工位分组头：客户的 Excel 就是按工位一段段读的 */
.station-row td[b-uvmsb0kbtc] {
    background: #eef2f7; font-weight: 650; color: #334155; font-size: 12px;
    padding: 4px 10px; border-top: 1px solid #cbd5e1;
}

/* 已下单锁定行：给一条左边框而不是整行变灰——整行变灰会让人以为是停用数据 */
.locked-row td[b-uvmsb0kbtc] { background: #fffdf5; }
.locked-row td:first-child[b-uvmsb0kbtc] { box-shadow: inset 3px 0 #f59e0b; }

/* 技术描述列：一行截断，全文在 title 里 */
.desc-cell[b-uvmsb0kbtc] { max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #5b6b7f; }

/* 图纸三格：亮=已上传可点，灰=未上传 */
.file-cell[b-uvmsb0kbtc] { white-space: nowrap; }
.file-chip[b-uvmsb0kbtc] {
    display: inline-block; min-width: 30px; text-align: center;
    font-size: 10.5px; line-height: 1.5; padding: 1px 5px; margin-right: 3px;
    border: 1px solid #e2e8f0; border-radius: 4px; background: #f8fafc; color: #b3bdcb;
    text-decoration: none;
}
.file-chip.on[b-uvmsb0kbtc] {
    border-color: #86efac; background: #f0fdf4; color: #15803d; font-weight: 600;
}
.file-chip.on:hover[b-uvmsb0kbtc] { background: #dcfce7; }

/* Excel 导入预览的逐行错误清单：行多时自己滚，别把弹窗撑出屏幕 */
.import-errors[b-uvmsb0kbtc] { max-height: 240px; overflow-y: auto; border: 1px solid #f1d4d4; border-radius: 6px;
    background: #fdf6f6; padding: 8px 12px; font-size: 12.5px; line-height: 1.8; margin-bottom: 6px; }
.import-errors b[b-uvmsb0kbtc] { color: #b42318; font-weight: 650; }

/* 套数与项目台数不一致的提醒：橙色但不刺眼——它是提示不是错误，业务上确实可能故意不同 */
.bom-qty-warn[b-uvmsb0kbtc] { display:inline-flex; align-items:center; gap:5px; padding:3px 9px; border-radius:12px;
    font-size:11.5px; font-weight:600; color:#92400e; background:#fef3c7; border:1px solid #fde68a; }
/* /Components/SystemFlowMap.razor.rz.scp.css */
/* 系统导航图：五条泳道的图标流程地图。
   与工作台整体风格一致（card-surface 里），节点是可点的小卡片，箭头用 bootstrap-icons。 */

.sysmap[b-pvji2tglv4] { display: flex; flex-direction: column; gap: 10px; }

.sysmap-row[b-pvji2tglv4] { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }

/* 泳道标签：阶段序号 + 名称，五个阶段五个色点 */
.sysmap-phase[b-pvji2tglv4] {
    flex: 0 0 74px;
    font-size: 12px; font-weight: 700; color: #475569;
    padding: 4px 8px; border-radius: 6px; text-align: center; white-space: nowrap;
    background: #f1f5f9;
    border-left: 3px solid #94a3b8;
}
.sysmap-phase.p1[b-pvji2tglv4] { border-left-color: #2563eb; }
.sysmap-phase.p2[b-pvji2tglv4] { border-left-color: #d97706; }
.sysmap-phase.p3[b-pvji2tglv4] { border-left-color: #16a34a; }
.sysmap-phase.p4[b-pvji2tglv4] { border-left-color: #7c3aed; }
.sysmap-phase.p5[b-pvji2tglv4] { border-left-color: #0f766e; }

/* 节点卡片 */
.sysmap-node[b-pvji2tglv4] {
    display: flex; align-items: center; gap: 8px;
    min-width: 150px; max-width: 190px;
    padding: 7px 10px;
    background: #fff;
    border: 1px solid var(--bom-border, #dfe5ec);
    border-radius: 9px;
    text-align: left;
    cursor: pointer;
    transition: border-color .15s, box-shadow .15s, transform .1s;
}
.sysmap-node:hover[b-pvji2tglv4] {
    border-color: var(--bom-primary, #2563eb);
    box-shadow: 0 4px 12px rgba(37, 99, 235, .13);
    transform: translateY(-1px);
}
.sysmap-node:focus-visible[b-pvji2tglv4] { outline: 2px solid var(--bom-primary, #2563eb); outline-offset: 2px; }

.sysmap-ico[b-pvji2tglv4] {
    flex: none; width: 32px; height: 32px;
    display: grid; place-items: center;
    border-radius: 8px;
    background: #eef4ff; color: #2563eb;
    font-size: 15px;
}
.sysmap-txt[b-pvji2tglv4] { min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
.sysmap-txt b[b-pvji2tglv4] { font-size: 12.5px; color: #172033; white-space: nowrap; }
.sysmap-txt small[b-pvji2tglv4] { font-size: 10.5px; color: #94a3b8; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* 无权限：置灰不可点，但仍然出现在图上——地图的意义是让人知道全流程长什么样 */
.sysmap-node.locked[b-pvji2tglv4] { cursor: not-allowed; opacity: .5; filter: grayscale(.6); }
.sysmap-node.locked:hover[b-pvji2tglv4] { border-color: var(--bom-border, #dfe5ec); box-shadow: none; transform: none; }

/* 箭头与连接符 */
.sysmap-arrow[b-pvji2tglv4] { color: #b6c2d2; font-size: 15px; flex: none; }
.sysmap-arrow.fork[b-pvji2tglv4]::after { content: "⑂"; margin-left: 2px; color: #b6c2d2; font-size: 12px; }
.sysmap-down[b-pvji2tglv4] { color: #cbd5e1; font-size: 14px; margin-left: 2px; transform: rotate(90deg); flex: none; }

/* 分支块：两条并列的支线（购入件 / 加工件），各带一个小标签 */
.sysmap-branch[b-pvji2tglv4] { display: flex; flex-direction: column; gap: 6px; padding: 4px 6px; border-left: 1px dashed #d7dee8; border-right: 1px dashed #d7dee8; border-radius: 6px; }
.sysmap-branch-line[b-pvji2tglv4] { display: flex; align-items: center; gap: 6px; }
.sysmap-tag[b-pvji2tglv4] {
    flex: none; font-size: 10.5px; font-weight: 600; color: #64748b;
    background: #f1f5f9; border-radius: 4px; padding: 2px 6px; white-space: nowrap;
}

/* 支线（退料这类可选路径）：靠一点距离 + 回折箭头示意“从生产退回仓库” */
.sysmap-side[b-pvji2tglv4] { display: flex; align-items: center; gap: 6px; margin-left: 14px; }
.sysmap-side > i[b-pvji2tglv4] { color: #cbd5e1; font-size: 14px; }
.sysmap-side .sysmap-node[b-pvji2tglv4] { border-style: dashed; }

/* 小屏：泳道标签占整行，节点缩窄 */
@media (max-width: 720px) {
    .sysmap-phase[b-pvji2tglv4] { flex-basis: 100%; text-align: left; }
    .sysmap-node[b-pvji2tglv4] { min-width: 132px; }
    .sysmap-txt small[b-pvji2tglv4] { display: none; }
    .sysmap-down[b-pvji2tglv4] { display: none; }
}

/* 全局站号（2026-09-04）：与全屏导航页同款，缩小一档。
   locked 用的是整块 opacity+grayscale，序号会跟着被压暗——小图上这是可接受的：
   它只是个索引，真要看清楚会点「查看大图」。 */
.sysmap-node[b-pvji2tglv4] { position: relative; }
.sysmap-no[b-pvji2tglv4] {
    position: absolute; left: -5px; top: -6px; z-index: 1;
    min-width: 18px; height: 16px; padding: 0 3px;
    display: grid; place-items: center;
    font-size: 10px; font-weight: 800; font-variant-numeric: tabular-nums;
    color: #94a3b8; background: #fff; border: 1px solid #e2e8f0; border-radius: 4px;
}
.sysmap-no.opt[b-pvji2tglv4] { min-width: 0; color: #a16207; background: #fdf3e2; border-color: #f6e3bd; }
/* /Layout/ColumnFilter.razor.rz.scp.css */
/* 列头漏斗。整个组件挂在 <th> 里，所以外层用 inline 元素，靠 CSS 自己摆成块。
   面板用 absolute 而不是 fixed：表头本身是 sticky，滚动时 fixed 面板会飘在原地。 */
.cf[b-6m52snjbt2] { position: relative; display: inline-flex; vertical-align: middle; margin-left: 3px; }

.cf-btn[b-6m52snjbt2] {
    display: inline-grid; place-items: center;
    width: 18px; height: 18px; padding: 0;
    border: 0; border-radius: 4px; background: transparent;
    color: #b0bcca; font-size: 10px; line-height: 1; cursor: pointer;
    transition: color .12s, background .12s;
}
.cf-btn:hover[b-6m52snjbt2] { color: #2f6fed; background: #e6effc; }
.cf.on .cf-btn[b-6m52snjbt2] { color: #2f6fed; background: #e0ecff; }

/* 点空白处收起。z-index 压在面板之下、盖在页面之上 */
.cf-backdrop[b-6m52snjbt2] { position: fixed; inset: 0; z-index: 1200; display: block; }

.cf-panel[b-6m52snjbt2] {
    position: absolute; z-index: 1201; top: calc(100% + 6px); left: 0;
    display: flex; flex-direction: column; gap: 7px;
    width: 232px; padding: 10px;
    background: #fff; border: 1px solid #dbe2ea; border-radius: 9px;
    box-shadow: 0 12px 32px rgba(15,23,42,.16);
    font-weight: 400; text-align: left; white-space: normal;
    cursor: default;
}
/* 最右边几列的面板贴着右缘展开，否则会被表格的横向滚动切掉 */
.cf-panel.right[b-6m52snjbt2] { left: auto; right: 0; }

.cf-head[b-6m52snjbt2] { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.cf-head b[b-6m52snjbt2] { font-size: 12px; color: #172033; font-weight: 700; }
.cf-clear[b-6m52snjbt2] { padding: 0; border: 0; background: transparent; color: #2f6fed; font-size: 11px; cursor: pointer; }

.cf-tip[b-6m52snjbt2] { font-size: 10.5px; color: #9aa6b4; }
.cf-state[b-6m52snjbt2] { display: flex; align-items: center; gap: 6px; padding: 10px 2px; font-size: 11.5px; color: #94a3b8; }

.cf-list[b-6m52snjbt2] { display: block; max-height: 210px; overflow: auto; margin: 0 -2px; }
.cf-item[b-6m52snjbt2] {
    display: flex; align-items: center; gap: 7px; margin: 0;
    padding: 5px 6px; border-radius: 5px;
    font-size: 12px; font-weight: 400; color: #334155; cursor: pointer;
}
.cf-item:hover[b-6m52snjbt2] { background: #f4f8ff; }
.cf-item input[b-6m52snjbt2] { flex: none; }
.cf-item span[b-6m52snjbt2] { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cf-item em[b-6m52snjbt2] { flex: none; font-style: normal; font-size: 10.5px; color: #9aa6b4; font-variant-numeric: tabular-nums; }

.cf-foot[b-6m52snjbt2] { display: flex; align-items: center; justify-content: flex-end; gap: 6px; }
.cf-foot .btn-link[b-6m52snjbt2] { padding: 0 4px; font-size: 11.5px; text-decoration: none; margin-right: auto; }
.cf-foot .btn-primary[b-6m52snjbt2] { padding: 3px 14px; font-size: 12px; }

.cf-panel .form-control[b-6m52snjbt2] { height: 30px; font-size: 12px; }
/* /Layout/MainLayout.razor.rz.scp.css */
.page[b-e1vytn2c0g] {
    position: relative;
    display: flex;
    flex-direction: column;
}

main[b-e1vytn2c0g] {
    flex: 1;
}

.sidebar[b-e1vytn2c0g] {
    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

.top-row[b-e1vytn2c0g] {
    background-color: #f7f7f7;
    border-bottom: 1px solid #d6d5d5;
    justify-content: flex-end;
    height: 3.5rem;
    display: flex;
    align-items: center;
}

    .top-row[b-e1vytn2c0g]  a, .top-row[b-e1vytn2c0g]  .btn-link {
        white-space: nowrap;
        margin-left: 1.5rem;
        text-decoration: none;
    }

    .top-row[b-e1vytn2c0g]  a:hover, .top-row[b-e1vytn2c0g]  .btn-link:hover {
        text-decoration: underline;
    }

    .top-row[b-e1vytn2c0g]  a:first-child {
        overflow: hidden;
        text-overflow: ellipsis;
    }

@media (max-width: 640.98px) {
    .top-row[b-e1vytn2c0g] {
        justify-content: space-between;
    }

    .top-row[b-e1vytn2c0g]  a, .top-row[b-e1vytn2c0g]  .btn-link {
        margin-left: 0;
    }
}

@media (min-width: 641px) {
    .page[b-e1vytn2c0g] {
        flex-direction: row;
    }

    .sidebar[b-e1vytn2c0g] {
        width: 250px;
        height: 100vh;
        position: sticky;
        top: 0;
    }

    .top-row[b-e1vytn2c0g] {
        position: sticky;
        top: 0;
        z-index: 1;
    }

    .top-row.auth[b-e1vytn2c0g]  a:first-child {
        flex: 1;
        text-align: right;
        width: 0;
    }

    .top-row[b-e1vytn2c0g], article[b-e1vytn2c0g] {
        padding-left: 2rem !important;
        padding-right: 1.5rem !important;
    }
}
/* /Layout/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-2ijdkf3ejt] {
    background-color: rgba(255, 255, 255, 0.1);
}

.top-row[b-2ijdkf3ejt] {
    min-height: 3.5rem;
    background-color: rgba(0,0,0,0.4);
}

.navbar-brand[b-2ijdkf3ejt] {
    font-size: 1.1rem;
}

.bi[b-2ijdkf3ejt] {
    display: inline-block;
    position: relative;
    width: 1.25rem;
    height: 1.25rem;
    margin-right: 0.75rem;
    top: -1px;
    background-size: cover;
}

.bi-house-door-fill-nav-menu[b-2ijdkf3ejt] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}

.bi-plus-square-fill-nav-menu[b-2ijdkf3ejt] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}

.bi-list-nested-nav-menu[b-2ijdkf3ejt] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}

.nav-item[b-2ijdkf3ejt] {
    font-size: 0.9rem;
    padding-bottom: 0.5rem;
}

    .nav-item:first-of-type[b-2ijdkf3ejt] {
        padding-top: 1rem;
    }

    .nav-item:last-of-type[b-2ijdkf3ejt] {
        padding-bottom: 1rem;
    }

    .nav-item[b-2ijdkf3ejt]  a {
        color: #d7d7d7;
        border-radius: 4px;
        height: 3rem;
        display: flex;
        align-items: center;
        line-height: 3rem;
    }

.nav-item[b-2ijdkf3ejt]  a.active {
    background-color: rgba(255,255,255,0.37);
    color: white;
}

.nav-item[b-2ijdkf3ejt]  a:hover {
    background-color: rgba(255,255,255,0.1);
    color: white;
}

@media (min-width: 641px) {
    .navbar-toggler[b-2ijdkf3ejt] {
        display: none;
    }

    .collapse[b-2ijdkf3ejt] {
        /* Never collapse the sidebar for wide screens */
        display: block;
    }

    .nav-scrollable[b-2ijdkf3ejt] {
        /* Allow sidebar to scroll for tall menus */
        height: calc(100vh - 3.5rem);
        overflow-y: auto;
    }
}
/* /Layout/ProductBatchPicker.razor.rz.scp.css */
/* 快速新增物料面板（客户反馈 FB-08）。写在选品弹窗内联展开，而不是再叠一层弹窗：
   本组件的遮罩是自绘的 bom-modal-backdrop，没有 z-index 分层，套第二层必然打架。 */
.quick-create[b-zj5o2i9qwl] {
    border:1px dashed #86b7fe; background:#f6faff; border-radius:8px;
    padding:10px 12px; margin-bottom:10px;
}
.qc-head[b-zj5o2i9qwl] { font-size:12px; font-weight:650; color:#1d4ed8; margin-bottom:8px; }
.quick-create .form-label[b-zj5o2i9qwl] { font-size:11px; color:#64748b; font-weight:600; }
/* /Layout/ProductFieldSettings.razor.rz.scp.css */
/* 「字段设置」弹窗。两栏并排：左边列显隐（本机），右边唯一性规则（全公司）。
   窄屏改成上下堆叠——两栏各 300px 时在 1024 的笔记本上会把右栏挤成一条。 */
.fs-backdrop[b-2zfl4q7n9v] { z-index: 1046; padding: 18px; }
.fs-modal[b-2zfl4q7n9v] {
    width: min(1080px, 96vw); max-height: min(860px, 92vh);
    padding: 0; overflow: hidden; display: flex; flex-direction: column;
    background: #fff; border-radius: 14px; box-shadow: 0 20px 60px rgba(15,23,42,.24);
}
.fs-body[b-2zfl4q7n9v] {
    flex: 1; min-height: 0; overflow: auto;
    display: grid; grid-template-columns: minmax(0, 340px) minmax(0, 1fr); gap: 0;
}
.fs-pane[b-2zfl4q7n9v] { padding: 16px 18px; min-width: 0; }
.fs-pane + .fs-pane[b-2zfl4q7n9v] { border-left: 1px solid #e6eaf0; background: #fcfdfe; }
.fs-pane-head[b-2zfl4q7n9v] { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 12px; }
.fs-pane-head h3[b-2zfl4q7n9v] { margin: 0; font-size: 14px; font-weight: 700; color: #172033; display: flex; align-items: center; gap: 6px; }
.fs-pane-head h3 i[b-2zfl4q7n9v] { color: #2f6fed; }
.fs-pane-head p[b-2zfl4q7n9v] { margin: 4px 0 0; font-size: 11.5px; line-height: 1.6; color: #7b8794; }
.fs-pane-act[b-2zfl4q7n9v] { display: flex; gap: 2px; flex: none; }
.fs-pane-act .btn-link[b-2zfl4q7n9v] { padding: 0 4px; font-size: 12px; text-decoration: none; }

.fs-cols[b-2zfl4q7n9v] { display: grid; grid-template-columns: 1fr; gap: 1px; border: 1px solid #e6eaf0; border-radius: 8px; overflow: hidden; background: #e6eaf0; }
.fs-cols-2[b-2zfl4q7n9v] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.fs-col[b-2zfl4q7n9v] {
    display: flex; align-items: center; gap: 8px; margin: 0;
    padding: 8px 10px; background: #fff; font-size: 12.5px; color: #334155; cursor: pointer;
}
.fs-col:hover[b-2zfl4q7n9v] { background: #f5f9ff; }
.fs-col.fixed[b-2zfl4q7n9v] { color: #94a3b8; cursor: default; background: #f8fafc; }
.fs-col input[b-2zfl4q7n9v] { flex: none; }
.fs-col span[b-2zfl4q7n9v] { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fs-col em[b-2zfl4q7n9v] { margin-left: auto; flex: none; font-style: normal; font-size: 10.5px; color: #94a3b8; }

.fs-sub[b-2zfl4q7n9v] { margin: 14px 0 6px; font-size: 11.5px; font-weight: 700; color: #64748b; letter-spacing: .03em; }
.fs-sub:first-of-type[b-2zfl4q7n9v] { margin-top: 4px; }
.fs-radios[b-2zfl4q7n9v] { display: flex; flex-wrap: wrap; gap: 6px; }
.fs-radio[b-2zfl4q7n9v] {
    display: inline-flex; align-items: center; gap: 6px; margin: 0;
    padding: 6px 10px; border: 1px solid #dfe4ec; border-radius: 999px;
    background: #fff; font-size: 12.5px; color: #334155; cursor: pointer;
}
.fs-radio:hover[b-2zfl4q7n9v] { border-color: #b9cdf3; }
.fs-radio.on[b-2zfl4q7n9v] { border-color: #2f6fed; background: #eef4ff; color: #1d4ed8; font-weight: 600; }

.fs-switch[b-2zfl4q7n9v] { display: flex; align-items: center; gap: 8px; margin: 14px 0 0; font-size: 12.5px; color: #334155; cursor: pointer; }
.fs-note[b-2zfl4q7n9v] { margin: 6px 0 0; font-size: 11px; line-height: 1.7; color: #8a96a4; }
.fs-note b[b-2zfl4q7n9v] { color: #64748b; }

.fs-scan[b-2zfl4q7n9v] { margin-top: 14px; padding-top: 12px; border-top: 1px solid #e6eaf0; }
.fs-ok[b-2zfl4q7n9v], .fs-bad[b-2zfl4q7n9v] { margin-top: 10px; padding: 9px 11px; border-radius: 8px; font-size: 12px; line-height: 1.6; }
.fs-ok[b-2zfl4q7n9v] { color: #166534; background: #f0fdf4; border: 1px solid #bbf7d0; }
.fs-bad[b-2zfl4q7n9v] { color: #9a3412; background: #fff7ed; border: 1px solid #fed7aa; }
.fs-dups[b-2zfl4q7n9v] { margin-top: 8px; max-height: 240px; overflow: auto; border: 1px solid #e6eaf0; border-radius: 8px; }
/* 体检结果本身就是一张对账表，网格线必须齐——只有横线的话「哪个值撞了哪几条」很难对上行 */
.fs-dups table[b-2zfl4q7n9v] { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.fs-dups th[b-2zfl4q7n9v], .fs-dups td[b-2zfl4q7n9v] { padding: 6px 8px; border-right: 1px solid #eef1f5; border-bottom: 1px solid #eef1f5; text-align: left; vertical-align: top; }
.fs-dups th:last-child[b-2zfl4q7n9v], .fs-dups td:last-child[b-2zfl4q7n9v] { border-right: 0; }
.fs-dups th[b-2zfl4q7n9v] { position: sticky; top: 0; background: #f5f7fa; color: #64748b; font-weight: 650; white-space: nowrap; }
.fs-dups .num[b-2zfl4q7n9v] { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.fs-dups .val[b-2zfl4q7n9v] { font-weight: 650; color: #172033; overflow-wrap: anywhere; }
.fs-dups .who[b-2zfl4q7n9v] { color: #64748b; overflow-wrap: anywhere; }

@media (max-width: 900px) {
    .fs-body[b-2zfl4q7n9v] { grid-template-columns: 1fr; }
    .fs-pane + .fs-pane[b-2zfl4q7n9v] { border-left: 0; border-top: 1px solid #e6eaf0; }
    .fs-cols-2[b-2zfl4q7n9v] { grid-template-columns: 1fr; }
}
/* /Pages/AuditLogs.razor.rz.scp.css */
/* 操作日志：IP 一列用等宽字体，多行地址左对齐能对齐比较；
   带一点底色，和右边「地区」的绿色徽标区分开。 */
.log-ip[b-svw4p0zn3p] {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 12.5px;
    color: #be185d;
    background: #fdf2f8;
    border: 1px solid #fbcfe8;
    border-radius: 5px;
    padding: 1px 6px;
    white-space: nowrap;
}
/* /Pages/Categories.razor.rz.scp.css */
.category-page[b-dx70ehux16] { color:#172033; }
.category-hero[b-dx70ehux16] { display:flex; justify-content:space-between; align-items:flex-end; gap:24px; padding:6px 2px 20px; border-bottom:1px solid #dfe5ec; }
.category-hero > div:first-child > span[b-dx70ehux16] { color:#185abd; font-size:10px; font-weight:750; letter-spacing:.14em; }
.category-hero h1[b-dx70ehux16] { margin:6px 0 5px; font-size:29px; }.category-hero p[b-dx70ehux16] { margin:0; color:#64748b; font-size:13px; }
.category-hero > div:last-child[b-dx70ehux16] { display:flex; gap:9px; }
.category-notice[b-dx70ehux16] { display:flex; gap:9px; align-items:center; margin:14px 0; padding:10px 13px; border-left:3px solid #3b78bd; background:#f1f6fc; color:#536579; font-size:12px; }
/* 工具条与统计条：与物料资料页同一规格（38px 高、8px 圆角、同焦点环），
   这样基础资料几个页面的查询区看起来是一家人。 */
.category-command[b-dx70ehux16] { display:flex; align-items:center; gap:8px; padding:14px 0; border-bottom:1px solid #dfe5ec; flex-wrap:wrap; }
.category-command .form-select[b-dx70ehux16] { width:140px; min-height:38px; font-size:13px; }
.category-command .search-box[b-dx70ehux16] { position:relative; width:min(340px, 40vw); }
.category-command .search-box i[b-dx70ehux16] { position:absolute; left:12px; top:50%; transform:translateY(-50%); color:#94a3b8; z-index:1; }
.category-command .search-box input[b-dx70ehux16] { min-height:38px; padding-left:36px; font-size:13px; }
.category-command .form-control[b-dx70ehux16], .category-command .form-select[b-dx70ehux16] { border-radius:8px; border-color:#dfe4ec; }
.category-command .form-control:focus[b-dx70ehux16], .category-command .form-select:focus[b-dx70ehux16] { border-color:#2f6fed; box-shadow:0 0 0 3px rgba(47,111,237,.12); }
.category-command .command-spacer[b-dx70ehux16] { flex:1; }
.category-command .reset-link[b-dx70ehux16] { color:#64748b; text-decoration:none; }

.category-summary[b-dx70ehux16] { display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); border:1px solid #dfe5ec; border-bottom:0; background:#fff; }
.category-summary > div[b-dx70ehux16] { min-height:70px; padding:13px 18px; border-right:1px solid #dfe5ec; display:grid; grid-template-columns:auto 1fr; column-gap:10px; align-content:center; }
.category-summary > div:last-child[b-dx70ehux16] { border-right:0; }
.category-summary span[b-dx70ehux16] { grid-column:1 / -1; color:#64748b; font-size:11px; letter-spacing:.05em; }
.category-summary strong[b-dx70ehux16] { font-size:22px; line-height:1.15; font-variant-numeric:tabular-nums; }
.category-summary small[b-dx70ehux16] { color:#94a3b8; align-self:end; padding-bottom:2px; }
.category-summary .summary-text[b-dx70ehux16] { max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* 折叠箭头：没有子分类的行留一个等宽占位，否则同级的名字会左右错开 */
.tree-toggle[b-dx70ehux16] { width:20px; height:20px; flex:none; display:grid; place-items:center; padding:0;
    border:0; background:transparent; color:#94a3b8; font-size:10px; border-radius:4px; }
.tree-toggle:hover[b-dx70ehux16] { background:#e8f0fe; color:#2f6fed; }
.tree-toggle.placeholder-slot[b-dx70ehux16] { pointer-events:none; }

/* 左树 + 右表。列宽与物料资料页对齐（220px），两个页面并排看不出错位。 */
.category-workspace[b-dx70ehux16] { display:grid; grid-template-columns:220px minmax(0,1fr); border:1px solid #dfe5ec; background:#fff; }
.category-rail[b-dx70ehux16] { border-right:1px solid #dfe5ec; background:#f8fafc; min-width:0; }
.category-tree[b-dx70ehux16] { padding:10px 8px 16px; max-height:660px; overflow:auto; }
.category-workspace .category-table-wrap[b-dx70ehux16] { border:0; }

.category-table-wrap[b-dx70ehux16] { border:1px solid #dfe5ec; background:#fff; overflow:auto; }
.category-table[b-dx70ehux16] { width:100%; min-width:760px; border-collapse:collapse; font-size:13px; }
.category-table th[b-dx70ehux16] { height:42px; padding:0 16px; background:#f7f9fb; color:#64748b; border-bottom:1px solid #dfe5ec; font-size:11px; text-align:left; }
.category-table td[b-dx70ehux16] { height:52px; padding:7px 16px; border-bottom:1px solid #edf1f5; color:#334155; }.category-table tbody tr:last-child td[b-dx70ehux16] { border-bottom:0; }.category-table tbody tr:hover[b-dx70ehux16] { background:#f8fbff; }
.tree-name[b-dx70ehux16] { padding-left:calc(var(--level) * 24px); display:flex; align-items:center; gap:8px; }.tree-name i[b-dx70ehux16] { color:#4d7fb8; }.tree-name strong[b-dx70ehux16] { font-weight:650; }
.category-table code[b-dx70ehux16] { color:#4d5e73; background:#f2f5f8; padding:3px 6px; }
.category-status[b-dx70ehux16] { display:inline-flex; align-items:center; gap:6px; font-size:11px; }.category-status i[b-dx70ehux16] { width:6px; height:6px; border-radius:50%; }.category-status.on[b-dx70ehux16] { color:#177245; }.category-status.on i[b-dx70ehux16] { background:#22a06b; }.category-status.off[b-dx70ehux16] { color:#8b5e18; }.category-status.off i[b-dx70ehux16] { background:#d19a25; }
.category-actions[b-dx70ehux16] { text-align:right; white-space:nowrap; }.category-actions button[b-dx70ehux16] { width:29px; height:29px; border:0; background:transparent; color:#64748b; }.category-actions button:hover[b-dx70ehux16] { color:#185abd; background:#e8f0fb; }.category-actions button.danger:hover[b-dx70ehux16] { color:#b42318; background:#feeceb; }
.category-state[b-dx70ehux16] { min-height:380px; display:flex; flex-direction:column; gap:12px; align-items:center; justify-content:center; color:#8290a0; }.category-state > i[b-dx70ehux16] { font-size:32px; }.category-state strong[b-dx70ehux16] { color:#475569; }
.category-editor[b-dx70ehux16] { width:min(560px,94vw); max-width:none; padding:0; overflow:hidden; border-radius:5px; }
/* 弹窗头统一走全站的 bom-form-head（蓝色渐变）。这里只补关闭按钮的蓝底配色。
   2026-08-29 修：这条规则的选择器行此前不知何时被删掉了，只剩一段裸属性挂在注释后面，
   浏览器解析到这里会一路吞到下一个 } 为止——关闭按钮的样式其实一直没生效。 */
.category-editor .modal-close[b-dx70ehux16] {
    width:32px; height:32px; flex:none; border-radius:8px;
    border:1px solid rgba(255,255,255,.35); background:rgba(255,255,255,.16); color:#fff;
    display:grid; place-items:center; transition:background .15s;
}
.category-editor .modal-close:hover[b-dx70ehux16] { background:rgba(255,255,255,.3); }

/* 弹窗表单：标签深色加粗、字段之间给足呼吸，别再把复选框和下拉挤一格 */
.category-editor .bom-field label[b-dx70ehux16] { display:block; margin-bottom:5px; font-size:12.5px; font-weight:650; color:#243244; }
.category-editor .bom-field .req[b-dx70ehux16] { color:#d92d20; }
.category-editor .form-control[b-dx70ehux16], .category-editor .form-select[b-dx70ehux16] { min-height:40px; font-size:13.5px; border-radius:8px; border-color:#dfe4ec; }
.category-editor .form-control:focus[b-dx70ehux16], .category-editor .form-select:focus[b-dx70ehux16] { border-color:#2f6fed; box-shadow:0 0 0 3px rgba(47,111,237,.12); }
.category-editor .field-hint[b-dx70ehux16] { margin-top:6px; font-size:11.5px; line-height:1.6; color:#7a8798; display:flex; gap:5px; }
.category-editor .field-hint i[b-dx70ehux16] { margin-top:2px; flex:none; color:#94a3b8; }

/* 启用开关：整行可点，说明文字跟在标题下面——不再是一个孤零零竖排的复选框 */
.ct-switch[b-dx70ehux16] { display:flex; gap:11px; align-items:flex-start; margin:0; padding:12px 14px;
    border:1px solid #e3e9f0; border-radius:9px; background:#f8fafc; cursor:pointer; }
.ct-switch:hover[b-dx70ehux16] { border-color:#c7d6ea; background:#f4f8fd; }
.ct-switch .form-check-input[b-dx70ehux16] { margin:2px 0 0; flex:none; width:17px; height:17px; cursor:pointer; }
.ct-switch .cs-text[b-dx70ehux16] { display:flex; flex-direction:column; gap:2px; min-width:0; }
.ct-switch strong[b-dx70ehux16] { font-size:13.5px; font-weight:650; color:#243244; }
.ct-switch em[b-dx70ehux16] { font-style:normal; font-size:11.5px; line-height:1.6; color:#7a8798; }

@media(max-width:1100px){ .category-workspace[b-dx70ehux16] { grid-template-columns:190px minmax(0,1fr); } }
@media(max-width:820px){
    .category-workspace[b-dx70ehux16] { display:block; }
    .category-rail[b-dx70ehux16] { border-right:0; border-bottom:1px solid #dfe5ec; }
    .category-tree[b-dx70ehux16] { max-height:190px; }
}
@media(max-width:700px){.category-hero[b-dx70ehux16]{display:block}.category-hero>div:last-child[b-dx70ehux16]{margin-top:15px}.category-hero p[b-dx70ehux16]{line-height:1.5}}
/* /Pages/Products.razor.rz.scp.css */
.material-page[b-j9htg96klj] {
    --material-ink: #172033;
    --material-muted: #64748b;
    --material-line: #dfe5ec;
    --material-soft: #f5f7f9;
    --material-blue: #2f6fed;   /* 与全站主色一致（原来是 #185abd，自成一支蓝）*/
    --material-green: #177245;
    color: var(--material-ink);
    padding-bottom: 24px;
}
.material-hero[b-j9htg96klj] { display:flex; align-items:flex-end; justify-content:space-between; gap:24px; padding:6px 2px 20px; border-bottom:1px solid var(--material-line); }
.material-eyebrow[b-j9htg96klj] { font-size:11px; font-weight:750; letter-spacing:.16em; color:var(--material-blue); margin-bottom:8px; }
.material-eyebrow span[b-j9htg96klj] { color:#94a3b8; margin-left:8px; }
.material-hero h1[b-j9htg96klj] { margin:0; font-size:29px; line-height:1.15; letter-spacing:-.02em; font-weight:720; }
.material-hero p[b-j9htg96klj] { max-width:680px; margin:8px 0 0; color:var(--material-muted); font-size:14px; }
.hero-actions[b-j9htg96klj] { display:flex; gap:10px; flex:none; }

.material-command[b-j9htg96klj] { display:flex; align-items:center; gap:8px; padding:14px 0; border-bottom:1px solid var(--material-line); }
/* 查询区控件与全站表单同规格：38px 高、8px 圆角、同一边框色与焦点环 */
.material-command .form-select[b-j9htg96klj] { width:150px; min-height:38px; font-size:13px; }
.search-box[b-j9htg96klj] { position:relative; width:min(390px, 32vw); }
.search-box i[b-j9htg96klj] { position:absolute; left:12px; top:50%; transform:translateY(-50%); color:#94a3b8; z-index:1; }
.search-box input[b-j9htg96klj] { min-height:38px; padding-left:36px; font-size:13px; }
.material-command .form-control[b-j9htg96klj], .material-command .form-select[b-j9htg96klj] { border-radius:8px; border-color:#dfe4ec; }
.material-command .form-control:focus[b-j9htg96klj], .material-command .form-select:focus[b-j9htg96klj] {
    border-color:#2f6fed; box-shadow:0 0 0 3px rgba(47,111,237,.12);
}
.command-spacer[b-j9htg96klj] { flex:1; }
.reset-link[b-j9htg96klj] { color:#64748b; text-decoration:none; }

.material-summary[b-j9htg96klj] { display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); border:1px solid var(--material-line); border-top:0; background:#fff; }
.material-summary > div[b-j9htg96klj] { min-height:72px; padding:13px 18px; border-right:1px solid var(--material-line); display:grid; grid-template-columns:auto 1fr; column-gap:10px; align-content:center; }
.material-summary > div:last-child[b-j9htg96klj] { border-right:0; }
.material-summary span[b-j9htg96klj] { grid-column:1 / -1; color:var(--material-muted); font-size:11px; letter-spacing:.05em; }
.material-summary strong[b-j9htg96klj] { font-size:23px; line-height:1.15; font-variant-numeric:tabular-nums; }
.material-summary .summary-text[b-j9htg96klj] { font-size:17px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.material-summary small[b-j9htg96klj] { color:#94a3b8; align-self:end; padding-bottom:2px; }

.material-workspace[b-j9htg96klj] { display:grid; grid-template-columns:220px minmax(620px, 1fr) 286px; min-height:610px; border:1px solid var(--material-line); border-top:0; background:#fff; }
.category-rail[b-j9htg96klj] { border-right:1px solid var(--material-line); background:#f8fafc; min-width:0; }
/* 树本体是全站共享的 CategoryTree 组件（ct-* 全局样式在 bom.css），这里只管容器滚动 */
.category-tree[b-j9htg96klj] { padding:10px 8px 16px; max-height:660px; overflow:auto; }

.material-list[b-j9htg96klj] { min-width:0; display:flex; flex-direction:column; }
.list-head[b-j9htg96klj] { min-height:66px; padding:11px 16px; display:flex; align-items:center; justify-content:space-between; border-bottom:1px solid var(--material-line); }
.list-head h2[b-j9htg96klj] { font-size:15px; margin:0; font-weight:700; }
.list-head p[b-j9htg96klj] { margin:3px 0 0; color:#94a3b8; font-size:11px; }
.list-head > span[b-j9htg96klj] { color:#64748b; font-size:12px; }
.table-shell[b-j9htg96klj] { width:100%; overflow:auto; flex:1; }
.material-table[b-j9htg96klj] { width:100%; min-width:1000px; border-collapse:collapse; font-size:12px; }
.material-table th[b-j9htg96klj] { position:sticky; top:0; z-index:1; height:40px; padding:0 10px; background:#f8fafc; border-bottom:1px solid var(--material-line); color:#64748b; font-size:11px; font-weight:650; white-space:nowrap; }
.material-table td[b-j9htg96klj] { height:58px; padding:7px 10px; border-bottom:1px solid #edf1f5; color:#334155; vertical-align:middle; }
.material-table tbody tr[b-j9htg96klj] { cursor:pointer; }
.material-table tbody tr:hover[b-j9htg96klj] { background:#f8fbff; }
.material-table tbody tr.selected[b-j9htg96klj] { background:#edf5ff; box-shadow:inset 3px 0 #185abd; }
.material-table .sortable[b-j9htg96klj] { cursor:pointer; user-select:none; }
.material-table .sortable i[b-j9htg96klj] { font-size:10px; margin-left:3px; }
.material-ident[b-j9htg96klj] { display:flex; align-items:center; min-width:190px; gap:9px; }
.material-ident img[b-j9htg96klj],.material-thumb[b-j9htg96klj] { width:36px; height:36px; object-fit:cover; border:1px solid var(--material-line); background:#f4f6f8; flex:none; }
.material-thumb[b-j9htg96klj] { display:grid; place-items:center; color:#94a3b8; }
.material-ident div[b-j9htg96klj],.material-table td > span.cell-primary[b-j9htg96klj] { min-width:0; }
.material-ident strong[b-j9htg96klj],.cell-primary[b-j9htg96klj] { display:block; max-width:180px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; font-weight:650; color:#172033; }
.material-ident small[b-j9htg96klj],.material-table td small[b-j9htg96klj] { display:block; color:#94a3b8; margin-top:2px; white-space:nowrap; }
.type-chip[b-j9htg96klj],.critical-chip[b-j9htg96klj] { display:inline-block; padding:3px 7px; border:1px solid #cfd9e6; background:#f6f8fb; color:#42526a; font-size:11px; line-height:1.1; white-space:nowrap; }
.critical-chip[b-j9htg96klj] { color:#9a3412; border-color:#fed7aa; background:#fff7ed; margin-left:5px; }
.status-pill[b-j9htg96klj] { display:inline-flex; align-items:center; gap:5px; font-size:11px; white-space:nowrap; }
.status-pill i[b-j9htg96klj] { width:6px; height:6px; border-radius:50%; }
.status-pill.on[b-j9htg96klj] { color:#177245; }.status-pill.on i[b-j9htg96klj] { background:#22a06b; }
.status-pill.off[b-j9htg96klj] { color:#8b5e18; }.status-pill.off i[b-j9htg96klj] { background:#d19a25; }
.actions-col[b-j9htg96klj] { width:66px; }

/* 技术描述列（客户反馈 FB-02）：一行截断，完整内容在 title 里。
   给固定宽度是为了不让它把型号、图纸挤出可视区——表格本身已经 min-width:1000px 带横向滚动。 */
.desc-col[b-j9htg96klj] { width:210px; max-width:210px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; color:#5b6b7f; }
.row-actions[b-j9htg96klj] { white-space:nowrap; }
.row-actions button[b-j9htg96klj] { width:27px; height:27px; border:0; background:transparent; color:#64748b; }
.row-actions button:hover[b-j9htg96klj] { color:#185abd; background:#e6effc; }
.row-actions button.danger:hover[b-j9htg96klj] { color:#b42318; background:#feeceb; }
.material-state[b-j9htg96klj] { min-height:420px; display:flex; flex-direction:column; align-items:center; justify-content:center; color:#64748b; }
.material-state p[b-j9htg96klj] { margin:9px 0 0; }.material-state.empty i[b-j9htg96klj] { font-size:35px; color:#b8c3cf; }
.material-state.empty h3[b-j9htg96klj] { font-size:16px; margin:15px 0 3px; }.material-state.empty p[b-j9htg96klj] { color:#94a3b8; margin:0 0 16px; font-size:12px; }

.material-inspector[b-j9htg96klj] { border-left:1px solid var(--material-line); background:#fbfcfd; padding:16px; min-width:0; }
.inspector-empty[b-j9htg96klj] { height:100%; min-height:360px; display:grid; place-content:center; text-align:center; color:#a1adba; }
.inspector-empty i[b-j9htg96klj] { font-size:30px; margin-bottom:10px; }.inspector-empty p[b-j9htg96klj] { font-size:12px; line-height:1.7; }
.inspector-cover[b-j9htg96klj] { height:150px; display:grid; place-items:center; background:#eef2f5; border:1px solid var(--material-line); overflow:hidden; }
.inspector-cover img[b-j9htg96klj] { width:100%; height:100%; object-fit:contain; background:#fff; }
.inspector-cover > i[b-j9htg96klj] { font-size:42px; color:#aab5c0; }
.inspector-title[b-j9htg96klj] { padding:14px 0; border-bottom:1px solid var(--material-line); }
.inspector-title > span[b-j9htg96klj] { color:#64748b; font-size:11px; letter-spacing:.05em; }
.inspector-title h2[b-j9htg96klj] { font-size:17px; line-height:1.35; margin:4px 0 10px; }
.completeness[b-j9htg96klj] { padding:14px 0; border-bottom:1px solid var(--material-line); }
.completeness > div:first-child[b-j9htg96klj] { display:flex; justify-content:space-between; font-size:11px; color:#64748b; }.completeness strong[b-j9htg96klj] { color:#172033; }
.progress-track[b-j9htg96klj] { height:4px; background:#e1e7ed; margin-top:8px; }.progress-track i[b-j9htg96klj] { display:block; height:100%; background:#2774c8; }
.inspector-data[b-j9htg96klj] { margin:5px 0 14px; }
.inspector-data > div[b-j9htg96klj] { display:grid; grid-template-columns:88px 1fr; gap:8px; padding:8px 0; border-bottom:1px solid #edf1f5; font-size:11px; }
.inspector-data dt[b-j9htg96klj] { color:#7b8794; font-weight:500; }.inspector-data dd[b-j9htg96klj] { margin:0; color:#27364a; text-align:right; overflow-wrap:anywhere; }
/* 技术描述 / 手册链接（FB-04）：这两项常常比 88px 的标签列还长，
   改成上下两行整行铺开，右对齐会把长句子挤成一条竖线。 */
.inspector-data > div.dl-full[b-j9htg96klj] { grid-template-columns:1fr; gap:3px; }
.inspector-data > div.dl-full dd[b-j9htg96klj] { text-align:left; white-space:pre-wrap; }
.manual-link[b-j9htg96klj] { display:block; padding:9px 10px; border:1px solid #bfd2ec; color:#185abd; background:#f3f7fd; text-decoration:none; font-size:12px; margin-bottom:9px; }
.inspector-edit[b-j9htg96klj] { width:100%; }

.material-backdrop[b-j9htg96klj] { z-index:1045; padding:18px; }
/* 弹窗的头/体/脚与字段栅格全部改用全站样式（bom-form-head / bom-fsec / bom-field /
   bom-modal-foot），本文件只留列表页与图片区的私有样式。 */
/* 高度用 max-height 而不是定高：矮屏（笔记本 / 125% 缩放 / 副屏）上定高会连同
   bom.css 的 max-height:78vh 一起把底部按钮条挤出可视区。max-width 也别写 none——
   写了就把 .bom-modal 的 calc(100vw - 48px) 压掉，窄窗口下弹窗硬撑出屏幕。 */
.material-editor[b-j9htg96klj] { width:min(1060px, 96vw); max-height:min(880px, 94vh); padding:0; overflow:hidden; background:#fff; border-radius:5px; box-shadow:0 20px 60px rgba(15,23,42,.24); }

/* ::deep 不能省：<form> 是 <EditForm> 子组件渲染出来的，Blazor CSS 隔离只给本
   .razor 标记里的元素加作用域属性，子组件渲染的元素拿不到 —— 少了 ::deep 这条规则
   永远不匹配，form 退化成普通块，头/体/脚不再是 flex 兄弟，底部「保存」被裁掉且整窗不能滚。
   （2026-08-28 客户反馈 FB-05 的真正病根；同一坑见 Pager 的 ::deep .bom-pager） */
.material-editor[b-j9htg96klj]  form { min-height:0; max-height:inherit; display:flex; flex-direction:column; }
/* 弹窗头：与客户/供应商档案统一成全站的蓝色渐变头（bom-form-head）。
   这里只补两件 bom.css 里没有的：主体列要能压缩（长编码不挤掉标题）、
   以及右上角关闭按钮在蓝底上的配色。
   ——2026-08-28 修复：这两条规则的选择器行原先被一次批量替换误删，
   浏览器按错误恢复把后面的 .image-section 也一起吞了。 */
.material-editor[b-j9htg96klj]  .fh-main { min-width:0; }
.material-editor[b-j9htg96klj]  .modal-close {
    width:32px; height:32px; flex:none; border-radius:8px;
    border:1px solid rgba(255,255,255,.35); background:rgba(255,255,255,.16); color:#fff;
    display:grid; place-items:center; transition:background .15s;
}
.image-section[b-j9htg96klj] { align-items:start; }.image-section > :not(.section-heading)[b-j9htg96klj] { grid-column:2; }
.image-wait[b-j9htg96klj] { padding:13px; background:#f6f8fa; border:1px solid var(--material-line); color:#64748b; font-size:12px; }
.image-toolbar[b-j9htg96klj] { display:flex; align-items:center; gap:12px; }.image-toolbar small[b-j9htg96klj] { color:#8a96a4; }
.image-grid[b-j9htg96klj] { display:grid; grid-template-columns:repeat(4, 1fr); gap:10px; margin-top:12px; }
.image-card[b-j9htg96klj] { position:relative; border:1px solid var(--material-line); background:#fff; }.image-card.main[b-j9htg96klj] { border-color:#2c73be; }
.image-card img[b-j9htg96klj] { width:100%; height:108px; object-fit:contain; background:#f4f6f8; }.image-card > span[b-j9htg96klj] { position:absolute; top:5px; left:5px; padding:2px 6px; background:#185abd; color:white; font-size:10px; }
.image-card > div[b-j9htg96klj] { display:flex; border-top:1px solid var(--material-line); }.image-card button[b-j9htg96klj] { flex:1; border:0; background:#fff; padding:6px 3px; color:#185abd; font-size:10px; }.image-card button+button[b-j9htg96klj] { border-left:1px solid var(--material-line); }.image-card button.danger[b-j9htg96klj] { color:#b42318; }
.no-images[b-j9htg96klj] { grid-column:1 / -1; color:#94a3b8; font-size:12px; padding:16px; border:1px dashed #cfd7e1; text-align:center; }

[b-j9htg96klj] .bom-pager { margin-top:auto; border-top:1px solid var(--material-line); padding:10px 12px; background:#fff; }

@media (max-width: 1280px) {
    .material-workspace[b-j9htg96klj] { grid-template-columns:200px minmax(600px,1fr); }
    .material-inspector[b-j9htg96klj] { display:none; }
}
@media (max-width: 900px) {
    .material-hero[b-j9htg96klj] { align-items:flex-start; }.material-command[b-j9htg96klj] { flex-wrap:wrap; }.search-box[b-j9htg96klj] { width:100%; }.command-spacer[b-j9htg96klj] { display:none; }
    .material-summary[b-j9htg96klj] { grid-template-columns:repeat(2,1fr); }.material-summary > div:nth-child(2)[b-j9htg96klj] { border-right:0; }.material-summary > div:nth-child(-n+2)[b-j9htg96klj] { border-bottom:1px solid var(--material-line); }
    .material-workspace[b-j9htg96klj] { display:block; }.category-rail[b-j9htg96klj] { border-right:0; border-bottom:1px solid var(--material-line); }.category-tree[b-j9htg96klj] { max-height:180px; }
}
@media (max-width: 600px) {
    .material-hero[b-j9htg96klj] { display:block; }.hero-actions[b-j9htg96klj] { margin-top:15px; }.material-command .form-select[b-j9htg96klj] { width:calc(50% - 4px); }.material-summary[b-j9htg96klj] { grid-template-columns:1fr 1fr; }
    .material-editor[b-j9htg96klj] { width:100vw; max-height:100vh; border-radius:0; }.material-backdrop[b-j9htg96klj] { padding:0; }/* DOM 里用的是 bom-form-head / bom-form-body / bom-modal-foot（全站样式），
   原来这行写的 .editor-* 三个类一个都不存在，是死代码。改成 ::deep 打到真实类上。 */
.material-editor[b-j9htg96klj]  .bom-form-head,
.material-editor[b-j9htg96klj]  .bom-form-body,
.material-editor[b-j9htg96klj]  .bom-modal-foot { padding-left:15px; padding-right:15px; }
}

/* 采购 / 报价记录（FB-01）：右侧资料面板底部，紧凑但可读。
   数字列一律 tabular-nums，否则单价上下对不齐，比价时特别难看。 */
.price-trace[b-j9htg96klj] { margin-top:14px; border-top:1px solid var(--material-line); padding-top:12px; }
.pt-head[b-j9htg96klj] { display:flex; align-items:baseline; justify-content:space-between; gap:10px; margin-bottom:8px; }
.pt-head > span[b-j9htg96klj] { font-size:12px; font-weight:650; color:#334155; display:flex; align-items:center; gap:5px; }
.pt-head > span i[b-j9htg96klj] { color:#7c8ea3; }
.pt-head strong[b-j9htg96klj] { font-size:12px; font-weight:650; color:#0f766e; white-space:nowrap; font-variant-numeric:tabular-nums; }
.pt-state[b-j9htg96klj] { padding:14px 4px; font-size:12px; color:#94a3b8; display:flex; align-items:center; gap:7px; }
.pt-table[b-j9htg96klj] { width:100%; border-collapse:collapse; font-size:11.5px; }
.pt-table th[b-j9htg96klj] { padding:5px 6px; text-align:left; font-weight:600; color:#8494a6; border-bottom:1px solid #e6ecf2; white-space:nowrap; }
.pt-table td[b-j9htg96klj] { padding:6px; border-bottom:1px solid #f1f5f9; color:#334155; vertical-align:top; }
.pt-table tbody tr:last-child td[b-j9htg96klj] { border-bottom:0; }
.pt-table .num[b-j9htg96klj] { text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.pt-sub[b-j9htg96klj] { color:#9aa6b4; font-size:10.5px; margin-top:1px; }
.pt-flag[b-j9htg96klj] { display:inline-block; margin-left:4px; padding:0 5px; border-radius:8px; font-size:10px;
    color:#0f766e; background:#d8efec; vertical-align:1px; }
.pt-more[b-j9htg96klj] { margin-top:7px; font-size:10.5px; color:#9aa6b4; }

/* ===== 2026-09-03 客户要求：序号列 / 列头筛选 / 复制新增 / 表格网格线 ===== */

/* 序号列。窄、右对齐、等宽数字——三位数和一位数上下要对齐，不然翻页时看着跳。 */
.seq-col[b-j9htg96klj] { width: 52px; text-align: center; color: #94a3b8; font-variant-numeric: tabular-nums; white-space: nowrap; }
.material-table td.seq-col[b-j9htg96klj] { font-size: 11.5px; }
.material-table tbody tr.selected td.seq-col[b-j9htg96klj] { color: #2f6fed; font-weight: 700; }

/* 数字列统一右对齐 + 等宽字形 */
.num-col[b-j9htg96klj] { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* 表头里塞了漏斗按钮，得让文字和按钮在一条基线上，且不因为按钮而换行 */
.material-table th[b-j9htg96klj] { white-space: nowrap; }
.material-table th.sortable[b-j9htg96klj] { position: relative; }

/* 网格线（客户：「都要有框显示，像表格一样，不要白白的那种感觉」）。
   原来只有横线，一眼望过去是一片白底浮着几行字；补上竖线之后每个字段各占一格，
   对图号、对规格时手指不会串行。列与列之间用比横线更浅的颜色，
   否则密密麻麻的网格会把内容压下去。 */
.material-table th[b-j9htg96klj] { border-right: 1px solid #e3e8ee; }
.material-table td[b-j9htg96klj] { border-right: 1px solid #eef1f5; }
.material-table th:last-child[b-j9htg96klj], .material-table td:last-child[b-j9htg96klj] { border-right: 0; }
/* 隔行浅底：行一多，纯白底数到第七行就串行了 */
.material-table tbody tr:nth-child(even) > td[b-j9htg96klj] { background: #fcfdfe; }
.material-table tbody tr:hover > td[b-j9htg96klj] { background: #f8fbff; }
.material-table tbody tr.selected > td[b-j9htg96klj] { background: #edf5ff; }

/* 当前生效的列筛选，摆在表格上方 */
.filter-chips[b-j9htg96klj] { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding: 8px 16px; background: #f8fbff; border-bottom: 1px solid var(--material-line); }
.fc-label[b-j9htg96klj] { display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 700; color: #2f6fed; }
.fc-chip[b-j9htg96klj] { display: inline-flex; align-items: center; gap: 4px; max-width: 260px; padding: 3px 6px 3px 9px; border: 1px solid #cfe0fb; border-radius: 999px; background: #fff; font-size: 11.5px; color: #475569; }
.fc-chip b[b-j9htg96klj] { font-weight: 650; color: #172033; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fc-chip button[b-j9htg96klj] { display: inline-grid; place-items: center; width: 16px; height: 16px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: #94a3b8; font-size: 10px; }
.fc-chip button:hover[b-j9htg96klj] { background: #e6effc; color: #b42318; }
.fc-clear[b-j9htg96klj] { margin-left: auto; padding: 0 4px; border: 0; background: transparent; color: #64748b; font-size: 11.5px; text-decoration: underline; }
.fc-clear:hover[b-j9htg96klj] { color: #b42318; }

/* 复制新增的提醒条 */
.copy-hint[b-j9htg96klj] { display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px; margin-bottom: 10px; border: 1px solid #fed7aa; border-radius: 8px; background: #fff7ed; color: #9a3412; font-size: 12px; line-height: 1.6; }
.copy-hint > i[b-j9htg96klj] { font-size: 15px; margin-top: 1px; flex: none; }
.copy-hint b[b-j9htg96klj] { display: block; font-weight: 700; }
.copy-hint span[b-j9htg96klj] { display: block; margin-top: 2px; color: #b45309; font-size: 11.5px; }

/* 「★ 识别键」小标：贴在图号这类第二主键字段的标签后面 */
.key-badge[b-j9htg96klj] { display: inline-block; margin-left: 5px; padding: 1px 6px; border: 1px solid #bfd2ec; border-radius: 999px; background: #eef4ff; color: #1d4ed8; font-size: 10px; font-weight: 700; vertical-align: 1px; }

/* 右侧资料面板的采购/报价小表也补上竖线，与主表一致 */
.pt-table th[b-j9htg96klj], .pt-table td[b-j9htg96klj] { border-right: 1px solid #f1f5f9; }
.pt-table th:last-child[b-j9htg96klj], .pt-table td:last-child[b-j9htg96klj] { border-right: 0; }

/* 工具条按钮不许换行。加了「字段设置」之后一行挤不下，Bootstrap 默认会把
   「筛选」「导出」这类两字按钮拆成上下两行（「筛 / 选」），很难看也点不准。
   改成：按钮一律 nowrap，让搜索框去承担压缩。 */
.material-command .btn[b-j9htg96klj] { white-space: nowrap; flex: none; }
.material-command .search-box[b-j9htg96klj] { flex: 1 1 260px; width: auto; min-width: 180px; max-width: 390px; }
.material-command .form-select[b-j9htg96klj] { flex: none; }
/* 窄屏本来就是 flex-wrap:wrap（见下方 900px 断点），整块换行没问题，
   要防的只是按钮内部的文字被拆开。 */

/* ===== 按钮配色与全站统一（2026-09-04）=====
   本页的工具条用的是私有的 .material-command，吃不到 bom.css 里那条
   「描边按钮收成中性」的规则，于是导出还是绿框、导入还是蓝框，
   和刚统一过的其它页面对不上。这里补齐同一套口径：
   描边按钮一律中性，实心只留「新增物料」一个。 */
.material-command .btn-outline-primary[b-j9htg96klj],
.material-command .btn-outline-success[b-j9htg96klj],
.material-command .btn-outline-dark[b-j9htg96klj],
.material-command .btn-outline-warning[b-j9htg96klj],
.material-command .btn-outline-secondary[b-j9htg96klj],
.hero-actions .btn-outline-secondary[b-j9htg96klj] {
    color: #475569;
    background: #fff;
    border-color: #dbe2ea;
}
.material-command .btn-outline-primary:hover[b-j9htg96klj],
.material-command .btn-outline-success:hover[b-j9htg96klj],
.material-command .btn-outline-dark:hover[b-j9htg96klj],
.material-command .btn-outline-warning:hover[b-j9htg96klj],
.material-command .btn-outline-secondary:hover[b-j9htg96klj],
.hero-actions .btn-outline-secondary:hover[b-j9htg96klj] {
    color: var(--material-blue);
    background: #f4f8ff;
    border-color: #b9cdf3;
}
.material-command .btn[b-j9htg96klj] { padding: .34rem .68rem; font-size: .855rem; white-space: nowrap; }

/* ===== 库存显示（2026-09-04 客户：「物料资料页能不能看到各个物料的库存信息」）===== */

/* 列表里低于安全库存的那一格：红字 + 小三角。
   只标数字不标行——整行标红会把「这条物料本身有问题」的意思带偏，
   实际只是需要补货。 */
.material-table td.stock-low[b-j9htg96klj] { color: #b42318; font-weight: 700; }
.material-table td.stock-low i[b-j9htg96klj] { font-size: 10px; vertical-align: 1px; }

/* 右侧资料面板的库存分布 */
.stock-panel[b-j9htg96klj] { margin-top: 14px; border-top: 1px solid var(--material-line); padding-top: 12px; }
.sp-head[b-j9htg96klj] { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 8px; }
.sp-head > span[b-j9htg96klj] { font-size: 12px; font-weight: 650; color: #334155; display: flex; align-items: center; gap: 5px; }
.sp-head > span i[b-j9htg96klj] { color: #7c8ea3; }
.sp-head strong[b-j9htg96klj] { font-size: 13px; font-weight: 700; color: #0f766e; white-space: nowrap; font-variant-numeric: tabular-nums; }
.sp-head strong.stock-low[b-j9htg96klj] { color: #b42318; }
.sp-state[b-j9htg96klj] { padding: 14px 4px; font-size: 12px; color: #94a3b8; display: flex; align-items: center; gap: 7px; }

.sp-table[b-j9htg96klj] { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.sp-table th[b-j9htg96klj] { padding: 5px 6px; text-align: left; font-weight: 600; color: #8494a6; border-bottom: 1px solid #e6ecf2; white-space: nowrap; }
.sp-table td[b-j9htg96klj] { padding: 6px; border-bottom: 1px solid #f1f5f9; color: #334155; vertical-align: top; }
.sp-table tbody tr:last-child td[b-j9htg96klj] { border-bottom: 0; }
.sp-table .num[b-j9htg96klj] { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.sp-sub[b-j9htg96klj] { color: #9aa6b4; font-size: 10.5px; margin-top: 1px; }
/* 可用 < 现有 说明有占用，标出来免得用户以为系统算错了 */
.sp-reserved[b-j9htg96klj] { color: #a16207; }

.sp-safety[b-j9htg96klj] { margin-top: 8px; padding: 6px 8px; border-radius: 6px; font-size: 11px;
    color: #0f766e; background: #f0fdfa; border: 1px solid #ccfbf1; }
.sp-safety.bad[b-j9htg96klj] { color: #9a3412; background: #fff7ed; border-color: #fed7aa; }
.sp-more[b-j9htg96klj] { display: inline-block; margin-top: 8px; font-size: 11.5px; color: var(--material-blue); text-decoration: none; }
.sp-more:hover[b-j9htg96klj] { text-decoration: underline; }
/* /Pages/Projects/ProjectEdit.razor.rz.scp.css */
/* 项目编辑表单美化（2026-08-28 用户要求：页面宽一点、字段标签深色粗体、整体好看点）。
   CSS 隔离只作用于本 .razor 标记里的元素——本页没有 RenderTreeBuilder 手工节点，可放心用元素选择器。 */
.pe-card[b-mhownmvnx0] { max-width:1200px; padding:24px 28px; }

/* 分节标题：左侧色条 + 收紧字距，盖过内联的 border-bottom 工具类 */
h6[b-mhownmvnx0] {
    font-size:14.5px; color:#1e293b; letter-spacing:.4px;
    border-left:3px solid #4f6ef2; padding-left:9px;
    border-bottom:1px solid #e2e8f0 !important;
}

/* 字段标签：深色粗体（默认灰细体在密表单里辨识度差） */
.form-label[b-mhownmvnx0] { font-weight:600; color:#0f172a; font-size:13px; margin-bottom:5px; }

.form-text[b-mhownmvnx0] { color:#94a3b8; font-size:11.5px; }

/* 控件观感统一：圆角稍大、聚焦描边用主题色 */
.form-control[b-mhownmvnx0], .form-select[b-mhownmvnx0] { border-radius:8px; }
.form-control:focus[b-mhownmvnx0], .form-select:focus[b-mhownmvnx0] {
    border-color:#4f6ef2; box-shadow:0 0 0 .15rem rgba(79,110,242,.15);
}

/* 安规多选（第十四阶段 DEC-1403）：一组可点的标签，比多选下拉直观得多 */
.compliance-picker[b-mhownmvnx0] { display:flex; flex-wrap:wrap; gap:6px; padding-top:3px; }
.cp-chip[b-mhownmvnx0] {
    border:1px solid #cbd5e1; background:#fff; color:#475569;
    border-radius:999px; padding:3px 12px; font-size:12.5px; line-height:1.5;
    cursor:pointer; transition:all .12s;
}
.cp-chip:hover[b-mhownmvnx0] { border-color:#94a3b8; background:#f8fafc; }
.cp-chip.on[b-mhownmvnx0] { border-color:#4f6ef2; background:#eef2ff; color:#3548c9; font-weight:600; }
.cp-chip i[b-mhownmvnx0] { font-size:11px; margin-right:2px; }
/* /Pages/Projects/ProjectList.razor.rz.scp.css */
/* 项目列表工作区：左年份档案 + 右列表（第十二阶段 DEC-1201）。
   注意：CSS 隔离只对本 .razor 标记里的元素生效；这里所有节点都写在标记里，没有 RenderTreeBuilder 手工建的元素。 */
.project-workspace[b-7d5df1w47d] { display:grid; grid-template-columns:190px minmax(0, 1fr); gap:12px; align-items:start; }

.year-rail[b-7d5df1w47d] {
    background:#f8fafc; border:1px solid var(--bom-border, #e2e8f0); border-radius:10px;
    padding:10px 8px; position:sticky; top:8px;
}
.yr-head[b-7d5df1w47d] {
    font-size:12px; font-weight:700; color:#64748b; letter-spacing:.5px;
    padding:2px 8px 8px; display:flex; align-items:center; gap:6px;
}
.yr-item[b-7d5df1w47d] {
    display:flex; align-items:center; gap:8px; width:100%;
    border:0; background:transparent; text-align:left;
    padding:7px 10px; border-radius:8px; font-size:13px; color:#334155;
    cursor:pointer; transition:background .12s;
}
.yr-item + .yr-item[b-7d5df1w47d] { margin-top:2px; }
.yr-item:hover[b-7d5df1w47d] { background:#eef2f7; }
.yr-item.active[b-7d5df1w47d] { background:#4f6ef2; color:#fff; font-weight:600; }
.yr-item.active .yr-count[b-7d5df1w47d] { background:rgba(255,255,255,.25); color:#fff; }
.yr-item i[b-7d5df1w47d] { flex:0 0 auto; opacity:.75; }
.yr-label[b-7d5df1w47d] { flex:1 1 auto; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.yr-count[b-7d5df1w47d] {
    flex:0 0 auto; min-width:26px; text-align:center;
    background:#e2e8f0; color:#475569; border-radius:999px;
    font-size:11px; font-weight:600; padding:1px 7px;
}
.yr-empty[b-7d5df1w47d] { padding:8px 10px; color:#94a3b8; font-size:12px; }

.project-list[b-7d5df1w47d] { min-width:0; }

/* 「资料」列的报价/合同标记：亮 = 已上传，灰 = 未上传 */
.doc-flag[b-7d5df1w47d] { font-size:15px; color:#cbd5e1; margin-right:8px; }
.doc-flag.on[b-7d5df1w47d] { color:#16a34a; }

/* 窄屏：档案条横排在列表上方，别把表格挤成一条缝 */
@media (max-width: 900px) {
    .project-workspace[b-7d5df1w47d] { display:block; }
    .year-rail[b-7d5df1w47d] { position:static; display:flex; flex-wrap:wrap; gap:4px; margin-bottom:10px; }
    .yr-head[b-7d5df1w47d] { flex:0 0 100%; padding-bottom:4px; }
    .yr-item[b-7d5df1w47d] { width:auto; }
    .yr-item + .yr-item[b-7d5df1w47d] { margin-top:0; }
}
/* /Pages/PurchaseStats.razor.rz.scp.css */
/* 左侧分类树已换成全站共享的 CategoryTree 组件（ct-* 全局样式在 bom.css），本页不再自带树样式 */
/* /Pages/Purchasing/RfqEdit.razor.rz.scp.css */
/* 询价单比价区（第十四阶段 DEC-1401）。
   一行展开就是一张比价表：几家的价、交期、起订量并排看，最低价高亮。 */
.rfq-grid[b-fij1tkm6tv] { font-size: 12.5px; }
.rfq-grid thead th[b-fij1tkm6tv] { white-space: nowrap; font-size: 11.5px; color: #64748b; font-weight: 650; }
.rfq-grid tr.row-open > td[b-fij1tkm6tv] { background: #f5f8ff; }

.quote-panel > td[b-fij1tkm6tv] { background: #f8fafc; padding: 10px 14px !important; border-top: 0; }
.qp-head[b-fij1tkm6tv] { font-size: 12.5px; font-weight: 650; color: #1d4ed8; margin-bottom: 8px; }

.quote-table[b-fij1tkm6tv] { background: #fff; font-size: 12.5px; }
.quote-table thead th[b-fij1tkm6tv] { font-size: 11.5px; color: #64748b; white-space: nowrap; }
.quote-table .form-control-sm[b-fij1tkm6tv], .quote-table .form-select-sm[b-fij1tkm6tv] { font-size: 12px; padding: 2px 6px; }

/* 最低价高亮：给依据，但不替人做决定——交期、起订量、资质都可能更重要 */
.quote-table tr.lowest > td[b-fij1tkm6tv] { background: #fffbeb; }
.quote-table tr.lowest > td:first-child[b-fij1tkm6tv] { box-shadow: inset 3px 0 #f59e0b; }
/* /Pages/SalesContracts.razor.rz.scp.css */

/* 合同附件区（OPEN-1103）：合同自己挂附件，不再借项目附件 */
.contract-files[b-53dkq0spl8] { border-top: 1px dashed #cbd5e1; margin-top: 10px; padding-top: 10px; }
.cf-head[b-53dkq0spl8] { font-size: 12.5px; font-weight: 650; color: #334155; margin-bottom: 8px; }
.cf-head .text-muted[b-53dkq0spl8] { font-weight: 400; font-size: 11.5px; }
.cf-list[b-53dkq0spl8] { list-style: none; padding: 0; margin: 0; font-size: 12.5px; }
.cf-list li[b-53dkq0spl8] { padding: 3px 0; border-bottom: 1px solid #f1f5f9; }
.cf-list li:last-child[b-53dkq0spl8] { border-bottom: 0; }
/* /Pages/SalesStats.razor.rz.scp.css */
/* 左侧分类树已换成全站共享的 CategoryTree 组件（ct-* 全局样式在 bom.css），本页不再自带树样式 */
/* /Pages/SystemMap.razor.rz.scp.css */
/* 系统导航页（/system-map）。
   2026-08-21 客户要求：普通笔记本一屏看全五个阶段，所以整页按「压扁」做，不追求大图标。
   2026-09-04 改版：加全局站号 01–19、把箭头字符换成会伸缩的轨道线段、右侧常驻讲解板、页内导览。

   配色纪律（bom.css 末尾 2026-09-04「界面收敛」）：
   颜色留给需要判断的信息，不给常驻装饰。所以——
   · 21 块彩色图标浅底 → 全部改中性，颜色还给轨道线与当前站；
   · 五个阶段色**保留**：它们是三米外唯一能看出「分五段」的东西，是分组标识不是装饰；
   · 新增的提示配色一律从收敛后的 badge 表取值，不引入第二套色。 */

.navmap-hero[b-yp5om25oab] {
    display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;
    margin-bottom: 10px;
}
.navmap-hero h1[b-yp5om25oab] {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    font-size: 19px; font-weight: 800; color: #0f172a; margin: 0; letter-spacing: -.01em;
}
.navmap-hero h1 i[b-yp5om25oab] { color: var(--bom-primary); }
.navmap-hero h1 p[b-yp5om25oab] { font-size: 12.5px; font-weight: 400; color: #64748b; margin: 0; }
.navmap-hero-acts[b-yp5om25oab] { display: flex; gap: 8px; flex: none; }

/* 本页不在 .bom-toolbar 下，吃不到收敛后的中性描边规则，自己复制一份
   （先例：Products.razor.css 给 .material-command 复制过同一套）。 */
.navmap-hero-acts .btn-outline-secondary[b-yp5om25oab],
.np-acts .btn-outline-secondary[b-yp5om25oab] {
    color: #475569; background: #fff; border-color: #dbe2ea;
}
.navmap-hero-acts .btn-outline-secondary:hover[b-yp5om25oab],
.np-acts .btn-outline-secondary:hover[b-yp5om25oab] {
    color: var(--bom-primary); background: #f4f8ff;
    border-color: color-mix(in srgb, var(--bom-primary) 42%, #dbe2ea);
}
.navmap-hero-acts .btn[b-yp5om25oab] { padding: .3rem .7rem; font-size: .84rem; white-space: nowrap; }

/* ---- 两栏：左图右板 ---- */
/* 五阶段主色定义在 wrap 上：右侧讲解板要靠 --c1~--c5 给自己上色，而它在 .navmap 之外。 */
.navmap-wrap[b-yp5om25oab] {
    --c1: #2563eb; --c2: #d97706; --c3: #16a34a; --c4: #7c3aed; --c5: #0f766e;
    display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 14px;
    max-width: 1440px;
    outline: none;   /* 挂了 tabindex 接 Esc，别画焦点框 */
}
/* 不写 align-items:start —— grid 项被压成内容高度后 sticky 就没有可移动空间，
   讲解板会跟着滚走。aside 保持默认 stretch，sticky 加在它的子元素上。 */
.navmap-aside[b-yp5om25oab] { min-width: 0; }
.navmap[b-yp5om25oab] { display: flex; flex-direction: column; gap: 6px; min-width: 0; }

/* ---- 阶段卡：p1~p5 五处枚举压成一个 --pc ---- */
.navmap-phase.p1[b-yp5om25oab] { --pc: var(--c1); }
.navmap-phase.p2[b-yp5om25oab] { --pc: var(--c2); }
.navmap-phase.p3[b-yp5om25oab] { --pc: var(--c3); }
.navmap-phase.p4[b-yp5om25oab] { --pc: var(--c4); }
.navmap-phase.p5[b-yp5om25oab] { --pc: var(--c5); }

.navmap-phase[b-yp5om25oab] {
    background: #fff; border: 1px solid #e2e8f0; border-radius: 10px;
    border-left: 4px solid var(--pc);
    padding: 8px 12px 9px;
    box-shadow: 0 1px 2px rgba(15, 23, 42, .05);   /* 收敛后的唯一卡片阴影口径 */
}
.navmap-phase-head[b-yp5om25oab] { display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
.navmap-phase-no[b-yp5om25oab] {
    flex: none; align-self: center; width: 24px; height: 24px; border-radius: 7px;
    display: grid; place-items: center;
    font-size: 13px; font-weight: 800; color: #fff; background: var(--pc);
}
.navmap-phase-head b[b-yp5om25oab] { font-size: 14px; color: #0f172a; }
/* 阶段头写出这一段的站号范围，把 ①~⑤ 和 01~19 挂上钩：「② 采购  05–08  …」 */
.navmap-range[b-yp5om25oab] {
    flex: none; font-size: 11px; font-weight: 700; color: #94a3b8;
    font-variant-numeric: tabular-nums; letter-spacing: .02em;
}
.navmap-phase-head small[b-yp5om25oab] { color: #94a3b8; font-size: 12px; }

/* ---- 站点 ---- */
.navmap-lane[b-yp5om25oab] { display: flex; align-items: center; flex-wrap: wrap; gap: 14px 0; }

/* 一个「格」= 瓷片 + 悬在它右端的说明钮（button 不能嵌套 button，所以说明钮是兄弟节点） */
.navmap-cell[b-yp5om25oab] { position: relative; display: flex; flex: 0 1 auto; min-width: 132px; max-width: 176px; }

.navmap-tile[b-yp5om25oab] {
    position: relative; flex: 1 1 auto; min-width: 0;
    display: flex; align-items: center; gap: 7px;
    padding: 6px 26px 6px 8px;                      /* 右侧 26px 让给说明钮 */
    background: #fff; border: 1px solid #e2e8f0; border-radius: 9px;
    text-align: left; cursor: pointer;
    transition: border-color .15s, box-shadow .15s, transform .12s, color .15s;
}
.navmap-tile:hover[b-yp5om25oab] {
    color: var(--pc); border-color: currentColor;
    box-shadow: 0 6px 18px rgba(15, 23, 42, .07);   /* 收敛后的 hover 口径 */
    transform: translateY(-1px);
}
.navmap-tile:focus-visible[b-yp5om25oab] { outline: 2px solid var(--bom-primary); outline-offset: 2px; }

.navmap-ico[b-yp5om25oab] {
    flex: none; width: 26px; height: 26px; display: grid; place-items: center;
    border-radius: 7px; font-size: 14px;
    background: #f1f5f9; color: #64748b;            /* 21 块彩色浅底改中性——本次减法的主体 */
    transition: background .15s, color .15s;
}
.navmap-tile:hover .navmap-ico[b-yp5om25oab] { background: color-mix(in srgb, var(--pc) 12%, #fff); color: var(--pc); }

.navmap-tile b[b-yp5om25oab] {
    flex: 1 1 auto; min-width: 0;
    font-size: 13px; font-weight: 650; color: #0f172a;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* 副标（Node.Sub）不再渲染在瓷片上——搬进讲解板。这是「压成一行」的来源。 */

/* 全局站号徽章：序号是「顺序」这个事实，不是需要判断的状态，所以平时中性灰、不吃颜色预算 */
.navmap-no[b-yp5om25oab] {
    position: absolute; left: -6px; top: -7px; z-index: 1;
    min-width: 20px; height: 17px; padding: 0 4px;
    display: grid; place-items: center;
    font-size: 10.5px; font-weight: 800; letter-spacing: .02em;
    font-variant-numeric: tabular-nums;             /* 补零两位 + 等宽，宽度不跳 */
    color: #94a3b8; background: #fff; border: 1px solid #e2e8f0; border-radius: 5px;
}
/* 可选支线不占主线号。色值取收敛表 bg-warning 那一对 */
.navmap-no.opt[b-yp5om25oab] { min-width: 0; color: #a16207; background: #fdf3e2; border-color: #f6e3bd; letter-spacing: 0; }

/* ---- 轨道线：箭头字符换成会伸缩的线段（「好看」的主要来源）---- */
.navmap-link[b-yp5om25oab] {
    position: relative; flex: 1 1 18px; min-width: 14px; max-width: 44px;
    height: 2px; margin: 0 3px; border-radius: 2px;
    background: color-mix(in srgb, var(--pc) 26%, #e2e8f0);
}
.navmap-link[b-yp5om25oab]::after {                               /* 线尾三角，指明方向 */
    content: ""; position: absolute; right: -1px; top: -3px;
    border: 4px solid transparent;
    border-left: 5px solid color-mix(in srgb, var(--pc) 38%, #cbd5e1);
}

/* ---- 二选一分叉（购入件 / 加工件，共用站号 06）---- */
.navmap-fork[b-yp5om25oab] {
    position: relative; flex: 0 1 auto;
    display: flex; flex-direction: column; gap: 6px;
    padding: 10px 6px 5px;
    border: 1px dashed #d7dee8; border-radius: 9px; background: #fbfcfe;
}
.navmap-fork-cap[b-yp5om25oab] {
    position: absolute; top: -7px; left: 10px; padding: 0 5px; background: #fff;
    font-size: 10px; font-weight: 700; color: #5a6b7f;
}
.navmap-fork-line[b-yp5om25oab] { display: flex; align-items: center; gap: 6px; }
.navmap-tag[b-yp5om25oab] {
    flex: none; font-size: 11px; font-weight: 700; color: #5a6b7f;
    background: #eef1f5; border-radius: 5px; padding: 2px 7px; white-space: nowrap;
}

/* ---- 可选支线（退料）---- */
.navmap-sidearrow[b-yp5om25oab] { color: #cbd5e1; font-size: 14px; flex: none; margin: 0 6px 0 12px; }
.navmap-side .navmap-tile[b-yp5om25oab] { border-style: dashed; }
.navmap-next[b-yp5om25oab] { display: none; }                     /* 阶段间下箭头不占位（沿用） */

/* ---- 说明钮：替掉原来的 .navmap-go 右尖角 ---- */
.navmap-info[b-yp5om25oab] {
    position: absolute; right: 4px; top: 50%; transform: translateY(-50%); z-index: 2;
    width: 20px; height: 20px; padding: 0; border: 0; border-radius: 5px;
    background: transparent; color: #cbd5e1; font-size: 12px; line-height: 1;
    display: grid; place-items: center; cursor: pointer;
    opacity: 0; transition: opacity .15s, color .15s, background .15s;
}
.navmap-cell:hover .navmap-info[b-yp5om25oab],
.navmap-cell:focus-within .navmap-info[b-yp5om25oab] { opacity: 1; }
.navmap-info:hover[b-yp5om25oab] { color: var(--pc); background: #f1f5f9; }
.navmap-info:focus-visible[b-yp5om25oab] { opacity: 1; outline: 2px solid var(--bom-primary); outline-offset: 1px; }
@media (hover: none) { .navmap-info[b-yp5om25oab] { opacity: .55; } }   /* 触屏没有 hover */

/* ---- 四种状态 ---- */
/* locked 必须逐子元素调色，不能用整块 opacity/grayscale——父元素 opacity 会把序号徽章
   一起吃掉，而序号正是本次改版的主产出。行为与 title 文案一个字不动。 */
.navmap-tile.locked[b-yp5om25oab] { cursor: not-allowed; background: #fafbfc; border-color: #eef1f5; }
.navmap-tile.locked b[b-yp5om25oab] { color: #94a3b8; }
.navmap-tile.locked .navmap-ico[b-yp5om25oab] { background: #f1f5f9; color: #cbd5e1; }
.navmap-tile.locked .navmap-lock[b-yp5om25oab] { display: inline-block; }
.navmap-tile.locked:hover[b-yp5om25oab] { border-color: #eef1f5; box-shadow: none; transform: none; color: inherit; }
.navmap-tile.locked:hover .navmap-ico[b-yp5om25oab] { background: #f1f5f9; color: #cbd5e1; }
.navmap-lock[b-yp5om25oab] { display: none; flex: none; font-size: 10.5px; color: #cbd5e1; }

.navmap-cell.is-current .navmap-tile[b-yp5om25oab] {
    border-color: var(--pc);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--pc) 14%, transparent);
}
.navmap-cell.is-current .navmap-no[b-yp5om25oab] { color: #fff; background: var(--pc); border-color: var(--pc); }
.navmap-cell.is-current .navmap-ico[b-yp5om25oab] { background: color-mix(in srgb, var(--pc) 12%, #fff); color: var(--pc); }

/* ---- 讲解板 ---- */
.navmap-panel[b-yp5om25oab] {
    position: sticky; top: 8px;
    background: #fff; border: 1px solid #e2e8f0; border-radius: 12px;
    padding: 14px; box-shadow: 0 1px 2px rgba(15, 23, 42, .05);
}
.np-kicker[b-yp5om25oab] {
    font-size: 11px; font-weight: 800; letter-spacing: .06em;
    color: var(--pc, #64748b); font-variant-numeric: tabular-nums;
}
.np-title[b-yp5om25oab] { font-size: 16px; font-weight: 750; color: #0f172a; margin: 2px 0 4px; letter-spacing: -.01em; }

.np-node[b-yp5om25oab] { padding-top: 10px; margin-top: 10px; border-top: 1px dashed #eef1f5; }
.np-node:first-of-type[b-yp5om25oab] { border-top: 0; margin-top: 4px; padding-top: 0; }
.np-node-h[b-yp5om25oab] { display: flex; align-items: center; gap: 6px; margin-bottom: 2px; }
.np-node-h b[b-yp5om25oab] { font-size: 13.5px; font-weight: 700; color: #0f172a; }

.np-dl[b-yp5om25oab] { margin: 0; }
.np-dl dt[b-yp5om25oab] { font-size: 11.5px; font-weight: 700; color: #94a3b8; margin-top: 8px; }
.np-dl dd[b-yp5om25oab] { font-size: 13px; color: #334155; line-height: 1.55; margin: 2px 0 0; }

.np-warn[b-yp5om25oab] {
    margin-top: 10px; padding: 8px 10px; border-radius: 8px; font-size: 12px; line-height: 1.5;
    background: #fdf3e2; border: 1px solid #f6e3bd; color: #a16207;   /* = 收敛表 bg-warning */
}
.np-hint[b-yp5om25oab] {
    margin-top: 10px; padding: 8px 10px; border-radius: 8px; font-size: 12px; line-height: 1.5;
    background: #f8fafc; border: 1px solid #eef1f5; color: #475569;
}

/* 上一步 / 下一步：这一行就是「导航感」的核心 */
.np-flow[b-yp5om25oab] {
    margin-top: 12px; padding-top: 10px; border-top: 1px solid #eef1f5;
    font-size: 12px; color: #94a3b8; display: flex; flex-wrap: wrap; gap: 4px 10px;
}
.np-flow button[b-yp5om25oab] {
    border: 0; background: transparent; padding: 0; cursor: pointer;
    font-size: 12px; color: #475569; font-weight: 600;
}
.np-flow button:hover[b-yp5om25oab] { color: var(--bom-primary); text-decoration: underline; }

.np-acts[b-yp5om25oab] { display: flex; align-items: center; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
.np-acts .btn[b-yp5om25oab] { padding: .3rem .62rem; font-size: .83rem; white-space: nowrap; }
/* 浅底蓝：与 bom.css 里「查询」按钮同一档 */
.np-acts .btn-open[b-yp5om25oab] { color: var(--bom-primary); background: #e8f0fe; border: 1px solid #cddffb; }
.np-acts .btn-open:hover:not(:disabled)[b-yp5om25oab] { color: #fff; background: var(--bom-primary); border-color: var(--bom-primary); }
.np-acts .btn-open:disabled[b-yp5om25oab] { color: #94a3b8; background: #f1f5f9; border-color: #e2e8f0; cursor: not-allowed; }

/* 未选中时的图例，别留一大片白 */
.np-legend[b-yp5om25oab] { font-size: 12.5px; color: #475569; line-height: 1.9; }
.np-legend .lg[b-yp5om25oab] {
    display: inline-grid; place-items: center; min-width: 20px; height: 17px; padding: 0 4px;
    border-radius: 5px; border: 1px solid #e2e8f0; background: #fff;
    color: #94a3b8; font-size: 10.5px; font-weight: 800; margin-right: 6px; vertical-align: -2px;
    font-variant-numeric: tabular-nums;
}
.np-legend .lg.opt[b-yp5om25oab] { color: #a16207; background: #fdf3e2; border-color: #f6e3bd; }

/* 导览态时面板顶部长出进度条 */
.np-guide[b-yp5om25oab] {
    margin: -14px -14px 12px; padding: 10px 14px;
    background: #f8fafc; border-bottom: 1px solid #eef1f5; border-radius: 12px 12px 0 0;
}
.np-prog[b-yp5om25oab] { display: flex; gap: 2px; height: 5px; margin-bottom: 8px; }
.np-prog i[b-yp5om25oab] { flex: 1 1 0; border-radius: 2px; background: #e2e8f0; }
.np-prog i.on[b-yp5om25oab] { background: color-mix(in srgb, var(--pc) 42%, #e2e8f0); }
.np-prog i.cur[b-yp5om25oab] { background: var(--pc); }
.np-guide-txt[b-yp5om25oab] { font-size: 12px; color: #64748b; font-variant-numeric: tabular-nums; }

/* ---- 邀请条 / 导览横幅 ---- */
.navmap-invite[b-yp5om25oab], .navmap-guidebar[b-yp5om25oab] {
    display: flex; align-items: center; gap: 10px;
    padding: 8px 12px; margin-bottom: 8px; border-radius: 10px;
    background: var(--bom-primary-050); border: 1px solid var(--bom-primary-100);
}
.navmap-invite > i[b-yp5om25oab], .navmap-guidebar > i[b-yp5om25oab] { flex: none; color: var(--bom-primary); font-size: 16px; }
.navmap-invite b[b-yp5om25oab] { font-size: 13px; color: #0f172a; }
.navmap-invite span[b-yp5om25oab], .navmap-guidebar span[b-yp5om25oab] { font-size: 12.5px; color: #64748b; }
.navmap-invite .ni-x[b-yp5om25oab] {
    margin-left: auto; border: 0; background: transparent; color: #94a3b8;
    font-size: 12px; padding: 2px 6px; cursor: pointer;
}
.navmap-invite .ni-x:hover[b-yp5om25oab] { color: #475569; }

.navmap-foot[b-yp5om25oab] { margin-top: 10px; }

/* ---- 打印：客户演示会直接 Ctrl+P 贴墙 ---- */
@media print {
    .navmap-wrap[b-yp5om25oab] { grid-template-columns: minmax(0, 1fr); max-width: none; }
    .navmap-aside[b-yp5om25oab], .navmap-invite[b-yp5om25oab], .navmap-guidebar[b-yp5om25oab], .navmap-info[b-yp5om25oab] { display: none !important; }
    .navmap-phase[b-yp5om25oab] { box-shadow: none; break-inside: avoid; }
    .navmap-tile[b-yp5om25oab] { box-shadow: none !important; transform: none !important; }
    .navmap-no[b-yp5om25oab] { color: #334155 !important; }
}

/* ---- 窄屏：讲解板落到图下面，变普通块，不做抽屉 ---- */
@media (max-width: 1180px) {
    .navmap-wrap[b-yp5om25oab] { grid-template-columns: minmax(0, 1fr); }
    .navmap-panel[b-yp5om25oab] { position: static; }
}
@media (max-width: 760px) {
    .navmap-cell[b-yp5om25oab] { min-width: 120px; max-width: 156px; }
    .navmap-link[b-yp5om25oab] { max-width: 26px; }
    .navmap-hero[b-yp5om25oab] { flex-direction: column; }
    .navmap-hero h1[b-yp5om25oab] { font-size: 17px; }
    .navmap-hero h1 p[b-yp5om25oab] { display: none; }
    .navmap-phase-head small[b-yp5om25oab] { display: none; }
}
