/* 2026-11-02 P1 珍珠玻璃主题：禁 CDN（生产内网不可联网），移除 jsDelivr 字体 @import，
   字体一律走系统字体栈（--font-* 变量不变，缺字自动回落，内网观感与原一致）。
   如后续要本地化 Archivo/IBM Plex Mono，把 woff2 落盘 frontend/vendor/fonts/ 再补 @font-face（另行评估）。
   主题令牌换新见同目录 pearl.css（独立文件，link 移除即整批回退）。 */

/* ===== 全局重置 ===== */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
    /* ===== 蓝图工程风主题（2026-10-16 UI 重设计；仅视觉层变更，业务零影响） ===== */
    --primary: #0F5C8C;
    --primary-light: #2E7FB8;
    --primary-dark: #0A4570;
    --primary-bg: #E3EEF7;
    --accent: #DE7A33;
    --bg: #EDF1F6;
    --card-bg: #FFFFFF;
    --text: #0A2340;
    --text-light: #7A8FA6;
    --text-sub: #45607C;
    --border: #D2DDE9;
    --border-light: #E6EDF5;
    --surface-muted: #F6F9FC;
    --surface-sunken: #E6ECF3;
    --success: #16794F;
    --danger: #C0392B;
    --radius: 6px;
    --radius-sm: 4px;
    --shadow-sm: 0 1px 2px rgba(10,35,64,0.05);
    --shadow: 0 2px 6px rgba(10,35,64,0.07), 0 8px 22px rgba(10,35,64,0.06);
    --shadow-hover: 0 3px 8px rgba(10,35,64,0.09), 0 12px 30px rgba(10,35,64,0.10);
    --transition: 0.18s cubic-bezier(0.4, 0, 0.2, 1);
    /* 侧边栏深色（工程墨蓝） */
    --sidebar-bg: #0B2740;
    --sidebar-bg-2: #103553;
    --sidebar-hover: rgba(255,255,255,0.08);
    --sidebar-active: rgba(222,122,51,0.20);
    --sidebar-text: rgba(232,240,248,0.74);
    --sidebar-text-active: #FFE7D3;
    /* 字体栈（外部字体不可达时自动回落） */
    --font-body: 'Noto Sans SC', 'Microsoft YaHei', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
    --font-display: 'Archivo', 'Noto Sans SC', 'Microsoft YaHei', sans-serif;
    --font-mono: 'IBM Plex Mono', Consolas, Monaco, 'Courier New', 'Noto Sans SC', 'Microsoft YaHei', monospace;
    /* 工程网格纸纹理 */
    --grid-tex: linear-gradient(rgba(15,92,140,0.045) 1px, transparent 1px),
                linear-gradient(90deg, rgba(15,92,140,0.045) 1px, transparent 1px);
}

html { -webkit-text-size-adjust: 100%; }

body {
    font-family: var(--font-body);
    background-color: var(--bg);
    /* 2026-10-16 UI 重设计：工程网格纸底纹（极淡，仅氛围，不干扰阅读） */
    background-image: var(--grid-tex);
    background-size: 26px 26px;
    color: var(--text);
    line-height: 1.55;
    font-size: 14px;
    -webkit-font-smoothing: antialiased;
}

::selection { background: rgba(46,127,184,0.20); }

/* 滚动条 */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #B9C8D9; border-radius: 8px; border: 2px solid transparent; background-clip: content-box; }
::-webkit-scrollbar-thumb:hover { background-color: var(--text-light); }

/* ===== 整体布局 ===== */
.app-layout {
    display: flex;
    min-height: 100vh;
}

/* ===== 左侧侧边栏 ===== */
.sidebar {
    width: 220px;
    flex-shrink: 0;
    background: linear-gradient(180deg, var(--sidebar-bg) 0%, var(--sidebar-bg-2) 100%);
    color: #fff;
    display: flex;
    flex-direction: column;
    position: sticky;
    top: 0;
    height: 100vh;
    box-shadow: 2px 0 12px rgba(11,39,64,0.16);
    z-index: 50;
}
.sidebar-brand {
    padding: 20px 18px 16px;
    border-bottom: 1px solid rgba(255,255,255,0.08);
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.sidebar-brand .brand-cn {
    /* 2026-09-30 系统更名为「PCB 智能业务管理系统」，名称较长，字号/字距微调以完整显示 */
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 0.5px;
    line-height: 1.35;
    /* 2026-10-16 UI 重设计：品牌名渐变改为白→暖金，呼应橙色标注点缀 */
    background: linear-gradient(90deg, #FFFFFF, #FFD9B0);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}
.sidebar-brand .brand-en {
    font-size: 10px;
    opacity: 0.55;
    letter-spacing: 1.5px;
    text-transform: uppercase;
}
.sidebar-nav {
    flex: 1;
    padding: 12px 10px;
    display: flex;
    flex-direction: column;
    gap: 4px;
    overflow-y: auto;
}
.sidebar-nav::-webkit-scrollbar { width: 4px; }
.sidebar-nav::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); }

/* 侧边栏分组（2026-10-19 AI 模块并入：管理系统 / AI 两大分组） */
.nav-group {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.nav-group + .nav-group {
    margin-top: 16px;
}
.nav-group-title {
    padding: 8px 14px 4px;
    font-size: 11px;
    letter-spacing: 2px;
    color: var(--sidebar-text);
    opacity: 0.45;
    user-select: none;
}

/* 侧边栏菜单项（.tab-btn） */
.tab-btn {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    background: transparent;
    color: var(--sidebar-text);
    border: none;
    padding: 11px 14px;
    border-radius: var(--radius-sm);
    cursor: pointer;
    font-size: 14px;
    transition: all var(--transition);
    text-align: left;
    position: relative;
}
.tab-btn .nav-icon {
    width: 22px;
    height: 18px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.tab-btn .nav-icon svg {
    width: 18px;
    height: 18px;
    stroke: currentColor;
    fill: none;
    stroke-width: 1.5;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.tab-btn .nav-label { flex: 1; }
.tab-btn:hover {
    background: var(--sidebar-hover);
    color: #fff;
    transform: translateX(2px);
}
.tab-btn.active {
    background: var(--sidebar-active);
    color: var(--sidebar-text-active);
    font-weight: 600;
    /* 2026-10-16 UI 重设计：深底上改用橙色描边高亮（原蓝色投影在深蓝底不可见） */
    box-shadow: inset 0 0 0 1px rgba(222,122,51,0.38);
}
.tab-btn.active::before {
    content: '';
    position: absolute;
    left: -10px;
    top: 50%;
    transform: translateY(-50%);
    width: 4px;
    height: 22px;
    background: var(--accent);
    border-radius: 0 3px 3px 0;
}
.sidebar-footer {
    padding: 12px 18px;
    border-top: 1px solid rgba(255,255,255,0.08);
    text-align: center;
}
.sidebar-footer .footer-version {
    font-size: 11px;
    color: rgba(255,255,255,0.4);
    letter-spacing: 1px;
}
/* 2026-10-08 底部登录信息 + 退出按钮 */
.footer-user {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 10px;
    padding: 7px 10px;
    border-radius: 8px;
    background: rgba(255,255,255,0.06);
}
.footer-user-info { display: flex; flex-direction: column; align-items: flex-start; min-width: 0; }
.footer-user-name {
    font-size: 12.5px; color: #fff; font-weight: 600;
    max-width: 110px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.footer-user-role { font-size: 10.5px; color: rgba(255,255,255,0.5); margin-top: 1px; }
.footer-logout-btn {
    flex: none;
    border: 1px solid rgba(255,255,255,0.25);
    background: transparent;
    color: rgba(255,255,255,0.85);
    font-size: 12px;
    padding: 4px 12px;
    border-radius: 6px;
    cursor: pointer;
    transition: background .15s, border-color .15s;
}
.footer-logout-btn:hover { background: var(--danger); border-color: var(--danger); color: #fff; }
.footer-logout-btn:disabled { opacity: .5; cursor: default; }

/* ===== 右侧内容区 ===== */
.content-wrapper {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

/* ===== 简化顶栏 ===== */
.app-header {
    background: #fff;
    border-bottom: 1px solid var(--border);
    box-shadow: 0 1px 3px rgba(10,35,64,0.05);
    position: sticky;
    top: 0;
    z-index: 40;
}
.header-inner {
    padding: 12px 24px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 16px;
}
.company-name { display: flex; flex-direction: column; }
.company-name .cn {
    font-size: 16px;
    font-weight: 700;
    color: var(--primary-dark);
    letter-spacing: 0.5px;
}
.company-name .en {
    font-size: 10px;
    color: var(--text-light);
    letter-spacing: 1.2px;
    text-transform: uppercase;
}
.header-page-title {
    font-size: 18px;
    font-weight: 700;
    color: var(--text);
    padding-left: 16px;
    margin-left: 16px;
    border-left: 3px solid var(--primary);
}

/* ===== 内容区 Tab 栏 ===== */
.content-tabs {
    background: #fff;
    border-bottom: 1px solid var(--border);
    padding: 0 24px;
    display: flex;
    align-items: center;
    gap: 2px;
    min-height: 40px;
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
}
.content-tabs::-webkit-scrollbar { height: 0; }
.ctab {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    font-size: 13px;
    color: var(--text-sub);
    background: var(--surface-sunken);
    border: 1px solid transparent;
    border-bottom: none;
    border-radius: 8px 8px 0 0;
    cursor: pointer;
    transition: all var(--transition);
    white-space: nowrap;
    position: relative;
    top: 1px;
}
.ctab:hover {
    background: var(--border);
    color: var(--text);
}
.ctab.active {
    background: #fff;
    color: var(--primary);
    border-color: var(--border);
    border-bottom-color: #fff;
    font-weight: 600;
}
.ctab.active::after {
    content: '';
    position: absolute;
    left: 0; right: 0;
    bottom: -1px;
    height: 2px;
    background: var(--primary);
    border-radius: 2px 2px 0 0;
}
.ctab .ctab-close {
    width: 16px; height: 16px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    font-size: 12px;
    color: var(--text-light);
    transition: all var(--transition);
}
.ctab .ctab-close:hover {
    background: var(--danger);
    color: #fff;
}
.ctab.pinned .ctab-close {
    display: none;
}

/* ===== Tab Content ===== */
.tab-content { display: none; }
.tab-content.active { display: block; animation: fadeIn 0.25s ease; }
/* 2026-10-26 防菜单闪现 → 2026-11-03 p2-review 修2 升级为【通用 data-perm 隐藏链路】：
   旧规则只匹配 .tab-btn，报价页 8 处静态按钮（新增/添加型号/清空/导出/保存/取消等）与动态行按钮
   虽带 data-perm 却照样可见。现任意 [data-perm] 元素默认一律隐藏，auth-gate 判定有权加 .perm-ok 才显示。
   !important：业务脚本的 inline display 不能绕过隐藏（不能只靠 JS 置灰）；动态插入/改 data-perm 的节点
   由 auth-gate 的 MutationObserver 同步补判定。免登录/AUTH 关闭时 auth-gate 对全量补 .perm-ok。*/
[data-perm]:not(.perm-ok) { display: none !important; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

.main-content {
    flex: 1;
    padding: 18px 24px;
    min-height: 0;
    /* 2026-10-07：用 clip 代替 auto——既防止内容横向溢出，又不形成滚动容器，
       否则计算器右侧 position:sticky 报价结果面板会因祖先 overflow:auto 而失效。
       宽表（报价明细/报价单列表/CRM 列表等）各自已有 overflow-x:auto 的包裹层。 */
    overflow-x: clip;
}

/* ===== Layout ===== */
.calc-layout {
    display: grid;
    grid-template-columns: 1fr 400px;
    gap: 16px;
    align-items: start;
}
.quote-layout {
    /* 已由 .main-content 提供 padding */
}

/* ===== Category Section ===== */
.category-section {
    margin-bottom: 4px;
}
.category-title {
    font-size: 16px;
    font-weight: 700;
    font-family: var(--font-display);
    letter-spacing: 0.02em;
    color: #fff;
    background: linear-gradient(135deg, var(--primary-dark), var(--primary));
    padding: 10px 18px;
    border-radius: var(--radius-sm) var(--radius-sm) 0 0;
    display: flex;
    align-items: center;
    gap: 10px;
}
.category-title::before {
    content: '';
    width: 4px;
    height: 18px;
    background: var(--accent);
    border-radius: 2px;
    flex-shrink: 0;
}
.category-sub {
    font-size: 12px;
    font-weight: 400;
    opacity: 0.85;
    padding: 2px 8px;
    background: rgba(255,255,255,0.18);
    border-radius: 999px;
}
.category-section .card:first-of-type {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
}
.category-section .card {
    padding: 14px 16px;
    box-shadow: none;
    border-width: 0 0 0 1px;
    border-color: transparent;
}
.category-section .card h3 {
    font-size: 13px;
    font-weight: 600;
    color: var(--primary-dark);
    margin-bottom: 10px;
    padding-bottom: 4px;
    border-bottom: 1px dashed var(--border-light);
}

/* ===== Card ===== */
.card {
    background: var(--card-bg);
    border: 1px solid var(--border-light);
    border-radius: var(--radius);
    box-shadow: var(--shadow-sm);
    padding: 16px 18px;
    margin-bottom: 12px;
    transition: box-shadow var(--transition), border-color var(--transition);
}
.card:hover { box-shadow: var(--shadow); }
.card h3 {
    font-size: 15px;
    color: var(--primary-dark);
    margin-bottom: 12px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    letter-spacing: 0.2px;
    font-weight: 700;
    font-family: var(--font-display);
    letter-spacing: 0.02em;
    position: relative;
    padding-left: 14px;
}
.card h3::before {
    content: '';
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 4px;
    height: 16px;
    border-radius: 2px;
    background: linear-gradient(180deg, var(--primary-light), var(--primary));
}
.req-mark {
    font-size: 11px;
    color: var(--danger);
    font-weight: 500;
    margin-left: 6px;
    padding: 1px 6px;
    background: #FBE9E7;
    border-radius: 4px;
}
.optional-mark {
    font-size: 11px;
    color: var(--text-light);
    font-weight: 500;
    margin-left: 6px;
    padding: 1px 6px;
    background: var(--surface-sunken);
    border-radius: 4px;
}
.field-count-badge {
    font-size: 11px;
    color: var(--text-light);
    background: var(--surface-sunken);
    padding: 2px 8px;
    border-radius: 10px;
    font-weight: 500;
}
.field-hint { font-size: 12px; color: var(--text-light); margin-bottom: 8px; }

/* ===== Collapsible ===== */
details.collapsible { padding: 0; }
details.collapsible > summary {
    font-size: 15px;
    color: var(--primary-dark);
    padding: 14px 18px;
    cursor: pointer;
    font-weight: 700;
    list-style: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    border-radius: var(--radius);
    transition: background var(--transition);
    position: relative;
}
details.collapsible > summary::before {
    content: '';
    position: absolute;
    left: 18px;
    top: 50%;
    transform: translateY(-50%);
    width: 4px;
    height: 14px;
    border-radius: 2px;
    background: linear-gradient(180deg, var(--primary-light), var(--primary));
}
details.collapsible > summary:hover { background: var(--surface-muted); }
details.collapsible > summary::after {
    content: '▾';
    font-size: 12px;
    color: var(--text-light);
    transition: transform 0.25s ease;
    padding-left: 14px;
}
details.collapsible[open] > summary::after { transform: rotate(180deg); }
details.collapsible > summary::-webkit-details-marker { display: none; }
details.collapsible[open] > summary { border-bottom: 1px solid var(--border-light); border-radius: var(--radius) var(--radius) 0 0; }
details.collapsible > .form-grid { padding: 14px 18px; }

/* ===== Form ===== */
.form-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 10px 12px;
    align-items: start;
}
.form-grid-wide {
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.form-grid-compact {
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
/* 动态表单专用：字段数量随配置增删变化，auto-fill 保留空轨道，
   单字段时列宽仍恒定，不被拉伸成通栏，与多字段行的输入框等宽 */
.form-grid-fixed {
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
}

/* 多选 checkbox 区域 - flex wrap 自动换行 */
.flex-wrap-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    grid-column: 1 / -1;
}
.flex-wrap-pills .form-group {
    flex: 0 0 auto;
    min-width: 0;
}
.flex-wrap-pills .checkbox-label {
    align-self: auto;
    width: auto;
}

.form-group { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.form-group label {
    font-size: 12.5px;
    color: var(--text-sub);
    font-weight: 600;
    letter-spacing: 0.1px;
    white-space: normal;
}
.form-group input,
.form-group select,
.form-group textarea {
    width: 100%;
    min-height: 32px;
    padding: 4px 10px;
    border: 1px solid var(--border);
    border-radius: 6px;
    font-size: 13px;
    font-family: inherit;
    background: #fff;
    color: var(--text);
    transition: border-color var(--transition), box-shadow var(--transition), background var(--transition);
    outline: none;
    line-height: 1.4;
    box-sizing: border-box;
}
.form-group input:hover,
.form-group select:hover { border-color: #B9C8D9; }
.form-group input:focus,
.form-group select:focus {
    border-color: var(--primary);
    background: #fff;
    box-shadow: 0 0 0 3px rgba(46,127,184,0.14);
}
.form-group textarea { height: auto; min-height: 64px; resize: vertical; }
.form-group .hint { font-size: 11px; color: var(--text-light); line-height: 1.3; }
/* 工序代号红色提示（增加工序标记） */
.form-group .process-hint {
    font-size: 11px;
    color: var(--danger);
    line-height: 1.3;
    margin-top: 2px;
    font-weight: 500;
}

/* 自定义 select 箭头 - 用纯CSS伪元素，彻底避免背景图溢出到option下拉列表 */
.form-group { position: relative; }
.form-group select {
    appearance: none;
    -webkit-appearance: none;
    background-image: none !important;
    background: #fff;
    padding-right: 28px;
    cursor: pointer;
}
/* 用 .form-group 的 ::after 伪元素画纯CSS三角箭头（不用background-image） */
.form-group:has(>select:not([multiple]))::after {
    content: '';
    position: absolute;
    right: 10px;
    bottom: 9px;
    width: 0;
    height: 0;
    border-left: 5px solid transparent;
    border-right: 5px solid transparent;
    border-top: 6px solid var(--text-light);
    pointer-events: none;
    z-index: 2;
}
.form-group:has(>select:not([multiple]):focus)::after {
    border-top-color: var(--primary);
}

/* option 背景强制白色，防止Chrome默认蓝色选中背景 */
.form-group select option {
    background-color: #fff !important;
    color: var(--text) !important;
}
.form-group select option:checked {
    background-color: var(--primary-bg) !important;
    color: var(--primary-dark) !important;
}

.checkbox-label {
    display: flex;
    align-items: flex-start;
    justify-content: flex-start;
    gap: 8px;
    font-weight: 500 !important;
    cursor: pointer;
    width: 100%;
    min-height: 34px;
    height: auto;
    padding: 6px 10px;
    border: 1px solid var(--border);
    border-radius: 6px;
    background: #fff;
    font-size: 13px;
    color: var(--text-sub);
    transition: all var(--transition);
    white-space: normal;
    word-break: break-all;
    box-shadow: var(--shadow-sm);
    line-height: 1.4;
    box-sizing: border-box;
}
/* checkbox 在 form-grid 里时，上方 select 有 label+gap 占了空间，
   checkbox form-group 没有独立 label，所以给 checkbox-label 加 margin-top 对齐框 */
.form-grid .checkbox-group .checkbox-label {
    margin-top: 26px;
    width: 100%;
}
/* flex-wrap-pills 里的 checkbox 按内容自适应宽度 */
.flex-wrap-pills .checkbox-label {
    width: auto;
    margin-top: 0;
}
.checkbox-label:hover {
    border-color: var(--primary-light);
    background: var(--primary-bg);
    transform: translateY(-1px);
}
.checkbox-label input[type="checkbox"] { display: none; }
.checkbox-label input[type="checkbox"] + span::before {
    content: '○';
    font-size: 14px;
    color: var(--border);
    transition: all var(--transition);
}
.checkbox-label input[type="checkbox"]:checked + span::before {
    content: '✓';
    color: #fff;
    background: var(--primary);
    border-radius: 50%;
    padding: 0 4px;
    font-size: 11px;
    line-height: 15px;
    display: inline-block;
    width: 16px;
    height: 16px;
    text-align: center;
}
.checkbox-label:has(input[type="checkbox"]:checked) {
    border-color: var(--primary);
    background: var(--primary-bg);
    color: var(--primary-dark);
    font-weight: 600;
    box-shadow: 0 2px 6px rgba(15,92,140,0.14);
}
.enig-custom-fields { margin-top: 10px; padding: 12px; background: #FBF1DC; border: 1px dashed #E8CF9E; border-radius: 8px; }

/* ===== 多选区域：pill/tag 样式 ===== */
.multi-checkbox-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 4px;
}
.multi-checkbox-grid .group-title {
    width: 100%;
    font-size: 12.5px;
    color: var(--text-sub);
    font-weight: 600;
    padding: 6px 0 2px;
    border-bottom: 1px solid var(--border-light);
    margin-bottom: 4px;
}
.multi-checkbox-grid .checkbox-group {
    flex: 0 0 auto;
}
.multi-checkbox-grid .checkbox-label {
    padding: 5px 12px;
    border: 1px solid var(--border);
    border-radius: 16px;
    background: #fff;
    font-size: 12.5px;
    color: var(--text);
    transition: all var(--transition);
    user-select: none;
    gap: 5px;
}
.multi-checkbox-grid .checkbox-label:hover {
    border-color: var(--primary-light);
    background: var(--primary-bg);
}
.multi-checkbox-grid input[type="checkbox"] {
    display: none;
}
.multi-checkbox-grid input[type="checkbox"]:checked + span {
    color: var(--primary-dark);
}
.multi-checkbox-grid .checkbox-label.checked {
    border-color: var(--primary);
    background: var(--primary-bg);
    color: var(--primary-dark);
    font-weight: 600;
    box-shadow: 0 1px 3px rgba(15,92,140,0.10);
}

/* ===== Area Calculator ===== */
.area-calc-card {
    background: linear-gradient(135deg, var(--primary-bg), #D5E6F3);
    border: 1px solid #B8D4E7;
}
.area-calc-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
    gap: 10px;
    margin-bottom: 10px;
}
.area-calc-actions { display: flex; align-items: center; gap: 12px; }
.area-result { font-weight: 700; color: var(--primary-dark); font-size: 15px; }

/* ===== Manual Price / 样品一口价 ===== */
.manual-price-card {
    background: linear-gradient(135deg, #FDF3E6, #F8E6CE);
    border: 1px solid #E8CD9A;
}
.manual-price-card h3 { color: #A85A12; }
.manual-price-card h3::before {
    background: linear-gradient(180deg, var(--accent), #B8641A);
}

/* ===== Result Panel ===== */
/* 2026-10-07：报价结果面板跟随滚轮悬浮在右侧；面板超高时自身滚动，底部按钮始终可达 */
.result-panel { position: sticky; top: 12px; align-self: start; max-height: calc(100vh - 24px); overflow-y: auto; }
.result-panel::-webkit-scrollbar { width: 6px; }
.result-panel::-webkit-scrollbar-thumb { background: #B9C8D9; border-radius: 3px; }
.result-card { position: relative; }

.price-highlight {
    /* 2026-10-16 UI 重设计：工程墨蓝渐变 + 顶部橙色标注线（蓝图/标注风格） */
    background:
        radial-gradient(140px 90px at 90% 0%, rgba(255,255,255,0.14), transparent 70%),
        linear-gradient(135deg, #0B2740 0%, var(--primary) 58%, var(--primary-light) 100%);
    color: #fff;
    border-radius: var(--radius);
    padding: 20px 18px;
    text-align: center;
    margin-bottom: 14px;
    box-shadow: 0 6px 20px rgba(11,39,64,0.28);
    position: relative;
    overflow: hidden;
    border-top: 3px solid var(--accent);
}
.price-label { font-size: 12.5px; opacity: 0.92; letter-spacing: 0.5px; }
/* 2026-10-16：报价金额改等宽字体，数字对齐更稳、更像仪表读数 */
.price-value { font-family: var(--font-mono); font-size: 30px; font-weight: 600; margin: 6px 0; letter-spacing: -0.01em; }
.price-extra { font-size: 13px; opacity: 0.88; }

/* ===== Breakdown Table ===== */
.price-breakdown { margin-bottom: 12px; }
.price-breakdown h4 {
    font-size: 12.5px;
    color: var(--primary-dark);
    margin-bottom: 6px;
    padding-left: 10px;
    border-left: 3px solid var(--primary-light);
    line-height: 1.3;
    font-weight: 700;
}
.breakdown-table, .summary-table { width: 100%; border-collapse: collapse; }
.breakdown-table td, .summary-table td {
    padding: 5px 8px;
    border-bottom: 1px solid var(--border-light);
    font-size: 12.5px;
}
.breakdown-table tr:hover td { background: var(--primary-bg); }
.breakdown-table td:first-child { color: var(--text-light); }
.breakdown-table td:last-child { text-align: right; font-weight: 600; }
/* 百分比加价项前的"（基数*百分比）"灰色提示 */
.pct-base {
    color: var(--text-light);
    font-weight: 400;
    font-size: 11.5px;
    margin-right: 5px;
    white-space: nowrap;
}

.summary-table td {
    padding: 6px 8px;
    border-bottom: 1px solid var(--border);
}
.summary-table tr.highlight td {
    font-weight: 700;
    font-size: 14px;
    color: var(--primary-dark);
    border-bottom: 2px solid var(--primary);
    background: var(--primary-bg);
}
.summary-table td:last-child { text-align: right; }

/* ===== Lead Time ===== */
.lead-time {
    background: linear-gradient(135deg, var(--primary-bg), #D5E6F3);
    border: 1px solid #B8D4E7;
    border-radius: var(--radius-sm);
    padding: 9px 14px;
    margin: 10px 0;
    font-size: 13px;
}
.lead-time .lt-label { color: var(--text-light); }
.lead-time .lt-value { font-weight: 700; color: var(--success); }
.warnings { font-size: 12px; color: var(--accent); }
.warnings div { padding: 2px 0; }

/* ===== Buttons ===== */
.btn {
    display: inline-block;
    padding: 8px 20px;
    border: none;
    border-radius: var(--radius-sm);
    font-size: 13.5px;
    font-family: inherit;
    font-weight: 600;
    cursor: pointer;
    transition: all var(--transition);
    text-align: center;
    min-height: 36px;
    line-height: 1.4;
}
.btn:active { transform: translateY(1px); }
.btn-sm { padding: 4px 12px; font-size: 12px; min-height: 28px; border-radius: 6px; }
.btn-lg { padding: 12px 28px; font-size: 15px; min-height: 42px; }
.btn-primary {
    /* 2026-10-16 UI 重设计：工程风实感按钮（轻渐变 + 深色描边，替代原柔光按钮） */
    background: linear-gradient(180deg, var(--primary-light), var(--primary));
    color: #fff;
    border: 1px solid var(--primary-dark);
    box-shadow: 0 1px 2px rgba(10,35,64,0.20);
    letter-spacing: 0.02em;
}
.btn-primary:hover { box-shadow: 0 3px 10px rgba(10,35,64,0.25); filter: brightness(1.08); }
.btn-outline {
    background: #fff;
    color: var(--primary);
    border: 1px solid var(--primary);
}
.btn-outline:hover { background: var(--primary); color: #fff; box-shadow: 0 2px 8px rgba(15,92,140,0.25); }
.btn-danger { background: linear-gradient(135deg, #A83028, #C0392B); color: #fff; box-shadow: 0 2px 6px rgba(192,57,43,0.25); }
.btn-danger:hover { filter: brightness(1.07); box-shadow: 0 4px 12px rgba(192,57,43,0.32); }
/* 2026-10-12 UI优化：补齐缺失的按钮变体，与 btn-primary/danger 保持统一圆角/阴影/过渡 */
.btn-secondary {
    background: var(--surface-sunken);
    color: var(--text-sub);
    border: 1px solid var(--border);
}
.btn-secondary:hover { background: var(--border); border-color: #B9C8D9; }
.btn-success {
    background: linear-gradient(135deg, var(--success), #2E9A6A);
    color: #fff;
    box-shadow: 0 2px 6px rgba(22,121,79,0.25);
}
.btn-success:hover { filter: brightness(1.07); box-shadow: 0 4px 12px rgba(22,121,79,0.32); }
/* 2026-10-19 按钮状态补齐（改动原因：此前 .btn 没有禁用态，置灰按钮与可点按钮无差别；影响范围：全站按钮外观） */
.btn:disabled, .btn[disabled] {
    opacity: .55; cursor: not-allowed; box-shadow: none; filter: none; transform: none;
}
.btn:disabled:hover, .btn[disabled]:hover { box-shadow: none; filter: none; }
.btn:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }

.result-actions { display: flex; gap: 10px; margin-top: 12px; }
.result-actions .btn { flex: 1; }

/* ===== 2026-10-18 行级重新编辑：计算器顶部编辑态横幅 ===== */
.item-edit-banner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 10px 14px;
    margin-bottom: 12px;
    background: var(--primary-bg);
    border: 1px solid var(--primary-light);
    border-left: 4px solid var(--primary);
    border-radius: var(--radius);
    color: var(--primary-dark);
    font-size: 13px;
    font-weight: 600;
}

/* ===== Quotation Tab ===== */
.card-header-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 12px;
    padding-bottom: 10px;
    border-bottom: 1px solid var(--border-light);
}
.card-header-row h3 { margin: 0; padding: 0; border: none; }
.card-header-row h3::before { display: none; }
.card-actions { display: flex; gap: 8px; }

.quote-items-table-wrap { overflow-x: auto; border-radius: var(--radius-sm); }
.quote-items-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 12px;
}
.quote-items-table th {
    background: linear-gradient(135deg, var(--primary-dark), var(--primary));
    color: #fff;
    padding: 8px 6px;
    text-align: center;
    white-space: nowrap;
    border: 1px solid rgba(15,92,140,0.9);
    /* 2026-10-16：表头改等宽小字距大写，工程表格观感 */
    font-family: var(--font-mono);
    font-size: 11px;
    font-weight: 500;
    letter-spacing: 0.06em;
}
.quote-items-table td {
    padding: 5px 6px;
    border: 1px solid var(--border);
    text-align: center;
    vertical-align: middle;
}
.quote-items-table tbody tr:nth-child(even) td { background: var(--surface-muted); }
.quote-items-table tbody tr:hover td { background: var(--surface-sunken); }
.quote-items-table .empty-row td { color: var(--text-light); padding: 24px; }
.quote-items-table tfoot td {
    background: var(--primary-bg);
    font-weight: 700;
    padding: 7px 6px;
    text-align: right;
}
.quote-items-table .item-total { font-weight: 700; color: var(--primary); }
/* 2026-11-03 复制型号（同型号多行）：型号组头 + 多行组浅色底纹（不合并单元格，型号名每行照显） */
.quote-items-table tbody tr.qm-group-head td {
    background: #E6F0F9;
    border-top: 2px solid #9DB6D4;
    padding: 5px 8px;
    font-weight: 600;
    color: #0A4570;
}
.quote-items-table tbody tr.qm-group-head:hover td { background: #E6F0F9; }
.quote-items-table tbody tr.qm-group-head .qm-group-name { font-size: 13px; text-align: left; }
.quote-items-table tbody tr.qm-group-head .qm-group-count { font-weight: 400; color: #5A718C; font-size: 12px; margin-left: 6px; }
.quote-items-table tbody tr.qm-group-head .qm-group-ops { text-align: right; white-space: nowrap; }
/* 同型号≥2 行的数据行浅蓝底（覆盖斑马纹；组头已做组分隔，此底纹仅提示"这些行属同一型号"） */
.quote-items-table tbody tr.qm-copy-row td { background: #F6FAFE; }
.quote-items-table tbody tr.qm-copy-row:hover td { background: #EAF2FA; }
/* 2026-10-27 需求3：备注多行输入（≤512字符），纵向对齐与输入框观感一致 */
.quote-items-table .inline-textarea {
    resize: vertical;
    min-height: 38px;
    line-height: 1.4;
    font-size: 12px;
    padding: 3px 6px;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    vertical-align: middle;
}

.export-card { text-align: center; }
.export-actions { display: flex; justify-content: center; gap: 14px; flex-wrap: wrap; }

/* ===== 价格配置页 ===== */
.cfg-card { border: 1px solid var(--border-light); border-radius: 10px; padding: 14px 16px; margin-bottom: 12px; background: var(--card-bg); box-shadow: var(--shadow-sm); }

/* 2026-10-12 UI优化：价格配置页动态元素通用类（替代 pcb-config-page.js 中的内联 cssText） */
/* 2026-10-14 修复：八/九标题样式与一~七的 .cfg-title 完全对齐（左侧蓝条+加粗），回归自 8f0bc17 抽类丢样式；该类仅八、九使用 */
.cfg-section-title {
    font-size: 14px;
    color: var(--primary-dark);
    font-weight: 700;
    margin-bottom: 10px;
    padding-left: 12px;
    border-left: 4px solid var(--primary-light);
    line-height: 1.35;
}
.cfg-hint { font-size: 11px; color: var(--text-light); margin-bottom: 12px; line-height: 1.5; }
.cfg-input-sm { padding: 4px 8px; border: 1px solid var(--border); border-radius: 4px; font-size: 12px; background: #fff; box-sizing: border-box; width: 100%; }
.cfg-input { padding: 6px 10px; border: 1px solid var(--border); border-radius: 4px; font-size: 13px; background: #fff; box-sizing: border-box; width: 100%; }
.cfg-group-label { margin-top: 14px; margin-bottom: 4px; padding: 6px 10px; background: #EAF2EE; border-left: 3px solid var(--primary); font-weight: 600; font-size: 13px; color: var(--primary-dark); }
.cfg-subtitle { margin: 8px 0 2px 12px; font-size: 12px; color: var(--primary-dark); font-weight: 600; }
.cfg-add-btn { margin: 4px 0 14px 12px; padding: 3px 10px; background: #fff; color: var(--primary); border: 1px solid var(--primary); border-radius: 3px; cursor: pointer; font-size: 12px; }
.cfg-del-btn { background: #FBE9E7; color: var(--danger); border: 1px solid #F1CBC6; border-radius: 4px; cursor: pointer; font-size: 14px; width: 28px; height: 26px; line-height: 1; }
.cfg-add-row-btn { margin-top: 10px; padding: 6px 14px; background: var(--primary); color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 12px; }
.cfg-field-row { display: flex; flex-direction: column; gap: 4px; }
.cfg-field-label { font-size: 12px; color: var(--text-sub); font-weight: 500; }
.cfg-grid-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 16px; }
.cfg-grid-5col { display: grid; grid-template-columns: 140px 1fr 1fr 80px 40px; gap: 8px; align-items: center; margin-bottom: 6px; }
.cfg-grid-5col-head { display: grid; grid-template-columns: 140px 1fr 1fr 80px 40px; gap: 8px; font-size: 11px; color: var(--text-light); font-weight: 600; padding: 0 4px 6px; border-bottom: 1px solid var(--border); margin-bottom: 8px; }
.cfg-head-grid-4col { display: grid; grid-template-columns: 90px 1fr 1fr 1fr; gap: 6px 10px; align-items: center; margin-top: 10px; padding-top: 8px; border-top: 1px dashed var(--border); }
.cfg-grid-4col { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 10px 16px; }
.cfg-rule-title { font-weight: 600; font-size: 13px; color: var(--primary-dark); margin: 14px 0 8px; padding-top: 10px; border-top: 1px dashed var(--border); }
.cfg-tip { font-size: 11px; color: var(--text-light); }
.cfg-btn-row { margin-top: 12px; display: flex; gap: 10px; align-items: center; }

/* 2026-10-09 只读模式：整页弱化，鼠标提示不可编辑（控件本身已 disabled） */
#tab-config.cfg-readonly #configContainer { opacity: .92; }
#tab-config.cfg-readonly .cfg-card input:disabled,
#tab-config.cfg-readonly .cfg-card select:disabled,
#tab-config.cfg-readonly .cfg-card textarea:disabled,
#tab-config.cfg-readonly .cfg-card button:disabled {
    background: var(--border-light); color: var(--text-light); border-color: var(--border); cursor: not-allowed;
}
#tab-config.cfg-readonly .card-actions button:disabled { opacity: .55; cursor: not-allowed; }

/* 2026-10-07 价格配置：大标题折叠（默认收起），整体收紧 */
.cfg-collapse-head { cursor: pointer; user-select: none; position: relative; padding-right: 26px; }
.cfg-collapse-head:hover { color: var(--primary, var(--primary-light)); }
.cfg-collapse-head::after {
    content: '▸'; position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
    color: var(--text-light); font-size: 12px; font-weight: 400; transition: transform .15s;
}
.cfg-card:not(.cfg-collapsed) .cfg-collapse-head::after,
.card:not(.cfg-collapsed) .cfg-collapse-head::after { content: '▾'; }
.cfg-card.cfg-collapsed, .card.cfg-collapsed { padding: 10px 16px !important; margin-bottom: 8px; }
/* !important：七/九/十等卡片内部行用了内联 display:grid，普通规则压不住，会导致收不干净（列名残留） */
/* 2026-10-13 修复：八/九标题类为 cfg-section-title，折叠时同样保留标题不隐藏（回归自 8f0bc17） */
.cfg-card.cfg-collapsed > :not(.cfg-title):not(.cfg-section-title),
.card.cfg-collapsed > :not(.cfg-title):not(.cfg-section-title) { display: none !important; }
.cfg-card.cfg-collapsed .cfg-collapse-head,
.card.cfg-collapsed .cfg-collapse-head { margin-bottom: 0 !important; }

.cfg-title {
    font-size: 14px;
    color: var(--primary-dark);
    font-weight: 700;
    margin-bottom: 10px;
    padding-left: 12px;
    border-left: 4px solid var(--primary-light);
    line-height: 1.35;
}
.cfg-sub-title { font-size: 12.5px; color: var(--text-sub); font-weight: 600; margin: 12px 0 6px; padding-left: 8px; border-left: 3px solid var(--border); }
.cfg-inline { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; font-size: 13px; flex-wrap: wrap; }
.cfg-save-tip { font-size: 12px; color: var(--success); margin-bottom: 8px; min-height: 16px; }
.cfg-category-title {
    font-size: 15px;
    font-weight: 700;
    color: var(--primary-dark);
    background: var(--primary-bg);
    padding: 8px 14px;
    border-radius: 8px;
    margin: 16px 0 8px;
    border-left: 4px solid var(--primary);
}
.config-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-bottom: 8px; border-radius: var(--radius-sm); overflow: hidden; }
.config-table th, .config-table td { border: 1px solid var(--border-light); padding: 5px 6px; text-align: center; }
.config-table th {
    background: linear-gradient(135deg, var(--primary-bg), #D5E6F3);
    color: var(--primary-dark);
    white-space: nowrap;
    font-weight: 600;
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.04em;
}
.config-table tbody tr:nth-child(even) td { background: var(--surface-muted); }
.config-table tbody tr:hover td { background: var(--surface-sunken); }
.config-table input[type="number"], .config-table input[type="text"] {
    width: 74px; padding: 4px 5px; border: 1px solid var(--border);
    border-radius: 5px; text-align: center; font-size: 12px; font-family: inherit;
    background: var(--surface-muted); transition: border-color var(--transition), box-shadow var(--transition);
}
.config-table input:focus {
    outline: none; border-color: var(--primary);
    box-shadow: 0 0 0 2px rgba(46,127,184,0.14); background: #fff;
}
.config-table select { padding: 4px 5px; font-size: 12px; border: 1px solid var(--border); border-radius: 5px; font-family: inherit; background: var(--surface-muted); }
.config-table .hint { font-size: 11px; color: var(--text-light); }

/* ===== Print/Export Styles ===== */
@media print {
    .app-header, .tab-btn, .result-actions, .export-actions, .card-actions, .btn { display: none !important; }
    body { background: #fff; }
    .card { box-shadow: none; border: 1px solid #ddd; }
}

/* ===== Responsive ===== */
@media (max-width: 900px) {
    .calc-layout {
        grid-template-columns: 1fr;
    }
    .result-panel { position: static; }
    .header-inner {
        flex-direction: column;
        align-items: stretch;
    }
    .tabs { justify-content: center; }
    .company-name { text-align: center; }
    .company-name .cn { font-size: 18px; }
    .area-calc-grid { grid-template-columns: 1fr 1fr; }
    .price-value { font-size: 28px; }
    .quote-items-table { font-size: 11px; }
}

@media (max-width: 500px) {
    .form-grid { grid-template-columns: 1fr; }
    .area-calc-grid { grid-template-columns: 1fr; }
    .header-inner { padding: 8px 12px; }
    .calc-layout, .quote-layout { padding: 10px; }
    .card { padding: 12px 14px; }
    .tab-btn { padding: 6px 14px; font-size: 13px; }
    .price-value { font-size: 24px; }
    .price-highlight { padding: 16px 14px; }
    .export-actions { flex-direction: column; }
}

/* ===== v2: 元数据驱动架构样式 ===== */

/* 动态表单容器 */
.dynamic-form-container {
    display: flex;
    flex-direction: column;
    gap: 12px;
}

/* 动态渲染的 card（由 PCB_FormRenderer 生成） */
.dynamic-card {
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 10px;
    overflow: hidden;
    box-shadow: 0 1px 3px rgba(0,0,0,0.04);
}
.dynamic-card-header {
    background: linear-gradient(135deg, var(--primary-dark), var(--primary));
    padding: 10px 18px;
    display: flex;
    align-items: center;
}
.dynamic-card-header h3 {
    font-size: 15px;
    font-weight: 700;
    font-family: var(--font-display);
    color: #fff;
    margin: 0;
    padding-left: 12px;
    position: relative;
    letter-spacing: 0.03em;
}
.dynamic-card-header h3::before {
    content: '';
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 4px;
    height: 16px;
    border-radius: 2px;
    background: rgba(255,255,255,0.85);
}
.dynamic-card .form-grid {
    padding: 16px 18px;
}

/* 字段显隐过渡 */
.dynamic-card .form-group {
    transition: opacity 0.15s ease, transform 0.15s ease;
}

/* ===== 下拉多选框 ===== */
.multiselect-dropdown {
    position: relative;
    width: 100%;
    min-width: 0;  /* 2026-10-06 问题3：网格列内允许收缩，防止撑破布局 */
}
.msd-trigger {
    min-height: 34px;
    padding: 4px 28px 4px 8px;
    border: 1px solid var(--border);
    border-radius: 4px;
    background: #fff;
    cursor: pointer;
    display: flex;
    align-items: center;
    position: relative;
    /* 2026-10-06 问题3：网格列内多选标签可换行，高度自适应，不再横向撑破列宽 */
    max-width: 100%;
    box-sizing: border-box;
}
.msd-trigger:focus {
    border-color: var(--primary);
    outline: none;
}
.msd-tags {
    flex: 1;
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    align-items: center;
}
.msd-placeholder {
    color: var(--text-light);
    font-size: 13px;
}
.msd-tag {
    background: var(--primary-bg);
    color: var(--primary-dark);
    border: 1px solid #B8D4E7;
    border-radius: 3px;
    padding: 2px 6px 2px 8px;
    font-size: 12px;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    line-height: 1.4;
}
.msd-tag-x {
    cursor: pointer;
    font-weight: 700;
    color: var(--primary-dark);
    padding: 0 2px;
}
.msd-tag-x:hover { color: var(--danger); }
.msd-arrow {
    position: absolute;
    right: 8px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--text-light);
    font-size: 12px;
    pointer-events: none;
}
.msd-panel {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    max-height: 200px;
    overflow-y: auto;
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 4px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.12);
    z-index: 100;
    padding: 4px 0;
}
.msd-item {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    cursor: pointer;
    font-size: 13px;
}
.msd-item:hover {
    background: var(--surface-sunken);
}
.msd-item input[type="checkbox"] {
    margin: 0;
}
.dynamic-card .form-group[style*="display: none"] {
    opacity: 0;
    transform: translateY(-4px);
}

/* 多选网格（renderField multiselect） */
.multi-checkbox-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    padding: 8px 0;
}

/* Schema JSON 编辑器 */
.schema-editor {
    margin-top: 16px;
}
.schema-json-editor {
    width: 100%;
    min-height: 300px;
    padding: 12px;
    font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
    font-size: 13px;
    line-height: 1.5;
    border: 2px solid var(--border);
    border-radius: 8px;
    background: var(--surface-muted);
    color: var(--text);
    resize: vertical;
    tab-size: 2;
}
.schema-json-editor:focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 2px rgba(46,127,184,0.14);
    background: #fff;
}

/* 调试面板 */
.debug-panel {
    margin-top: 16px;
    background: var(--surface-muted);
    border-color: var(--border);
}
.debug-panel summary {
    color: var(--text-light);
    font-size: 13px;
    font-weight: 500;
}
.debug-panel pre {
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 10px;
    font-size: 12px;
    line-height: 1.4;
    overflow-x: auto;
    max-height: 400px;
    overflow-y: auto;
}
.debug-panel details {
    margin-bottom: 8px;
}
.debug-panel summary {
    cursor: pointer;
    user-select: none;
    padding: 4px 0;
}

/* 配置页按钮行 */
.cfg-btn-row {
    display: flex;
    gap: 8px;
    margin-top: 10px;
    flex-wrap: wrap;
}

/* ============ AI 文档参数提取 Tab ============ */
.ai-drop-zone {
    border: 2px dashed var(--border);
    border-radius: 10px;
    padding: 40px 20px;
    text-align: center;
    cursor: pointer;
    transition: all 0.2s;
    background: var(--surface-muted);
    margin-bottom: 12px;
}
.ai-drop-zone:hover,
.ai-drop-zone.drag-over {
    border-color: var(--primary);
    background: var(--primary-bg);
}
.ai-drop-icon {
    font-size: 42px;
    margin-bottom: 10px;
}
.ai-drop-text {
    font-size: 15px;
    color: var(--text);
    margin: 6px 0;
}
.ai-drop-hint {
    font-size: 12px;
    color: var(--text-secondary);
    margin: 0;
}
.ai-file-info {
    background: var(--primary-bg);
    border: 1px solid #B8D4E7;
    border-radius: 6px;
    padding: 8px 12px;
    margin-bottom: 12px;
    font-size: 13px;
    color: var(--primary-dark);
}
.ai-action-row {
    display: flex;
    gap: 10px;
    margin-top: 12px;
    flex-wrap: wrap;
}
.ai-loading {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-top: 14px;
    padding: 10px 14px;
    background: var(--primary-bg);
    border-radius: 6px;
    color: var(--primary-dark);
    font-size: 14px;
}
.ai-spinner {
    width: 18px;
    height: 18px;
    border: 2px solid #B8D4E7;
    border-top-color: var(--primary);
    border-radius: 50%;
    animation: ai-spin 0.8s linear infinite;
}
@keyframes ai-spin {
    to { transform: rotate(360deg); }
}
.ai-error {
    margin-top: 12px;
    padding: 10px 14px;
    background: #FBE9E7;
    border: 1px solid #F1CBC6;
    border-radius: 6px;
    color: var(--danger);
    font-size: 13px;
}
.ai-result-block {
    margin-top: 16px;
}
.ai-block-label {
    display: block;
    font-size: 13px;
    font-weight: 600;
    color: var(--text);
    margin-bottom: 8px;
}
.ai-raw-text {
    width: 100%;
    min-height: 140px;
    max-height: 260px;
    padding: 10px;
    border: 1px solid var(--border);
    border-radius: 6px;
    font-size: 12px;
    line-height: 1.6;
    background: var(--surface-muted);
    color: var(--text-light);
    resize: vertical;
    box-sizing: border-box;
    font-family: Consolas, Monaco, monospace;
}
.ai-table-wrap {
    border: 1px solid var(--border);
    border-radius: 6px;
    overflow: hidden;
}
.ai-params-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
}
.ai-params-table th {
    background: var(--primary);
    color: #fff;
    padding: 8px 12px;
    text-align: left;
    font-weight: 600;
}
.ai-params-table td {
    padding: 8px 12px;
    border-bottom: 1px solid var(--border-light);
}
.ai-params-table tr:last-child td {
    border-bottom: none;
}
.ai-params-table tr:nth-child(even) td {
    background: var(--surface-muted);
}
.ai-params-table .param-name {
    font-weight: 500;
    color: var(--text-secondary);
}
.ai-params-table .param-value {
    color: var(--text);
    word-break: break-all;
}
.ai-param-input {
    width: 100%;
    padding: 4px 10px;
    border: 1px solid var(--border);
    border-radius: 6px;
    font-size: 13px;
    box-sizing: border-box;
    min-height: 32px;
    font-family: inherit;
    color: var(--text);
    background: #fff;
}
.ai-param-input:focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 3px rgba(46,127,184,0.14);
}
.ai-warning {
    margin-top: 14px;
    padding: 10px 14px;
    background: #FDF0DF;
    border: 1px solid #F0D2A8;
    border-radius: 6px;
    color: #8A5A1E;
    font-size: 13px;
}
/* AI 保存状态提示（灰字、非弹窗） */
.ai-save-status {
    margin-top: 8px;
    padding: 8px 12px;
    background: var(--surface-sunken);
    border-left: 3px solid var(--text-light);
    color: var(--text-light);
    font-size: 13px;
    line-height: 1.5;
    border-radius: 2px;
}
/* AI 编辑模式 checkbox / radio */
.ai-checkbox-label,
.ai-radio-label {
    display: inline-flex;
    align-items: center;
    margin-right: 12px;
    font-size: 14px;
    cursor: pointer;
}
.ai-param-checkbox {
    margin-right: 4px;
}
.ai-radio-group {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 12px;
}
/* AI 配置弹窗（2026-10-12 UI优化：与 qmg/crm 弹窗统一遮罩色/z-index/圆角/阴影/间距） */
.ai-modal {
    position: fixed;
    top: 0; left: 0; right: 0; bottom: 0;
    background: rgba(10,35,64,0.5);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 9000;
}
.ai-modal-content {
    background: #fff;
    border-radius: 10px;
    width: 90%;
    max-width: 480px;
    max-height: 90vh;
    overflow-y: auto;
    box-shadow: 0 12px 40px rgba(10,35,64,0.26);
}
.ai-modal-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 16px 20px;
    border-bottom: 1px solid var(--border);
}
.ai-modal-header h3 {
    margin: 0;
    font-size: 16px;
}
.ai-modal-close {
    background: none;
    border: none;
    font-size: 24px;
    cursor: pointer;
    color: var(--text-light);
    line-height: 1;
    transition: color var(--transition);
}
.ai-modal-close:hover { color: var(--text); }
.ai-modal-body {
    padding: 20px;
}
.ai-modal-footer {
    padding: 14px 20px;
    border-top: 1px solid var(--border);
    display: flex;
    gap: 10px;
    justify-content: flex-end;
}
/* Trae-MCP 调试模式警告提示 */
.ai-trae-warning {
    margin-top: 12px;
    padding: 12px 14px;
    background: #FCEEE0;
    border: 1px solid #EFC79A;
    border-radius: 6px;
    font-size: 13px;
    line-height: 1.6;
    color: #B45A10;
}
.ai-trae-warning strong {
    display: block;
    margin-bottom: 4px;
}
.ai-trae-warning p {
    margin: 0;
}
/* select 中禁用的 option 样式 */
select option:disabled {
    color: var(--text-light);
    background: var(--surface-sunken);
}
/* 文件上传成功卡片 */
.ai-file-info {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--primary-bg);
    border: 1px solid #B8D4E7;
    border-radius: 8px;
    padding: 10px 14px;
    margin-bottom: 12px;
}
.ai-file-icon {
    flex-shrink: 0;
    width: 40px;
    height: 40px;
    border-radius: 6px;
    background: var(--primary);
    color: #fff;
    font-size: 11px;
    font-weight: bold;
    display: flex;
    align-items: center;
    justify-content: center;
    letter-spacing: 0.5px;
}
.ai-file-detail {
    flex: 1;
    min-width: 0;
}
.ai-file-name {
    font-size: 14px;
    color: var(--text);
    font-weight: 500;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.ai-file-meta {
    font-size: 12px;
    color: var(--primary-dark);
    margin-top: 2px;
}
.ai-file-remove {
    flex-shrink: 0;
    background: none;
    border: none;
    color: var(--text-light);
    font-size: 20px;
    cursor: pointer;
    padding: 0 4px;
    line-height: 1;
}
.ai-file-remove:hover {
    color: var(--danger);
}

/* ========== CRM 客户开发模块样式（2026-09-30 并入，原 iframe 样式已废弃） ========== */
/* 全部为新增 crm-* 类，复用全局 CSS 变量与 .card/.btn/.form-group 风格，不覆盖原有样式 */
.crm-root { display: flex; flex-direction: column; gap: 12px; }
.crm-loading, .crm-empty { padding: 28px; text-align: center; color: var(--text-light); font-size: 13px; }
.crm-text-light { color: var(--text-light); font-size: 12px; font-weight: normal; }
.crm-req { color: var(--danger); }

/* 工具栏 */
.crm-toolbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; padding: 12px 14px; margin-bottom: 0; }
.crm-filters { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.crm-toolbar-actions { display: flex; gap: 8px; }
.crm-input {
    height: 32px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 6px;
    font-size: 13px; font-family: inherit; color: var(--text); background: #fff; box-sizing: border-box;
}
.crm-input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(46,127,184,0.14); }
select.crm-input { min-width: 104px; cursor: pointer; }
.crm-textarea { height: auto; resize: vertical; }

/* 表格 */
.crm-table-card { padding: 0; overflow: hidden; }
.crm-list-body { overflow-x: auto; }
.crm-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.crm-table th {
    background: var(--surface-muted); color: var(--text-light); font-weight: 500; text-align: left;
    padding: 9px 10px; border-bottom: 1px solid var(--border); white-space: nowrap;
    /* 2026-10-16：表头统一等宽小字距大写 */
    font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.05em; text-transform: uppercase;
}
.crm-table td { padding: 9px 10px; border-bottom: 1px solid var(--border-light); vertical-align: middle; }
.crm-table tbody tr:hover { background: var(--primary-bg); }
.crm-table-compact th, .crm-table-compact td { padding: 7px 8px; }
.crm-cell-name { font-weight: 600; color: var(--text); min-width: 160px; }
.crm-row-dormant { color: var(--text-light); }
.crm-row-dormant .crm-cell-name { color: var(--text-light); }
.crm-op-cell { white-space: nowrap; text-align: right; }
.crm-link {
    background: none; border: none; color: var(--primary); cursor: pointer; font-size: 12px;
    padding: 2px 5px; font-family: inherit;
}
.crm-link:hover { text-decoration: underline; }
.crm-link-danger { color: var(--danger); }
.crm-link:disabled { color: #B9C8D9; cursor: not-allowed; }

/* 等级/阶段/状态标签 */
.crm-level { display: inline-block; min-width: 22px; text-align: center; padding: 2px 7px; border-radius: 10px; font-size: 11px; font-weight: 700; color: #fff; }
.crm-level-S { background: linear-gradient(135deg,#B85A18,var(--accent)); }
.crm-level-A { background: linear-gradient(135deg,var(--primary),var(--primary-light)); }
.crm-level-B { background: linear-gradient(135deg,var(--success),#2E9A6A); }
.crm-level-C { background: linear-gradient(135deg,var(--text-sub),var(--text-light)); }
.crm-stage-tag { display: inline-block; padding: 2px 9px; border-radius: 4px; font-size: 11px; background: var(--primary-bg); color: var(--primary-dark); white-space: nowrap; }
.crm-stage-dormant, .crm-status-dormant { background: var(--surface-sunken) !important; color: var(--text-light) !important; }
.crm-status-active { color: var(--success); font-size: 12px; }
.crm-status-dormant { display: inline-block; padding: 2px 9px; border-radius: 4px; font-size: 11px; }
.crm-primary-flag { color: #B85A18; font-weight: 600; font-size: 12px; }

/* 分页 */
.crm-pager { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; flex-wrap: wrap; gap: 8px; }
.crm-pager-info { font-size: 12px; color: var(--text-light); }
.crm-pager-btns { display: flex; gap: 8px; }

/* 表单 */
.crm-edit-head { display: flex; justify-content: space-between; align-items: center; }
.crm-form-card { padding: 14px 16px; }
.crm-form-card h3 { margin: 0 0 12px; font-size: 14px; }
.crm-form-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px 16px; }
.crm-form-grid .form-group input, .crm-form-grid .form-group select, .crm-form-grid .form-group textarea { width: 100%; }

/* 详情 */
.crm-detail-head { display: flex; justify-content: space-between; align-items: center; }
.crm-detail-card { padding: 14px 16px; }
.crm-detail-title { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.crm-detail-title h3 { margin: 0; font-size: 17px; border: none; padding: 0; }
.crm-detail-title h3::before { display: none; }
.crm-code { color: var(--text-light); font-size: 12px; font-weight: normal; margin-left: auto; }
.crm-info-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px 20px; }
.crm-info-item { display: flex; font-size: 12.5px; line-height: 1.5; }
.crm-info-label { color: var(--text-light); min-width: 78px; flex-shrink: 0; }
.crm-info-val { color: var(--text); word-break: break-all; }

/* 阶段步骤条 */
.crm-steps { display: flex; align-items: flex-start; margin: 6px 0 16px; flex-wrap: wrap; gap: 4px 0; }
.crm-step { display: flex; flex-direction: column; align-items: center; width: 92px; text-align: center; }
.crm-step-dot {
    width: 26px; height: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
    font-size: 12px; font-weight: 700; background: var(--surface-sunken); color: var(--text-light); border: 2px solid var(--border);
}
.crm-step-label { font-size: 11px; color: var(--text-light); margin-top: 4px; }
.crm-step-done .crm-step-dot { background: #D5E6F3; color: var(--primary); border-color: #7FB3D5; }
.crm-step-active .crm-step-dot { background: linear-gradient(135deg,var(--primary),var(--primary-light)); color: #fff; border-color: var(--primary); box-shadow: 0 0 0 4px rgba(15,92,140,0.14); }
.crm-step-active .crm-step-label { color: var(--primary); font-weight: 700; }
.crm-step-line { flex: 1 1 auto; height: 2px; background: var(--border); margin: 13px 4px 0; min-width: 12px; }

.crm-detail-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.crm-sub-card { padding: 12px 14px; }
.crm-sub-card .card-header-row { margin-bottom: 10px; }

/* 跟进卡片 */
.crm-follow-item { border: 1px solid var(--border-light); border-radius: 8px; padding: 9px 12px; margin-bottom: 8px; background: var(--surface-muted); }
.crm-follow-head { display: flex; align-items: center; gap: 8px; margin-bottom: 5px; }
.crm-follow-method { background: var(--primary-bg); color: var(--primary-dark); font-size: 11px; padding: 1px 8px; border-radius: 9px; font-weight: 600; }
.crm-follow-date { font-size: 11px; color: var(--text-light); }
.crm-cust-init { font-size: 11px; color: #B85A18; background: #FBE9DA; padding: 1px 8px; border-radius: 9px; }
.crm-follow-ops { margin-left: auto; display: flex; gap: 4px; }
.crm-follow-content { font-size: 13px; color: var(--text); margin-bottom: 4px; white-space: pre-wrap; }
.crm-follow-next { font-size: 12px; color: var(--text-sub); }

/* 弹窗 */
/* CRM/账号 弹窗（2026-10-12 UI优化：遮罩色与 qmg/ai 弹窗统一） */
.crm-modal-mask { position: fixed; inset: 0; background: rgba(10,35,64,0.5); z-index: 9000; display: flex; align-items: center; justify-content: center; padding: 20px; }
.crm-modal { background: #fff; border-radius: 10px; width: 720px; max-width: 100%; max-height: 88vh; display: flex; flex-direction: column; box-shadow: 0 12px 40px rgba(10,35,64,0.26); }
.crm-modal-head { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; border-bottom: 1px solid var(--border); }
.crm-modal-head h3 { margin: 0; font-size: 15px; }
.crm-modal-x { background: none; border: none; font-size: 22px; line-height: 1; color: var(--text-light); cursor: pointer; transition: color var(--transition); }
.crm-modal-x:hover { color: var(--text); }
.crm-modal-body { padding: 16px 20px; overflow-y: auto; flex: 1; }
.crm-modal-foot { margin-top: 14px; text-align: right; }
.crm-ls-box { max-height: 340px; overflow-y: auto; margin-bottom: 12px; }
.crm-ls-add { display: flex; gap: 8px; }
.crm-ls-add input { flex: 1; }
.crm-import-ph { text-align: center; padding: 10px 0; }
.crm-import-ph input { margin: 12px 0; }

/* 占位页（看板） */
.crm-board-root { display: flex; flex-direction: column; gap: 12px; }
.crm-board-bar { padding: 12px 16px; display: flex; align-items: center; gap: 10px; }
.crm-board-bar-right { margin-left: auto; display: flex; align-items: center; gap: 4px; }
.crm-input-sm { height: 28px; font-size: 12.5px; padding: 2px 8px; width: auto; min-width: 120px; }
.crm-placeholder { text-align: center; padding: 60px 20px; color: var(--text-light); }
.crm-placeholder-icon { font-size: 42px; margin-bottom: 8px; }
.crm-placeholder h3 { color: var(--text-sub); margin: 6px 0; }
.crm-placeholder p { font-size: 13px; margin: 4px 0; }

/* 看板框架（2026-10-16 需求7；2026-10-18 需求3 移除休眠列后=5 阶段列） */
.crm-kanban { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; } /* 2026-10-18 需求3 移除休眠列=5阶段；2026-10-17 删「客户审核」阶段 */
.crm-kanban-col { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; min-height: 300px; display: flex; flex-direction: column; }
.crm-kanban-head { padding: 9px 10px; border-radius: 8px 8px 0 0; font-size: 12.5px; font-weight: 700; color: #fff; display: flex; justify-content: space-between; align-items: center; background: var(--text-light); }
.crm-kanban-lead { background: var(--text-light); }
.crm-kanban-profiling { background: var(--primary-light); }
.crm-kanban-development { background: #2E9A6A; }
.crm-kanban-erp_handover { background: var(--primary-light); }
.crm-kanban-first_order { background: #C96A28; }
.crm-kanban-count { background: rgba(255,255,255,0.25); border-radius: 10px; padding: 0 8px; font-size: 11px; }
/* 2026-10-16 看板铺满改造：body 改纵向 flex，卡片 flex 拉伸动态占满整列高度（消除列内底部空白） */
.crm-kanban-body { padding: 8px; flex: 1; display: flex; flex-direction: column; }
.crm-kanban-empty { text-align: center; font-size: 11px; color: var(--text-light); padding: 20px 6px; border: 1px dashed var(--border); border-radius: 6px; background: #fff; flex: 1; display: flex; align-items: center; justify-content: center; }
.crm-kanban-dormant { background: #8A94A6; }

/* 2026-10-16 需求7：看板卡片（基本信息 + 最新跟进 + 下次跟进超期标注） */
.crm-kanban-summary { display: flex; flex-wrap: wrap; gap: 8px; }
.crm-kanban-sum-item { font-size: 12px; color: var(--text-sub); background: var(--surface-muted); border: 1px solid var(--border-light); border-radius: 12px; padding: 3px 12px; }
.crm-kanban-sum-total { font-weight: 700; color: var(--primary); border-color: var(--primary); }
/* 2026-10-18 需求1：顶部chips=可点击的阶段筛选 */
.crm-kanban-sum-item[data-stage] { cursor: pointer; user-select: none; transition: background .15s, color .15s, border-color .15s; }
.crm-kanban-sum-item[data-stage]:hover { border-color: var(--primary); color: var(--primary); }
.crm-kanban-sum-item.active { background: var(--primary); border-color: var(--primary); color: #fff; }
.crm-kanban-sum-item.crm-kanban-sum-total.active { color: #fff; }
/* 2026-10-18 需求2：每列「⚠ 逾期」筛选开关（列标题右侧，计数徽标旁） */
.crm-kanban-head-right { display: flex; align-items: center; gap: 6px; }
.crm-kanban-od { font-size: 11px; line-height: 1.2; padding: 2px 7px; border-radius: 9px; border: 1px solid rgba(255,255,255,0.55); background: rgba(255,255,255,0.18); color: #fff; cursor: pointer; white-space: nowrap; transition: background .15s, color .15s; }
.crm-kanban-od:hover { background: rgba(255,255,255,0.4); }
.crm-kanban-od.active { background: #fff; color: #C0392B; border-color: #fff; font-weight: 700; }
/* 2026-11-04 看板卡片改造：固定高度 300px（不拉伸/不内部滚动，超出一律省略号截断）。
   取消整卡 pointer（旧版整卡一个点击事件），可点提示下沉到四个独立分区：
   名称/跟进内容块/下一步/下次跟进日期；卡片本身与留白不可点（无 pointer、无 hover 描边）。 */
.crm-kanban-card { border: 1px solid var(--border-light); border-radius: 8px; padding: 12px 12px 10px; margin-bottom: 8px; background: #fff; height: 300px; flex: 0 0 auto; overflow: hidden; display: flex; flex-direction: column; }
.crm-card-title { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
/* 分区①公司名称：可点（进客户详情）；单行省略号，hover 主色+下划线 */
.crm-card-name { flex: 1 1 auto; min-width: 0; font-size: 13px; font-weight: 700; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; border-radius: 4px; transition: color .15s; }
.crm-card-name:hover { color: var(--primary); text-decoration: underline; text-underline-offset: 3px; }
.crm-card-meta { font-size: 11px; color: var(--text-light); margin-bottom: 7px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 分区②最近跟进块：可点（弹该条跟进只读详情）；flex:1 占中部，min-height:0 保证固定高度内可被压缩截断 */
.crm-card-follow { border-top: 1px dashed var(--border-light); padding: 8px 6px 4px; margin: 0 -6px 8px; flex: 1 1 auto; display: flex; flex-direction: column; justify-content: center; gap: 6px; min-height: 0; border-radius: 6px; cursor: pointer; transition: background .15s; }
.crm-card-follow:hover { background: var(--surface-muted); }
/* 无跟进记录时该区块不可点（无 pointer/hover），点击不弹窗 */
.crm-card-follow.crm-card-follow-empty { cursor: default; }
.crm-card-follow.crm-card-follow-empty:hover { background: transparent; }
.crm-card-follow-head { font-size: 11px; color: var(--text-light); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crm-card-follow-content { font-size: 12px; color: var(--text); line-height: 1.7; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; }
/* 分区③「下一步」：嵌套在跟进块内的独立可点区（弹新增跟进），stopPropagation 防止点串到跟进详情 */
.crm-card-follow-next { font-size: 11px; color: var(--text-sub); line-height: 1.6; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; border-radius: 4px; cursor: pointer; transition: color .15s; }
.crm-card-follow-next:hover { color: var(--primary); }
/* 分区④「下次跟进日期」：可点（弹新增跟进）；margin-top:auto 固定贴卡片底部 */
.crm-card-next { font-size: 11.5px; color: var(--text-sub); border-radius: 5px; margin-top: auto; padding: 8px 4px 0; border-top: 1px dashed var(--border-light); cursor: pointer; transition: color .15s; }
.crm-card-next:hover { color: var(--primary); }
/* 图4：超期红色标注（hover 主色不覆盖超期红色，超期行仍可点） */
/* 2026-11-04 下级规则合并·前端口径对齐：看板卡片显式「＋跟进」按钮行（仅 sub_manage/owner/all 渲染；与③④分区并存） */
.crm-card-fu-row { margin: 0 0 8px; display: flex; justify-content: flex-end; }
.crm-card-fu-btn { padding: 2px 10px; font-size: 11.5px; }
.crm-card-overdue { color: var(--danger); font-weight: 600; }
.crm-card-next.crm-card-overdue:hover { color: var(--danger); text-decoration: underline; text-underline-offset: 3px; }

/* 2026-10-16 需求5：客户审核资料（截图预览/放大）
   2026-10-19 UI重排（改动原因：原输入框未撑满宽、缩略图固定148px小块且破图文字外溢，观感差；
   影响范围：仅「客户审核情况」模块样式，弹窗/预览逻辑不变） */
.crm-review-group { margin-bottom: 16px; }
.crm-review-title { display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 12.5px; font-weight: 700; color: var(--text-sub); margin-bottom: 8px; }
.crm-review-imgs { display: grid; grid-template-columns: repeat(auto-fill, minmax(158px, 1fr)); gap: 12px; }
.crm-review-item { border: 1px solid var(--border-light); border-radius: 8px; padding: 6px 6px 4px; background: #fff; transition: box-shadow .18s, border-color .18s; }
.crm-review-item:hover { border-color: var(--primary); box-shadow: 0 4px 14px rgba(46,127,184,0.14); }
.crm-review-thumb { position: relative; width: 100%; aspect-ratio: 4 / 3; border-radius: 6px; overflow: hidden; background: var(--surface-muted); display: flex; align-items: center; justify-content: center; }
.crm-review-thumb.broken::after { content: '图片无法显示'; font-size: 11px; color: var(--text-light); }
.crm-review-img { width: 100%; height: 100%; object-fit: cover; display: block; cursor: zoom-in; transition: transform .18s; }
.crm-review-img:hover { transform: scale(1.04); }
.crm-review-name { font-size: 11px; color: var(--text-light); margin: 6px 2px 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crm-review-del { border: none; background: none; color: var(--danger); font-size: 11px; cursor: pointer; padding: 3px 6px; border-radius: 4px; }
.crm-review-del:hover { background: rgba(192,57,43,0.08); }
.crm-review-add {
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
    border: 1.5px dashed var(--border); border-radius: 8px; background: var(--surface-muted);
    color: var(--text-light); font-size: 12px; font-family: inherit; cursor: pointer; min-height: 128px;
    transition: border-color .18s, color .18s, background .18s;
}
.crm-review-add:hover { border-color: var(--primary); color: var(--primary); background: rgba(46,127,184,0.06); }
.crm-review-foot { display: flex; align-items: center; gap: 12px; border-top: 1px solid var(--border-light); padding-top: 12px; margin-top: 4px; }
.crm-modal-wide { width: 900px; }
.crm-preview-wrap { text-align: center; padding: 6px 0; }
.crm-preview-img { max-width: 100%; max-height: 70vh; border-radius: 6px; }

/* 2026-10-16 需求6：弹窗表单单列 + 大输入框 */
.crm-form-stack { display: flex; flex-direction: column; gap: 12px; }
.crm-form-stack .form-group { margin-bottom: 0; }
.crm-textarea-lg { min-height: 96px; width: 100%; line-height: 1.6; padding: 8px 10px; }
.crm-form-stack .crm-textarea-lg { height: auto; }

/* toast */
.crm-toast {
    position: fixed; top: 24px; left: 50%; transform: translateX(-50%) translateY(-12px); z-index: 9500;
    background: var(--text); color: #fff; font-size: 13px; padding: 9px 20px; border-radius: 8px;
    opacity: 0; transition: all .25s; box-shadow: 0 6px 20px rgba(10,35,64,.32); max-width: 80vw;
}
.crm-toast-show { opacity: 1; transform: translateX(-50%) translateY(0); }
.crm-toast-err { background: var(--danger); }

/* ========== 报价单管理模块（2026-10-06 P3） ========== */
.qmg-filter-row { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; padding: 10px 0; }
.qmg-input { height: 32px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 6px; font-size: 13px; min-width: 120px; box-sizing: border-box; font-family: inherit; color: var(--text); background: #fff; }
.qmg-input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(46,127,184,0.14); }

/* 2026-10-19 原生控件统一美化（改动原因：日期控件的日历图标/空白占位、文件选择按钮仍是浏览器原生样式，
   与系统输入框不统一；影响范围：全站 input[type=date]/[type=file] 仅外观，取值与上传逻辑不变） */
input[type="date"] {
    color-scheme: light; /* 强制浅色取色，避免深色模式下图标/面板变黑 */
    cursor: pointer;
}
/* 2026-10-19 修复：上一版把图标画在 input 背景、热区留给透明伪元素，两者错位导致点图标弹不出面板。
   现改为图标直接画在 ::-webkit-calendar-picker-indicator 上——该伪元素本身就是浏览器原生点击热区，
   图标在哪点哪即弹日期面板，位置/点击天然一致 */
input[type="date"]::-webkit-calendar-picker-indicator {
    width: 26px; height: 100%; padding: 5px; margin: 0;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237A8FA6' stroke-width='2' stroke-linecap='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M16 3v4M8 3v4M3 11h18'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: 15px 15px;
    cursor: pointer;
    opacity: 1;
    transition: background-image .15s;
}
input[type="date"]:hover::-webkit-calendar-picker-indicator,
input[type="date"]:focus-within::-webkit-calendar-picker-indicator {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230F5C8C' stroke-width='2' stroke-linecap='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M16 3v4M8 3v4M3 11h18'/%3E%3C/svg%3E");
}
input[type="file"] { height: auto; padding: 4px; cursor: pointer; }
input[type="file"]::file-selector-button {
    height: 30px; padding: 0 14px; margin-right: 10px; border: 1px solid var(--primary); border-radius: 6px;
    background: #fff; color: var(--primary); font-size: 13px; font-family: inherit; cursor: pointer;
    transition: background .15s, color .15s;
}
input[type="file"]::file-selector-button:hover { background: var(--primary); color: #fff; }

/* 2026-10-19 全站控件状态统一（改动原因：占位符颜色、禁用态、复选/单选配色此前各处不一致；
   影响范围：仅状态样式，取值与业务逻辑不变） */
input::placeholder, textarea::placeholder { color: var(--text-light); opacity: 1; }
input:disabled, textarea:disabled, select:disabled {
    background: var(--surface-sunken); color: var(--text-light); border-color: var(--border-light); cursor: not-allowed;
}
input[type="checkbox"], input[type="radio"] { accent-color: var(--primary); cursor: pointer; }
/* 数字框加减箭头压淡，悬停/聚焦再加深，避免默认全黑箭头抢视觉 */
input[type="number"]::-webkit-inner-spin-button { opacity: .35; transition: opacity .15s; }
input[type="number"]:hover::-webkit-inner-spin-button,
input[type="number"]:focus::-webkit-inner-spin-button { opacity: .85; }
/* 筛选条按钮与 32px 输入框同一行时对齐高度（.btn-sm 28px 会显得矮一截） */
.qmg-filter-row .btn, .crm-toolbar .btn { min-height: 32px; }
.qmg-grow { flex: 1; min-width: 180px; }
.qmg-spacer { flex: 1; }
.qmg-table-wrap { overflow-x: auto; }
.qmg-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.qmg-table th, .qmg-table td { padding: 8px 10px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; }
.qmg-table th { background: var(--surface-sunken); font-family: var(--font-mono); font-size: 11px; font-weight: 500; letter-spacing: 0.05em; text-transform: uppercase; color: var(--text-light); }
.qmg-table .qmg-num { text-align: right; font-family: var(--font-mono); }
.qmg-doc-link { color: var(--primary-light); text-decoration: none; cursor: pointer; }
.qmg-doc-link:hover { text-decoration: underline; }
.qmg-ops { display: flex; gap: 6px; flex-wrap: wrap; }
.btn-icon { background: transparent; border: 1px solid var(--border); padding: 3px 10px; border-radius: 5px; cursor: pointer; font-size: 12px; color: var(--text-sub); }
.btn-icon:hover { background: var(--border-light); }
.btn-icon.btn-danger { color: var(--danger); border-color: #F1CBC6; }
.btn-icon.btn-danger:hover { background: #FBE9E7; }
/* 2026-10-07 草稿行【确认】主操作按钮 + 未确认时【导出】置灰（配合状态机闸门） */
.btn-icon.btn-icon-confirm { color: var(--primary); border-color: #7FB3D5; background: var(--primary-bg); font-weight: 600; }
.btn-icon.btn-icon-confirm:hover { background: #D5E6F3; }
.qmg-ops .btn-icon:disabled { opacity: .5; cursor: not-allowed; background: var(--surface-sunken); color: var(--text-light); }
.qmg-ops .btn-icon:disabled:hover { background: var(--surface-sunken); box-shadow: none; }
.qmg-empty { text-align: center; color: var(--text-light); padding: 24px; }
.qmg-pager { display: flex; gap: 8px; align-items: center; justify-content: flex-end; padding: 10px 0; font-size: 13px; color: var(--text-sub); }
.qmg-status-tag { display: inline-block; padding: 2px 10px; border-radius: 10px; font-size: 12px; font-weight: 600; }
.qmg-status-draft { background: var(--border-light); color: var(--text-sub); }
/* v1.9.0（2026-10-20）新状态机标签色：待关联=灰、待报价=蓝、待确认=橙、已确认=绿、已导出=青（设计方案 1.1F） */
.qmg-status-pending-link { background: var(--border-light); color: var(--text-sub); }
.qmg-status-pending-quote { background: #D5E6F3; color: var(--primary); }
.qmg-status-pending-confirm { background: #FCE8D5; color: #B25E00; }
.qmg-status-confirmed { background: #DCEFE5; color: var(--success); }
.qmg-status-exported { background: #D5EFEF; color: #0E7C7B; }
/* v1.8.0（2026-10-17）：赢单（金）/输单（灰红）终态徽标 */
.qmg-status-won { background: #F6E7C1; color: #9A6B00; }
.qmg-status-lost { background: #F5D5D5; color: #A94442; }

/* 2026-10-31 状态机v2 录单流程：报价结果弹窗 赢单/输单按钮配色——赢单=系统成功色 --success、
   输单=系统危险色 --danger（只引用既有 CSS 变量，不新造颜色值；选中/悬停=实心，置灰沿用 .btn:disabled 规范） */
.btn-oc-won { background: var(--card-bg); color: var(--success); border: 1px solid var(--success); }
.btn-oc-won.btn-oc-on, .btn-oc-won:hover { background: var(--success); color: var(--card-bg); border-color: var(--success); }
.btn-oc-lost { background: var(--card-bg); color: var(--danger); border: 1px solid var(--danger); }
.btn-oc-lost.btn-oc-on, .btn-oc-lost:hover { background: var(--danger); color: var(--card-bg); border-color: var(--danger); }
/* 2026-11-04 R-C 录单上传 UI 改造：原 9 个灰格子「＋上传」→ 一个大拖拽区 + 已传缩略图网格 +
   上传中/失败状态遮罩（纯样式改造，接口/校验/提交零改动）。已传图继续复用 .calc-image-thumb/.calc-image-del。
   本块在 Print/Export 哈希段（C4 保护）之外，不影响打印/导出差值 */
.entry-upload-wrap { margin-top: 10px; }
.entry-dropzone {
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
    padding: 28px 16px; border: 1.5px dashed var(--border); border-radius: var(--radius-lg);
    background: var(--surface-muted); color: var(--text-sub); cursor: pointer; text-align: center;
    transition: border-color .15s ease, background .15s ease, color .15s ease;
}
.entry-dropzone:hover, .entry-dropzone.is-drag { border-color: var(--primary); background: var(--primary-bg); color: var(--primary-dark); }
.entry-dropzone.is-full { opacity: .6; cursor: not-allowed; }
.entry-dropzone.is-full:hover { border-color: var(--border); background: var(--surface-muted); color: var(--text-sub); }
.entry-drop-ic { font-size: 28px; line-height: 1; color: var(--primary); font-weight: 400; }
.entry-drop-main { font-size: 14px; font-weight: 600; }
.entry-drop-sub { font-size: 12px; color: var(--text-light); }
.entry-upload-head { display: flex; justify-content: flex-end; margin: 10px 0 8px; }
.entry-thumb-grid { display: grid; grid-template-columns: repeat(auto-fill, 84px); gap: 8px; }
.entry-thumb-mask {
    position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 4px; background: rgba(10, 35, 64, .55); color: #fff; font-size: 12px; padding: 4px;
}
.entry-thumb-error .entry-thumb-mask { justify-content: center; gap: 6px; background: var(--danger-soft); color: var(--danger); }
.entry-spinner {
    width: 20px; height: 20px; border: 2px solid rgba(255, 255, 255, .55); border-top-color: #fff;
    border-radius: 50%; animation: entry-spin .8s linear infinite;
}
.entry-thumb-tip { line-height: 1.2; }
.entry-thumb-errmsg { line-height: 1.25; text-align: center; word-break: break-all; font-size: 11px; }
.entry-retry-btn {
    border: 1px solid var(--danger); background: var(--card-bg); color: var(--danger);
    border-radius: 6px; font-size: 12px; line-height: 1.4; padding: 2px 10px; cursor: pointer;
}
.entry-retry-btn:hover { background: var(--danger); color: var(--card-bg); }
@keyframes entry-spin { to { transform: rotate(360deg); } }

/* v1.9.0（2026-10-20）型号管理：客户搜索下拉（新增/编辑弹窗，D5 从 CRM 档案搜索选择） */
.mdl-cust-wrap { position: relative; }
.mdl-cust-wrap input { width: 100%; }
.mdl-cust-list {
    position: absolute; left: 0; right: 0; top: calc(100% + 2px); z-index: 60;
    background: #fff; border: 1px solid var(--border); border-radius: 6px;
    max-height: 220px; overflow-y: auto; box-shadow: 0 6px 18px rgba(10, 35, 64, 0.14);
}
.mdl-cust-item { padding: 7px 12px; font-size: 13px; cursor: pointer; color: var(--text); }
.mdl-cust-item:hover { background: var(--surface-sunken); }
.mdl-cust-empty { color: var(--text-light); cursor: default; }
.mdl-cust-empty:hover { background: transparent; }

/* 编辑器顶部条 */
.calc-layout > .qmg-editor-bar { grid-column: 1 / -1; }
.calc-layout > .cp-toolbar { grid-column: 1 / -1; }
.qmg-editor-bar { display: flex; flex-direction: column; gap: 10px; }
.qmg-editor-head { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; }
.qmg-editor-title { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.qmg-doc-no { font-size: 16px; font-weight: 700; color: var(--text); }
.qmg-version { font-size: 13px; color: var(--text-sub); }
.qmg-editor-actions { display: flex; gap: 8px; }
.qmg-customer-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.qmg-cust-label { font-size: 13px; color: var(--text-sub); white-space: nowrap; }
.qmg-cust-hint { font-size: 11px; color: var(--text-light); }
.qmg-bound-label { font-size: 13px; color: var(--text-sub); padding: 3px 12px; background: var(--border-light); border-radius: 12px; white-space: nowrap; }
.qmg-bound-label.qmg-bound-on { background: #D5E6F3; color: var(--primary); font-weight: 600; }
#qmgCustomerNameInput[readonly], #qmgCustomerCodeInput[readonly] { background: var(--bg); color: var(--text-sub); cursor: default; }

/* 弹窗 */
.qmg-modal { position: fixed; inset: 0; z-index: 9000; display: flex; align-items: flex-start; justify-content: center; padding: 40px 20px; overflow-y: auto; }
.qmg-modal-mask { position: absolute; inset: 0; background: rgba(15, 23, 42, .5); }
.qmg-modal-dialog { position: relative; background: #fff; border-radius: 10px; box-shadow: 0 12px 40px rgba(10,35,64,0.26); width: 100%; max-width: 900px; max-height: 88vh; display: flex; flex-direction: column; }
.qmg-modal-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; border-bottom: 1px solid var(--border); font-weight: 700; color: var(--text); }
.qmg-modal-close { background: none; border: none; font-size: 22px; cursor: pointer; color: var(--text-light); line-height: 1; transition: color var(--transition); }
.qmg-modal-close:hover { color: var(--text); }
.qmg-modal-body { padding: 16px 20px; overflow-y: auto; flex: 1; }
.qmg-modal-footer { padding: 12px 20px; border-top: 1px solid var(--border); display: flex; justify-content: flex-end; gap: 10px; }

.qmg-detail-section { margin-bottom: 20px; }
.qmg-detail-section h4 { margin: 0 0 10px; font-size: 14px; color: var(--text); border-left: 3px solid var(--primary-light); padding-left: 8px; }
.qmg-detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 8px 18px; }
.qmg-detail-row { display: flex; font-size: 13px; }
.qmg-detail-row label { color: var(--text-sub); width: 110px; flex-shrink: 0; }
.qmg-detail-row span { color: var(--text); word-break: break-all; }
.qmg-detail-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.qmg-detail-table th, .qmg-detail-table td { padding: 6px 8px; border: 1px solid var(--border); text-align: left; }
.qmg-detail-table th { background: var(--surface-muted); font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--text-light); }

.qmg-form-row { margin-bottom: 10px; display: flex; flex-direction: column; }
.qmg-form-row label { font-size: 13px; margin-bottom: 4px; color: var(--text-sub); }
.qmg-form-input { height: 32px; padding: 4px 10px; border: 1px solid var(--border); border-radius: 6px; font-size: 13px; box-sizing: border-box; font-family: inherit; color: var(--text); background: #fff; }
.qmg-form-input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(46,127,184,0.14); }
.req-mark { color: var(--danger); }
.qmg-missing { color: var(--danger); cursor: pointer; text-decoration: underline; }

@media (max-width: 1200px) {
    .crm-form-grid, .crm-info-grid { grid-template-columns: repeat(2, 1fr); }
    .crm-detail-cols { grid-template-columns: 1fr; }
    .crm-kanban { grid-template-columns: repeat(4, 1fr); }
}

/* ========== 账号管理（2026-09-30） ========== */
.acc-perm-group { border: 1px solid var(--border-light); border-radius: 8px; padding: 8px 12px; margin-bottom: 8px; background: var(--surface-muted); }
.acc-perm-gtitle { font-size: 12px; font-weight: 700; color: var(--text-sub); margin-bottom: 6px; }
.acc-perm-item { display: inline-flex; align-items: center; gap: 4px; font-size: 12.5px; margin: 3px 16px 3px 0; cursor: pointer; }
.acc-perm-item input { margin: 0; cursor: pointer; }

/* ========== 客户专属价格联动工具条（2026-09-30） ========== */
.cp-toolbar {
    display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
    margin: 0 0 12px; padding: 10px 14px;
    background: linear-gradient(90deg, var(--primary-bg), var(--surface-muted));
    border: 1px solid #B8D4E7; border-radius: 10px;
}
.cp-toolbar .cp-title { font-size: 13px; font-weight: 700; color: var(--primary-dark); white-space: nowrap; }
.cp-toolbar .crm-input { min-width: 180px; }
.cp-badge { font-size: 11px; padding: 2px 10px; border-radius: 10px; font-weight: 600; white-space: nowrap; }
.cp-badge-general { background: var(--surface-sunken); color: var(--text-sub); }
.cp-badge-customer { background: #FBE9DA; color: #B85A18; }
.cp-hint { font-size: 11.5px; color: var(--text-light); }

/* ========== 含税/未税计税模式高亮（2026-10-06 问题6） ========== */
/* 默认（含税）蓝色渐变保持原样；未税模式切换为琥珀色，卡片与下拉同步给出明确视觉反馈 */
.price-highlight { transition: background 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; border: 2px solid transparent; box-sizing: border-box; }
.price-highlight.tax-mode-untaxed {
    background: linear-gradient(135deg, #B85A18 0%, #C96A28 55%, var(--accent) 100%);
    border-color: #F0D9B0;
    box-shadow: 0 10px 28px rgba(184,90,24,0.28);
}
.price-highlight.tax-mode-untaxed .price-label::after { content: '（未税口径）'; font-size: 12px; opacity: .85; margin-left: 6px; }
.tax-select-taxinc { border-color: var(--primary-light) !important; box-shadow: 0 0 0 2px rgba(15,92,140,.16); }
.tax-select-untaxed { border-color: #C96A28 !important; box-shadow: 0 0 0 2px rgba(201,106,40,.18); }

/* CRM 详情页：专属价格方案绑定列表 */
.crm-scheme-box { padding: 2px 0; }
.crm-scheme-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; }
.crm-scheme-item { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border: 1px solid var(--border-light);
    border-radius: 8px; font-size: 13px; cursor: pointer; background: #fff; }
.crm-scheme-item:hover { border-color: #7FB3D5; background: var(--surface-muted); }
.crm-scheme-bound { border-color: var(--accent); background: #FDF3E6; }
.crm-scheme-disabled { opacity: .55; cursor: not-allowed; background: var(--surface-muted); }
/* 2026-11-03 P4：客户卡「适用价格配置」只读行——无勾选/无点击，去掉手型与 hover 高亮 */
.crm-scheme-ro { cursor: default; }
.crm-scheme-ro:hover { border-color: var(--border-light); background: #fff; }
.crm-scheme-ro.crm-scheme-bound:hover { border-color: var(--accent); background: #FDF3E6; }
.crm-scheme-name { flex: 1; font-weight: 600; }
.crm-hint-line { font-size: 11.5px; color: var(--text-light); line-height: 1.6; }

/* ===== 2026-11-03 P4：价格配置页「绑定客户」穿梭框 ===== */
.bind-shuttle { display: flex; gap: 10px; margin: 12px 0; align-items: stretch; }
.bind-panel { flex: 1; border: 1px solid var(--border-light); border-radius: 8px;
    display: flex; flex-direction: column; min-width: 0; background: #fff; }
.bind-panel-head { display: flex; justify-content: space-between; align-items: center;
    padding: 8px 10px; border-bottom: 1px solid var(--border-light);
    background: var(--surface-muted); border-radius: 8px 8px 0 0; font-size: 13px; font-weight: 600; }
.bind-count { color: var(--text-light); font-weight: 400; font-size: 12px; }
.bind-search { margin: 8px 10px 4px; padding: 5px 8px; font-size: 13px; }
.bind-list { overflow: auto; max-height: 300px; padding: 4px 10px 8px; flex: 1; }
.bind-item { display: flex; align-items: center; gap: 8px; padding: 6px 4px;
    font-size: 13px; border-bottom: 1px dashed var(--border-light); }
.bind-item:last-child { border-bottom: 0; }
.bind-item-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bind-item-code { color: var(--text-light); font-size: 11.5px; white-space: nowrap; }
.bind-item-locked { background: #f7f8fa; color: var(--text-light); }
.bind-lock { color: #9a6700; font-size: 11.5px; white-space: nowrap; }
.bind-arrows { display: flex; flex-direction: column; justify-content: center; gap: 10px; }
.bind-empty { color: var(--text-light); font-size: 12.5px; padding: 16px; text-align: center; }

/* ===== v3 选项化重构补充样式（2026-10-15） ===== */
.form-group-wide { grid-column: 1 / -1; }
.form-group-wide input { width: 100%; }
.cfg-sub-table { margin: 6px 0 10px; padding: 8px; background: var(--surface-muted); border-left: 3px solid var(--accent, #2f6fed); border-radius: 4px; }
.cfg-sub-title { font-weight: 600; margin: 4px 0 6px; font-size: 13px; }
.cfg-sub-table .config-table { margin: 6px 0; }
.cfg-auto-range { margin-top: 4px; font-size: 12px; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.cfg-auto-range input { padding: 2px 4px; }
.proc-desc-cell { font-size: 10px; line-height: 1.4; max-width: 260px; }

/* ===== 自动化流程模块（2026-10-19 并入，auto-*）：复用 crm-* 体系视觉 ===== */
.auto-cat { margin-bottom: 22px; }
.auto-cat-title { font-size: 13px; font-weight: 700; color: var(--text-muted, #666); letter-spacing: 2px; margin-bottom: 10px; padding-left: 2px; }
.auto-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 14px; }
.auto-card { display: flex; flex-direction: column; gap: 8px; padding: 14px 16px; }
.auto-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.auto-card-name { font-weight: 700; font-size: 15px; }
.auto-card-desc { font-size: 12px; color: var(--text-muted, #888); line-height: 1.6; min-height: 32px; }
.auto-card-meta { display: flex; align-items: center; gap: 8px; font-size: 12px; min-height: 22px; }
.auto-card-actions { display: flex; gap: 8px; flex-wrap: wrap; padding-top: 4px; border-top: 1px solid var(--border, #eee); margin-top: 2px; }
.auto-side { font-size: 11px; padding: 2px 8px; border-radius: 999px; white-space: nowrap; }
.auto-side-ok { background: #e8f7ee; color: #2e7d4f; }
.auto-side-warn { background: #fdf3e0; color: #a86a12; }
.auto-side-danger { background: #fdeaea; color: #c0392b; }
.auto-st { font-size: 11px; padding: 2px 8px; border-radius: 999px; }
.auto-st-run { background: #e3f0fd; color: #1a6fc4; }
.auto-st-ok { background: #e8f7ee; color: #2e7d4f; }
.auto-st-err { background: #fdeaea; color: #c0392b; }
.auto-st-stop { background: #f0f0f2; color: #777; }
.auto-time { color: var(--text-muted, #999); }
.auto-warn { background: #fff8e6; border: 1px solid #f0dfae; color: #8a6d1a; font-size: 12px; padding: 8px 12px; border-radius: 6px; margin-bottom: 12px; line-height: 1.6; }
.auto-modal { width: min(760px, 94vw); }
.auto-stream { background: #14161c; color: #d6dae2; font-family: Consolas, 'Courier New', monospace; font-size: 12px; line-height: 1.7; padding: 12px; border-radius: 6px; max-height: 45vh; overflow-y: auto; white-space: pre-wrap; word-break: break-all; }
.auto-line-err { color: #ff9d8a; }
.auto-stream-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; }
.auto-cfg-block { margin-bottom: 16px; }
.auto-cfg-title { font-size: 13px; font-weight: 700; margin: 12px 0 8px; padding-left: 8px; border-left: 4px solid var(--accent, #2f6fed); }
.auto-cfg-sec { font-size: 12px; color: var(--text-muted, #888); font-weight: 700; margin: 10px 0 4px; letter-spacing: 1px; }
.auto-times { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0; }
.auto-time-chip { display: inline-flex; align-items: center; gap: 6px; background: var(--surface-muted, #f6f7f9); border: 1px solid var(--border, #e3e5e8); border-radius: 6px; padding: 4px 8px; }
.auto-time-input { width: 58px; border: none; background: transparent; font-size: 13px; text-align: center; }
.auto-log-wrap { max-height: 55vh; overflow-y: auto; }
.auto-log-row:hover { background: var(--surface-muted, #f6f7f9); cursor: pointer; }

/* ===== 报价计算器截图上传（2026-10-20 需求1：≤9张，仅计算器页显示，不进详情/导出） ===== */
.calc-image-upload { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.calc-image-upload .hint { color: var(--text-light); font-size: 12px; }
.calc-image-grid { display: flex; flex-wrap: wrap; gap: 8px; width: 100%; }
.calc-image-thumb { position: relative; width: 84px; height: 84px; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; background: var(--surface-muted); }
.calc-image-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.calc-image-thumb .calc-image-del {
    position: absolute; top: 2px; right: 2px; width: 20px; height: 20px; line-height: 18px;
    text-align: center; border: none; border-radius: 50%; background: rgba(10,35,64,0.62); color: #fff;
    font-size: 13px; cursor: pointer; padding: 0;
}
.calc-image-thumb .calc-image-del:hover { background: var(--danger); }

/* 2026-10-29 需求1：各大类卡片底部截图上传块（与基本信息「上传截图」同款控件，独立计数） */
.group-image-upload { margin-top: 12px; padding-top: 12px; border-top: 1px dashed var(--border); }
.group-image-upload > label { display: block; font-weight: 600; margin-bottom: 6px; }

/* ========== EQ 发送页（2026-10-23 EQ自动化改造，eq-app.js 专用） ========== */
.eq-card { padding: 16px 20px; }
.eq-card-title { font-size: 14px; font-weight: 700; color: var(--text, #16324f); margin-bottom: 12px; }
.eq-drop { border: 2px dashed var(--border, #c9d6e4); border-radius: 8px; padding: 22px; text-align: center; cursor: pointer; transition: all .15s; }
.eq-drop:hover, .eq-drop-hover { border-color: var(--primary, #1f6fb8); background: rgba(31,111,184,.05); }
.eq-drop input[type="file"] { display: none; }
.eq-drop-hint { font-size: 13px; color: var(--text-light, #7a8fa6); }
.eq-file-list { display: flex; flex-direction: column; gap: 6px; margin-top: 10px; }
.eq-file-item { display: flex; align-items: center; gap: 10px; padding: 6px 10px; border: 1px solid var(--border, #c9d6e4); border-radius: 6px; font-size: 13px; }
.eq-file-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.eq-status { margin: 4px 0 12px; font-size: 13px; line-height: 1.6; }
.eq-status-ok { color: #1e8e4e; }
.eq-status-warn { color: #b06f00; }
.eq-status-err { color: #c0392b; }
.eq-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 16px; }
.eq-span2 { grid-column: span 2; }
.eq-attach { display: flex; flex-wrap: wrap; gap: 6px; min-height: 32px; align-items: center; }
.eq-chip { padding: 3px 10px; border-radius: 12px; background: rgba(31,111,184,.08); border: 1px solid var(--border, #c9d6e4); font-size: 12px; }
.eq-actions { display: flex; align-items: center; gap: 14px; margin-top: 16px; }
.eq-result { margin-top: 12px; font-size: 13px; line-height: 1.7; }
.eq-td-clip { max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ===== 账号与权限管理（2026-10-24 权限重构批次3：角色管理三区块编辑器） ===== */
.acc-subtabs { display: flex; gap: 4px; }
.acc-subtab { padding: 7px 16px; border: 1px solid var(--border, #c9d6e4); background: #fff; border-radius: 6px;
    font-size: 13px; cursor: pointer; color: var(--text, #334155); }
.acc-subtab:hover { border-color: var(--primary-light, #2e7fb8); color: var(--primary, #0f5c8c); }
.acc-subtab.active { background: var(--primary, #0f5c8c); border-color: var(--primary, #0f5c8c); color: #fff; font-weight: 600; }

/* 2026-11-03 权限 A+ P1：销售组织子页（珍珠皮肤变量，无新框架） */
.so-wrap { display: flex; flex-direction: column; gap: 14px; padding: 4px 2px; }
.so-head select { max-width: 420px; }
.so-body { border: 1px solid var(--border, #c9d6e4); border-radius: 8px; padding: 12px; background: var(--surface-soft, #f7fafc); }
.so-title { font-weight: 600; font-size: 14px; margin-bottom: 10px; display: flex; align-items: center; gap: 8px; }
.so-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 6px 14px; max-height: 460px; overflow: auto; }
.so-pick-item { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border: 1px solid var(--border, #d9e2ec);
    border-radius: 6px; background: #fff; cursor: pointer; }
.so-pick-item:hover { border-color: var(--primary-light, #2e7fb8); }
.so-pick-name { font-weight: 600; }
.so-pick-locked { background: #f4f5f7; cursor: not-allowed; opacity: .72; }
.so-pick-locked:hover { border-color: var(--border, #d9e2ec); }
.so-foot { display: flex; align-items: center; }
.acc-rl-section { margin-top: 16px; padding-top: 12px; border-top: 1px dashed var(--border, #c9d6e4); }
.acc-rl-title { font-size: 13px; font-weight: 700; margin-bottom: 10px; color: var(--text, #22303f); }
/* 页面权限开关卡片：中文+说明，非技术用户友好 */
.acc-perm-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 8px; }
.acc-perm-card { display: flex; gap: 8px; align-items: flex-start; padding: 10px 12px; border: 1.5px solid var(--border, #c9d6e4);
    border-radius: 8px; cursor: pointer; background: #fff; transition: border-color .15s, background .15s; }
.acc-perm-card:hover { border-color: var(--primary-light, #2e7fb8); }
.acc-perm-card.on { border-color: var(--primary, #0f5c8c); background: rgba(46,127,184,.08); }
.acc-perm-card input { margin-top: 2px; }
.acc-perm-card-t { font-size: 13px; font-weight: 600; }
.acc-perm-card-d { font-size: 11.5px; color: var(--text-light, #7a8fa6); margin-top: 2px; line-height: 1.5; }
/* 操作权限勾选 */
.acc-perm-item { display: block; padding: 5px 6px; font-size: 13px; border-radius: 5px; cursor: pointer; }
.acc-perm-item:hover { background: rgba(46,127,184,.06); }
/* 数据范围按钮组 */
.acc-scope-title { font-size: 13px; font-weight: 600; margin: 10px 0 6px; }
.acc-scope-btns { display: flex; flex-wrap: wrap; gap: 8px; }
.acc-scope-btn { padding: 8px 14px; border: 1.5px solid var(--border, #c9d6e4); background: #fff; border-radius: 6px;
    font-size: 13px; cursor: pointer; color: var(--text, #334155); }
.acc-scope-btn:hover { border-color: var(--primary-light, #2e7fb8); }
.acc-scope-btn.on { border-color: var(--primary, #0f5c8c); background: rgba(46,127,184,.12); font-weight: 600; color: var(--primary, #0f5c8c); }
/* 账号弹窗里的角色权限只读摘要 */
.acc-role-summary { font-size: 12.5px; line-height: 1.9; background: rgba(46,127,184,.06);
    border: 1px solid var(--border, #c9d6e4); border-radius: 6px; padding: 10px 12px; }
.acc-perm-group { margin-top: 10px; }

/* ===== 2026-11-03 权限 A+ P3：角色编辑器按页面分组（一个页面一组：页面访问/操作按钮/数据权限）===== */
.rl-page { border: 1.5px solid var(--border, #c9d6e4); border-radius: 10px; margin: 10px 0; overflow: hidden; }
.rl-page.off { opacity: .62; background: #f8fafc; }
.rl-page-head { display: flex; align-items: center; gap: 8px; padding: 10px 14px; background: #f1f5f9; cursor: pointer; user-select: none; }
.rl-page-head.on { background: rgba(46,127,184,.12); }
.rl-page-title { font-weight: 700; font-size: 14px; }
.rl-page-body { padding: 10px 14px 12px; }
.rl-page.off .rl-page-body { display: none; }
.rl-block-title { font-size: 12.5px; font-weight: 700; color: var(--text-light, #64748b); margin: 10px 0 6px; text-transform: none; }
.rl-tier { margin: 4px 0 8px; }
.rl-tier-label { font-size: 12px; color: var(--primary, #0f5c8c); font-weight: 600; margin: 6px 0 2px; }
.rl-action-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 2px 14px; }
.rl-data-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 2px 14px; }
.rl-warn { background: #fef9c3; border: 1px solid #facc15; color: #713f12; border-radius: 6px;
    padding: 7px 10px; font-size: 12.5px; margin: 5px 0; }
.rl-mode-row { display: flex; gap: 14px; align-items: center; margin: 6px 0 2px; font-size: 13px; }
.rl-diff-add { color: #15803d; font-weight: 600; }
.rl-diff-rm { color: #b91c1c; font-weight: 600; }
.rl-prev-grid td, .rl-prev-grid th { padding: 4px 8px; font-size: 12.5px; border: 1px solid var(--border, #d9e2ec); }
.rl-prev-grid { border-collapse: collapse; margin: 6px 0; }

/* ===== 选人控件（2026-10-26 方案A：搜索式多选，客户可见账号/批量共享统一使用） ===== */
.usr-pick { position: relative; }
.usr-pick-box { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-height: 36px;
    padding: 4px 8px; border: 1px solid var(--border, #c9d6e4); border-radius: 6px; background: #fff; }
.usr-pick-box:focus-within { border-color: var(--primary-light, #2e7fb8); box-shadow: 0 0 0 2px rgba(15,92,140,.16); }
.usr-pick-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px;
    background: rgba(31,111,184,.10); border: 1px solid rgba(31,111,184,.28); font-size: 12px; color: var(--primary, #0f5c8c); }
.usr-pick-x { cursor: pointer; color: var(--text-light, #7a8fa6); font-size: 13px; line-height: 1; padding: 0 2px; }
.usr-pick-x:hover { color: #c0392b; }
.usr-pick-input { flex: 1; min-width: 140px; border: none; outline: none; font-size: 13px;
    padding: 4px 2px; background: transparent; color: var(--text, #22303f); }
.usr-pick-count { margin-top: 4px; font-size: 12px; color: var(--text-light, #7a8fa6); }
.usr-pick-panel { margin-top: 6px; border: 1px solid var(--border, #c9d6e4); border-radius: 6px;
    max-height: 220px; overflow-y: auto; background: #fff; }
.usr-pick-item { display: flex; align-items: center; gap: 8px; padding: 7px 10px; cursor: pointer; font-size: 13px; }
.usr-pick-item + .usr-pick-item { border-top: 1px solid rgba(0,0,0,.05); }
.usr-pick-item:hover { background: rgba(46,127,184,.07); }
.usr-pick-item.on { background: rgba(46,127,184,.10); }
.usr-pick-cbx { width: 14px; height: 14px; border: 1.5px solid var(--border, #c9d6e4); border-radius: 3px; flex: none; background: #fff; }
.usr-pick-cbx.on { background: var(--primary, #0f5c8c); border-color: var(--primary, #0f5c8c); position: relative; }
.usr-pick-cbx.on::after { content: '✓'; position: absolute; inset: 0; color: #fff; font-size: 10px;
    display: flex; align-items: center; justify-content: center; }
.usr-pick-name { font-weight: 600; color: var(--text, #22303f); }
.usr-pick-sub { margin-left: auto; font-size: 12px; color: var(--text-light, #7a8fa6); }
.usr-pick-empty { padding: 14px; text-align: center; font-size: 12.5px; color: var(--text-light, #7a8fa6); }

/* ===== 2026-10-30 P2/P3 单据方案绑定（列表黄标/进度/执行方案横幅/换绑差异表） ===== */
.exec-scheme-banner { padding: 9px 12px; border-radius: 6px; font-size: 13px; font-weight: 600;
    background: rgba(46,127,184,.08); border: 1px solid rgba(46,127,184,.25); color: var(--text, #22303f); }
.exec-scheme-banner.unbound { background: rgba(230,170,20,.12); border-color: rgba(210,150,10,.5); color: #8a6100; }
.exec-scheme-banner .snap-link { margin-left: 10px; font-weight: 500; cursor: pointer; color: var(--primary, #0f5c8c); text-decoration: underline; }
.exec-scheme-info { font-size: 13px; color: var(--text, #22303f); padding: 4px 2px; }
.exec-scheme-info.unbound { color: #8a6100; background: rgba(230,170,20,.12); border-radius: 6px; padding: 8px 12px; font-weight: 600; }
/* 2026-10-30 UI-v2 需求B7：方案绑定变更记录（时间/操作人/旧方案→新方案/金额变化），详情页与弹窗共用 */
.scheme-changes { margin-top: 6px; }
.scheme-change-row { font-size: 12px; padding: 2px 0; border-top: 1px dashed var(--border, #dde3ea); }
.qmg-binding-tag { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 12px;
    background: rgba(230,170,20,.18); color: #8a6100; border: 1px solid rgba(210,150,10,.45); }
.qmg-binding-progress { font-size: 12.5px; color: var(--text-light, #7a8fa6); padding: 4px 2px 8px; }
.qmg-binding-progress .un { color: #8a6100; font-weight: 700; }
.qmg-unbound-filter { font-size: 12.5px; color: var(--text, #22303f); display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.bind-diff-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-top: 8px; }
.bind-diff-table th, .bind-diff-table td { border: 1px solid var(--border, #c9d6e4); padding: 5px 7px; text-align: right; }
.bind-diff-table th:first-child, .bind-diff-table td:first-child { text-align: left; }
.bind-diff-table .up { color: #c0392b; font-weight: 700; }
.bind-diff-table .down { color: #1e7e34; font-weight: 700; }
.bind-diff-total { margin-top: 8px; font-size: 13px; font-weight: 700; }

/* ==========================================================================
   R-A 只读查看（2026-11-04）
   只读横幅配色 + 计算器只读态对动态重渲染控件的持久遮罩（JS 会同步 disable，
   本段兜底覆盖表单/截图格重渲染后新生的控件）。放在文件末尾——
   ui-check C4 仅哈希 Print/Export～Responsive 两标记之间，本段不在其范围内。
   ========================================================================== */
.ro-readonly-banner { background:#eef4fb; border:1px solid #b9d2ec; border-left:4px solid #2e7fb8; color:#1f4e79; }
/* 计算器只读：只保留返回，其余动作入口全遮（面积计算/选截图/分组上传/删截图/添加·复制明细） */
#tab-calculator.calc-readonly .result-actions { display:none !important; }
#tab-calculator.calc-readonly #btnCalcArea,
#tab-calculator.calc-readonly #btnPickCalcImage,
#tab-calculator.calc-readonly .group-image-upload button,
#tab-calculator.calc-readonly .calc-image-del { display:none !important; }
/* 只读输入控件灰底（JS 已置 disabled，这里统一视觉，含动态表单重渲染后的新节点） */
#tab-calculator.calc-readonly input,
#tab-calculator.calc-readonly select,
#tab-calculator.calc-readonly textarea,
#tab-quotation.quote-readonly input,
#tab-quotation.quote-readonly textarea,
#tab-quotation.quote-readonly select { background:#f4f5f7 !important; color:#5a6572; cursor:not-allowed; }
