﻿/* =====================================================================
 * 手机端响应式适配样式（≤768px）
 * 统一由各页面的 <link> 引入，配合 js/mobile.js 使用
 * 核心：.px-win-mobile 作用于弹窗，.px-grid-mobile 作用于 Grid
 * ===================================================================== */

@media screen and (max-width: 768px) {

    /* ===== 窗口全屏 ===== */
    .px-win-mobile {
        width: 100vw !important; 
        max-width: 100vw !important;
        min-width: 0 !important;
        left: 0 !important;
        top: 0 !important;
        max-height: none !important;
        position: fixed !important;
        z-index: 19000 !important;
    }

    .px-win-mobile .x-window-wrap,
    .px-win-mobile .f-window-wrap,
    .px-win-mobile .x-window-body,
    .px-win-mobile .f-window-body,
    .px-win-mobile .x-form,
    .px-win-mobile .f-form,
    .px-win-mobile .x-form-body,
    .px-win-mobile .f-form-body {
        /* 2026-10-01 修正：原为 overflow-x:hidden，会把弹窗内 Grid 的横向滚动
           从外层直接裁掉，导致明细表格只显示前几列且无法右滑。
           改为 auto，纵向仍 auto；横向溢出交给内部 Grid 自行滚动。 */
        overflow-y: auto !important;
        overflow-x: auto !important;
        -webkit-overflow-scrolling: touch !important;
        width: 100% !important;
        max-width: 100% !important;
        min-width: 0 !important;
        box-sizing: border-box !important;
        padding-left: 2px !important;
        padding-right: 2px !important;
    }

    .px-win-mobile .x-window-body,
    .px-win-mobile .f-window-body {
        /* 高度不超过可视区（留出标题栏空间） */
        max-height: calc(100vh - 55px) !important;
        max-width: 100vw !important;
        /* ⚠ 2026-10-01 第 27 轮修正：**必须同时放开纵向滚动**！
           原来只设了 overflow-x:auto。当日期选择器(ShowTime=true)在手机上
           把时间面板**层叠到日期面板下方**时，内容变高，
           若主体不能纵向滚动 → **时间部分被裁掉，只能选日期**。
           故这里显式声明 overflow-y:auto + touch 惯性滚动。 */
        overflow-x: auto !important;
        overflow-y: auto !important;
        -webkit-overflow-scrolling: touch !important;
        touch-action: pan-x pan-y pinch-zoom !important;
    }

    /* ===== Column 布局控件项：强制撑满宽度实现单列 =====
       2026-10-01 修正：原规则含 display:block + position:static，
       会破坏 FineUI 内部按绝对定位排布的输入控件，
       导致「只显示标签、输入框消失」。现只覆写宽度相关属性，
       不动 display / position / float，保留 FineUI 原有定位机制。

       ⚠⚠ 2026-10-01 第二次修正（按钮"消失"的原因）：
       FineUI 的 FormRow 里，**同一行的多个控件（如一排按钮）是按列布局**的 ——
       每个控件包在 <div class="f-layout-column-item"> 里，靠内联 `left` 值横向排开。
       若统一强制 `width:100%; left:0`，这些控件会**全部叠在同一位置**，
       结果只看到最后一个（表现为"按钮少了"）。
       → 故必须**排除含按钮/链接按钮的 item**（用 :not(:has()) 兼容性差，
         改用"按钮自身还原"的思路：在下面单独把按钮 item 的 left 还原）。
       ⚠ 注意 .f-btn 是按钮、.f-linkbuttonfield 是行内链接按钮，
         都不能被压平。 */

    /* 表单控件项：撑满单列（仅用于输入控件） */
    .px-win-mobile .f-layout-column-item,
    .px-win-mobile .x-layout-column-item {
        width: 100% !important;
        max-width: 100% !important;
        min-width: 0 !important;
        left: 0 !important;
        right: auto !important;
        box-sizing: border-box !important;
    }

    /* ★ 但「含按钮的控件项」必须还原为 FineUI 原有布局 —— 否则同排按钮重叠。
       通过 :has() 精准排除（现代浏览器及微信 X5 均已支持）；
       不支持 :has() 的旧内核由 JS 的 fixButtonRowLayout() 兜底还原。 */
    .px-win-mobile .f-layout-column-item:has(.f-btn),
    .px-win-mobile .f-layout-column-item:has(.f-linkbutton),
    .px-win-mobile .f-layout-column-item:has(.f-button) {
        width: auto !important;
        max-width: none !important;
        min-width: 0 !important;
        left: auto !important;
        right: auto !important;
        box-sizing: border-box !important;
    }

    /* ★★ 2026-10-01 第 27 轮：「含多个输入框的控件项」也必须还原！
       原因：某些控件（如带时间的 DatePicker）在**宽屏**下内部是**横向多段**，
             FineUI 可能把它们各自包在 .f-layout-column-item 里靠 left 排开。
             被上面统一压成 width:100%; left:0 后 → 全部叠在一起、互相遮挡。
       处理：凡是内部含 **2 个及以上 input** 的控件项，还原为自适应布局，
             宽度由 :has() 组内的 JS 兜底函数计算。
       ⚠ 与"层叠显示"无关：手机(<600px)下的日期/时间面板层叠是 FineUI **内建**行为
         （官方 v7.1.1 优化），由框架自行处理，CSS 不得干预。 */
    .px-win-mobile .f-layout-column-item:has(input + input),
    .px-win-mobile .f-layout-column-item:has(.f-timefield),
    .px-win-mobile .f-layout-column-item:has(.f-timepicker),
    .px-win-mobile .f-layout-column-item:has(.f-datetimefield) {
        width: auto !important;
        max-width: none !important;
        min-width: 0 !important;
        left: auto !important;
        right: auto !important;
        box-sizing: border-box !important;
    }

    /* ===== 表单控件：撑满宽度 ===== */
    .px-win-mobile .f-field,
    .px-win-mobile .x-form-item {
        width: 100% !important;
        max-width: 100% !important;
        min-width: 0 !important;
        box-sizing: border-box !important;
    }

    /* 标签单元格和输入框单元格：撑满宽度，标签左对齐 */
    .px-win-mobile .f-field-fieldlabel-cell,
    .px-win-mobile .f-field-body-cell,
    .px-win-mobile .x-form-item-label,
    .px-win-mobile .x-form-item-body {
        width: 100% !important;
        max-width: 100% !important;
        min-width: 0 !important;
        box-sizing: border-box !important;
    }
    .px-win-mobile .f-field-fieldlabel-cell,
    .px-win-mobile .x-form-item-label {
        text-align: left !important;
    }

    /* 标签文字允许换行 */
    .px-win-mobile .f-field-fieldlabel,
    .px-win-mobile .f-fieldlabel-text {
        white-space: normal !important;
        word-wrap: break-word !important;
    }

    .px-win-mobile .f-field-body-cell-inner {
        width: 100% !important;
    }

    /* ===== 表单项内的 table 撑满宽度（不改变 display，避免拍平布局） ===== */
    .px-win-mobile .f-form table,
    .px-win-mobile .f-form-row table,
    .px-win-mobile .f-field table,
    .px-win-mobile .x-form table,
    .px-win-mobile .x-form-row table,
    .px-win-mobile .x-form-item table {
        width: 100% !important;
        box-sizing: border-box !important;
    }

    /* ===== 保护 Grid 表格不被 block 化 ===== */
    .px-win-mobile .f-grid table,
    .px-win-mobile .x-grid table,
    .px-win-mobile .f-grid tbody,
    .px-win-mobile .x-grid tbody,
    .px-win-mobile .f-grid tr,
    .px-win-mobile .x-grid tr,
    .px-win-mobile .f-grid td,
    .px-win-mobile .x-grid td {
        display: revert !important;
        width: auto !important;
        max-width: none !important;
        min-width: auto !important;
        float: none !important;
        clear: none !important;
        box-sizing: content-box !important;
    }

    /* ===== 窄屏解除 ForceFit 的「按比例压缩」 =====
       ForceFit 通过 table-layout:fixed + 列宽百分比把表格压成容器宽、列等比缩小，
       且不产生横向滚动 —— 窄屏下表现为「只看到前 1~2 列、无法右滑」。
       此处让表格回到按列声明宽度布局，溢出后由外层容器横向滚动。
       ⚠ 2026-10-01 第 17 轮修正：**不再强制 width:auto**！
       锁定列（AllowColumnLocking）的 sticky 偏移依赖 FineUI 依 Grid Width 算出的
       表格宽度；若把 width 改成 auto，锁定列会失效（按钮列跟着滚动）。
       故仅解除 table-layout:fixed 与 min-width，保留表格自身宽度。 */
    .px-win-mobile .f-grid > table,
    .px-win-mobile .f-grid table.x-grid-table,
    .px-win-mobile .f-grid > .x-grid-body table,
    .px-win-mobile .f-grid > .x-grid-view table {
        table-layout: auto !important;
        /* min-width 用表格自身宽度兜底，不收缩（保留 FineUI 计算值） */
        max-width: none !important;
    }

    /* ===== ★ Grid 横向滚动修复（2026-10-01 真机诊断多轮定位）=====
       实测 DOM 链条（第三次诊断，已确认滚动可用的层级）：
         table(2219px)
           └ .f-grid-headerinnerct  off=2219 scr=2219 ox=auto   ← 撑开成功
               └ .f-grid-headerct   off=317  scr=2219 ox=auto   ← ★ 可滚动=true（已能滚）
                   └ .f-grid-inner  off=317  scr=317  ox=auto   ← ✗ 父层仍未感知溢出
                       └ .f-panel-body → .f-panel-bodyct → .f-grid
       结论：headerct 已能滚，但 f-grid-inner 有【两个子元素】（表头区+数据区），
             父层未随 headerct 一起滚动，故整表看起来仍不能滚。
       解法：把滚动统一提升到 f-grid-inner 一层 ——
             让 headerct 不裁切（overflow:visible，把 2219 的溢出继续上传），
             由 f-grid-inner 作为唯一横向滚动容器。 */
    .px-win-mobile .f-grid-headerinnerct {
        width: max-content !important;
        min-width: 100% !important;
        overflow-x: visible !important;
        overflow-y: hidden !important;
    }
    .px-win-mobile .f-grid-headerct,
    .px-win-mobile .f-grid-headerct.f-state-default {
        /* 不再自行滚动，改由 f-grid-inner 统一滚动 */
        overflow-x: visible !important;
        overflow-y: hidden !important;
        width: max-content !important;
        min-width: 100% !important;
    }
    /* ★★★ 2026-10-05 第 43 轮修正：Grid 限宽规则**不能只放在 .px-win-mobile 下**！
       问题（用户反馈截图 px_xiangmukaiban）：
         主页面上的 Grid（带 CssClass="px-grid-mobile" 但**不在弹窗内**）
         既没有 .px-win-mobile 祖先，规则不匹配；
         若其 aspx 又写了固定 Width="1000px"，小屏下 Grid 会撑到 1000px
         而容器仅约 400px → **Grid 溢出容器外**，
         表现为「内容挤在左侧一小条、右侧大片空白」。
       解法：把 `.px-grid-mobile` 提到**独立选择器**（不再要求 .px-win-mobile 祖先），
             两条并列书写，保证主页面与弹窗内的 Grid 都被限宽。
       ⚠ 原理（第 19 轮诊断结论）：
         Grid 自身被像素宽撑开后，.f-grid-inner 的 max-width:100% 等于该像素宽，
         它也不再受限 → 表格与容器同宽、无溢出 → 既滚不动、又溢出到容器外。
       故必须让 **Grid 自身 = 容器宽（100%）**，
       而 .f-grid-inner 窄于内部 table → 产生溢出 → 由它承担横向滚动。 */
    .px-win-mobile .f-grid,
    .px-win-mobile .px-grid-mobile,
    .px-grid-mobile {
        width: 100% !important;
        max-width: 100% !important;
        box-sizing: border-box !important;
    }
    /* ★★ 2026-10-05 第 43 轮：**通用兜底** —— 手机上所有 Grid 都不得被固定像素宽度撑破。
       背景：全项目有 30+ 个 Grid 写了固定的 Width="1000px/1200px/1700px…"，
             手机容器仅约 400px 时会「溢出到容器外、内容挤在左侧」。
             逐个改 aspx 风险大、易漏；此处用 CSS 统一覆盖其**行内宽度**。
       ⚠ 只在小屏生效（本规则位于 @media max-width:768px 内），PC 端不受影响。
       ⚠ 用 `!important` 覆盖 FineUI 写在 style 上的像素宽度。 */
    .f-grid {
        width: 100% !important;
        max-width: 100% !important;
        box-sizing: border-box !important;
    }
    /* 通用兜底：唯一横向滚动容器 */
    .f-grid-inner {
        overflow-x: auto !important;
        overflow-y: visible !important;
        -webkit-overflow-scrolling: touch !important;
        max-width: 100% !important;
        touch-action: pan-x pinch-zoom !important;
        -ms-touch-action: pan-x pinch-zoom !important;
    }
    /* Grid 内部其余层只放开 overflow（不抢滚动权） */
    .f-grid-headerct,
    .f-grid-headerinnerct,
    .f-grid-bodyct {
        overflow-x: visible !important;
        max-width: none !important;
    }
    /* 表头/数据两块按内容撑开，让 f-grid-inner 感知溢出 */
    .f-grid-inner > * {
        width: max-content !important;
        min-width: 100% !important;
    }
    /* 表格本身按列声明宽度布局（解除 ForceFit 的压缩） */
    .f-grid table {
        table-layout: auto !important;
    }
    /* ★ 唯一横向滚动容器（同样提到 .px-grid-mobile 直系） */
    .px-win-mobile .f-grid-inner,
    .px-grid-mobile .f-grid-inner {
        overflow-x: auto !important;
        overflow-y: visible !important;
        -webkit-overflow-scrolling: touch !important;
        max-width: 100% !important;
        /* 微信 X5 内核：必须显式声明触摸手势方向，
           否则 FineUI 在 Grid 上绑定的触摸事件会把横向滑动"吃掉" */
        touch-action: pan-x pinch-zoom !important;
        -ms-touch-action: pan-x pinch-zoom !important;
    }
    /* Grid 各层都允许横向手势穿透（避免被行选中/点击事件拦截） */
    .px-win-mobile .f-grid,
    .px-win-mobile .f-grid-inner,
    .px-win-mobile .f-grid-headerct,
    .px-win-mobile .f-grid-headerinnerct,
    .px-win-mobile .f-grid-bodyct,
    .px-win-mobile .px-mx-panel,
    .px-win-mobile .px-mx-panel .f-panel-bodyct {
        touch-action: pan-x pan-y pinch-zoom !important;
    }
    /* 表头/数据两块都要按内容撑开，才能让 f-grid-inner 感知溢出 */
    .px-win-mobile .f-grid-inner > * {
        width: max-content !important;
        min-width: 100% !important;
    }

    /* ===== ★★★ 操作按钮「好找 + 好点」 =====
       ★★★ 2026-10-08 第 155 轮：**分工已变，本段选择器与样式保持不变** ——
         · **列顺序**：改由**服务端**负责 —— App_Code/PageBase.cs 的
           `MoveActionColumnsFirst` 在 OnPreRender 里把 f:LinkButtonField 列
           排到"序号列之后"⇒ 首屏与**每次 AJAX 回发**都成立。
           （第 56 轮那套"JS 搬 <th>/<td> DOM"的做法已于第 146 轮删除，
             **不再恢复** —— 它当年正是"搬两次 ⇒ 列错位"和"和 doLayout 对写 ⇒ 抖动"的根源。）
         · **标记**：改由 js/mobile.js 的 `markActionColumnsForMobile()` 负责
           （**只贴属性、不移动任何 DOM**；幂等，可在轮询里重复执行）。
           ⚠ 第 146 轮删掉"搬列"时，这个标记也一并没人打了
             ⇒ 本段样式曾一度成为**死代码**（40px 触控高度丢失，属回归）；
             第 155 轮已补回标记。
       背景：第 56 轮用户需求"不固定按钮列也可以，要方便显示按钮并容易操作"
             ⇒ ① 操作列排到最左；② 本段把操作列里的按钮放大到 40px 触控高度、不换行。
       ⚠ 只影响操作列，不动其它单元格的既有样式。 */

    /* 1) 操作列单元格：不换行、垂直居中、留足内边距 */
    .f-grid td[data-px-action="1"],
    .f-grid th[data-px-action="1"] {
        white-space: nowrap !important;
        text-align: center !important;
        vertical-align: middle !important;
        padding: 6px 8px !important;
        /* ⚠ 不要设 width:1%！
           宽度若被压到 1%，按钮的 padding 会挤掉文字，导致"进…"截断。
           保持 auto，由内容（nowrap 的按钮）自然决定宽度。 */
        width: auto !important;
        min-width: 96px !important;   /* 保证"进行确认"四字 + 内边距放得下 */
    }
    /* 2) 单元格内层容器不换行（FineUI 默认会 white-space:normal 导致按钮文字折行） */
    .f-grid td[data-px-action="1"] .f-grid-cell-inner,
    .f-grid td[data-px-action="1"] .f-grid-cell {
        white-space: nowrap !important;
        overflow: visible !important;
        text-overflow: clip !important;
        display: block !important;
    }
    /* 3) 按钮本体：40px 触控高度（用户指定），字号/内边距同步放大 */
    .f-grid td[data-px-action="1"] a,
    .f-grid td[data-px-action="1"] .f-btn,
    .f-grid td[data-px-action="1"] .f-linkbutton,
    .f-grid td[data-px-action="1"] [class*="f-btn"] {
        display: inline-block !important;
        min-height: 40px !important;
        line-height: 40px !important;
        padding: 0 14px !important;
        font-size: 14px !important;
        box-sizing: border-box !important;
        vertical-align: middle !important;
        border-radius: 4px !important;
        /* 手机端去掉点击高亮闪烁，改用 FineUI 自身的按下态 */
        -webkit-tap-highlight-color: transparent !important;
    }
    /* 4) 行号列之后紧跟操作列时，给一点视觉区隔（可选） */
    .f-grid td[data-px-action="1"] {
        background-color: #fbfbfb !important;
    }

    /* ===== 锁定列（移动端固定按钮列）—— 2026-10-01 第 20 轮：**功能已关闭** =====
       排查结论（供日后参考）：
         · FineUI 的 `AllowColumnLocking` 在手机端不生效
           （诊断实证：`sticky 单元格数: 0`，连 PC 端正常的主表也是 0）。
         · 曾尝试 JS 自建 sticky 固定列（右侧吸附），
           但**浏览器内核差异较大**，效果不稳定，个别内核下还会让整表被吸附住
           （诊断为"全部列被误判为锁定列"）导致无法横向滚动。
         · 经与用户确认：**移动端暂不做固定列**，优先保证横向滚动可用。
       故相关 CSS 规则已全部移除；JS 侧 `fixLockedColumns()` 保留但**默认关闭**
       （见 js/mobile.js，需 `window.__pxEnableLockedColumns = true` 才启用）。
       ⚠ 这段位置留作记录，切勿再轻易恢复 —— 恢复前务必在真机上验证
          "横向滚动仍可用"（这是优先级更高的能力）。 */

    /* ===== ⚠ 2026-10-01 第 18 轮：f-panel-bodyct **不再**承担横向滚动 =====
       诊断（第 17 轮）显示它被当成了滚动容器（off=281 scr=870），
       与 .f-grid-inner（off=870 scr=883）形成"双重滚动"互相打架，
       结果两边都只溢出一点 → 用户反馈"移不动了"。
       ★ 滚动容器必须唯一：只有 .f-grid-inner（见上方 1b-3 规则）。
       故这里只放开 overflow（不裁切），**不设 max-width**（不抢滚动权）。 */
    .px-win-mobile .f-grid > .f-panel-bodyct,
    .px-win-mobile .f-grid .f-panel-bodyct {
        overflow-x: visible !important;
        max-width: none !important;
    }

    /* ===== ★ 明细弹窗：限制内容区宽度，逼出横向溢出 =====
       诊断实测（明细 Grid 无法滚动）：
         ^3 .f-panel-body    off=1098            ← 内容区被表格撑到 1098px
         ^4 .f-panel-bodyct  off=291  scr=1098   ← 容器仅 291px
         Grid 表格           off=1077            ← 表格跟着撑到 1077，不产生溢出
       成因：弹窗内部容器"随内容变宽"，导致 Grid 容器与表格同宽 → scr = off → 无滚动。
       解法：把弹窗内容链的宽度**钉死在视口宽**，让内部表格溢出后再由 f-grid-inner 滚动。
       注意：只作用于 .px-win-mobile 弹窗内部，不影响 PC 端。
       警告：外层不可设 overflow-x:hidden，否则会裁掉内层 f-grid-inner 的滚动。 */
    /* ⚠ 2026-10-01 第五轮修正：实测发现仅用 width:100% 无效。
       诊断数据（明细弹窗）：
         ^3 .f-panel-body    off=1098  w=1098.41px   ← 仍被内容撑宽（规则未生效）
         ^4 .f-panel-bodyct  off=291   scr=1098      ← 容器只有 291，溢出被反向上传
         ^5 #EditWindow      off=293   scr=1098
       原因：Window 带 AutoScroll="true" 时，中间层的 .f-panel-body 是 position:relative
             且宽度由内容决定，当"父宽未定"时 width:100% 不产生约束力。
       解法：改用「绝对上限」约束 —— max-width 用 vw 计算（不依赖父宽），
             同时把 overflow-x 设为 auto 让溢出就地消化，不再往上反推。
             再配合 .f-window 自身的 hover 链限宽。 */
    .px-win-mobile.f-window,
    .px-win-mobile .f-window {
        width: 100vw !important;
        max-width: 100vw !important;
        box-sizing: border-box !important;
    }
    .px-win-mobile .f-window-body,
    .px-win-mobile .f-window-body > .f-panel-body,
    .px-win-mobile .f-window-body > .f-panel-body > .f-panel-bodyct,
    .px-win-mobile .f-window > .f-panel-body,
    .px-win-mobile .f-window > .f-panel-body > .f-panel-bodyct,
    .px-win-mobile .px-mx-panel,
    .px-win-mobile .px-mx-panel > .f-panel-body,
    .px-win-mobile .px-mx-panel > .f-panel-body > .f-panel-bodyct {
        width: 100% !important;
        max-width: 100vw !important;
        min-width: 0 !important;
        box-sizing: border-box !important;
    }
    /* ★ 关键：取消"内容反撑父层"的能力 —— 限制中间层不得被内容推宽。
       用 max-width:100vw 是绝对上限（不依赖父宽计算），
       配合 overflow-x:auto 让超宽内容在本层就地产生滚动条，
       而不是把整个祖先链顶宽。
       ⚠ 2026-10-01 第 17 轮：**必须排除 Grid 及其内部层**！
       Grid 依 Width 计算的表格宽度需要撑开（并被 f-grid-inner 滚动），
       若被 max-width/min-width:0 压缩，锁定列的 sticky 偏移计算会失效。 */
    .px-win-mobile .f-window .f-panel-body {
        max-width: 100vw !important;
    }
    /* ★ Grid 内部的中间层：保留内容宽度，不做限宽
       （用显式还原压过弹窗的限宽规则）
       ⚠ 2026-10-01 第 18 轮：**排除 .f-grid-inner**！
       它是唯一的横向滚动容器，必须保留 max-width:100%
       （只有限宽才能对内部 870px 的表格产生溢出 → 才能滚）。
       若给它 max-width:none，它会跟着内容撑到 870px，自身就没溢出了
       （诊断实证：off=870 scr=883，只差 13px → "移不动了"）。 */
    .px-win-mobile .f-grid .f-panel-body,
    .px-win-mobile .f-grid .f-panel-bodyct,
    .px-win-mobile .f-grid-headerct,
    .px-win-mobile .f-grid-headerinnerct,
    .px-win-mobile .f-grid-bodyct,
    .px-win-mobile .f-grid table {
        max-width: none !important;
        min-width: auto !important;
    }
    /* .f-grid-inner：唯一滚动容器，必须限宽（保持 1b-3 规则不被覆盖） */
    .px-win-mobile .f-grid-inner {
        max-width: 100% !important;
        min-width: 0 !important;
        overflow-x: auto !important;
    }

    /* ===== 弹窗容器不得裁切横向内容 =====
       诊断（网格明细弹窗）实测：
         #EditWindow        ox=hidden  ← 第二道裁剪，必须放开
         .f-panel-bodyct    off=291 scr=1098  ← 溢出已产生
       备注：.f-window 自身仍需 overflow:hidden 做圆角裁剪，
             故这里只放开 .f-window 内部的 body 链。 */
    .px-win-mobile .f-window > .f-panel-body,
    .px-win-mobile .f-window > .f-panel-body > .f-panel-bodyct,
    .px-win-mobile .f-window .f-window-body,
    .px-win-mobile .f-window .f-window-body > .f-panel-bodyct,
    /* 2026-10-01 补充：明细面板（px-mx-panel）及其 body 链同样需要
       就地消化溢出，否则宽表格会把这层反撑宽、再上传给 f-grid-inner，
       使 f-grid-inner 的 scr 等于 off，永远滚不动。 */
    .px-win-mobile .px-mx-panel,
    .px-win-mobile .px-mx-panel > .f-panel-body,
    .px-win-mobile .px-mx-panel > .f-panel-body > .f-panel-bodyct {
        overflow-x: auto !important;
        -webkit-overflow-scrolling: touch !important;
    }

    /* ===== FormRow：撑满宽度（不动 display，避免拍平 FineUI 布局） ===== */
    .px-win-mobile .x-form-row,
    .px-win-mobile .f-form-row {
        width: 100% !important;
        table-layout: fixed !important;
    }

    .px-win-mobile .x-form-row > *,
    .px-win-mobile .f-form-row > * {
        width: 100% !important;
        padding: 2px 4px !important;
        margin: 0 !important;
        box-sizing: border-box !important;
    }

    /* ===== 表单项撑满宽度 ===== */
    .px-win-mobile .x-form-item,
    .px-win-mobile .f-form-item,
    .px-win-mobile .x-form-field-wrap,
    .px-win-mobile .f-form-field-wrap {
        width: 100% !important;
        max-width: 100% !important;
        min-width: 0 !important;
        box-sizing: border-box !important;
    }

    /* ===== 隐藏字段保护 ===== */
    .x-hidden,
    .x-hide-display,
    .f-form-row [style*="display: none"],
    .f-form-row [style*="display:none"] {
        display: none !important;
    }

    /* ===== 标签 ===== */
    .f-form-label, .x-form-label,
    .f-form-item-label, .x-form-item-label {
        white-space: nowrap !important;
        text-overflow: ellipsis !important;
        overflow: hidden !important;
        display: inline-block !important;
        vertical-align: middle !important;
    }

    /* ===== 输入控件撑满 =====
       ⚠ 2026-10-01 第 27 轮：**.f-datepicker / .x-datepicker 已从此列表移除**！
       DatePicker 设了 ShowTime="true" 时，内部是横向多段结构
       （[日期输入框][时间输入框][触发按钮]）。若把容器本身设为 width:100%，
       内部靠后的「时间输入框」会被挤出容器外 → 现象是**只能选日期、选不了时间**。
       日期选择器的宽度处理见下方专门规则（外层撑满、内部各段自适应）。 */
    .px-win-mobile .f-form-text,
    .px-win-mobile .x-form-text,
    .px-win-mobile .f-triggerbox,
    .px-win-mobile .x-triggerbox,
    .px-win-mobile .f-combobox,
    .px-win-mobile .x-combobox,
    .px-win-mobile .f-numberbox,
    .px-win-mobile .x-numberbox,
    .px-win-mobile input[type="text"],
    .px-win-mobile select,
    .px-win-mobile textarea {
        width: 100% !important;
        max-width: 100% !important;
        box-sizing: border-box !important;
        min-width: 0 !important;
    }

    /* ★★★ 2026-10-01 第 27 轮（已修正）：带时间的日期选择器在手机端的显示
       ============================================================
       原以为"时间输入框被挤出容器"，但查阅 FineUIPro 官方发布说明后确认：

         v7.1.1 起，DatePicker 增加 StackDateTime 属性（默认 false）——
         **仅当 DisplayType=day 且 ShowTime=true 时有效**，将日期面板与时间面板
         **层叠**起来；并且**屏幕尺寸小于 600px 时会自动层叠**
         （官方优化项，非 bug）。

       即：手机（<600px）上，点开日期选择器后
         · 上方 = 日期面板（日历）
         · 下方 = **时间面板**
       两者是**上下堆叠**关系，需要**向下滚动面板**才能看到时间部分。

       因此本页**不做**任何强迫内部重排的 CSS（那会破坏 FineUI 自身的堆叠布局），
       改为两点适配：
         ① 让弹出的日历面板本身可滚动、且不被弹窗裁掉；
         ② 面板高度不要超过屏幕，保证能滚到时间部分。
       ============================================================ */
    /* =========================================================================
       ★★★ 2026-10-05 第 33 轮：日期/时间选择面板 —— 按**真实类名**修正
       =========================================================================
       真机诊断（第 32 轮广谱扫描）获得的 FineUIPro 15.0.1 真实 DOM：

       ① 面板根元素类名是 **`.f-calendar`**（不是 f-datepicker-panel！）：
            <div id="..._peisongshijian_Calendar"
                 class="f-calendar f-widget-content f-corner-all
                        f-calendar-display-day f-calendar-...">
              off=274x335  absolute  z=19010
              **overflow-y: hidden**      ← 关键：面板内容被纵向裁掉！

       ② 时间面板**确实存在且已渲染**，但被 `display:none` 隐藏：
            <div class="f-calendar-header"       text="选择时间"  disp=none>
            <div class="f-calendar-timepane"                   disp=none>  ← 时间区
              <table class="f-calendar-float-column-hour">
                <a class="f-calendar-hour" text="00|01|02...">

       ③ 日期区容器：
            .f-calendar-datetimepanect   (display:flex)
              .f-calendar-datetimepane   (block, relative)
                .f-calendar-datetimepane-body (display:flex)

       **根因**：诊断时**视口高度只有 163px**（手机软键盘弹出把可视区压缩了）。
       FineUI 判断"空间不足、放不下日期+时间"，于是**自动把时间面板 display:none**。

       ⚠ 因此本问题的正解不是"加滚动"，而是**让时间面板显示出来**：
          ① 强制 `.f-calendar-timepane` 等时间区可见（覆盖 display:none）；
          ② 面板允许纵向滚动（放不下时可滚）；
          ③ 面板高度自适应可视区（用 vh，不写死）。
       ⚠ 全部用 `.px-win-mobile` 前缀限定，PC 端（弹窗外）不受影响。
       ========================================================================= */

    /* =========================================================================
       ★★★ 2026-10-05 第 37 轮（方案定稿）：日期/时间选择面板
       =========================================================================
       【最终方案】由**服务端按设备**决定 DatePicker 的 `StackDateTime` 属性：
         · 手机端 → StackDateTime = true（日期面板与时间面板**层叠**，时间可见可点）
         · PC 端  → StackDateTime = false（日期与时间**并排**显示，保持原体验）
       实现见各页面 `.aspx.cs` 的 **Page_Init**：
           bool isMobile = IsMobileDevice();
           peisongshijian.StackDateTime = isMobile;
       （`StackDateTime` 是控件属性、**无条件生效**，故不能写在 aspx 上，
         否则 PC 端也会层叠；必须在代码里按设备区分。）

       ⚠ 本段 CSS **不再干预面板的 display 结构**！
         此前（第 33~36 轮）曾用 `display:block!important` 强行把时间区"顶"出来，
         那是在**没有启用 StackDateTime** 的前提下的权宜之计；
         现既已启用 StackDateTime，应由 FineUI 自行完成层叠布局，
         CSS 只需保证「面板放不下时能滚动、宽度不超视口」即可。
         继续强改 display 反而会与框架布局冲突。

       真机诊断（第 32 轮广谱扫描）确认的真实类名，供后续排查参考：
         .f-calendar              面板根（挂在 body 下、position:absolute、z≈19010）
           .f-calendar-datetimepanect   日期+时间的容器（display:flex）
             .f-calendar-datetimepane   日期区
           .f-calendar-header           时间区标题（文字"选择时间"）
           .f-calendar-timepane         时间区主体
             .f-calendar-float-column-hour   小时列
             .f-calendar-item.f-calendar-hour 时/分条目
       ========================================================================= */

    /* ① 日期选择器输入框：撑满所在列（只动 input 本身，不动容器） */
    .f-calendar input {
        box-sizing: border-box !important;
    }

    /* ② 面板根：放不下时可纵向滚动；宽度不超视口；层级保证在最上层 */
    .f-calendar {
        max-width: 100vw !important;
        max-height: 70vh !important;
        overflow-y: auto !important;
        overflow-x: hidden !important;
        box-sizing: border-box !important;
        -webkit-overflow-scrolling: touch !important;
        touch-action: pan-y pinch-zoom !important;
        z-index: 20000 !important;
    }

    /* ③ 内部各块宽度自适应，不超出面板；保证层叠后的两块都在视口内 */
    .f-calendar .f-calendar-datetimepanect,
    .f-calendar .f-calendar-datetimepane,
    .f-calendar .f-calendar-timepane,
    .f-calendar .f-calendar-header {
        max-width: 100% !important;
        box-sizing: border-box !important;
    }

    /* ④ 时间选择列（时/分）：内容多时自身可滚动，触控友好 */
    .f-calendar [class*="f-calendar-float-column"] {
        overflow-y: auto !important;
        -webkit-overflow-scrolling: touch !important;
        touch-action: pan-y pinch-zoom !important;
    }

    /* ===== Grid 表格手机端 ===== */
    .px-grid-mobile .f-grid-cell,
    .px-grid-mobile .x-grid-cell {
        font-size: 12px !important;
        padding: 4px 4px !important;
    }

    .px-grid-mobile .f-grid-cell-inner,
    .px-grid-mobile .x-grid-cell-inner {
        white-space: normal !important;
        word-break: break-all !important;
    }

    .px-grid-mobile {
        min-height: 250px !important;
    }

    /* ★★★★★★★ 2026-10-07 第 119 轮 r119：**收窄作用域，排除分页栏！**
       原写法（后代选择器）会把 Grid 内部**所有** `.f-panel-body` 都设成 min-height:200px ——
       **包括分页栏工具栏的 .f-panel-body**（真机诊断实测其高度恰为 200px：
       `^1 <div> .f-panel-body 331x200`）。
       该规则的本意只是给 **Grid 数据区** 兜底高度，不该波及分页栏。
       ⇒ 用 `:not()` 排除分页栏内的 body（.f-panel-toolbar-bottomct 的后代无法用
         `:not()` 表达，故改为**直接排除带 f-toolbar 的祖先链**：这里用两条规则处理）：
         ① 先整体保留原规则（数据区仍需要 200px 兜底）；
         ② 再用**更具体的选择器**把分页栏内的 body 重置为 0（见下一条）。

       ⚠ 注意：`.f-panel-body` 是 FineUI 的**通用类名**（Panel/Grid/Window/Toolbar 都用），
         所以任何"给 .f-panel-body 设尺寸"的规则都必须限定到真正的目标容器。 */
    .px-grid-mobile .f-panel-body,
    .px-grid-mobile .x-panel-body {
        min-height: 200px !important;
    }
    /* ★ 修正：分页栏工具栏内的 body 不应继承上面的 200px 兜底高度
       （分页栏高度应由其按钮内容决定）。选择器更具体 ⇒ 优先级更高。 */
    .px-grid-mobile .f-panel-toolbar-bottomct .f-panel-body,
    .px-grid-mobile .f-panel-toolbar-bottomct .x-panel-body {
        min-height: 0 !important;
    }

    /* ===== 触摸优化：按钮最小尺寸 ===== */
    .px-win-mobile .f-btn,
    .px-win-mobile .x-btn,
    .px-win-mobile button,
    .px-win-mobile [role="button"] {
        min-height: 40px !important;
        min-width: 40px !important;
        padding: 8px 14px !important;
        font-size: 14px !important;
    }

    /* ===== 下拉框触摸友好 ===== */
    .px-win-mobile select,
    .px-win-mobile .f-combobox input,
    .px-win-mobile .x-combobox input {
        min-height: 36px !important;
        font-size: 15px !important;
    }

    /* ===== 底部安全区适配（iPhone X 等刘海屏） ===== */
    .px-win-mobile {
        padding-bottom: env(safe-area-inset-bottom, 0) !important;
    }
    .px-win-mobile .f-window-body,
    .px-win-mobile .x-window-body {
        padding-bottom: calc(10px + env(safe-area-inset-bottom, 0)) !important;
    }
    .px-win-mobile .f-panel-footer,
    .px-win-mobile .x-panel-footer {
        padding-bottom: calc(8px + env(safe-area-inset-bottom, 0)) !important;
    }

    /* =================================================================
       ★★★ 2026-10-01 第 26 轮：手机端「隐藏次要列」
       =================================================================
       目的：宽表格在手机上要横向滑很久才能看到关键列。
             把次要列（身份证、银行卡、地址、单价等）隐藏，减少滚动距离。

       实现方式：**纯 CSS**，不依赖 FineUI 的 hideColumn API（项目里未验证过），
                 也不需要改后台代码。

       FineUI 的 Grid 渲染后，每个列的 <th> 与对应 <td> 都会带上
       `f-grid-colheader-<ColumnID>` 或 `f-grid-col-<ColumnID>` 之类的类名
       （注意：`f-grid-colheader-*` 类 FineUI 会给**所有**列都加，
        但后缀是各自的 ColumnID，可用于精确匹配某列）。

       用法：在页面的 <head> 里加一段：
         <style>
           @media screen and (max-width:768px) {
             .px-hide-col-xiangmuhao,
             .px-hide-col-danjia { display: none !important; }
           }
         </style>
       并给对应列的 <th>/<td> 打标记 —— 由 js/mobile.js 的
       `hideColumnsForMobile(gridId, [列ID列表])` 在运行时完成标记与隐藏，
       这样最可靠（不依赖 FineUI 的类名规则是否稳定）。

       下面的规则是 JS 打上标记后的实际隐藏效果。 */
    .px-hide-col {
        display: none !important;
        width: 0 !important;
        min-width: 0 !important;
        max-width: 0 !important;
        padding: 0 !important;
        border: 0 !important;
        overflow: hidden !important;
    }
    /* 被隐藏的列在表头占位也要一并清掉，避免表头与数据错位 */
    th.px-hide-col,
    td.px-hide-col {
        display: none !important;
    }
    /* 隐藏列后，锁定列（功能列）的 right 偏移需重算 —— 由 JS 负责 */
}
