﻿/****** iframe页面 公共样式 *******/
.iframe_container {
    padding: 7px;
    height: calc(100% - 27px);
}
/* =====================================================================
   lyh 2026-09-20：查询区「列宽 / 排序 / 对齐」统一规则
   ---------------------------------------------------------------------
   ★ 第四版核心变更：按 ColSpan 精确占列（解决「排列错位、杂乱、没对齐」）
     ------------------------------------------------------------------
     第三版把字段项设为 flex:0 0 auto（按内容宽）以救活 ColSpan(2)，
     但副作用是字段宽度脱离 4 列网格基准 —— 多个字段挤同一行时各自按
     内容宽显示，实测列宽参差到 0.60~1.32 列、dx-col-N 序号失序
     （0,1,3,0,1），视觉上就是「排列错位、杂乱、没对齐」。

     修复：后端 PublicDeal.构建列表头 在产出字段时按 ColSpan 写上
     CssClass（cs1 / cs2 / cs4），CSS 第 4 条据此用 flex-basis 精确
     占列 —— 每个字段严格占满整数列，恢复整齐的 4 列网格。
     （CSS 无法自行反推 ColSpan，故必须由后端下发类名。）

     实测（/Buyin/BuyinOrder，boxW=1564）：
       改前：组织 0.68列 / 操作日期 1.32列 / 采购单号 0.60列 …（参差）
             dx-col-N = 0,1,3,0,1（失序）
       改后：组织 0.249列 / 操作日期 0.499列 / 采购单号 0.249列（精确）
             采购类型·简称·全称 全部 0.249列；contX 对齐 69/478/867/1258
     12 页回归：noCs=0（每字段都有类）、越界=0（无字段超出所在列）

   ★ 第三版：作用域不再依赖 .iframe_container
     ------------------------------------------------------------------
     第二版的规则全部写成 `.iframe_container .dx-form:has(.form_button) ...`，
     实测发现全站 46 个带 form_button 的页面里有 6 个【没有 .iframe_container
     包裹层】，各自使用自己的页面级 class，导致这些页面的查询区规则完全失效：
       /LockPrice/LockPriceIndex         → .lock-price-page / .lock-price-query
       /BasicInformation/BasicInfo       → .basic-info-container
       /MenuManagement/MenuManagementIndex → .menu-manage-page
       /RawMaterialPSI/RawMaterialPSIIndex → .raw-material-psi-page
       /StripOrderOne/StripOrderOneIndex  → .strip-one-page
       /WeighingRoom/WeighingRoomIndex    → .weighing-room-page

     修复思路：form_button 这个类【只由各页面查询区的 AddButton() 产出】，
     本身就是最精准的判据，无需再叠加容器前缀。因此统一去掉
     `.iframe_container`，改为 `.dx-form:has(.form_button) ...` 全局生效。
     弹窗按钮走 popup 底部 toolbar，不带 form_button，天然不受影响
     （弹窗隔离实测：wrap:nowrap / rowGap:normal / 富文本仍 94px 多行）。
   ===================================================================== */
/* 1) 所有 collection：横向排列 + 允许换行 + 底部对齐 + 行间 4px */
.dx-form:has(.form_button) .dx-box-flex.dx-box.dx-collection {
    flex-direction: row !important;
    flex-wrap: wrap !important;
    align-items: flex-end !important;
    row-gap: 4px !important;
}

/* 2) 中间包裹层全部透明：嵌在 item 里的 collection / 各种 group+layout 层
      —— 让字段与按钮上浮到同一个 flex 上下文（第一版保留） */
.dx-form:has(.form_button) .dx-box-item > .dx-box.dx-collection,
.dx-form:has(.form_button) .dx-box-item > .dx-box-item-content,
.dx-form:has(.form_button) .dx-box-item-content > .dx-box.dx-collection,
.dx-form:has(.form_button) .dx-box-item-content > .dx-form-group,
.dx-form:has(.form_button) .dx-box-item-content > .dx-form-group-content,
.dx-form:has(.form_button) .dx-box-item-content > .dx-layout-manager,
.dx-form:has(.form_button) .dx-box-item-content > .dx-responsivebox,
.dx-form:has(.form_button) .dx-item-content > .dx-box.dx.collection,
/* group 外壳（DevExtreme 给含 colSpan / 组字段套的 .dx-field-item 包装） */
.dx-form:has(.form_button) .dx-field-item.dx-field-item-has-group,
.dx-form:has(.form_button) .dx-item.dx-box-item {
    display: contents !important;
}

/* 3) ★ 解开宽度锁：组壳那层原本只有 1057px（外层容器 1580px），
      右侧 523px 被空置 —— 一律撑满，查询区用足整行宽度 */
.dx-form:has(.form_button) .dx-form-group,
.dx-form:has(.form_button) .dx-form-group-content,
.dx-form:has(.form_button) .dx-layout-manager,
.dx-form:has(.form_button) .dx-responsivebox,
.dx-form:has(.form_button) .dx-field-item-content {
    width: 100% !important;
}

/* 4) ★★ 字段项：按 ColSpan 精确占列（第四版核心修复）
      ------------------------------------------------------------------
      问题：第三版把字段项设为 flex:0 0 auto（按内容宽），虽让 ColSpan(2) 生效，
            却让字段宽度脱离 4 列网格基准 —— 多个字段挤同一行时各自按内容宽显示，
            实测列宽参差到 0.60~1.32 列、dx-col-N 序号失序（0,1,3,0,1），
            视觉上就是「排列错位、杂乱、没对齐」。
      修复：后端在「构建列表头」产出字段时按 ColSpan 写入 CssClass（cs1/cs2/cs4），
            此处按类名用 flex-basis 精确占列 —— 每个字段严格占满整数列，
            恢复整齐的 4 列网格；跨列字段（日期区间/富文本/超宽字段）仍占 2 列。

      ★ 第五版：为按钮预留空间，解决「4 个字段正好占满一行时按钮被挤到第 2 行」
        实测（/Vendors/Vendors，boxW=1558）：4 个单列字段各 387.5px，合计 1550px，
        只剩 8px，而查询按钮宽 90px + 6px padding = 96px → 必然换行，白白多占一行。
        改法：单列宽度从 `25% - 2px` 收窄到 `calc(25% - 26px)`，
        4 列共让出 104px ≈ 刚好容纳一个按钮；按钮装得下就不再换行。
        收窄量取 26px 的依据：常见按钮宽 70~96px（含 6px 左内边距），
        4 列均摊每列让 26px（共 104px）可覆盖「单个查询按钮」的绝大多数情形。
        （按钮本身 flex:0 0 auto，宽度自适应，不需要预设大小）

      间隙：单行最多 4 个字段，字段间实际留出的空隙由 row-gap/gap 承担，
            这里用负 px 抵消是为了避免 4×(25%) 恰好等于 100% 导致换行。
      ------------------------------------------------------------------ */
.dx-form:has(.form_button) .dx-field-item:not(.dx-field-button-item) {
    flex: 0 0 auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
}

/* 4a) 单列：占 1/4 行宽，并让出 26px 给查询按钮 */
.dx-form:has(.form_button) .dx-field-item.cs1 {
    flex-basis: calc(25% - 26px) !important;
    width: calc(25% - 26px) !important;
    max-width: calc(25% - 26px) !important;
}

/* 4b) 跨 2 列：日期区间 / 富文本 / 数据库宽度超 1 列的字段
      ★ 第十版（2026-09-22）：让出量从 26px 改为 52px = 26px × 2。
      原因：26px 的让出量是按【列】计的，跨列项占 2 列、却只让了 1 份，
      于是「1 个 cs2」比「2 个 cs1」宽出整整 26px，右边界对不上下方网格。
      实测（/Buyin/BuyinOrder，boxW=1666）：
        改前 组织 cs1=391 | 操作日期 cs2=807(右边界1205) | 采购单号 cs1=391
             下一行 简称 391 + 全称 391（右边界 1179）→ 日期区间比标准 2 列宽 26px
        改后 操作日期 cs2=781(右边界1179) → 与「全称」右边界完全重合，差 0px
      行数不变（仍 2 行），其余字段宽度未受影响。
      注：让出量按列递增只会释放空间，不会把字段挤出换行，方向安全。 */
.dx-form:has(.form_button) .dx-field-item.cs2 {
    flex-basis: calc(50% - 52px) !important;
    width: calc(50% - 52px) !important;
    max-width: calc(50% - 52px) !important;
}

/* 4c) 占满整行（保留为兜底）：后端第五版已不再产出 cs4 ——
      「末行独占 4 列」规则已移除（用户要求日期区间始终只占 2 列）。
      此处保留以免历史缓存页面出现无类名而退回按内容宽。 */
.dx-form:has(.form_button) .dx-field-item.cs4 {
    flex-basis: 100% !important;
    width: 100% !important;
    max-width: 100% !important;
}

/* 5) ★ 按钮项：不撑满高度（改前 62px 导致独占一行、字段被挤到下一行），
      压到与字段同高并垂直居中；order 让多个按钮统一排到最后连续排列 */
.dx-form:has(.form_button) .dx-field-button-item {
    order: 999 !important;
    flex: 0 0 auto !important;
    width: auto !important;
    min-width: 0 !important;
    height: auto !important;
    max-height: 27px !important;
    align-self: center !important;
    padding-left: 6px !important;
}

    /* 6) 按钮本体：宽度自适应、文字不折行，且不被压成细条，与字段同高 */
    .dx-form:has(.form_button) .dx-field-button-item .dx-button {
        width: auto !important;
        min-width: 64px !important;
        height: 27px !important;
        white-space: nowrap;
    }

/* 7) ★ 行距压紧：DevExtreme 给 field-item / box-item 带 13px 纵向 margin，
      多行时 53 = 13 + 27 + 13，纵向空间被浪费 —— 清零，行间只留 row-gap */
.dx-form:has(.form_button) .dx-field-item,
.dx-form:has(.form_button) .dx-box-item,
.dx-form:has(.form_button) .dx-item {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}

/* 8) ★★ 标签宽度统一 62px —— 解决「第 1 行与第 2 行输入框左边界不对齐」。
      lyh 2026-09-20：根因是 DevExtreme 按「每行最长标签」逐行算标签宽，
      把结果写进 .dx-field-item-label-content 的内联 style：
        第一行最长是「操作日期」(4 字) → 全行 width:62px；
        第二行最长只有「全称」(2 字)   → 全行 width:36px。
      于是第二行输入框起点比第一行左偏 26px，视觉上「乱」。
      实测三页（BuyinOrder / InStock / MaterialArrive）：
        改前 labelW 有 2~3 种：[36,62] / [36,62] / [49,62]；
        改后一律 [62]，首列输入框起点全部收敛到 69，
        后续列以 287px 等步进（356 / 643 / 930 …）整齐排列。
      取值 62px 的理由：最长标签「操作日期」实测 62px（4 字 × 15px + 内边距），
        低于此值（如 52px）DevExtreme 会对长标签做补偿，反而在同一行内产生
        59/79 两种起点；62px 恰好容纳全部 4 字标签，无需补偿。
      注：后端 FormItemLabelBuilder 无 Width 方法（仅 Alignment/Location/
        Option/ShowColon/Template/Text/Visible），故只能走 CSS。
      弹窗标签不受影响（弹窗无 form_button，见文首第三版说明）。 */
.dx-form:has(.form_button) .dx-field-item-label {
    width: 72px !important;
    flex: 0 0 72px !important;
}

.dx-form:has(.form_button) .dx-field-item-label-content {
    width: 72px !important;
}

.dx-form:has(.form_button) .dx-field-item-label-text {
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
}

/* 8b) ★ 标签文字统一左对齐
      dm 2026-10-20：DevExtreme 会按「每一行」给标签写内联 text-align，
      导致多行查询区里第一行标签右对齐、末行（如「板带」）左对齐，两种观感混在一起。
      此处对标签三层容器统一强制 text-align:left，用 !important 压掉内联样式，全站查询区一致。
      作用域仍限定 .dx-form:has(.form_button)，只命中查询区，不影响弹窗。 */
.dx-form:has(.form_button) .dx-field-item-label,
.dx-form:has(.form_button) .dx-field-item-label-content,
.dx-form:has(.form_button) .dx-field-item-label-text {
    text-align: left !important;
}

/* 8a) ★ 编辑器填满列格：数据库 Width 配置给 TextBox/SelectBox/DateBox 等写入的
       内联像素宽度（如 style="width:150px"）会截断 cs1/cs2 列宽，导致字段参差。
       强制查询区所有编辑器撑满 .dx-field-item-content，让列宽完全由 cs1/cs2 决定。 */
.dx-form:has(.form_button) .dx-field-item-content > .dx-widget {
    width: 100% !important;
}

/* 9) ★★ 弹窗（新建/修改/双击浏览）行距压紧 —— 对齐查询区
      ------------------------------------------------------------------
      问题（lyh 2026-09-20）：「新建、修改、双击浏览弹窗的，每行之间的间距太大，
        要调整和刚刚查询那边一样的间距」。

      根因：DevExtreme 自带样式（dx.material.blue.light.css）里有
        .dx-field-item:not(.dx-field-item-has-group):not(.dx-field-item-has-tabs)
                   :not(.dx-first-row):not(.dx-label-v-align) { padding-top: 26px; }
        → 凡是「不在第一行」的字段项都被塞 26px 上内边距，这是 DevExtreme
          内置的纵向行距方案。实测「新增备品备件订单」弹窗（/InventoryOrder/PurchaseOrder）：
            第 1 行 订单单号 …  y=55  h=27  pt=0
            第 2 行 仓库     …  y=82  h=53  pt=26px  ← 27 + 26
            第 3 行 采购类型 …  y=135 h=90  pt=26px
          行与行之间视觉上就是 26px，明显比查询区的 4px 松散。

      查询区之所以没这个问题：第 7 条规则的 `.dx-form:has(.form_button) .dx-field-item`
        已把 padding-top 清零。而弹窗【没有 form_button】（按钮走 popup 底部 toolbar），
        所以第 7 条天然不命中，弹窗就一直沿用 DevExtreme 的 26px。

      作用域为什么用 .dx-popup-wrapper：
        实测该弹窗内容容器的祖先链是
          div.dx-overlay-content.dx-popup-normal
            → div.dx-overlay-wrapper.dx-popup-wrapper   ← 挂在 body 下
              → body
        .dx-popup-wrapper 由 DevExtreme 动态创建并 append 到 body，
        与查询区所在的 .iframe_container / 页面级容器完全不相交：
          实测 当前文档
            .dx-popup-wrapper .dx-form      → 1（弹窗表单）
            .dx-form:has(.form_button)      → 1（查询区表单）
            .use_popup_container .dx-form   → 0（这个类不可靠，不用）
        故用 .dx-popup-wrapper 前缀既精准命中弹窗、又绝不外溢到查询区。

      ★ 只改纵向间距，不碰宽度/占列 —— 弹窗有自己的 ColCount，不能被查询区的
        cs1/cs2 flex-basis 规则污染，所以这里不写任何 width / flex-basis。
      ------------------------------------------------------------------ */
.dx-popup-wrapper .dx-form .dx-field-item,
.dx-popup-wrapper .dx-form .dx-box-item,
.dx-popup-wrapper .dx-form .dx-item {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}

/* 9a) 行间只留 4px，与查询区的 row-gap:4px 一致 */
.dx-popup-wrapper .dx-form .dx-box-flex.dx-box.dx-collection {
    row-gap: 4px !important;
}

/* 9b) 富文本/多行控件在弹窗里保持自身高度，不被 9a 的行距影响 */
.dx-popup-wrapper .dx-form .dx-field-item-content {
    padding-top: 0 !important;
    padding-bottom: 0 !important;
}

/* 9c) 弹窗标签宽度对齐查询区（DevExtreme 按行算宽会导致跨行输入框左边界不齐） */
.dx-popup-wrapper .dx-form .dx-field-item-label {
    width: 72px !important;
    flex: 0 0 72px !important;
}

.dx-popup-wrapper .dx-form .dx-field-item-label-content {
    width: 72px !important;
}

.dx-popup-wrapper .dx-form .dx-field-item-label-text {
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
}

.iframe_container .iframe_container-table .dx-gridbase-container > .dx-datagrid-rowsview.dx-scrollable {
    /*        margin-bottom: 35px;*/
}

/*    .iframe_container .form_button .dx-button {
        height: 26px !important;
    }*/


.iframe_container .iframe_container-table {
    margin: 10px 0px 0px;
    height: calc(100% - 37px);
    overflow: auto;
    will-change: tranforms;
}

    .iframe_container .iframe_container-table > .dx-widget {
        height: calc(100% - 36px);
    }

    /* hjl 2026-09-21：收紧选择器 —— 筛选行的放大镜容器也带 dx-datagrid 类
           （<div class="dx-menu dx-filter-menu dx-datagrid">），笼统的 .dx-datagrid 会把它一起命中，
           把 overflow 打成 auto → 而放大镜是「0 宽、靠 36px 子元素溢出显示」的绝对定位层，被裁掉后
           连锁导致筛选行被撑到 40px、放大镜跑到输入框上方、「审核」列与邻列错位。
           排除 .dx-menu 后，网格根元素行为不变，一处覆盖全部使用本布局的业务页。 */
    .iframe_container .iframe_container-table .dx-datagrid:not(.dx-menu) {
        /*height: calc(100vh - 92px);*/
        overflow: auto;
        will-change: tranforms;
    }

    /* 设置网格的行高度 - 已由 globalFontSize.js 统一控制 */
    /* .iframe_container .iframe_container-table .dx-datagrid-rowsview table tbody tr td {
            line-height: 0px !important;
        } */

    /*       .iframe_container .iframe_container-table .dx-button {
            height: 24px !important;
            min-width: 24px !important;
        }*/

    .iframe_container .iframe_container-table .dx-pager {
        position: fixed !important;
        bottom: 0 !important;
        left: 7px;
        right: 7px;
        height: 34px !important;
        padding: 5px 20px !important;
        width: auto;
        box-sizing: border-box;
        background-color: #fff !important;
    }

        .iframe_container .iframe_container-table .dx-pager .dx-page-sizes .dx-page-size,
        .iframe_container .iframe_container-table .dx-pager .dx-pages .dx-page,
        .iframe_container .bottom-section .dx-pager .dx-page-sizes .dx-page-size,
        .iframe_container .bottom-section .dx-pager .dx-pages .dx-page {
            line-height: 5px !important;
        }

.iframe_container .bottom-section > div {
    height: calc(100% - 34px) !important;
    overflow: hidden;
}

.iframe_container .iframe_container-table .dx-pager .dx-pages .dx-next-button,
.iframe_container .iframe_container-table .dx-pager .dx-pages .dx-prev-button {
    line-height: 17px !important;
}

.iframe_container .dx-pager {
    position: fixed !important;
    bottom: 0 !important;
    left: 7px;
    right: 7px;
    height: 34px !important;
    padding: 5px 20px !important;
    width: auto;
    box-sizing: border-box;
    background-color: #fff !important;
}

    .iframe_container .dx-pager .dx-pages .dx-navigate-button {
        height: 5px;
    }

.iframe_container .iframe_container-table .dx-button.dx-dialog-button {
    height: 28px !important;
    min-width: 60px !important;
}


@media screen and (max-width:767px) {
    .iframe_container .iframe_container-table {
        /*padding-bottom: 27px;*/
    }
}

/** popup弹框 公共样式 */
.dx-popup-wrapper > .dx-overlay-content {
    margin: 10px !important;
}

.dx-popup-title.dx-toolbar .dx-toolbar-items-container {
    height: 38px !important;
    line-height: 38px !important;
}

.dx-toolbar-menu-section .dx-toolbar-hidden-button .dx-button {
    height: 25px !important;
}

.dx-popup-title.dx-toolbar .dx-toolbar-label {
    font-size: 16px !important;
}

.dx-popup-content.dx-dialog-content {
    text-align: center !important;
}

.dx-popup-content {
    padding: 5px 24px;
    /*overflow: visible;*/
}

.dx-popup-bottom.dx-toolbar {
    /*margin-top: 22px !important;*/
    margin-top: 0px !important;
    padding: 0 25px;
}

.dx-popup-content.dx-dialog-content {
    padding: 24px 24px 0 24px;
}

.dx-button.dx-closebutton {
    min-width: 25px !important;
    height: 25px !important;
}

.dx-button.dx-dialog-button {
    height: 25px !important;
}

/* =====================================================================
   let 2026-09-27：网格「单元格文字可复制」—— 放开文本选择
   ---------------------------------------------------------------------
   需求：Ctrl+C 能把单元格里的文字复制出来。
   实测结论（第 104 轮，独立 demo 页）：
     ① 数据行的 td 本来就是 user-select:auto（能拖选），拖完 Ctrl+C 走浏览器
        原生复制 —— 开箱可用，本文件原先也没禁过它；
     ② 表头被主题写死了不可选：dx.material.blue.light.css:17608
          .dx-datagrid-headers { user-select: none; }
        导致表头拖不出选区、表头文字复制不到；
     ③ 「点一下单元格 + Ctrl+C」在任何网页都复制不出东西 —— 属于浏览器规范
        （没有选区时复制命令没有内容），由 jsTools/GlobalCellCopy.js 接管补齐。
   本规则只解决②：把表头 / 数据行的文本选择放开为 text。
   ★ 纯 CSS，不改事件、不改布局，免编译、刷新即生效。

   ★ 已知副作用（第105轮实测，务必知情）：本项目数十个页面开了 AllowColumnResizing(true)
     （BuyinOrder / CheckRequest / ApplyOutFix / BackBuy / LoadTableManagement …），
     而 DevExtreme 23.1 的列宽拖动**不走 DOM 手柄**：内部由 columnsResizer 用
     「列边界点位」判定（_generatePointsByColumns / _pointCreated），表头里并不存在
     .dx-resizable-handle 元素（实测 document.querySelectorAll 计数为 0）。
     因此，用户在表头按下并水平拖动调列宽时，表头文字会被一并拖成蓝色选区 ——
     **不影响拖列宽本身、也不影响随后的排序/筛选，只是视觉上多一块蓝底**，点别处即散。
     ⇒ 若不想要「表头也可拖选」，把下面 ① 里 `.dx-datagrid .dx-datagrid-headers,`
       与 `.dx-datagrid .dx-datagrid-headers .dx-header-row > td,` 两行注释掉即可：
       数据行的复制能力不受影响，表头文字仍可用「点一下 + Ctrl+C」复制（见方案B）。

   范围：不带 .iframe_container 前缀 —— 本文件虽名为 iframe 公共样式，但由
     Views/Shared/_Layout.cshtml:52 全局引入，规则对壳页面与 iframe 业务页一致
     生效，且不依赖任何祖先容器。
   ===================================================================== */

/* ① 表头 / 数据行：允许拖选文本
   ★ 必须连 .dx-datagrid-headers 容器自身一起放开 ——
     主题里 .dx-datagrid-headers{user-select:none}（dx.material.blue.light.css:17608），
     第 105 轮 D3/D5/D6 实测：只放开 td 时，td 的计算值确实是 text、用 Range 也能手动
     选中，但鼠标拖选仍然发不起来 —— Chrome 中祖先的 none 会拦住后代的「拖选发起」。
     容器一起放开后，表头才真正可以拖选。 */
.dx-datagrid .dx-datagrid-headers,
.dx-datagrid .dx-datagrid-headers .dx-header-row > td,
.dx-datagrid .dx-datagrid-headers .dx-header-row > td *,
.dx-datagrid .dx-datagrid-rowsview .dx-row > td,
.dx-datagrid .dx-datagrid-rowsview .dx-row > td * {
    -webkit-user-select: text !important;
    -moz-user-select: text !important;
    -ms-user-select: text !important;
    user-select: text !important;
}

    /* ② 行内按钮 / 复选框 / dxResizable 手柄：保持不可选（点它们时不该留下选区）
   ★ 注意：这里的 .dx-resizable-handle 不是 DataGrid 的列宽手柄 —— DevExtreme 23.1 的
     列宽拖动走「点位」机制、不渲染 DOM 手柄（见上方说明）；本行是给 dxResizable 这类
     通用组件（如可拖拽调整尺寸的弹窗/面板）兜底的。 */
    .dx-datagrid .dx-datagrid-headers .dx-resizable-handle,
    .dx-datagrid .dx-datagrid-headers .dx-resizable-handle *,
    .dx-datagrid .dx-datagrid-headers .dx-header-row > td .dx-button,
    .dx-datagrid .dx-datagrid-headers .dx-header-row > td .dx-button *,
    .dx-datagrid .dx-datagrid-rowsview .dx-row > td .dx-button,
    .dx-datagrid .dx-datagrid-rowsview .dx-row > td .dx-button *,
    .dx-datagrid .dx-datagrid-rowsview .dx-row > td .dx-checkbox,
    .dx-datagrid .dx-datagrid-rowsview .dx-row > td .dx-checkbox * {
        -webkit-user-select: none !important;
        -moz-user-select: none !important;
        -ms-user-select: none !important;
        user-select: none !important;
    }

/* =====================================================================
   [R141 2026-10-10] TreeList / TreeView 同类问题补齐
   ---------------------------------------------------------------------
   用户报「权限--菜单管理 下面的网格不能 Ctrl+C 复制」。
   定位：该页用的是 DevExtreme **TreeList**
     （Views/MenuManagement/MenuManagementIndex.cshtml:204），
   而上面 ① 的放开规则只写了 .dx-datagrid-*。实测主题里 TreeList 与 DataGrid
   是**成对**的两套类名（dx.material.blue.light.css）：
       .dx-datagrid-headers { user-select: none }   @17608  ← ① 已放开
       .dx-treelist-headers { user-select: none }   @20408  ← 本条放开 ★
   ⇒ TreeList 此前表头拖不出选区，且「点一下 + Ctrl+C」也因 GlobalCellCopy.js
     的选择器只认 .dx-datagrid-* 而完全没有内容（CSS 的 ①② 两步一起漏）。
   ⇒ 与 ① 同形、同副作用（拖列宽时表头文字会被一并拖成选区，纯视觉、
     不影响拖列宽/排序/筛选），此处不重复说明。
   范围同样不带 .iframe_container 前缀：本文件由 _Layout.cshtml 全局引入。
   ===================================================================== */

/* ③-a TreeList：表头 / 数据行放开拖选 */
.dx-treelist .dx-treelist-headers,
.dx-treelist .dx-treelist-headers .dx-header-row > td,
.dx-treelist .dx-treelist-headers .dx-header-row > td *,
.dx-treelist .dx-treelist-rowsview .dx-row > td,
.dx-treelist .dx-treelist-rowsview .dx-row > td * {
    -webkit-user-select: text !important;
    -moz-user-select: text !important;
    -ms-user-select: text !important;
    user-select: text !important;
}

    /* ③-b TreeList 里的按钮 / 复选框 / 展开箭头：保持不可选 */
    .dx-treelist .dx-treelist-rowsview .dx-row > td .dx-button,
    .dx-treelist .dx-treelist-rowsview .dx-row > td .dx-button *,
    .dx-treelist .dx-treelist-rowsview .dx-row > td .dx-checkbox,
    .dx-treelist .dx-treelist-rowsview .dx-row > td .dx-checkbox *,
    .dx-treelist .dx-treelist-collapsed,
    .dx-treelist .dx-treelist-expanded,
    .dx-treelist .dx-treelist-empty-space {
        -webkit-user-select: none !important;
        -moz-user-select: none !important;
        -ms-user-select: none !important;
        user-select: none !important;
    }

/* ③-c TreeView（权限管理 / 权限组 / 员工权限 / 部门管理 / 物料分类 / 基础信息）：
   主题里 .dx-treeview-node { user-select: none }（@12278）⇒ 树节点文字选不中。
   放开它，但**把外壳左侧主菜单再锁回去** —— 左菜单用的是同一个 TreeView 控件
   （Views/Home/Index.cshtml:86、Views/XcMenu/Index.cshtml:47，两者都没有 .ID()），
   它的树都放在 .menu-container 里；而 .menu-container 全站只在这两个导航视图
   出现（已 grep 核实，业务页零命中），所以下面这条排除规则不会误伤业务页树。
   ★ 左菜单属于导航控件，放开会让拖动时留下蓝色选区，故刻意锁回 none。 */
.dx-treeview .dx-treeview-node,
.dx-treeview .dx-treeview-node * {
    -webkit-user-select: text !important;
    -moz-user-select: text !important;
    -ms-user-select: text !important;
    user-select: text !important;
}

.menu-container .dx-treeview .dx-treeview-node,
.menu-container .dx-treeview .dx-treeview-node * {
    -webkit-user-select: none !important;
    -moz-user-select: none !important;
    -ms-user-select: none !important;
    user-select: none !important;
}

/* ③-d 树节点里的展开箭头 / 复选框：保持不可选（选择器更具体，压过 ③-c） */
.dx-treeview .dx-treeview-node .dx-treeview-toggle-item-visibility,
.dx-treeview .dx-treeview-node .dx-checkbox,
.dx-treeview .dx-treeview-node .dx-checkbox * {
    -webkit-user-select: none !important;
    -moz-user-select: none !important;
    -ms-user-select: none !important;
    user-select: none !important;
}

/* ③-e PivotGrid（/PlanOrderReport/PlanOrderReportIndex）：主题里**没有**
   给它设 user-select:none（已逐条扫描核实），所以这里不需要 CSS；
   「点一下 + Ctrl+C」由 GlobalCellCopy.js 新选择器 .dx-pivotgrid td 覆盖。 */

/* =====================================================================
   [R129 2026-09-29] 生产验收单（/StripAcceptance/StripAcceptanceIndex）专属修正
   ① 页面内字号统一到 13px   ② 弹窗内「外框 vs 网格」左右同沿
   ---- 作用域说明（★ 重要，改前必读）----
   * 本页专属类 .acceptance-* 经 Views 全量核实只在本页 cshtml 出现；
     通用 DevExtreme 类一律加本页独有锚点，避免污染其它 40+ 个页面。
   * ★★ DevExtreme Popup 的 ID 不落在弹窗 DOM 上：实测 #StripAcceptanceDetailPopup /
     #StripAcceptanceProcessDetailPopup / #StripAcceptanceEntryPopup 都是 body 下的
     「空壳 DIV」（不含任何子元素），与真正渲染的弹窗是【兄弟】关系：
        BODY
          ├─ DIV#StripAcceptanceDetailPopup.dx-overlay.dx-popup   ← 空壳，无内容
          └─ DIV.dx-overlay-wrapper.dx-popup-wrapper              ← 真正的弹窗
               └─ DIV.dx-overlay-content
                    ├─ DIV.dx-popup-title……                        ← 标题在 .dx-popup-content 之外
                    └─ DIV.dx-popup-content
                         └─ DIV.acceptance-detail-shell            ← 内容根
     ⇒ 结论：**永远不要用 #StripAcceptance*Popup 作 CSS 前缀**（一辈子匹配不到）。
       · 弹窗内容 → 用三个页面独有 shell 类（detail / process / entry）
       · 弹窗标题 → 只能用 :has() 从「含本页 shell 的那个 wrapper」反查
                   （:has() 需 Chrome 105+；本页 DevExtreme 23.1 环境满足）
   * 本文件在 <head> 引入，本页内联 <style> 在 body —— 同特异性下后者胜，
     故凡需覆盖内联规则处一律加 !important。
   ===================================================================== */

/* ---- A. 字号统一 13px（把 11/12/14/16/17px 全部收口） ---- */

/* A1 弹窗标题「分条验收明细 / 加工明细 / 新生产录入」：16px -> 13px
      16px 来自 .dx-toolbar-item-label（标题栏内层），外层 .dx-popup-title 已是 13px */
.dx-overlay-wrapper:has(.acceptance-detail-shell) .dx-popup-title,
.dx-overlay-wrapper:has(.acceptance-detail-shell) .dx-popup-title *,
.dx-overlay-wrapper:has(.acceptance-process-shell) .dx-popup-title,
.dx-overlay-wrapper:has(.acceptance-process-shell) .dx-popup-title *,
.dx-overlay-wrapper:has(.acceptance-entry-shell) .dx-popup-title,
.dx-overlay-wrapper:has(.acceptance-entry-shell) .dx-popup-title * {
    font-size: 13px !important;
}

/* A2 批次列表项「全部批次」：16px -> 13px */
.acceptance-batch-panel .dx-list-item-content,
.acceptance-batch-panel .dx-list-item-content * {
    font-size: 13px !important;
}

/* A3 网格「暂无数据」：17px（主题 dx.material.blue.light.css 的 .dx-datagrid-nodata）-> 13px */
.acceptance-detail-shell .dx-datagrid-nodata,
.acceptance-process-shell .dx-datagrid-nodata,
.acceptance-entry-shell .dx-datagrid-nodata,
#StripAcceptanceListGrid .dx-datagrid-nodata {
    font-size: 13px !important;
}

/* A4 页签「成品、余料 / 计划状况 / 加工要求」：14px -> 13px */
.acceptance-tab,
.acceptance-tab.is-active {
    font-size: 13px !important;
}

/* A5 机台 / 班组 输入区：label 与输入框 12px -> 13px */
.acceptance-field label,
.acceptance-field input,
.acceptance-field select {
    font-size: 13px !important;
}

/* A6 概览摘要 / 步骤提示 / 合计条 / 面板标题：11~13px 统一到 13px */
.acceptance-overview-identity,
.acceptance-overview-header,
.acceptance-summary-item span,
.acceptance-summary-item strong,
.acceptance-step-hint,
.acceptance-entry-totals,
.acceptance-panel-title {
    font-size: 13px !important;
}

/* A7 网格数据格：12px（Site.css 全站规约 .dx-datagrid .dx-row.dx-data-row > td）-> 13px（仅本页） */
.acceptance-detail-shell .dx-datagrid .dx-row.dx-data-row > td,
.acceptance-process-shell .dx-datagrid .dx-row.dx-data-row > td,
.acceptance-entry-shell .dx-datagrid .dx-row.dx-data-row > td,
#StripAcceptanceListGrid .dx-datagrid .dx-row.dx-data-row > td {
    font-size: 13px !important;
}

/* A8 列表页查询条件区标签：12px -> 13px */
#StripAcceptanceQueryForm .dx-field-item-label-text,
#StripAcceptanceQueryForm .dx-field-item-label-text * {
    font-size: 13px !important;
}

/* A9 网格分页器（10/20/40 页大小 + 页码）：12px -> 13px */
.acceptance-detail-shell .dx-pager .dx-page,
.acceptance-detail-shell .dx-pager .dx-page-size,
.acceptance-process-shell .dx-pager .dx-page,
.acceptance-process-shell .dx-pager .dx-page-size,
.acceptance-entry-shell .dx-pager .dx-page,
.acceptance-entry-shell .dx-pager .dx-page-size,
#StripAcceptanceListGrid .dx-pager .dx-page,
#StripAcceptanceListGrid .dx-pager .dx-page-size {
    font-size: 13px !important;
}

/* ---- B. 弹窗内「外框 vs 网格」左右同沿 ---- */

/* B1 成因：.acceptance-tab-content{padding:7px} 把网格四周收进 7px，
      而其上方的「机台/班组」外框 .acceptance-entry-context 是贴满内容面板的
      => 实测外框 239..1877、网格 246..1848，左右各差 7px。只去掉左右内缩。 */
.acceptance-tab-content {
    padding: 7px 0 !important;
}

/* B2 概览卡片同理：.acceptance-overview-body{padding:7px} 让左右网格再内缩 7px
      => 去掉左右内缩后与卡片内边对齐（用户所说「右边控件没右对齐」）。 */
.acceptance-overview-body {
    padding: 7px 0 !important;
}


/* ======================================================================
   ★★ 2026-10-05（第 191 轮 · 需求）：全站「提示弹窗」统一底色
   ----------------------------------------------------------------------
   需求原话：保存成功 / 审核成功 / 反审核成功、常规提醒、异常提醒、警告……
   这些提示弹窗【全部要有底色】，并且「成功」与「异常、警告」必须用
   不同底色区分开。

   统一口径（四类，一律【实心色底 + 白字】）：
       成功 success → 绿 #2e9e4f
       异常 error   → 红 #d9534f
       警告 warning → 橙 #e8951e
       常规 info    → 蓝 #337ab7
   色值取自站内既有口径（按钮成功绿、Bootstrap 危险红、站内主蓝 #337ab7），
   警告用比主题 #ffc107 更深的橙，保证白字有足够对比度。

   ★ 未标注类别的提示（历史上会渲染成「透明底 + 白字」＝看不见、
     或者白底＋深字＝与界面同色分不清）一律按【常规】蓝底兜底，
     见下面第一条 .dx-toast-content 与 .message-box 默认规则。

   覆盖对象：
     ① 顶部小提示条   DevExtreme toast（.dx-toast-*）
     ② 右下角提醒盒子 .message-box（m_newMes / m_pass / m_warn / m_error）
     ③ 顶部「此页数据已被 XX 变更」长条 #__xc数据已变更
     ④ 导出提示条     #__xc导出成功提示 / #__xc导出中提示 / #__xc推送提示
     ⑤ 生产验收单弹窗底部提示语 .acceptance-step-hint

   为什么统一加 !important：
     · ①③④ 里的元素是 JS/视图里的【内联样式】（style="…"），CSS 只有
       !important 才压得住（无 !important 的样式规则压不过内联样式）；
     · ② 与原文件 LayoutMessageBoxStyle.css 同权重，靠加载顺序不可靠，直接 !important；
     · 以后换主题 / 调整样式表顺序也不会把底色弄丢。
   ====================================================================== */

/* ---------- ① 顶部小提示条（DevExtreme toast） ---------- */
/* 兜底：type 缺失时不会挂 .dx-toast-* 类 ⇒ 原来是「透明底 + 白字」＝看不见 */
.dx-toast-content {
    background-color: #337ab7 !important; /* 常规=蓝 */
    color: #ffffff !important;
}

.dx-toast-info,
.dx-toast-info .dx-toast-content {
    background-color: #337ab7 !important; /* 常规提醒 */
    color: #ffffff !important;
}

.dx-toast-success,
.dx-toast-success .dx-toast-content {
    background-color: #2e9e4f !important; /* 保存 / 审核 / 反审核成功 */
    color: #ffffff !important;
}

.dx-toast-warning,
.dx-toast-warning .dx-toast-content {
    background-color: #e8951e !important; /* 警告 */
    color: #ffffff !important;
}

.dx-toast-error,
.dx-toast-error .dx-toast-content {
    background-color: #d9534f !important; /* 异常提醒 */
    color: #ffffff !important;
}

.dx-toast-message {
    color: #ffffff !important;
}

/* ---------- ② 右下角「新消息提示」盒子 ---------- */
/* 默认态原来是「无底色」（LayoutMessageBoxStyle.css 里 background-color 被注释掉了）
   ⇒ 与界面同底色、分不清；这里给「常规」蓝底兜底 */
.message-box {
    background-color: #337ab7 !important;
}

    .message-box.m_newMes {
        background-color: #337ab7 !important;
    }
    /* 常规提醒 */
    .message-box.m_pass {
        background-color: #2e9e4f !important;
    }
    /* 成功 / 审批通过 */
    .message-box.m_warn {
        background-color: #e8951e !important;
    }
    /* 警告 */
    .message-box.m_error {
        background-color: #d9534f !important;
    }
        /* 异常 / 错误信息 */
        .message-box .title,
        .message-box .approval_content,
        .message-box.m_error .title,
        .message-box.m_error .approval_content {
            color: #ffffff !important;
        }
    /* 左侧图标：原来只有命中的 4 个类别才有图，默认态是空白；
   这里补上默认图标（常规提醒），并按类别对齐既有图标 */
    .message-box .container .left_img {
        background-image: url('../../img/MessageBoxIcon/m_remind.png');
    }

    .message-box.m_newMes .container .left_img {
        background-image: url('../../img/MessageBoxIcon/m_remind.png');
    }

    .message-box.m_pass .container .left_img {
        background-image: url('../../img/MessageBoxIcon/m_pass.png');
    }

    .message-box.m_warn .container .left_img {
        background-image: url('../../img/MessageBoxIcon/m_warn.png');
    }

    .message-box.m_error .container .left_img {
        background-image: url('../../img/MessageBoxIcon/m_error.png');
    }

/* ---------- ③ 顶部「此页数据已被 XX 变更」长条 ---------- */
/* 元素由 _Layout 内联样式创建，只能用 !important 覆盖；
   语义属「警告（需刷新）」⇒ 橙底白字 */
#__xc数据已变更 {
    background: #e8951e !important;
    border: 1px solid #c97f13 !important;
    color: #ffffff !important;
}

    #__xc数据已变更 span {
        color: #ffffff !important;
    }

    #__xc数据已变更 button {
        background: #ffffff !important;
        color: #b5700f !important;
        border: none !important;
    }

/* ---------- ④ 导出 / 推送提示条 ---------- */
#__xc导出成功提示,
#__xc推送提示 {
    background: #2e9e4f !important; /* 成功=绿 */
    color: #ffffff !important;
}

#__xc导出中提示 {
    background: #337ab7 !important; /* 进行中=常规蓝 */
    color: #ffffff !important;
}

/* ---------- ⑤ 生产验收单：弹窗底部提示语 ---------- */
/* 原来无底色 ⇒ 浮在白底弹窗上「和界面一样、没法区分」；按「常规提醒」给蓝底白字 */
.acceptance-step-hint {
    flex: 0 0 auto;
    padding: 7px 10px;
    border-radius: 4px;
    background: #337ab7 !important;
    color: #ffffff !important;
    line-height: 1.6;
}


/* ---------- ② 补充：图标白色圆底衬 ----------
   2026-10-05（第 191 轮 · 图标白色圆底衬）：改底色的副作用修正。
     m_remind.png = 蓝色实心圆 + 白「i」   m_pass.png = 浅绿实心圆 + 深绿「✓」
     m_warn.png   = 橙色线框圆 + 橙「!」   m_error.png = 浅红实心圆 + 深红「✕」
   本轮底色改成饱和实心色后：橙底(#e8951e)上的橙色警告图标几乎看不见、
   红底(#d9534f)上的异常图标发闷。这里加一个白色圆形底衬 + 图标缩到 24px 居中，
   原图稿不动，四类底色上都清晰。（若不想要这个白圆，删掉本块即可回到裸图标。） */
.message-box .container .left_img {
    background-color: #ffffff !important;
    border-radius: 50% !important;
    background-size: 24px 24px !important;
    background-position: center center !important;
    background-repeat: no-repeat !important;
}

/* ======================================================================
   ★★ 2026-10-05（第 192 轮 · 需求）：右下角「新消息提示」盒子的可读性加固
   ----------------------------------------------------------------------
   现象：弹出提醒盒子时文字看不清。
   两处加固：
     ① 文字色 —— 原来只给 .title / .approval_content 加了白字；改过的旧版本
        （LayoutMessageBoxStyle.css 里 .message-box.m_error .title{color:#000}）
        以及以后新增的子节点都可能重新变成深字压深底，这里改成「盒子内所有
        元素一律白字」，盒子自带实心色底，白字任何主题下都读得清。
     ② z-index —— 原来只有 1000，而 DevExtreme 的弹窗遮罩(z-index≈14xx~15xx)
        比它高；在明细弹窗打开的状态下弹提醒盒子，盒子会被遮罩压住而看不清。
        提到遮罩之上，保证任何弹窗开着都能看见。
   ====================================================================== */
.message-box,
.message-box * {
    color: #ffffff !important;
}

.message-box {
    z-index: 2147483000 !important;
}

/* ======================================================================
   10) ★★ 全站查询区：字段项【水平内边距】统一 20px（左 = 右 = 20px）
       背景：DevExtreme 按 dx-first-col / dx-last-col 给字段项加不对称内边距
             （非首列 padding-left:20px、非末列 padding-right:20px）。
             本项目为保住 ColSpan 把字段宽度改成 cs1/cs2 的固定 flex-basis，
             字段变成【紧密并排、每格等宽】；而 DevExtreme 的列序号跟踪与之
             不同步 —— 实测「组织」「进仓单号」没有被标成 dx-first-col，
             「简称」没有被标成 dx-last-col，于是同一行里同时出现
             padding-left = 0/20、padding-right = 20/0 两种值 ⇒
               ① 行首字段的输入框比同行其它字段【左偏 20px】；
               ② 行末字段的输入框比同列其它字段【宽 20px】。
             视觉上就是用户反馈的「查询条件栏，组织和第二行的字段没对齐」。
             （CDP 探针实测标签左边缘：组织 7 / 入仓日期 27）

       ★ 第八版（2026-10-09）：作用域由【两个页面 id】提升为【全站】。
         此条最早只在 #Receivable_Head_Form / #Payable_Head_Form 上修过，
         症状与本条描述一模一样，但全站其余 40+ 个带 form_button 的页面
         保持原样 ⇒ 用户反馈「有同样问题的还有很多单据」，本次一并统一。

       修法：以 form_button（只由各页查询区 AddButton() 产出）为判据，
             把字段项的 padding-left / padding-right 一律统一为 20px。
             ★ padding-right 必须一起统一 —— 只改左边的话，行末字段因
               padR=0 仍比同列其它字段宽 20px，输入框右边界依旧参差
               （实测「只改左」这一变体在 14 个页面全部未能修正宽度）。
             border-box 下内边距位于格子内部，不改变 flex-basis 决定的列宽，
             【不影响列宽与换行】（实测 14 个页面格起点 x 全部零变化）。

       作用域：`.dx-form:has(.form_button)` —— 与上面第 4 条同一选择器，
              两者合起来就是「查询区字段项布局」这一件事的完整统一过程：
              第 4 条管【占位宽度】、本条管【水平内边距】。
              弹窗按钮走 popup 底部 toolbar、不带 form_button，天然不受影响。

       实测（CDP 三态对比，2026-10-09，14 个页面结论一致）：
             现状 contDX=[62,82]、contW=[263,283,(648)] 参差
             → 修后 contDX=[82]、contW=[263] / cs2 = 628（仅剩天然列宽差）
       ====================================================================== */
.dx-form:has(.form_button) .dx-field-item:not(.dx-field-button-item) {
    padding-left: 20px !important;
    padding-right: 20px !important;
}

/* ======================================================================
   11) ★★ 全站 DevExtreme 滚动条：粗细统一放大 1.5 倍

   背景：用户反馈「所有的 DevExtreme 网格，上下、左右的滚动条非常小」。

   现状（CDP 实测，修改前；主题 dx.material.blue.light.css 第 4422~4634 行）：
       .dx-scrollbar-vertical  .dx-scrollable-scroll { width: 6px }    ← 竖条厚
       .dx-scrollbar-vertical  .dx-scrollbar-hoverable { width: 6px }   ← 竖条轨道
       .dx-scrollbar-horizontal .dx-scrollable-scroll { height: 6px }   ← 横条厚
       .dx-scrollbar-horizontal .dx-scrollbar-hoverable { height: 6px } ← 横条轨道
       悬停 / 拖动时上面两组各涨到 13px。
       .dx-scrollable-scroll { padding: 2px 0 2px 2px } —— 滑块内容再内缩 2px，
       于是【肉眼看到的灰条实际只有 4px】（4 = 6 - 2 - 0）。

   实测（/Buyin/BuyinOrder + /Stock/StockDetail，共 16 条滚动条，100% 命中）：
       类名一律带 dx-scrollbar-hoverable；
       竖条 css宽 = 6px、横条 css高 = 6px；
       滑块的内联样式只写【长度】（width: 1654px / height: 707px），
       【粗细不含任何内联值】⇒ 纯 CSS 可控，改样式表即可，不碰 .cs / .cshtml。

   修法：把上述值一律 ×1.5 ——
       条厚   6  → 9px
       悬停  13  → 19.5px
       内缩   2  → 3px  （保住「可见部分」也正好 1.5 倍：4px → 6px）
       保留位 6  → 9px  （scrollbarMode:'always' 时表体让出的内边距）

   ★ 为什么必须【连 hover 那组一起镜像】：
     本次目标是「任何状态都变大」，所以用 !important 覆盖；而
     .dx-scrollbar-vertical.dx-scrollbar-hoverable{width:9px!important} 的权重 (0,2,0)
     会【压死】主题里非 !important 的悬停规则 (0,3,0) —— !important 优先于权重，
     结果是鼠标悬停 / 拖动时滚动条【不再变粗】。因此悬停与拖动态那组选择器
     必须原样镜像出来、并同样加 !important，靠更高的权重 (0,3,0) 反压回去。

   作用范围：.dx-scrollbar-vertical / .dx-scrollbar-horizontal 是 DevExtreme
       dxScrollable 的公共类 —— DataGrid / TreeList / PivotGrid / TreeView / List /
       DropDown 弹层 / 抽屉 / 日程 全部复用它 ⇒ 一条规则覆盖「所有 DevExtreme 网格」，
       不必按控件族逐个登记，也不会外溢到非 DevExtreme 的原生滚动区域。
   ====================================================================== */
.dx-scrollable-scroll {
    padding: 3px 0 3px 3px !important;
}

/* —— 竖条（上下方向）：6px → 9px —— */
.dx-scrollbar-vertical .dx-scrollable-scroll {
    width: 9px !important;
}

.dx-scrollbar-vertical.dx-scrollbar-hoverable {
    width: 9px !important;
}

    .dx-scrollbar-vertical.dx-scrollbar-hoverable.dx-scrollable-scrollbar-active,
    .dx-scrollbar-vertical.dx-scrollbar-hoverable.dx-scrollable-scrollbar-active .dx-scrollable-scroll,
    .dx-scrollbar-vertical.dx-scrollbar-hoverable.dx-state-hover,
    .dx-scrollbar-vertical.dx-scrollbar-hoverable.dx-state-hover .dx-scrollable-scroll {
        width: 19.5px !important;
    }

/* —— 横条（左右方向）：6px → 9px —— */
.dx-scrollbar-horizontal .dx-scrollable-scroll {
    height: 9px !important;
    padding-left: 3px !important;
    padding-right: 3px !important;
    padding-bottom: 0 !important;
}

.dx-scrollbar-horizontal.dx-scrollbar-hoverable {
    height: 9px !important;
}

    .dx-scrollbar-horizontal.dx-scrollbar-hoverable.dx-scrollable-scrollbar-active,
    .dx-scrollbar-horizontal.dx-scrollbar-hoverable.dx-scrollable-scrollbar-active .dx-scrollable-scroll,
    .dx-scrollbar-horizontal.dx-scrollbar-hoverable.dx-state-hover,
    .dx-scrollbar-horizontal.dx-scrollbar-hoverable.dx-state-hover .dx-scrollable-scroll {
        height: 19.5px !important;
    }

/* —— scrollbarMode:'always' 时，表体为滚动条让出的内边距同步放大（6 → 9px）—— */
.dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-both > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content,
.dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-vertical > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content {
    padding-right: 9px !important;
}

.dx-rtl .dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-both > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content,
.dx-rtl .dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-vertical > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content,
.dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-both.dx-rtl > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content,
.dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-vertical.dx-rtl > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content {
    padding-right: 0 !important;
    padding-left: 9px !important;
}

.dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-both > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content,
.dx-scrollable-scrollbars-alwaysvisible.dx-scrollable-horizontal > .dx-scrollable-wrapper > .dx-scrollable-container > .dx-scrollable-content {
    padding-bottom: 9px !important;
}

/* ============================================================================
   12) ★★ 第301轮：排程看板（Views/Scheduling/Board.cshtml）网格「行高 / 字形守卫」

   用户报：排程 → 已计划明细(323)，拖动上下滚动条后整个网格变成「浅灰条 + 全白」，
   表头与单元格一个字都没有。
   对截图逐像素量测（1773x975）得到的铁证：
     · 网格区域内最深像素 sum=672 = 224x3 = 恰好 #e0e0e0 ⇒ 网格内「零字形」；
       而页面其它文字（页签 / 排产打印 / 清空 / 取消排程）全部正常。
     · 灰块是实心块、不是文字：y=129..145 连续 17px、x 向 70px 全为 (224,224,224)
       没有任何字间缝；色值精确 = #e0e0e0（同图 #2563eb/#dc2626/#dbeafe 逐字节复现）。
     · 行距 66.4px；灰块只在每行顶部 17~19px，其下 47px 全白。
     · y=101-102 有一条通宽 2px 灰线 = 相邻两行 border-top + border-bottom 合并。

   来源定位（全项目唯一）：wwwroot/jsTools/globalFontSize.js 注入的 #xcsoft-grid-height
   —— 它是整个项目里唯一把 #e0e0e0 写到网格单元格上的地方
   （Board.cshtml / SchedPage.css 内 #e0e0e0 出现 0 次）：
       .dx-datagrid .dx-data-row td { height: ${字号 x 1.8}px !important;
                                      border-top/bottom: 1px solid #e0e0e0 !important; }
   反解 66.4px ⇒ 用户「全局字号」≈ 28px。本地无头 Chrome 实测校准：
       字号 16→行高31 / 24→56 / 26→60 / 28→65 / 30→69 / 32→74
   （28px → 65px，与 66.4px 吻合）。该脚本由外壳 Home/Index.cshtml:751 加载，
   并由 syncIframeFontSize 推进 iframe；Board.cshtml 自己从不引用它。

   为什么看板必须挡掉：看板按 13px 字号 / ~27px 行高设计（机台卡片、页签、progress、
   .tag 小标签 line-height:18px、.right_content 弹性布局）。字号放大到 28px 时：
     · 每个 td 的 height 被强制成 50.4px（+padding/border）⇒ 行高 66px；
     · 323 行 ⇒ 滚动内容约 21000px 高（正常行高时约 8700px）；
     · 本地实测 28px 时 .dx-datagrid-rowsview 高度塌到 12~92px、网格被
       「清空 / 取消排程」按钮压住（.verify/sched/harness/V_F_font28_before.png）。
   即「大字号的全局规则」与「本页独有的 scrolling.rowRenderingMode:'virtual'」叠加后，
   整个网格只剩背景 / 边框、不再绘字形。

   ★ 想恢复「网格跟随全局字号」：删掉本节即可，无其它副作用。
   ============================================================================ */

/* 12.1 行高守卫：只保留「下边框」，取消注入的强制高度与成对的上边框 */
.schedul_container .dx-datagrid .dx-data-row > td {
    height: auto !important;
    line-height: 20px !important;
    padding: 3px 16px !important;
    border-top-style: none !important;
    border-bottom: 1px solid var(--xb-line-soft, #ededed) !important;
}

.schedul_container .dx-datagrid .dx-header-row > td,
.schedul_container .dx-datagrid .dx-filter-row > td,
.schedul_container .dx-datagrid .dx-group-row > td {
    height: auto !important;
    line-height: 20px !important;
    padding: 3px 16px !important;
}

    /* 12.2 字号回到看板设计值（Site.css 网格规约：数据格 12px / 表头 13px）
   必须连后代一起写：globalFontSize.js 同时给 .dx-widget / span / p /
   .dx-texteditor-input / .dx-checkbox-label 下了 font-size。 */
    .schedul_container .dx-datagrid .dx-data-row > td,
    .schedul_container .dx-datagrid .dx-data-row > td *,
    .schedul_container .dx-datagrid .dx-filter-row > td,
    .schedul_container .dx-datagrid .dx-filter-row > td * {
        font-size: 12px !important;
    }

    .schedul_container .dx-datagrid .dx-header-row > td,
    .schedul_container .dx-datagrid .dx-header-row > td * {
        font-size: 13px !important;
    }

/* 12.3 行内编辑器（录入顺序 / 计划备注 / 筛选行）保持单行，别被撑高 */
.schedul_container .dx-datagrid .dx-editor-cell .dx-texteditor-input,
.schedul_container .dx-datagrid .dx-filter-row .dx-texteditor-input,
.schedul_container .dx-datagrid .dx-placeholder {
    font-size: 12px !important;
    line-height: 25px !important;
    height: 25px !important;
}

/* 12.4 滚动层不铺不透明底色 —— 沿用 MenuMotionStyle.css:1194-1206 第290轮的结论：
   给虚拟滚动层铺不透明底色，会让 Chrome 把它当不透明合成层、随后不再绘该层内的字形。
   看板网格根节点仍由 --xb-surface 提供底色，此处外观不变。
   （必须带 html.xm-embed 才压得住 MenuMotionStyle.css:1201 的 (0,3,2)，故两版都写。） */
html.xm-embed .schedul_container .dx-datagrid .dx-datagrid-rowsview,
html.xm-embed .schedul_container .dx-datagrid .dx-datagrid-headers,
html.xm-embed .schedul_container .dx-datagrid .dx-datagrid-content,
.schedul_container .dx-datagrid .dx-datagrid-rowsview,
.schedul_container .dx-datagrid .dx-datagrid-headers,
.schedul_container .dx-datagrid .dx-datagrid-content {
    background-color: transparent !important;
}

/* ===== 第391~394轮：工装模块新建弹窗的表单 =====
   历史：
     · 第391轮：去掉仿 WinForms 灰底皮肤；列数由服务端算死，避免 ColCount(0)=auto 的「先 1 列后跳 2 列」；
     · 第392轮：标签由「在上」改为「与控件同行」（LabelLocation.Left）；
     · 第393轮：曾套「基础信息管理」淡蓝卡片（500 / 960）。
     · ★ 第394轮（用户反馈「这个样式还是不行，按客户资料样式调整，不用框框框起来」）：
       卡片整个去掉 —— 无边框 / 无底色 / 无圆角 / 无阴影 / 无限宽 / 无内边距；
       口径改成「客户资料」（Views/tblCustomer/tblCustomerIndex.cshtml）：
       白底、表单铺满弹窗宽度、每行 4 列平铺、标签固定宽 + 右对齐 + 6px 间距。
       列数同时回到全站默认 4 列（PublicDeal.构建新建编辑头 默认 总列数=4 的原生口径）。

   ★ 标签宽必须「外框与内层同宽」（客户资料第 339 轮踩过）：只改内层 label-content 会向右
     溢出、被同一行的输入框压住（表现为文字被挡）。外框 110px = 内层 104px + 6px 间距。
   ★ 用 px 不用 em：标签 <label> 继承 DevExtreme 写死的 12px，而标签文字 <span> 被
     childFontSize.js 改成全局字号（默认 13px），em 会让两者算出不同宽度。
     字号调大时靠 text-overflow:ellipsis 兜底，不会压住输入框。 */

.xc-addform-page {
    background-color: #ffffff;
}

.xc-addform-block {
    background-color: transparent;
    padding: 0 0 10px 0;
}

.xc-addform-title {
    font-weight: 600;
    font-size: 15px;
    color: #333333;
    margin: 0 0 10px 0;
}

/* ---------- 表单：白底平铺，不要任何框 ---------- */
.dx-form[class*="xc-addform-"] {
    width: 100% !important;
    max-width: none !important;
    margin: 0;
    padding: 0;
    border: 0 none !important;
    border-radius: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
}

/* ---------- 每行：标签固定宽右对齐 + 输入框吃掉剩余 ---------- */
.dx-form[class*="xc-addform-"] .dx-field-item {
    display: flex;
    align-items: center;
    padding-left: 0 !important;
    padding-right: 0 !important;
}

.dx-form[class*="xc-addform-"] .dx-field-item-label {
    flex: 0 0 110px !important;
    width: 110px !important;
}

.dx-form[class*="xc-addform-"] .dx-field-item-label-content {
    width: 104px !important;
    text-align: right !important;
}

.dx-form[class*="xc-addform-"] .dx-field-item-label-location-left {
    text-align: right;
    padding-right: 6px;
}

.dx-form[class*="xc-addform-"] .dx-field-item-label-text {
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
}

.dx-form[class*="xc-addform-"] .dx-field-item-content {
    flex: 1 1 auto !important;
    min-width: 0 !important;
    width: auto !important;
}

/* 输入框一律拉满整列（库表把很多字段配成了固定像素宽，不覆盖会参差不齐） */
.dx-form[class*="xc-addform-"] .dx-texteditor,
.dx-form[class*="xc-addform-"] .dx-texteditor-input-container,
.dx-form[class*="xc-addform-"] .dx-textarea,
.dx-form[class*="xc-addform-"] .dx-placeholder {
    width: 100% !important;
    max-width: 100% !important;
}

.dx-form[class*="xc-addform-"] .dx-textarea {
    min-height: 64px;
}

/* 行距 / 列距（4 列平铺，列间必须留空隙，否则标签会贴到左邻的输入框上） */
.dx-form[class*="xc-addform-"] .dx-box-flex.dx-box.dx-collection {
    row-gap: 6px !important;
    column-gap: 16px !important;
}

/* =====================================================================
   ★ 2026-10-26：DevExtreme 对话框正文前导语义图标
   ---------------------------------------------------------------------
   需求：「询问」类弹窗（confirm）在正文前显示问号；「提醒 / 警告 / 异常」类（alert）
        按语义显示 i / ! / ✕，与右下角 .message-box 共用 MessageBoxIcon 那套圆形 PNG。

   职责划分（本文件只管「画」，不管「判定」）：
     · wwwroot/jsTools/GlobalDialogCompat.js 接管 DevExpress.ui.dialog.confirm/.alert，
       在正文最前面插入 <span class="xc-dlg-ico xc-dlg-ico-ask"> 之类的前导占位；
     · 图标本身在这里用 ::before 贴图，PNG 走 MessageBoxIcon 目录（新增 m_ask.png）。

   为什么用 inline-block 的 ::before，而不是 padding-left + 绝对定位：
     `.dx-popup-content.dx-dialog-content` 是 text-align:center（本文件第 409 行），
     行内前导元素会被一起居中；若改成 padding-left + position:absolute，
     文字整体会右移半个图标宽，「确定退出吗？」这种短句一眼能看出偏心。
     同时 inline-block 只占第一行行首，多行正文的第二行仍从容器左边起，不会整体缩进。

   ★ 图标路径相对本文件（wwwroot/css/viewStyle/ ⇒ ../../img/…），
     与 LayoutMessageBoxStyle.css 的写法一致，两处可直接互抄。
   ===================================================================== */
/* 让图标成为「文本块」的前导：多行正文的第二行起与第一行文字左边缘对齐。
   padding-left 30px = 图标宽 22 + 右间距 8；text-indent -30px 把首行拉回容器左边缘，
   图标正好落在这块负缩进里。单行短句时 inline-block 收缩到内容宽，仍随 text-align:center 居中。 */
.xc-dlg-ico {
    display: inline-block !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
    padding-left: 30px !important;
    text-indent: -30px !important;
    text-align: left !important;
}

.xc-dlg-ico::before {
    text-indent: 0 !important;
    content: "" !important;
    display: inline-block !important;
    width: 22px !important;
    height: 22px !important;
    margin-right: 8px !important;
    vertical-align: -5px !important;
    background-position: center center !important;
    background-repeat: no-repeat !important;
    background-size: contain !important;
}

.xc-dlg-ico-ask::before   { background-image: url('../../img/MessageBoxIcon/m_ask.png') !important; }
.xc-dlg-ico-info::before  { background-image: url('../../img/MessageBoxIcon/m_remind.png') !important; }
.xc-dlg-ico-warn::before  { background-image: url('../../img/MessageBoxIcon/m_warn.png') !important; }
.xc-dlg-ico-error::before { background-image: url('../../img/MessageBoxIcon/m_error.png') !important; }

/* =====================================================================
   ★ 2026-10-26：公共确认框皮肤（样式方案 C · 公文强调条）
   ---------------------------------------------------------------------
   作用域：只认 .xc-dialog-c。该标记由 jsTools/GlobalDialogCompat.js 在包装
     DevExpress.ui.dialog.confirm / .alert 时加到弹窗根节点上，
     因此 dialog.custom 生成的自定义弹窗（材料追溯、账套、设备报修…）不受影响。

   设计要点：
     · 顶部 4px 琥珀渐变强调条（画在标题栏的 background 上，不占布局、不影响拖拽）
     · 标题 18px/700 左对齐；正文 14.5px 左对齐、行高 1.8（原来是居中，正式感不足）
     · 正文下方灰底提示框 .xc-dialog-hint，说明「做完之后会怎样」
     · 按钮统一 40px 高、104px 最小宽、8px 圆角；主按钮 .dx-button-default 实心琥珀
     · 去掉正文前的蓝色问号：强调条 + 动宾按钮文案已承担「需确认」的语义
       （要恢复只需把「隐藏前导图标」那两条注释掉）

   ★ 必须带 .xc-dialog-c 前缀的原因：本文件上方已有全局规则
       .dx-button.dx-dialog-button { height:25px !important }   ← 按钮只有 25px，是「小气」的直接原因
       .dx-popup-content.dx-dialog-content { text-align:center !important; padding:24px 24px 0 }
     这些规则服务的是全站所有弹窗，不能直接改；靠 .xc-dialog-c 提高一级特异性压住即可。

   ★ 回滚：删掉本段即可。GlobalDialogCompat.js 里保留「加类」那几行也无害
     —— 没有本段样式，加类不产生任何视觉变化。
   ===================================================================== */

/* ---------- 容器：圆角 + 投影 ----------
 * ★ 2026-10-27 修「底部按钮被切」：
 *   DevExtreme 渲染时会把弹窗高度写死成内联 style（height:218px 之类）。
 *   本段把按钮条 padding 加到 18/20、按钮高 40px，比它按默认按钮条算出的高度更高，
 *   多出来的那一截就被 overflow:hidden 直接切掉 —— 现象就是「取消 / 确定反审核
 *   两个按钮的底边被弹窗下沿咬掉」。
 *   三道保险：
 *     ① height:auto !important —— 压掉内联定高，让弹窗按内容自然长高；
 *     ② max-height:none        —— 不因视口偏小被 DevExtreme 夹到上限；
 *     ③ overflow:visible       —— 万一别处仍把高度算小，宁可露出来也不切掉。
 *   圆角改由标题栏 / 按钮条各自画（见下两段），不再依赖 overflow:hidden 裁剪。
 */
.xc-dialog-c .dx-overlay-content {
    border-radius: 12px !important;
    height: auto !important;
    max-height: none !important;
    overflow: visible !important;
    box-shadow: 0 16px 44px rgba(20, 30, 45, .22), 0 2px 6px rgba(20, 30, 45, .08) !important;
    background-color: #fff !important;
}

/* 正文区同理：高度跟着内容走，不和按钮条抢空间 */
.xc-dialog-c .dx-popup-content.dx-dialog-content {
    height: auto !important;
    max-height: none !important;
}

/* ---------- 标题栏：顶部琥珀渐变强调条 ---------- */
.xc-dialog-c .dx-popup-title.dx-toolbar {
    background-color: #fff !important;
    background-image: linear-gradient(90deg, #f5a623 0%, #f7c948 100%) !important;
    background-repeat: no-repeat !important;
    background-size: 100% 4px !important;
    background-position: top left !important;
    border-bottom: 1px solid #eef0f3 !important;
    padding: 16px 28px 0 28px !important;
    border-radius: 12px 12px 0 0 !important;   /* 容器不再裁剪，上圆角自己画 */
}

.xc-dialog-c .dx-popup-title.dx-toolbar .dx-toolbar-items-container {
    height: 34px !important;
    line-height: 34px !important;
}

.xc-dialog-c .dx-popup-title.dx-toolbar .dx-toolbar-label {
    font-size: 18px !important;
    font-weight: 700 !important;
    color: #1f2328 !important;
    letter-spacing: .4px !important;
    /* ★ DevExtreme 按默认 16px 字号把标题标签宽度量成 48px 并写成内联 max-width，
     *   本段把字号提到 18px 后「反审核」需要 53px ⇒ 被省略成「反…」。
     *   这里放开这个上限（内联无 !important，样式表 !important 可压）。 */
    max-width: none !important;
}

/* ---------- 正文：左对齐、加宽、行高放开 ---------- */
.xc-dialog-c .dx-popup-content.dx-dialog-content {
    text-align: left !important;
    padding: 6px 28px 0 28px !important;
    min-width: 400px !important;
    max-width: 560px !important;
}

.xc-dialog-c .dx-dialog-message {
    padding: 0 !important;
    font-size: 14.5px !important;
    line-height: 1.8 !important;
    color: #3d444b !important;
}

/* ★ 2026-10-27（第115轮）：恢复正文前导的问号图标。
   原这里是「隐藏前导的蓝色问号」两条规则（2026-10-26 决定的）——
   当时的理由是「顶部强调条 + 动宾按钮文案已承担需确认的语义」；
   但网格删除确认框实际渲染出来是「一块白底 + 一行字 + 两个实心按钮」，
   没有任何视觉锚点，用户要求参照「上面有标题 + 左侧问号」的样式，故恢复。
   要再隐藏：加回 .xc-dialog-c .xc-dlg-ico::before { display:none !important; } 即可，
   图标 span 一直在 HTML 里，不用改 JS。 */

/* ---------- 影响说明：灰底提示框 ---------- */
.xc-dialog-c .xc-dialog-hint {
    margin-top: 14px !important;
    padding: 10px 12px !important;
    background-color: #fafbfc !important;
    border: 1px solid #e6e9ed !important;
    border-radius: 8px !important;
    font-size: 12.5px !important;
    line-height: 1.7 !important;
    color: #767c82 !important;
}

/* ---------- 按钮条：右对齐、加大留白 ---------- */
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons {
    padding: 18px 28px 20px 28px !important;
    margin-top: 0 !important;
    background-color: #fff !important;
    border-top: 0 none !important;
    border-radius: 0 0 12px 12px !important;   /* 容器不再裁剪，下圆角自己画 */
    flex: 0 0 auto !important;                 /* 绝不被正文挤扁 */
    min-height: 78px !important;
}

.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-toolbar-items-container {
    justify-content: flex-end !important;
    height: auto !important;
    line-height: normal !important;
}

.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-toolbar-center {
    margin-left: auto !important;
    margin-right: 0 !important;
    justify-content: flex-end !important;
}

.xc-dialog-c .dx-dialog-buttons .dx-toolbar-item + .dx-toolbar-item {
    margin-left: 10px !important;
}

/* ---------- 按钮：统一尺寸 ---------- */
.xc-dialog-c .dx-button.dx-dialog-button {
    height: 40px !important;
    min-width: 104px !important;
    border-radius: 8px !important;
    font-weight: 600 !important;
}

.xc-dialog-c .dx-button.dx-dialog-button .dx-button-content {
    padding: 0 22px !important;
}

.xc-dialog-c .dx-button.dx-dialog-button .dx-button-text {
    font-size: 14px !important;
    font-weight: 600 !important;
    line-height: 1 !important;
}

/* 取消：白底描边 */
.xc-dialog-c .dx-button.dx-dialog-button.dx-button-normal {
    background-color: #fff !important;
    border: 1px solid #e3e6ea !important;
    color: #4a5056 !important;
    box-shadow: none !important;
}

.xc-dialog-c .dx-button.dx-dialog-button.dx-button-normal .dx-button-text {
    color: #4a5056 !important;
}

.xc-dialog-c .dx-button.dx-dialog-button.dx-button-normal.dx-state-hover {
    background-color: #f6f7f9 !important;
}

/* 确定：实心琥珀（带一点投影，与顶部强调条呼应） */
.xc-dialog-c .dx-button.dx-dialog-button.dx-button-default {
    background-color: #e8a01c !important;
    border: 1px solid #e8a01c !important;
    color: #fff !important;
    box-shadow: 0 3px 10px rgba(209, 143, 10, .30) !important;
}

.xc-dialog-c .dx-button.dx-dialog-button.dx-button-default .dx-button-text {
    color: #fff !important;
}

.xc-dialog-c .dx-button.dx-dialog-button.dx-button-default.dx-state-hover {
    background-color: #d99213 !important;
    border-color: #d99213 !important;
}

.xc-dialog-c .dx-button.dx-dialog-button.dx-button-default.dx-state-focused {
    background-color: #d99213 !important;
}

/* =====================================================================
   ★ 2026-10-27 · 危险动作变体（删除类）—— 红色警示皮肤

   为什么单独做一套：删除是「不可逆」动作，与审核/反审核/release 同用琥珀色
   会让人下意识连点。红色是「警告」的通用语义，能让人多看一眼。

   生效条件：GlobalDialogCompat.js 在贴 .xc-dialog-c 时，若标题命中
   「删除 / 作废 / 清空 / 注销」等破坏性词，就同时贴 .xc-dialog-danger。
   只覆盖三处颜色（顶部强调条 / 主按钮 / 提示框），版式与尺寸完全沿用方案 C，
   因此不存在两套皮肤互相打架的问题。
   ===================================================================== */

/* 顶部强调条：琥珀 → 正红渐变 */
.xc-dialog-c.xc-dialog-danger .dx-popup-title.dx-toolbar {
    background-image: linear-gradient(90deg, #d93025 0%, #f2695c 100%) !important;
}

/* 主按钮：实心红（含 hover / focus 的加深态） */
.xc-dialog-c.xc-dialog-danger .dx-button.dx-dialog-button.dx-button-default {
    background-color: #d9342b !important;
    border: 1px solid #d9342b !important;
    box-shadow: 0 3px 10px rgba(217, 52, 43, .32) !important;
}

.xc-dialog-c.xc-dialog-danger .dx-button.dx-dialog-button.dx-button-default.dx-state-hover,
.xc-dialog-c.xc-dialog-danger .dx-button.dx-dialog-button.dx-button-default.dx-state-focused {
    background-color: #bf2a22 !important;
    border-color: #bf2a22 !important;
}

/* 影响说明框：灰底 → 淡红底，和强调条呼应，不抢正文可读性 */
.xc-dialog-c.xc-dialog-danger .xc-dialog-hint {
    background-color: #fdf6f5 !important;
    border-color: #f0d7d4 !important;
    color: #8a4a44 !important;
}

/* 危险案的「取消」保持中性白底 —— 给用户留一条明显的退路 */
.xc-dialog-c.xc-dialog-danger .dx-button.dx-dialog-button.dx-button-normal.dx-state-hover {
    background-color: #f6f7f9 !important;
    border-color: #e3e6ea !important;
}

/* 窄屏兜底：不强撑 400px，避免小屏横向溢出 */
@media (max-width: 520px) {
    .xc-dialog-c .dx-popup-content.dx-dialog-content {
        min-width: 0 !important;
    }
}

/* =====================================================================
   ★ 2026-10-27（第115轮）：对话框按钮「主 / 次」角色
   ---------------------------------------------------------------------
   为什么不用现成的 .dx-button-default / .dx-button-normal 区分：
     DevExtreme 23.1 的 dialog 给**每一个**按钮都加 dx-button-default
     （无头 Chrome 实测：删除确认框「取消」「确定」两个按钮的 class 完全相同，
      都是 dx-button-mode-text dx-button-default dx-dialog-button），
     所以上面「取消＝白底描边」那几条 .dx-button-normal 规则一次都没命中，
     两个按钮都是实心琥珀 + 白字。
   做法：GlobalDialogCompat.js 贴 .xc-dialog-c 时按「按钮组最后一个＝主按钮」
     打类 .xc-btn-ok / .xc-btn-cancel；这里用 (0,5,0) 权重压住实心色，
     与按钮带不带 default 无关。
   ===================================================================== */

/* 次按钮（取消）：白底 + 1px 描边 + 深灰字
   ★ 必须把 hover / focused / active 一起写进选择器：
     按钮组里第一个按钮默认带 dx-state-focused，而上面「危险变体」那条
     .xc-dialog-c.xc-dialog-danger .dx-button.dx-dialog-button.dx-button-default.dx-state-focused
     是 (0,6,0)、比本段的 (0,5,0) 高 —— 实测取消按钮被刷成深红底 rgb(191,42,34)，
     文字又按本段是深灰，几乎看不清。 */
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel,
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-hover,
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-focused,
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-active {
    background-color: #fff !important;
    border: 1px solid #e3e6ea !important;
    color: #4a5056 !important;
    box-shadow: none !important;
}

.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel .dx-button-text,
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel .dx-button-content {
    color: #4a5056 !important;
}

.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-hover {
    background-color: #f6f7f9 !important;
    border-color: #dfe3e8 !important;
}

/* 主按钮（确定）：实心琥珀 + 白字（样式与方案 C 的 .dx-button-default 一致，权重更高） */
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok {
    background-color: #e8a01c !important;
    border: 1px solid #e8a01c !important;
    color: #fff !important;
    box-shadow: 0 3px 10px rgba(209, 143, 10, .30) !important;
}

.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok .dx-button-text,
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok .dx-button-content {
    color: #fff !important;
}

.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok.dx-state-hover,
.xc-dialog-c .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok.dx-state-focused {
    background-color: #d99213 !important;
    border-color: #d99213 !important;
}

/* 危险变体（删除类）：主按钮改正红，与顶部红色强调条呼应 */
.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok {
    background-color: #d9342b !important;
    border-color: #d9342b !important;
    box-shadow: 0 3px 10px rgba(217, 52, 43, .32) !important;
}

.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok.dx-state-hover,
.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-ok.dx-state-focused {
    background-color: #bf2a22 !important;
    border-color: #bf2a22 !important;
}

/* 危险变体下的「取消」：同样 (0,6,0)/(0,7,0)，压住上面 .dx-button-default 的焦点红底
   —— 红色只给主按钮一个，退路永远是白底描边 */
.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel,
.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-hover,
.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-focused,
.xc-dialog-c.xc-dialog-danger .dx-popup-bottom.dx-dialog-buttons .dx-button.xc-btn-cancel.dx-state-active {
    background-color: #fff !important;
    border-color: #e3e6ea !important;
    color: #4a5056 !important;
    box-shadow: none !important;
}
