@charset "UTF-8";
/* WXApp 全局样式（由 ServerModule.CustomFiles 加载，改完把 ?v= 加 1）
   从上往下：1 变量 → 2 ExtJS 组件（页签 / 菜单 / 面板 / 表格 / 表单 / 按钮 / 窗口）→ 3 业务卡片、响应式
   → 4 2026-09 改版新增（遮罩、左侧菜单图标、按钮栏、选中行、状态栏、页签、输入框、日期快捷键）
   → 5 提示（卡片 / 轻提示）→ 6 手机端、可访问性。
   后面的同权重规则会覆盖前面的，所以新增规则尽量放到对应段落的末尾，不要随手插到文件开头。
   首屏载入动画在 files/wx-loading.css（要在页面一出来就生效，单独一个文件）。 */
/* 1 变量 */

:root {--primary-color: #2e7d32; --primary-light: rgba(46, 125, 50, 0.10); --primary-hover: rgba(46, 125, 50, 0.15); --primary-strong: rgba(46, 125, 50, 0.35); --border-color: #e5e7eb; --text-color: #374151; --bg-white: #ffffff; --bg-gray: #f9fafb; --shadow-light: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-hover: 0 2px 4px rgba(0, 0, 0, 0.1); --radius: 8px; --grid-header-bg: #f8fafc; --grid-border: #fafafa; --grid-hover: #f1f5f9; --grid-selected: #e8f3e9; --grid-stripe: #f8f9fa;}

/* ⭐⭐⭐ 全局字体 - 统一所有组件 ⭐⭐⭐ */

* {font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", -apple-system, BlinkMacSystemFont, Arial, sans-serif; font-weight: 400;}

/* ⭐ 关键优化：移除所有 transform */

.x-grid-view, .x-grid-cell, .x-grid-cell-inner, .x-grid-row, .x-grid-item, .x-tab-bar, .x-panel-body, .x-btn, .x-window, .x-menu {transform: none !important;}

.x-window {animation: popSlide 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);}@keyframes popSlide {from { opacity: 0; transform: scale(0.92) translateY(12px); }to   { opacity: 1; transform: scale(1) translateY(0); }}
  
/*滚动条美化*/
::-webkit-scrollbar { width: 10px; height: 10px; }

::-webkit-scrollbar-track{background:#f4f7f5;border-radius:5px}

::-webkit-scrollbar-thumb{background:linear-gradient(to bottom,#c8e6c9,#81c784);border-radius:5px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:linear-gradient(to bottom,#a5d6a7,#66bb6a)}::-webkit-scrollbar-thumb:active{background:linear-gradient(to bottom,#81c784,#4caf50)}
/* 滑块用 border+background-clip 做出 2px 内缩，看起来比直接填满窄一点、不压边。切主题时 Set_Theme 会用同名 style 覆盖这几条。 */

.x-grid-row-selected {transition: background-color 0.15s ease;}


/* Tab 标签页 */
.x-tab {background: transparent;}


.x-tab-active .x-tab-inner-default {height: 21px !important; line-height: 21px; position: relative; border-bottom: none !important;}

.x-tab .x-tab-inner-default::after {content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 2px; background: var(--primary-color); border-radius: 2px 2px 0 0; transform: scaleX(0); transform-origin: center; transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);}

.x-tab-active .x-tab-inner-default::after {transform: scaleX(1);}


.x-tab-default-top {border: none !important; background-color: var(--bg-white) !important; border-radius: 6px 6px 0 0;}

.x-tab-default-top.x-tab-active, .x-tab-default.x-tab-active {background-color: transparent !important; background-image: none !important;}
/* Tab初始化动画 */

.x-tabpanel-child {animation: fadeIn 0.3s ease;} @keyframes fadeIn {from { opacity: 0; transform: translateY(8px); } to   { opacity: 1; transform: translateY(0); }}

/* PageControl 左右滚动按钮美化 - 优化版 */

.x-tab-bar-default-top .x-box-scroller-left,.x-tab-bar-default-top .x-box-scroller-right {width: 24px !important; height: 100% !important; background: linear-gradient(to right, rgba(255,255,255,0.98), rgba(255,255,255,0.85)) !important; border: none !important; opacity: 1 !important; transition: all 0.2s ease !important; cursor: pointer !important;}

.x-tab-bar-default-top .x-box-scroller-right {background: linear-gradient(to left, rgba(255,255,255,0.98), rgba(255,255,255,0.85)) !important;}
/* 隐藏默认的难看图标 */

.x-tab-bar-default-top .x-box-scroller-left .x-box-scroller-body-horizontal,.x-tab-bar-default-top .x-box-scroller-right .x-box-scroller-body-horizontal {background-image: none !important;}
/* 圆形按钮背景 */

.x-tab-bar-default-top .x-box-scroller-left::after,.x-tab-bar-default-top .x-box-scroller-right::after {content: ''; position: absolute; top: 30%; left: 50%; transform: translate(-50%, -50%); width: 20px; height: 20px; background: #f5f5f5; border-radius: 50%; border: 1px solid #e0e0e0; transition: all 0.25s ease; box-shadow: 0 1px 3px rgba(0,0,0,0.08);}
/* 箭头图标 */

.x-tab-bar-default-top .x-box-scroller-left::before,.x-tab-bar-default-top .x-box-scroller-right::before {content: ''; position: absolute; top: 30%; left: 50%; width: 8px; height: 8px; border-left: 2px solid #666; border-top: 2px solid #666; z-index: 1; transition: all 0.25s ease;}

.x-tab-bar-default-top .x-box-scroller-left::before {transform: translate(-50%, -50%) rotate(-45deg);}

.x-tab-bar-default-top .x-box-scroller-right::before {transform: translate(-50%, -50%) rotate(135deg);}
/* 鼠标悬停效果 */

.x-tab-bar-default-top .x-box-scroller-left:hover::after,.x-tab-bar-default-top .x-box-scroller-right:hover::after {background: var(--primary-color); border-color: var(--primary-color); box-shadow: 0 2px 6px var(--primary-strong); transform: translate(-50%, -50%) scale(1.05);}

.x-tab-bar-default-top .x-box-scroller-left:hover::before,.x-tab-bar-default-top .x-box-scroller-right:hover::before {border-color: #fff;}

.x-tab-bar-default-top .x-box-scroller-left:hover,.x-tab-bar-default-top .x-box-scroller-right:hover {background: linear-gradient(to right, rgba(255,255,255,0.98), rgba(255,255,255,0.85)) !important;}

.x-tab-bar-default-top .x-box-scroller-right:hover {background: linear-gradient(to left, rgba(255,255,255,0.98), rgba(255,255,255,0.85)) !important;}
/* 按下效果 */

.x-tab-bar-default-top .x-box-scroller-left:active::after,.x-tab-bar-default-top .x-box-scroller-right:active::after {transform: translate(-50%, -50%) scale(0.95);}
/* 禁用状态 */

.x-tab-bar-default-top .x-box-scroller-disabled::after {background: #fafafa; border-color: #e8e8e8; box-shadow: none;}

.x-tab-bar-default-top .x-box-scroller-disabled::before {border-color: #ccc;}

.x-tab-bar-default-top .x-box-scroller-disabled:hover::after {background: #fafafa; border-color: #e8e8e8; transform: translate(-50%, -50%) scale(1);}

.x-tab-bar-default-top .x-box-scroller-disabled:hover::before {border-color: #ccc;}

.x-tab-bar-default-top .x-box-scroller-disabled:hover {background: linear-gradient(to right, rgba(255,255,255,0.98), rgba(255,255,255,0.85)) !important;}

/*无边框窗体的专用 class*/

.no-border-style .x-window {border: 0 !important; border-radius: 0 !important;}
.no-border-style .x-window-default {padding: 0;}   


/* 菜单：原来这里、下面"菜单和下拉"、还有一段注释里各写了一遍 .x-menu，互相覆盖；合并成一处，取原来最终生效的值 */
.x-menu {background: #ffffff !important; background-image: none !important; border: none !important; border-radius: 8px !important; box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; padding: 4px !important;}
.x-menu-default, .x-menu-body, .x-menu-body-default {border-radius: var(--radius); box-shadow: 0 4px 12px rgba(0,0,0,0.08) !important; border: none !important; background-image: none !important;}
.x-menu-item-link { border-radius: 6px !important; }

.x-menu-item-active .x-menu-item-link, .x-menu-item-link:hover { background: transparent !important; }

.x-menu-item-text { color: #333 !important; font-size: 13px !important; }

.x-menu-sep { background: #eee !important; margin: 4px 8px !important; }
.x-menu-icon-separator { display: none !important; }
.x-menu-body { background: transparent !important; }

/* ⭐ Tab关闭按钮 - CSS绘制 */

.x-tab-default .x-tab-close-btn, .x-tab-active .x-tab-close-btn {width: 20px !important; height: 100% !important; opacity: 0.7; position: absolute; right: 0; top: 0; display: flex !important; align-items: center; justify-content: center; cursor: pointer; background: none !important; background-image: none !important;}

.x-tab-default .x-tab-close-btn::before, .x-tab-default .x-tab-close-btn::after, .x-tab-active .x-tab-close-btn::before, .x-tab-active .x-tab-close-btn::after {content: ''; position: absolute; width: 11px; height: 2px; background: #9aa6b1; border-radius: 1px;}

.x-tab-default .x-tab-close-btn::before, .x-tab-active .x-tab-close-btn::before {transform: rotate(45deg);}

.x-tab-default .x-tab-close-btn::after, .x-tab-active .x-tab-close-btn::after {transform: rotate(-45deg);}

.x-tab-default .x-tab-close-btn:hover, .x-tab-active .x-tab-close-btn:hover {opacity: 1;}


.x-tab-default .x-tab-inner {padding-right: 10px !important;}

.x-box-inner.x-box-scroller-body-horizontal {height: 50px !important;}

/* Panel 面板 */

.x-panel {border-radius: var(--radius); box-shadow: none; border: none;}
.x-panel-body-default {border: none;}

.x-panel-body-Custom {border-style: groove !important; border-width: 0.5px !important;}
.x-panel-header-default {border: none;}

.x-panel-header-text, .x-window-header-text {font-weight: 500; font-size: 14px;}

.TransparentTitle .x-panel-header-default {background: transparent;}

.x-panel-header.x-panel-header-default, .x-panel-header.x-panel-header-default .x-box-inner {background-color: transparent !important; background-image: none !important;}

/* ⭐⭐⭐ Grid 表格 ⭐⭐⭐ */

.x-grid-panel, .x-grid {border-radius: 12px; overflow: hidden; border: 1px solid #fafafa; background: var(--bg-white);}

.x-grid-header-ct {background: var(--grid-header-bg); border-bottom: 1px solid #f5f5f5;}

.x-column-header {background: var(--grid-header-bg); border-right: 1px solid #fafafa; font-weight: 400; font-size: 13px; color: #475569;}
.x-column-header:hover {background: #f1f5f9;}

.x-column-header-inner .x-column-header-text {white-space: normal; text-align: center; font-weight: 400;}

.x-column-header-sort-ASC, .x-column-header-sort-DESC {background: var(--primary-light);}

.x-grid-row, .x-grid-item {border-bottom: 1px solid #fcfcfc; background: var(--bg-white);}
.x-grid-item-alt {background: var(--grid-stripe);}



.x-grid-cell, .x-grid-td {border-right: none; vertical-align: middle; font-weight: 400 !important; font-size: 13px; line-height: 1.5; color: #374151;}
.x-grid-cell-inner {font-weight: 400 !important;}

.x-grid-item-focused .x-grid-cell-focused {background: var(--primary-light);}

.x-grid-empty {padding: 40px 20px; text-align: center; color: #94a3b8; font-size: 14px;}

.x-grid-group-hd {background: #f8fafc; border-bottom: 2px solid var(--grid-border); padding: 10px 12px; font-weight: 500; color: #475569;}

.x-grid-row-editor {border: 2px solid var(--primary-color); border-radius: 8px; background: var(--bg-white);}

.x-grid-row-numberer {background: var(--grid-header-bg); color: #64748b; font-weight: 400; text-align: center;}
.x-grid-checkcolumn {text-align: center;}
.x-grid-checkcolumn-checked {color: #10b981; font-weight: 500;}
.x-action-col-icon {cursor: pointer; opacity: 0.7;}
.x-action-col-icon:hover {opacity: 1;}

.x-toolbar-docked-bottom {background: var(--grid-header-bg); border-top: 1px solid var(--grid-border); padding: 8px 12px;}
.x-grid-locked {border-right: 2px solid var(--grid-border);}

.x-grid-row-summary {background: var(--grid-header-bg); border-top: 2px solid var(--grid-border); font-weight: 500;}

.x-grid-mask {background: rgba(255, 255, 255, 0.9);}                                      


.x-grid-item-selected .x-grid-cell-first .x-grid-cell-inner {padding-left: 4px !important;}     

.x-btn-grid-cell-small {border: none !important; background: transparent !important;box-shadow: none !important;}

.x-btn-button-grid-cell-small {border: none !important; background-color: transparent !important; box-shadow: none !important;}

.x-btn-icon-el-grid-cell-small {width: 16px !important; height: 16px !important; background-size: contain !important;}


/* 去掉工具栏底色 */

.my-htmlmemo .x-toolbar {background: transparent !important;background-image: none !important;border-bottom: none !important;}


.my-htmlmemo .x-toolbar-default {background-color: transparent !important;}

/* 去掉整体边框 */
.my-htmlmemo {border: none !important;}


/* TreeList */

.x-treelist-nav .x-treelist-item-text {line-height: 30px; font-size: 12px; font-weight: 400;}

.x-treelist-nav .x-treelist-item-icon:before, .x-treelist-nav .x-treelist-item-tool:before, .x-treelist-nav .x-treelist-item-expander {line-height: 30px;}
.x-treelist-nav {width: 192px !important;}

/* 自定义Tree */
.customTree .x-grid-row {height: 20px !important;}

.customTree .x-grid-cell {font-size: 12px !important; line-height: 20px !important; height: 20px !important; font-weight: 400 !important;}
.x-tree-icon {vertical-align: middle;}

/* 图标颜色 */

.icon-gray.fa {color: #78909c !important; font-size: 13px !important; opacity: 0.8;}

.icon-blue.fa {color: #5c6bc0 !important; font-size: 13px !important; opacity: 0.85;}

.icon-light-gray.fa {color: #90a4ae !important; font-size: 13px !important; opacity: 0.75;}

.x-menu-item:hover .icon-gray.fa, .x-menu-item:hover .icon-blue.fa, .x-menu-item:hover .icon-light-gray.fa {opacity: 1 !important;}

/* ⭐⭐⭐ 表单控件 - 统一设置 ⭐⭐⭐ */

/* Label 标签 */

.x-form-item-label, .x-form-item-label-text, .x-form-item-label-top, .x-form-item-label-left, .x-form-item-label-right, .x-form-item-label-default {font-weight: 400; font-size: 13px; color: #374151;}

.x-fieldset-header-text {font-weight: 500; font-size: 14px; color: #475569;}

/* TextField / TextArea (Edit) */

.x-form-text, .x-form-text-default, .x-form-textarea, .x-form-field, .x-form-field-default {font-weight: 400; font-size: 13px; color: #374151;}

input.x-form-text, textarea.x-form-textarea {font-weight: 400; font-size: 13px;}

/* ComboBox / Picker */

.x-form-trigger-wrap, .x-form-trigger-wrap-default {font-weight: 400; font-size: 13px;}
.x-form-text.x-form-field {font-weight: 400; font-size: 13px;}
.x-form-arrow-trigger {font-size: 13px;}

/* NumberField / SpinnerField */

.x-form-spinner, .x-form-spinner-default, .x-form-number {font-weight: 400; font-size: 13px;}

/* DateField / TimeField */
.x-form-date-trigger, .x-form-time-trigger {font-size: 13px;}
.x-datepicker {font-weight: 400; font-size: 13px;}
.x-datepicker-inner {font-weight: 400; font-size: 13px;}

/* CheckBox */

.x-form-checkbox, .x-form-cb-label, .x-form-cb-label-default {font-weight: 400; font-size: 13px; color: #374151;}
.x-form-checkbox-default {font-size: 13px;}

/* Radio */

.x-form-radio, .x-form-radio-label, .x-form-radio-label-default {font-weight: 400; font-size: 13px; color: #374151;}
.x-form-radio-default {font-size: 13px;}

/* DisplayField */

.x-form-display-field, .x-form-display-field-default {font-weight: 400; font-size: 13px; color: #374151;}

/* FileField */
.x-form-file-wrap {font-weight: 400; font-size: 13px;}

/* HtmlEditor */
.x-html-editor-wrap {font-weight: 400; font-size: 13px;}

/* Slider */
.x-slider {font-weight: 400; font-size: 13px;}

/* 原有的 noborder 样式 */

.noborder .x-form-text-wrap, .noborder .x-form-text-default {border-top: none; border-left: none; border-right: none; background: none; border-bottom: 1px solid var(--border-color);}

.noborder .x-form-text-wrap:focus-within, .noborder .x-form-text-default:focus {border-bottom-color: var(--primary-color);}

.noborder_cbx .x-form-text-wrap, .noborder_cbx .x-form-text-default {border-top: none; border-left: none; border-right: none; background: none; border-bottom: 1px solid var(--border-color);}
.noborder_cbx .x-form-trigger {background: none; border: none;}

.noborder_cbx .x-form-trigger::after {content: ''; position: absolute; right: 7px; top: 50%; transform: translateY(-50%); width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid var(--text-color);}
.customFieldSet {border: none;}

.my-form .x-window-header {background-color: var(--bg-gray) !important; color: var(--text-color) !important;}

.x-form-invalid-field, .x-form-invalid .x-form-text {border-color: #ef4444 !important; background: #fee2e2 !important;}
.x-form-invalid-icon {color: #ef4444;}
.x-form-valid-field {border-color: #10b981 !important;}




.x-form-file-btn.x-btn:disabled {opacity: 0.5 !important; cursor: not-allowed !important; pointer-events: none !important;}

/* ⭐⭐⭐ 按钮 ⭐⭐⭐ */

.x-btn, .x-btn-inner, .x-btn-inner-default {font-weight: 400; font-size: 13px;}


































/* 白字压在浅绿/浅蓝底上对比度只有 1.3:1，看不清；改成深色字 */
.btn-rounded, .btn-rounded_Blue {border: none; border-radius: 50%; font-size: 13px; font-weight: 400; cursor: pointer; width: 80px; height: 80px; color: #1f2933;}
.btn-rounded {background-color: #d7ebce;}
.btn-rounded:hover {background-color: #c5e2b8;}
.btn-rounded_Blue {background-color: #cce5ff;}
.btn-rounded_Blue:hover {background-color: #b8daff;}

.btn-flat {background: transparent; border: 1px solid rgba(255, 255, 255, 0.12); color: #475569; border-radius: 12px; cursor: pointer; font-size: clamp(11px, 2.2vw, 13px); font-weight: 400; min-height: 36px;}

.btn-flat:hover {background: var(--primary-light); border-color: var(--primary-strong);}
.btn-flat:active {background: var(--primary-hover);}

.x-btn-loading {position: relative; color: transparent !important; pointer-events: none;}

.x-btn-loading::after {content: ''; position: absolute; left: 50%; top: 50%; margin: -8px 0 0 -8px; width: 16px; height: 16px; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; animation: spin 0.6s linear infinite;}
@keyframes spin {to {transform: rotate(360deg);}}

/* 窗口和对话框 */

.x-window {border-radius: var(--radius); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);}

.x-window-header {border-radius: var(--radius) var(--radius) 0 0;}

/* ⭐⭐⭐ 菜单和下拉 ⭐⭐⭐ */


.x-menu-item, .x-menu-item-default {font-family: "Microsoft YaHei", "PingFang SC", sans-serif !important; font-weight: 400 !important; font-size: 13px !important; padding: 2px 12px !important; transition: all 0.15s ease !important; border-left: 3px solid transparent !important; -webkit-font-smoothing: antialiased !important; -moz-osx-font-smoothing: grayscale !important; background: transparent !important;}

.x-menu-item:hover, .x-menu-item-default:hover {background: var(--primary-light) !important; border-left-color: var(--primary-color) !important;}

.x-menu-item-active, .x-menu-item-default-active {background: var(--primary-hover) !important; border-left-color: var(--primary-color) !important;}
.x-menu-item-text {font-weight: 400; font-size: 13px;}

.x-boundlist {border-radius: var(--radius); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); border: none;}

.x-boundlist-item, .x-boundlist-item-over {padding: 6px 12px; font-weight: 400; font-size: 12px; white-space: nowrap !important; transition: all 0.15s ease;}
.x-boundlist-item:hover {background: var(--primary-light);}

.x-boundlist-selected {background: var(--grid-selected); font-weight: 500; white-space: nowrap !important; border-left: 3px solid var(--primary-color); padding-left: 9px;}

/* 其他 */
.uni-scrollbox {overflow: hidden !important;}

.x-calendar-panel-title {font-size: 16px; color: var(--primary-color); font-weight: bold; left: 40% !important;}
@keyframes uni-swal-force-hide {
  from { opacity: 1; }
  to   { opacity: 0; }
}
.swal2-hide {
  animation: uni-swal-force-hide 0.01s forwards !important;
}


#messagebox-1001 {background-color: var(--bg-white); border: none; border-radius: var(--radius); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);}

#messagebox-1001_header {background-color: var(--bg-white); border: none;}

#messagebox-1001-body {background-color: var(--bg-white); border: none;}
/* 消息框正文：原来这里写死 color:Red，结果四种 DlgType 全是红字。现在默认黑，错误/警告由 MessageDlg 挂 class 决定（见 xFunc 的 MsgHasAlertWord）。 */
#messagebox-1001-msg{background-color:var(--bg-white);border:none;color:#2c3e34;font-size:18px}
.wx-mb-err #messagebox-1001-msg{color:#c62828}
.wx-mb-warn #messagebox-1001-msg{color:#b26a00}
#messagebox-1001 .x-btn-inner{font-size:18px;height:20px}
#messagebox-1001 .x-title-text {color: var(--primary-color);}
/* 记录卡片 */
.record-card {
    width: 400px;
    background: var(--bg-white);
    padding: 15px;
    border-radius: var(--radius);
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
    margin: 0 auto 20px auto;  /* 上边距去掉，只留下边距 */
}
.record-card:hover {box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);}

/* 头部 */

.record-header {font-size: 16px; font-weight: 500; padding-bottom: 10px; border-bottom: 1px solid #ccc;}
.record-header p {margin: 4px 0;}
.record-header p:first-child {margin-top: 0;}

/* 内容区 */

.record-content {display: flex; align-items: flex-start; margin-top: 5px;}

.profile-img {background-color: var(--primary-color); width: 60px; height: 60px; flex-shrink: 0; display: flex; justify-content: center; align-items: center; color: var(--bg-white); font-size: 16px; font-weight: 500; border-radius: 50%;}
.profile-text {text-align: center; line-height: 60px;}
.info {flex: 1; padding-left: 10px;}
.info p {margin: 4px 0;}

/* 不显示头像时: 文字靠左 */
.record-card.no-profile .record-content {display: block;}
.record-card.no-profile .info {padding-left: 0;}
.record-card.no-profile .info p {margin-left: 0;}

/* 明细区 */

.contact-info {margin-top: 10px; padding: 10px; border: 1px solid #ddd; border-radius: 5px; background: var(--bg-gray);}
.contact-info h3 {margin-top: 0; font-size: 14px;}
.contact-info p {margin: 3px 0; font-size: 12px;}

/* 并排行: SameRow=True 的字段与前一字段同行, 等分宽度 */
.fld-row {display: flex; gap: 0 12px;}
.fld-row > p {flex: 1; margin: 4px 0;}

/* 卡片内开工/完工按钮行: 占满宽度, 两按钮等分, 中间留缝 */
.card-btn-row {display: flex; width: 100%; margin-top: 10px;}

.card-btn {flex: 1; padding: 10px 0; border: none; border-radius: 6px; color: #fff; font-size: 15px; font-weight: 500; text-align: center; cursor: pointer;}
.card-btn:active {opacity: 0.75;}
.card-btn-start  {background: var(--primary-color); margin-right: 5px;}
/* 完工：主色加深一档，和开工区分开（不支持 color-mix 的旧内核退回主色） */
.card-btn-finish {background: var(--primary-color); background: color-mix(in srgb, var(--primary-color) 68%, #000); margin-left: 5px;}




/* 工具提示 */

.x-tip {border-radius: var(--radius); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);}

/* 进度条 */

.x-progress {border-radius: var(--radius); overflow: hidden; height: 12px; background: var(--bg-gray);}

.x-progress-bar {background: var(--primary-color); border-radius: var(--radius);}

/* 徽章 */

.x-badge {border-radius: 12px; font-size: 11px; font-weight: 500; padding: 2px 8px;}

/* 工具类 */
.shadow-sm {box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);}
.shadow-md {box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);}
.rounded {border-radius: var(--radius);}
.text-primary {color: var(--primary-color);}
.bg-primary {background: var(--primary-color);}



/* 无障碍 */

.x-btn:focus-visible, .x-form-field:focus-visible {outline: 2px solid var(--primary-color); outline-offset: 2px;}
*:focus:not(:focus-visible) {outline: none;}

/* 打印 */

@media print {.x-btn, .x-toolbar, .x-tab-close-btn {display: none !important;} .x-grid, .x-panel {box-shadow: none !important; border: 1px solid #000 !important;} .x-grid-row {page-break-inside: avoid;}}

/* 响应式 */

@media (max-width: 768px) {.x-treelist-nav {width: 200px !important;} .record-card {width: 100%; max-width: 400px;} .btn-rounded, .btn-rounded_Blue {width: 60px !important; height: 60px !important; font-size: 13px !important;}}
/* ===== 以下为 2026-09 界面改版新增（原在 ServerModule.pas 的 CustomCSS.Add 里，已整体搬入）===== */
/* ===== 操作遮罩（环形描边 + 药丸）。首屏载入动画（进度条 + 三点弹跳）已移到 files/wx-loading.css，由 CustomFiles 在页面 head 里加载 ===== */
/* 查询/保存时的遮罩（ExtJS LoadMask，uniGUI ScreenMask）= 半透明白 + 轻微模糊，中间环形描边 + 磨砂药丸；文字来自 ScreenMask.Message */
/* 只有带提示文字的 LoadMask（查询/保存）才发白；模态窗口后面的遮罩没有 .x-mask-msg，保持主题默认，不然弹窗时看不清底下的数据。白纱画在 ::after 上并延迟 280ms 淡入：短请求（点否、切页签、秒回的查询）根本不会画出来，也就不会闪。不用 backdrop-filter，它会把整页提升成合成层，出现和消失各重绘一次，就是之前那一下跳动。 */
.x-mask:has(>.x-mask-msg){background:transparent!important;opacity:1!important}.x-mask:has(>.x-mask-msg)::after{content:"";position:absolute;left:0;top:0;right:0;bottom:0;background:#fff;opacity:.55;animation:wx-mask-in .4s ease}@keyframes wx-mask-in{0%,75%{opacity:0}}.x-mask-overlay{background:none!important}.x-mask-msg{background:transparent!important;border:0!important;padding:0!important;box-shadow:none!important}
/* 本体默认可见，动画只负责前 120ms 透明、后 120ms 淡入；系统开了“减少动态效果”（prefers-reduced-motion）时动画被禁，遮罩也要立即可见。原来写成 opacity:0 + 动画揭示，动画一禁就全透明 */
/* 药丸本体 + 转动的环 */
.x-mask-msg-inner{position:relative;opacity:1;animation:wx-pill-in .4s ease;background:#fff!important;border:1px solid #e3e8ec!important;border-radius:999px!important;box-shadow:0 6px 24px rgba(23,34,43,.12);padding:9px 16px 9px 40px!important}.x-mask-msg-inner::before{content:'';position:absolute;left:13px;top:50%;width:18px;height:18px;margin-top:-9px;border-radius:50%;border:3px solid var(--primary-color);border-color:var(--primary-color) var(--primary-color) transparent transparent;animation:mask-spin 1s linear infinite!important}.x-mask-msg-text{background:none!important;padding:0!important;font:500 13.5px "Microsoft YaHei","PingFang SC",sans-serif;color:#374151}@keyframes mask-spin{to{transform:rotate(360deg)}}@keyframes wx-pill-in{0%,75%{opacity:0}}
/* 不带 .x-mask-msg 的遮罩（组件被禁用时盖的那层等）保持全透明，元素还在，仍挡住后面的点击；带 .x-mask-msg 的是 LoadMask，不受影响 */
.x-mask:not(:has(>.x-mask-msg)){background:transparent!important;opacity:0!important}
/* 模态窗口（ShowModal、ExtJS 消息框）后面的遮罩：ExtJS 的 ZIndexManager 把它直接建在 body 下（div.x-mask.x-border-box[role=presentation]）。
   2026-09-21 按"对话框不要遮罩"做成了全透明，和居中卡片的遮罩不一致；现在给同一档很淡的底色（和 .wx-toast-mask 一样 .07）。
   要回到全透明：删掉下面这一条即可。 */
body>.x-mask.x-border-box[role=presentation]:not(:has(>.x-mask-msg)){background:rgba(15,23,42,.07)!important;opacity:1!important}
/* 窗口独立成合成层：拖动时只移动图层，不再重绘底下的页面。will-change 不加 transform，原来的 transform:none 照旧 */
.x-window{will-change:transform}
/* ===== 左侧菜单（TM_Main = ExtJS treelist）：白底、单色灰图标、主色绿选中，覆盖主题默认的深色选中行 ===== */
/* 菜单本体、每一行、子容器都白底；行之间不要边框 */
.x-treelist-nav,.x-treelist-nav .x-treelist-row,.x-treelist-nav .x-treelist-container,.x-treelist-nav .x-treelist-item-expanded>.x-treelist-row{background:#fff!important;border:0!important}
/* 文字深灰 13px；图标、展开箭头统一一种灰（原来图标各带各的颜色） */
.x-treelist-nav .x-treelist-item-text{color:#1f2933!important;font-size:13px!important}.x-treelist-nav .x-treelist-item-icon,.x-treelist-nav .x-treelist-item-icon::before,.x-treelist-nav .x-treelist-item-icon *,.x-treelist-nav .x-treelist-item-icon *::before,.x-treelist-nav .x-fa4,.x-treelist-nav .x-fa4::before,.x-treelist-nav .x-treelist-item-expander,.x-treelist-nav .x-treelist-item-expander::before,.x-treelist-nav .x-treelist-item-tool::before{color:#6b7a87!important}.x-treelist-nav .x-treelist-row-over{background:#f1f4f6!important}.x-treelist-nav .x-treelist-item-selected>.x-treelist-row{background:var(--grid-selected)!important}.x-treelist-nav .x-treelist-item-selected>.x-treelist-row::before{background:var(--primary-color)!important;width:3px!important}.x-treelist-nav .x-treelist-item-selected>.x-treelist-row .x-treelist-item-text,.x-treelist-nav .x-treelist-item-selected>.x-treelist-row .x-treelist-item-icon,.x-treelist-nav .x-treelist-item-selected>.x-treelist-row .x-treelist-item-icon *,.x-treelist-nav .x-treelist-item-selected>.x-treelist-row .x-treelist-item-icon *::before,.x-treelist-nav .x-treelist-item-selected>.x-treelist-row .x-treelist-item-icon::before{color:var(--primary-color)!important}
/* 菜单线条图标（内嵌，不依赖 files 目录）：用 CSS mask 覆盖 uniGUI 给 TUniNativeImageList 生成的 .fa4-<name> 字形。 */
/* 展开态图标 class 是 x-treelist-item-icon，收起态那一列是 x-treelist-item-tool，都带 x-fa4，所以统一按 .x-treelist-nav .x-fa4 匹配。 */
/* fa 名字只是键，图案按它实际挂的菜单含义画（原配法很随意：CRM=fax、行政管理=image、数据中心=sliders）： */
/* desktop=基础数据(数据库) handshake-o=销售(价签) cog=生产(厂房) cubes=仓储(仓库) line-chart=报表 user-plus=人事(两个人) */
/* cogs=系统(齿轮) fax=CRM(客服耳麦) edit=项目(看板) image=行政(办公楼) sliders=数据中心(服务器) times=退出(登出) */
/* 颜色走 currentColor，仍由上面的 color 规则控制。换图标改对应那条的 SVG；源文件与脚本：Claude outputs/menu_icons/ */
.x-treelist-nav .x-fa4::before{content:""!important;display:inline-block;width:18px;height:18px;vertical-align:-4px;background-color:currentColor;-webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat}
.x-treelist-nav .fa4-navicon{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M4 6h16M4 12h16M4 18h16%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-desktop{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cellipse cx=%2212%22 cy=%226%22 rx=%228%22 ry=%223%22/%3E%3Cpath d=%22M4 6v6c0 1.7 3.6 3 8 3s8-1.3 8-3V6%22/%3E%3Cpath d=%22M4 12v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-handshake-o{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3 8l9-4 9 4v8l-9 4-9-4z%22/%3E%3Cpath d=%22M3 8l9 4 9-4M12 12v8%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-shopping-cart{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3 4h2l2 12h11l2-8H6%22/%3E%3Ccircle cx=%229%22 cy=%2220%22 r=%221.2%22/%3E%3Ccircle cx=%2217%22 cy=%2220%22 r=%221.2%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-cog{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3 21h18%22/%3E%3Cpath d=%22M5 21V11l5 3V11l5 3V7h4v14%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-cubes{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3 21V9l9-5 9 5v12%22/%3E%3Cpath d=%22M3 21h18%22/%3E%3Cpath d=%22M8 21v-7h8v7%22/%3E%3Cpath d=%22M8 17.5h8%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-line-chart{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 3h8l4 4v14H6z%22/%3E%3Cpath d=%22M14 3v4h4%22/%3E%3Cpath d=%22M9.5 17.5v-3M12 17.5v-6M14.5 17.5v-4%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-yen{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M7 4l5 7 5-7M12 11v9M8 14h8M8 17h8%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-user-plus{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%229%22 cy=%228%22 r=%223.4%22/%3E%3Cpath d=%22M2.5 20a6.5 6.5 0 0 1 13 0%22/%3E%3Cpath d=%22M16 5.2a3.4 3.4 0 0 1 0 6.6M17.5 14.2a6 6 0 0 1 4 5.8%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-cogs{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%2212%22 r=%223%22/%3E%3Cpath d=%22M12 2.6l1.6 2.1a7.4 7.4 0 0 1 2 .8l2.6-.5 1.4 2.4-1.6 2a7.4 7.4 0 0 1 0 2.4l1.6 2-1.4 2.4-2.6-.5a7.4 7.4 0 0 1-2 .8L12 21.4l-1.6-2.1a7.4 7.4 0 0 1-2-.8l-2.6.5-1.4-2.4 1.6-2a7.4 7.4 0 0 1 0-2.4l-1.6-2 1.4-2.4 2.6.5a7.4 7.4 0 0 1 2-.8z%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-fax{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M4 13.5v-1.5a8 8 0 0 1 16 0v1.5%22/%3E%3Crect x=%222.5%22 y=%2213%22 width=%224%22 height=%226%22 rx=%221.6%22/%3E%3Crect x=%2217.5%22 y=%2213%22 width=%224%22 height=%226%22 rx=%221.6%22/%3E%3Cpath d=%22M19.5 19v.4a2.6 2.6 0 0 1-2.6 2.6H14%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-edit{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Crect x=%223%22 y=%224%22 width=%2218%22 height=%2216%22 rx=%222%22/%3E%3Crect x=%226.5%22 y=%227.5%22 width=%224%22 height=%226%22 rx=%221%22/%3E%3Crect x=%2213.5%22 y=%227.5%22 width=%224%22 height=%229%22 rx=%221%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-image{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M4 21V5a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v16%22/%3E%3Cpath d=%22M15 9h3a2 2 0 0 1 2 2v10%22/%3E%3Cpath d=%22M3 21h18%22/%3E%3Cpath d=%22M8 7h3M8 11h3M8 15h3%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-sliders{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Crect x=%223%22 y=%224%22 width=%2218%22 height=%226%22 rx=%222%22/%3E%3Crect x=%223%22 y=%2214%22 width=%2218%22 height=%226%22 rx=%222%22/%3E%3Cpath d=%22M6.5 7h.01M6.5 17h.01%22/%3E%3Cpath d=%22M10 7h4M10 17h4%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-truck{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3 7h11v9H3zM14 10h4l3 3v3h-7z%22/%3E%3Ccircle cx=%227%22 cy=%2218%22 r=%221.8%22/%3E%3Ccircle cx=%2217%22 cy=%2218%22 r=%221.8%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-user{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%228%22 r=%224%22/%3E%3Cpath d=%22M4 21a8 8 0 0 1 16 0%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-times{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M9 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h3%22/%3E%3Cpath d=%22M15 8l4 4-4 4%22/%3E%3Cpath d=%22M19 12H9%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-envelope{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Crect x=%223%22 y=%225%22 width=%2218%22 height=%2214%22 rx=%222%22/%3E%3Cpath d=%22M3 7l9 6 9-6%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-bar-chart{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M4 20h16M6 20v-6M11 20V9M16 20v-9M21 20V5%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-pie-chart{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M12 3a9 9 0 1 0 9 9h-9z%22/%3E%3Cpath d=%22M14 3.2A9 9 0 0 1 20.8 10H14z%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-bookmark{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 3h12v18l-6-4-6 4z%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-inbox{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Crect x=%223%22 y=%224%22 width=%2218%22 height=%2216%22 rx=%222%22/%3E%3Cpath d=%22M3 14h5l1.5 2h5L21 14%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-home{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3 11l9-7 9 7%22/%3E%3Cpath d=%22M5 10v10h5v-6h4v6h5V10%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-favorites{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M12 3l2.8 5.7 6.2.9-4.5 4.4 1.1 6.2L12 17.3 6.4 20.2l1.1-6.2L3 9.6l6.2-.9z%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-info{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%2212%22 r=%229%22/%3E%3Cpath d=%22M12 11v5M12 8h.01%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-settings{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 4v16M12 4v16M18 4v16%22/%3E%3Ccircle cx=%226%22 cy=%229%22 r=%222%22/%3E%3Ccircle cx=%2212%22 cy=%2215%22 r=%222%22/%3E%3Ccircle cx=%2218%22 cy=%228%22 r=%222%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-team{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%229%22 cy=%228%22 r=%223.4%22/%3E%3Cpath d=%22M2.5 20a6.5 6.5 0 0 1 13 0%22/%3E%3Cpath d=%22M16 5.2a3.4 3.4 0 0 1 0 6.6M17.5 14.2a6 6 0 0 1 4 5.8%22/%3E%3C/svg%3E")}
.x-treelist-nav .fa4-cut{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%221.7%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%226%22 cy=%226%22 r=%222.6%22/%3E%3Ccircle cx=%226%22 cy=%2218%22 r=%222.6%22/%3E%3Cpath d=%22M8.2 7.4L20 19M8.2 16.6L20 5%22/%3E%3C/svg%3E")}
/* 收起态（micro）行高只有 24px（展开态 30px，由 .x-treelist-item-text 的 line-height 撑起），统一成 30px 并让图标居中 */
.x-treelist-nav .x-treelist-item-tool{height:30px!important;line-height:30px!important}.x-treelist-nav .x-treelist-item-tool.x-fa4::before{vertical-align:middle}
/* 收起态：选中的 class 挂在图标元素自己身上（不是行），单独给一条绿色 */
.x-treelist-nav .x-treelist-item-tool.x-treelist-item-selected::before{color:var(--primary-color)!important}
/* 收起态弹出的子菜单里，最上面那行（父项标题）降成 12px 灰字，和条目分开层级 */
.x-treelist-floater .x-treelist-item-floated>.x-treelist-row .x-treelist-item-text{font-size:12px!important;color:#7b8794!important}
/* 收起态鼠标悬停弹出的子菜单：白底、细边、投影 */
.x-treelist-floater,.x-treelist-nav .x-treelist-floater .x-treelist-container{background:#fff!important}.x-treelist-floater{border:1px solid #e6eaee!important;box-shadow:0 6px 24px rgba(23,34,43,.14)!important}
/* ----- 按钮栏外观：平按钮（图标由 MainModule.UniImageList2 的 16x16 位图提供）----- */
/* 去掉 .btn-add 的白绿渐变；内层（wrap / inner）保持干净，边框画在按钮本体上 */
.x-btn.btn-add .x-btn-wrap,.x-btn.btn-add .x-btn-inner{background:transparent!important;background-image:none!important;border:0!important;box-shadow:none!important}
/* 按钮本体：白底 + 1px 淡描边 + 圆角，让它一眼看出是可点的控件 */
.x-btn.btn-add{background:#fff!important;background-image:none!important;border:1px solid #c5cdd5!important;border-radius:6px!important;box-shadow:none!important}
/* 悬停：底色微沉、边框加深；按下再沉一档 */
.x-btn.btn-add.x-btn-over,.x-btn.btn-add:hover{background:#f7f9fa!important;border-color:#aab4bd!important}.x-btn.btn-add.x-btn-pressed,.x-btn.btn-add.x-btn-menu-active{background:#eef1f4!important;border-color:#9aa6b1!important}
/* 按钮文字：深灰、常规字重 */
.x-btn.btn-add .x-btn-inner{color:#1f2933!important;font-weight:500!important}
/* 按钮栏的面板和滚动框误挂了 btn-add class，同样去掉它们身上的渐变 */
.x-panel.btn-add,.x-container.btn-add,.x-panel.btn-add>.x-panel-bodyWrap>.x-panel-body{background:transparent!important;background-image:none!important}
/* 禁用状态：平按钮把 ExtJS 默认的禁用外观盖掉了，这里重新给一套明显的 */
/* 禁用的按钮：整体压暗 + 去饱和（图标颜色烧在位图里，只靠 opacity 不够明显），并且不响应悬停 */
.x-btn.btn-add.x-item-disabled,.x-btn.btn-add.x-btn-disabled{opacity:.38!important;filter:grayscale(1)!important;cursor:default!important}
/* 禁用时文字再淡一档，和可用按钮拉开距离 */
.x-btn.btn-add.x-item-disabled .x-btn-inner,.x-btn.btn-add.x-btn-disabled .x-btn-inner{color:#8a97a3!important}
/* 禁用时边框也淡一档，且不响应悬停边框 */
.x-btn.btn-add.x-item-disabled,.x-btn.btn-add.x-btn-disabled{border-color:#edf0f3!important;background:#fff!important}
/* 换掉主题那张"箭头+竖线"的图，只保留自己画的箭头（盒子仍是 14px，排版不变） */
/* TUniMenuButton（其它/设置/导出）的箭头和右侧竖线是主题的同一张背景图，画在 x-btn-split-right::after 上。 */
.x-btn.btn-add .x-btn-split-right::after{background-image:none!important;background-color:#9aa6b1!important;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%222.6%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 9.5l6 6 6-6%22/%3E%3C/svg%3E") center/9px no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22%23000%22 stroke-width=%222.6%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 9.5l6 6 6-6%22/%3E%3C/svg%3E") center/9px no-repeat}
/* 顺带把那个空的箭头元素收掉，避免出现两个箭头 */
.x-btn.btn-add .x-btn-arrow-el{background-image:none!important}
/* 单个按钮不要下拉箭头：在它的 LayoutConfig.Cls 里加 wx-noarrow（目前 frmClass_Report 的 btnOpera 用了）。箭头和它右边预留的那段位置一起收掉，标题才会居中；下拉菜单照常可用，点按钮本身就会弹出。 */
.x-btn.wx-noarrow .x-btn-split-right::after,.x-btn.wx-noarrow .x-btn-arrow-el{display:none!important}.x-btn.wx-noarrow .x-btn-split-right,.x-btn.wx-noarrow .x-btn-button{padding-right:0!important;background-image:none!important}
/* ----- 表格选中行：dfm 的 CustomCSS 里是蓝色系（#dbeafe 底 + #1e40af 加粗字 + #1D9E75 左条）， */
/* 改成蓝图的淡绿系。用两层 class 提高优先级，压过 Set_Theme 里带 !important 的 .x-grid-row 底色。 */
/* 选中行底色：淡绿 */
.x-grid-view .x-grid-item-selected,.x-grid-view .x-grid-item-selected .x-grid-cell,.x-grid-view .x-grid-row-selected .x-grid-cell,.x-grid-view .x-grid-item-selected .x-grid-cell-row-numberer,.x-grid-view .x-grid-row .x-grid-cell-selected{background:var(--grid-selected)!important;background-image:none!important}
/* 选中行左侧那道竖条改成主色绿（原来是 #1D9E75） */
.x-grid-view .x-grid-item-selected{border-left-color:var(--primary-color)!important}.x-grid-view .x-grid-item-selected .x-grid-cell-first{border-left:3px solid var(--primary-color)!important}
/* 选中行文字不再变蓝加粗，保持正常字色 */
.x-grid-view .x-grid-item-selected .x-grid-cell-inner{color:#1f2933!important;font-weight:400!important}
/* 悬停行：极淡的灰，和选中区分开 */
.x-grid-view .x-grid-item-over:not(.x-grid-item-selected) .x-grid-cell{background:#f7f9fa!important}
/* 无表头的表格（Options 去掉 dgTitles，ExtJS 给表格外层加 x-grid-header-hidden；备用 :has 判断表头容器被隐藏）： */
/* 选中行不着淡绿底、不画左侧绿条，只留悬停浅灰。有表头的表格不受影响。 */
.x-grid-header-hidden .x-grid-view .x-grid-item-selected,.x-grid-header-hidden .x-grid-view .x-grid-item-selected .x-grid-cell,.x-grid-header-hidden .x-grid-view .x-grid-row-selected .x-grid-cell,.x-grid-header-hidden .x-grid-view .x-grid-row .x-grid-cell-selected,.x-grid:has(.x-grid-header-ct-hidden) .x-grid-view .x-grid-item-selected,.x-grid:has(.x-grid-header-ct-hidden) .x-grid-view .x-grid-item-selected .x-grid-cell,.x-grid:has(.x-grid-header-ct-hidden) .x-grid-view .x-grid-row-selected .x-grid-cell,.x-grid:has(.x-grid-header-ct-hidden) .x-grid-view .x-grid-row .x-grid-cell-selected,.x-grid:has(.x-grid-header-ct.x-hidden-display) .x-grid-view .x-grid-item-selected,.x-grid:has(.x-grid-header-ct.x-hidden-display) .x-grid-view .x-grid-item-selected .x-grid-cell,.x-grid:has(.x-grid-header-ct.x-hidden-display) .x-grid-view .x-grid-row-selected .x-grid-cell,.x-grid:has(.x-grid-header-ct.x-hidden-display) .x-grid-view .x-grid-row .x-grid-cell-selected,.x-grid:has(.x-grid-header-ct.x-hidden-offsets) .x-grid-view .x-grid-item-selected,.x-grid:has(.x-grid-header-ct.x-hidden-offsets) .x-grid-view .x-grid-item-selected .x-grid-cell,.x-grid:has(.x-grid-header-ct.x-hidden-offsets) .x-grid-view .x-grid-row-selected .x-grid-cell,.x-grid:has(.x-grid-header-ct.x-hidden-offsets) .x-grid-view .x-grid-row .x-grid-cell-selected{background:transparent!important}
.x-grid-header-hidden .x-grid-view .x-grid-item-selected,.x-grid-header-hidden .x-grid-view .x-grid-item-selected .x-grid-cell-first,.x-grid:has(.x-grid-header-ct-hidden) .x-grid-view .x-grid-item-selected,.x-grid:has(.x-grid-header-ct-hidden) .x-grid-view .x-grid-item-selected .x-grid-cell-first,.x-grid:has(.x-grid-header-ct.x-hidden-display) .x-grid-view .x-grid-item-selected,.x-grid:has(.x-grid-header-ct.x-hidden-display) .x-grid-view .x-grid-item-selected .x-grid-cell-first,.x-grid:has(.x-grid-header-ct.x-hidden-offsets) .x-grid-view .x-grid-item-selected,.x-grid:has(.x-grid-header-ct.x-hidden-offsets) .x-grid-view .x-grid-item-selected .x-grid-cell-first{border-left:0!important}
/* ----- 行号列 / 勾选列：去掉那层灰蓝底，跟数据行一样白 ----- */
/* dfm 里是 .x-grid-row-numberer{background:var(--grid-header-bg)}，Set_Theme 还会再刷一层带 !important 的底色， */
/* 所以这里用 .x-grid-view 前缀 + !important 一起压掉；选中行里这两列跟着变淡绿。 */
/* 正常行：两列不自带底色，跟着行色走（白底主题下即白色，换配色也不会出现白格子） */
.x-grid-view .x-grid-cell-row-numberer,.x-grid-view .x-grid-row-numberer,.x-grid-view .x-grid-cell-rownumberer,.x-grid-view .x-selmodel-checkbox,.x-grid-view .x-selmodel-column,.x-grid-view .x-grid-cell-special{background:transparent!important;background-image:none!important}
/* 表头上这两列的格子也去掉底色差异 */
.x-grid-header-ct .x-column-header-checkbox .x-column-header-inner,.x-grid-header-ct .x-column-header-numberer .x-column-header-inner{background:transparent!important;background-image:none!important}
/* ----- 其余几套按钮（btn-edit / btn-delete / btn-clear / 文件上传）统一成和 btn-add 一样的描边平按钮 ----- */
/* dfm 里它们原来各是一套渐变色；注意必须用 .x-btn 前缀限定，因为 btn-add 这类 class 也被误挂在面板上。 */
/* 形状统一：白底、1px 淡描边、圆角 6 */
.x-btn.btn-add,.x-btn.btn-edit,.x-btn.btn-delete,.x-btn.btn-clear,.x-btn.btn-op1,.x-btn.btn-op2,.x-form-file-btn.x-btn{background:#fff!important;background-image:none!important;border:1px solid #c5cdd5!important;border-radius:6px!important;box-shadow:none!important}
/* 悬停 / 按下与主按钮栏一致 */
.x-btn.btn-add.x-btn-over,.x-btn.btn-add:hover,.x-btn.btn-edit.x-btn-over,.x-btn.btn-edit:hover,.x-btn.btn-delete.x-btn-over,.x-btn.btn-delete:hover,.x-btn.btn-clear.x-btn-over,.x-btn.btn-clear:hover,.x-form-file-btn.x-btn:hover{background:#f7f9fa!important;border-color:#aab4bd!important}
/* 语义色只体现在文字和图标上：删除类偏红、修改类主色绿，其余中性 */
.x-btn.btn-delete .x-btn-inner{color:#c62828!important}.x-btn.btn-delete{border-color:#f0d5d5!important}.x-btn.btn-edit .x-btn-inner{color:var(--primary-color)!important}.x-btn.btn-edit{border-color:var(--primary-hover)!important}
/* 查询区的清除小按钮：本来就只有一个图标，保持中性灰、无边框，避免在输入框边上再多一个方框 */
.x-btn.btn-clear{border:0!important;background:transparent!important}.x-btn.btn-clear.x-btn-over,.x-btn.btn-clear:hover{background:#f1f4f6!important}
/* 往来单位 / 物料 选择框（基类 PnlCName / PnlPName 类 wx-lkgrp）：放大镜按钮保持原来的位图和位置不动； */
/* 输入框获得焦点时，在面板底部 3px 处（= 输入框下边线的位置）画一条主色线，从输入框左边到放大镜右边，两个看起来是一体的。 */
/* 聚焦时输入框自己的下边线隐掉，整条线（输入框左边 3px 到放大镜右边）全部由面板的 ::after 一笔画出来——一条线，粗细和位置不可能不一致 */
.wx-lkgrp::after{content:"";position:absolute;left:3px;right:0;bottom:3px;height:1px;background:transparent;pointer-events:none;z-index:3}
.wx-lkgrp:focus-within .x-form-text-wrap,.wx-lkgrp:focus-within .x-form-text-wrap-default,.wx-lkgrp:focus-within .x-form-trigger-wrap-default{border-bottom-color:transparent!important;box-shadow:none!important}
.wx-lkgrp:focus-within::after{background:var(--primary-color)}
/* 手机条件栏左右滑动（基类 SetLayout_Cond 手机分支给 PnlCond_Top / PnlCond_Client 挂 wx-hscroll）：body 横向可滚、隐藏滚动条、触摸惯性，不带动整页 */
.wx-hscroll>.x-panel-bodyWrap>.x-panel-body,.wx-hscroll>.x-panel-body{overflow-x:auto!important;overflow-y:hidden!important;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;scrollbar-width:none}
.wx-hscroll>.x-panel-bodyWrap>.x-panel-body::-webkit-scrollbar,.wx-hscroll>.x-panel-body::-webkit-scrollbar{display:none}
/* ----- 分组表头后面那个行数：灰色小字，和分组值拉开层次 ----- */
.x-grid-group-hd .wx-grp-n,.x-group-hd-container .wx-grp-n{color:#8a97a3;font-size:12px;font-weight:400;margin-left:6px}
/* 分组表头里日期后面那个星期几：灰色小字，和行数一个层级。 */
.x-grid-group-hd .wx-grp-w,.x-group-hd-container .wx-grp-w{color:#8a97a3;font-size:12px;font-weight:400;margin-left:6px}
/* 分组表头里的占比（本组行数/总行数）和后面的小比例条 */
.x-grid-group-hd .wx-grp-p,.x-group-hd-container .wx-grp-p{color:#8a97a3;font-size:12px;font-weight:400;margin-left:4px}
.x-grid-group-hd .wx-grp-bar,.x-group-hd-container .wx-grp-bar{display:inline-block;width:60px;height:6px;background:#dfe6e9;border-radius:3px;overflow:hidden;vertical-align:middle;margin-left:6px}
.x-grid-group-hd .wx-grp-bar i,.x-group-hd-container .wx-grp-bar i{display:block;height:100%;background:var(--primary-color);border-radius:3px}
/* ----- 底部状态栏（Main 的 uniSB1，方案 B 药丸标签）：工具条本体浅灰白底 + 顶线，每格是一个圆角小块 ----- */
/* 工具条本体：去掉主题的渐变和边框，只留 1px 顶线；beforeInit 里给它挂了 wx-sb 这个 class */
.x-toolbar.wx-sb{background:#fafbfc!important;background-image:none!important;border:0!important;border-top:1px solid #e6eaee!important;padding:0 8px!important}.wx-sb .x-toolbar-text{display:flex!important;align-items:center;height:26px!important;box-sizing:border-box;padding:0!important;font-size:12px!important;line-height:20px!important;color:#4b5865;min-width:0;overflow:hidden}
/* 各格 display:flex + 固定 26px 高（28 减顶线）并 align-items:center，不依赖工具条自己的对齐方式也能垂直居中 */
/* 药丸：浅灰块；用户块淡绿加粗；标签(.k)灰、值深灰；绿点表示本节点在线 */
.wx-chip{display:inline-flex;align-items:center;gap:6px;height:20px;padding:0 9px;border-radius:10px;background:#eef1f4;color:#4b5865;white-space:nowrap;cursor:default}.wx-chip.u{background:var(--grid-selected);color:var(--primary-color);font-weight:500}.wx-chip .k{color:#5f6d7a;font-weight:400}.wx-chip .dot{width:7px;height:7px;border-radius:50%;background:var(--primary-color);flex:none}
/* "选中合计"：Main.SetSumText 在状态栏上盖的一层，整条宽、同底色，盖住底下所有格子；列多放不下时截断加省略号 */
.wx-sb-sum{position:absolute;left:0;right:0;top:1px;bottom:0;z-index:5;display:flex;align-items:center;padding:0 8px;background:#fafbfc;overflow:hidden}.wx-sb-sum .wx-chip{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:20px}
/* 小图标：和左侧菜单一样用 mask + currentColor 的内嵌 SVG，颜色跟文字走 */
.wx-i{display:inline-block;width:13px;height:13px;background:currentColor;-webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat;flex:none}.wx-chip .wx-i{color:#5f6d7a}.wx-chip.u .wx-i{color:var(--primary-color)}
.wx-i-user{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%221.9%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%228%22 r=%224%22/%3E%3Cpath d=%22M4 21c0-4 3.6-7 8-7s8 3 8 7%22/%3E%3C/svg%3E")}
.wx-i-clock{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%221.9%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%2212%22 r=%229%22/%3E%3Cpath d=%22M12 7v5l3 2%22/%3E%3C/svg%3E")}
.wx-i-help{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%221.9%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%2212%22 r=%229%22/%3E%3Cpath d=%22M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.7.4-1 .9-1 1.7M12 17h.01%22/%3E%3C/svg%3E")}
/* 右侧链接：描边小药丸，主色绿，悬停淡绿底；版本号浅灰小字，编译时间在 title 里 */
.wx-sb-link{display:inline-flex;align-items:center;gap:5px;height:20px;box-sizing:border-box;padding:0 9px;border-radius:10px;border:1px solid var(--primary-hover);color:var(--primary-color)!important;text-decoration:none!important;white-space:nowrap}.wx-sb-link:hover{background:var(--grid-selected);border-color:var(--primary-strong)}.wx-sb-ver{color:#66727e;font-size:11px;cursor:default}
/* ----- 序号列（dgRowNumbers 生成的 RowNumberer）表头本来是空的，补一个 # ----- */
.x-grid-header-ct .x-column-header.x-row-numberer::before{content:"#";position:absolute;left:0;right:0;top:0;bottom:0;display:flex;align-items:center;justify-content:center;color:#7b8794;font-size:12.5px;pointer-events:none}
/* ----- 页签（主页控件 + 报表里的子页签）：默认黑字，激活主色绿 + 绿下划线 ----- */
/* dfm 里原来是蓝字 Pff、红下划线、悬停米黄底 #fff9e6。 */
/* 默认：深灰近黑、常规字重 */
.x-tab .x-tab-inner,.x-tab .x-tab-inner-default{color:#1f2933!important;font-weight:400!important}
/* 激活：主色绿 + 中等字重 */
.x-tab.x-tab-active .x-tab-inner,.x-tab.x-tab-active .x-tab-inner-default{color:var(--primary-color)!important;font-weight:500!important}
/* 下划线由红改绿（保留原来的展开动画）；悬停时是半透明的绿 */
.x-tab:not(.x-tab-active):hover .x-tab-inner-default::after{background:var(--primary-strong)!important}
/* 去掉米黄色的悬停底和页签底部那条灰线，悬停改成文字变绿 */
.x-tab:hover{background:transparent!important}.x-tab{border-bottom:0!important}.x-tab:not(.x-tab-active):hover .x-tab-inner{color:var(--primary-color)!important}
/* 关闭按钮：原来未激活蓝、激活红，统一成中性灰，悬停才加深 */
.x-tab-default .x-tab-close-btn:hover::before,.x-tab-default .x-tab-close-btn:hover::after,.x-tab-active .x-tab-close-btn:hover::before,.x-tab-active .x-tab-close-btn:hover::after{background:#5f6d7a!important}
/* 禁用时不要出现悬停底色 */
.x-btn.btn-add.x-item-disabled.x-btn-over,.x-btn.btn-add.x-btn-disabled.x-btn-over,.x-btn.btn-add.x-item-disabled:hover,.x-btn.btn-add.x-btn-disabled:hover{background:transparent!important}
/* ===== 2026-09-19 输入控件统一：和按钮同一套语言（6px 圆角 / 28px 高 / #d8dee4 描边 / 主色绿聚焦）===== */
.x-form-text-wrap-default,.x-form-trigger-wrap-default{border:1px solid #d8dee4!important;border-radius:6px!important;background:#fff!important;background-image:none!important}
/* 悬停加深一档，和按钮的悬停同一个值 */
.x-form-text-wrap-default:hover,.x-form-trigger-wrap-default:hover{border-color:#c5cdd5!important}
/* 聚焦：主色绿 + 一圈淡绿外发光，替代 ExtJS 默认的蓝色内阴影 */
.x-form-text-wrap-default.x-form-text-wrap-focus,.x-form-trigger-wrap-default.x-form-trigger-wrap-focus,.x-form-text-wrap-default:focus-within,.x-form-trigger-wrap-default:focus-within{border-color:var(--primary-color)!important;box-shadow:0 0 0 3px var(--primary-hover)!important}
/* 输入区本体：透明底（底色画在外框上）、28 高度由外框决定，这里给 26 内高 */
/* 高度/行高/颜色只管默认字体的输入框：ParentFont=False 的控件 uniGUI 会把字体写进 input 的内联 style，带 font-size/color 的排除，否则 PLC 看板那种 67px 大字会被压成 26px、红色被盖掉 */
.x-form-text-default:not(textarea):not([style*="font-size"]){height:26px!important;line-height:26px!important;padding:0 9px!important}
.x-form-text-default:not([style*="color"]){color:#1f2933!important}
.x-form-text-default,.x-form-textarea-default{background:transparent!important;background-image:none!important;border:0!important}
/* 多行文本框（TUniMemo）不给固定高度，按 dfm 里设的尺寸显示（ExtJS 写在内联 style 里），超出出滚动条；上面 26px 那条已用 :not(textarea) 排除多行文本框 */
.x-form-textarea-default{line-height:1.5!important;padding:5px 9px!important}
/* 禁用：整块压灰 */
.x-form-item.x-item-disabled .x-form-text-wrap-default,.x-form-item.x-item-disabled .x-form-trigger-wrap-default{background:#f2f4f6!important;border-color:#e6eaee!important;opacity:1!important}
/* 校验失败：原来是整块填红（#fee2e2），太重；改成红边 + 淡红外发光 */
.x-form-invalid-field,.x-form-invalid .x-form-text,.x-form-text-wrap-default.x-form-invalid-field{background:#fff!important;border-color:#d9534f!important;box-shadow:0 0 0 3px rgba(217,83,79,.10)!important}
/* 占位符 */
.x-form-text-default::placeholder,.x-form-empty-field{color:#6b7785!important;font-style:normal!important}
/* 触发按钮（下拉/日期/放大镜/清除）：去渐变、去竖线，图标用内嵌 SVG 上主题灰 */
.x-form-trigger,.x-form-trigger-default{background-image:none!important;background-color:transparent!important;border:0!important;width:24px!important}
.x-form-trigger::before{content:""!important;position:absolute;left:50%;top:50%;width:14px;height:14px;margin:-7px 0 0 -7px;background-color:#8a97a3;-webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat}
.x-form-trigger-wrap-default:hover .x-form-trigger::before{background-color:#5f6d7a}
/* [2026-10-09] 上传按钮（TUniFileUploadButton）外面也套着一层 x-form-trigger（x-form-trigger-cmp），它没有 --i 图标，上面那条 ::before 会在按钮正中画一个实心灰方块 → 嵌按钮的触发层不画图标 */
.x-form-trigger.x-form-trigger-cmp::before{content:none!important}
/* [2026-10-09] 允许拖放的上传按钮（AllowDragDrop、ButtonVisible=False 时渲染成 x-file-area）：uniGUI 自带 3px 黑色虚线 + 半透明，改成和其他按钮一样的白底灰边 */
.x-file-area{opacity:1!important;border:1px solid #c5cdd5!important;border-radius:6px!important;background:#fff!important;box-shadow:none!important;outline:none!important;cursor:pointer}
.x-file-area:hover{background:#f7f9fa!important;border-color:#aab4bd!important}
.x-file-area .x-btn-inner{font-family:"Microsoft YaHei","PingFang SC",sans-serif!important;font-size:13px!important;font-weight:400!important;color:#374151!important;text-shadow:none!important}
.x-form-arrow-trigger,.x-form-arrow-trigger-default{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222.4%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 9.5l6 6 6-6%22/%3E%3C/svg%3E")}
.x-form-date-trigger,.x-form-date-trigger-default{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Crect x=%223.5%22 y=%225%22 width=%2217%22 height=%2215%22 rx=%222%22/%3E%3Cpath d=%22M3.5 10h17M8 3v4M16 3v4%22/%3E%3C/svg%3E")}
.x-form-search-trigger,.x-form-search-trigger-default{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2211%22 cy=%2211%22 r=%227%22/%3E%3Cpath d=%22M20 20l-3.6-3.6%22/%3E%3C/svg%3E")}
.x-form-clear-trigger,.x-form-clear-trigger-default{--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Ccircle cx=%2212%22 cy=%2212%22 r=%229%22/%3E%3Cpath d=%22M9 9l6 6M15 9l-6 6%22/%3E%3C/svg%3E")}
/* 上面这些带 !important，会盖掉下面两套"只留下划线"的写法，所以在这里把它们按同样权重重新声明一遍，保证照旧生效 */
.noborder .x-form-text-wrap,.noborder .x-form-text-wrap-default,.noborder .x-form-trigger-wrap-default{border:0!important;border-bottom:1px solid var(--border-color)!important;border-radius:0!important;background:none!important;box-shadow:none!important}
.noborder .x-form-text-wrap-default:focus-within,.noborder .x-form-trigger-wrap-default:focus-within{border-bottom-color:var(--primary-color)!important;box-shadow:none!important}
/* 补：有的 uniGUI 版本包裹层没有 -default 后缀、或焦点落在组件而不是包裹层上，上面那条就配不到 → 这里按组件本身的 :focus-within 再给一次 */
.noborder .x-form-text-wrap:focus-within,.noborder:focus-within .x-form-text-wrap,.noborder:focus-within .x-form-text-wrap-default,.noborder:focus-within .x-form-trigger-wrap-default{border-bottom-color:var(--primary-color)!important}
/* 探针实测：统一输入框那条 height:26px 让 noborder 输入框的外框长到 28，比控件本身（dfm 高 23）高，下边线落在所在面板 body 的 overflow:hidden 之外被裁掉，
/* 所以查询条件栏聚焦时看不到绿线。noborder 的输入框不吃那个固定高度，用 ExtJS 按控件算的高度，边线就回到面板里面。 */
.noborder .x-form-text-default:not(textarea):not([style*="font-size"]),.noborder_cbx .x-form-text-default:not(textarea):not([style*="font-size"]){height:auto!important;line-height:normal!important;padding:0 4px!important}
.noborder_cbx .x-form-text-wrap,.noborder_cbx .x-form-text-wrap-default,.noborder_cbx .x-form-trigger-wrap-default{border:0!important;border-bottom:1px solid var(--border-color)!important;border-radius:0!important;background:none!important;box-shadow:none!important}
.noborder_cbx .x-form-trigger{background:none!important;border:none!important}
.noborder_cbx .x-form-trigger::before{content:none!important}
/* 日期快捷选择：按钮和菜单由 files/wx-ui.js 生成，挂在报表查询条件的两个日期框右边（PnlCond_Date 带 wx-dtgrp 样式类）。菜单是 fixed 定位挂在 body 上的，避免被面板裁掉。 */
.wx-dq-btn{position:absolute;z-index:5;height:22px;width:22px;display:flex;align-items:center;justify-content:center;border-radius:4px;color:#6b7280;cursor:pointer;user-select:none}
.wx-dq-btn:hover,.wx-dq-btn.wx-dq-on{background:var(--primary-light);color:var(--primary-color)}
.wx-dq-btn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.wx-dq-menu{position:fixed;z-index:100000;background:#fff;border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 8px 24px rgba(23,34,43,.14);padding:6px;display:grid;grid-template-columns:repeat(2,92px);gap:1px}
.wx-dq-menu button{border:0;background:none;font:13px/1 "Microsoft YaHei","PingFang SC",sans-serif;color:#374151;height:29px;text-align:left;padding:0 10px;border-radius:5px;cursor:pointer;white-space:nowrap}
.wx-dq-menu button:hover{background:var(--primary-light);color:var(--primary-color)}
.wx-dq-menu button.wx-dq-cur{color:var(--primary-color);font-weight:600;background:var(--primary-light)}
.wx-dq-menu button.wx-dq-all{grid-column:1/-1;border-top:1px solid #e5e7eb;margin-top:5px;height:32px;color:#6b7280}
.wx-dq-hd{grid-column:1/-1;font-size:11px;color:#9ca3af;padding:7px 10px 2px}
.wx-dq-hd.wx-dq-line{border-top:1px solid #e5e7eb;margin-top:5px}
/* [提示规范 2026-09-28] 开始：居中卡片（ErrDlg / MessageDlg 确认）和轻提示（MsgDlg / showtips）。脚本在 files/wx-ui.js 的 wxCard / wxTip。
   .wx-toast-mask 是全屏遮罩（只有一个按钮时点哪都关；两个及以上按钮时点外面不关，卡片晃一下），.wx-toast 是中间那张卡片。 */
.wx-toast-mask{position:fixed;left:0;top:0;right:0;bottom:0;z-index:99999;display:flex;align-items:center;justify-content:center;background:rgba(15,23,42,.07);animation:wx-toast-bg .16s ease}
.wx-toast-mask.wx-toast-out{animation:wx-toast-bgout .16s ease forwards}
@keyframes wx-toast-bg{from{background:rgba(15,23,42,0)}}
@keyframes wx-toast-bgout{to{background:rgba(15,23,42,0);opacity:0}}
.wx-toast{position:relative;min-width:260px;max-width:460px;background:#fff;border-radius:10px;box-shadow:0 8px 28px rgba(15,23,42,.14);padding:18px 22px 14px;text-align:center;overflow:hidden;animation:wx-toast-in .2s cubic-bezier(.2,.9,.3,1.2)}
.wx-toast-out .wx-toast{animation:wx-toast-outk .16s ease forwards}
@keyframes wx-toast-in{from{opacity:0;transform:scale(.88) translateY(-6px)}}
@keyframes wx-toast-outk{to{opacity:0;transform:scale(.94)}}
.wx-toast-msg{font-size:15px;line-height:1.7;color:#1f2933;word-break:break-word;max-height:50vh;overflow:auto}
.wx-toast-btn{margin-top:14px;border:0;border-radius:6px;background:var(--primary-color);color:#fff;font-size:13px;padding:6px 20px;min-width:80px;cursor:pointer;font-family:inherit;transition:filter .15s}
.wx-toast-btn:hover{filter:brightness(1.12)}
.wx-toast-btn:active{filter:brightness(.92)}
/* 自动关闭时卡片底部那条走完即关的进度条；常驻（nTimeout<0）时不生成这个元素。 */
.wx-toast-bar{position:absolute;left:0;bottom:0;height:3px;width:100%;background:var(--primary-color);opacity:.55;transform-origin:left center;animation:wx-toast-bark linear forwards}
@keyframes wx-toast-bark{to{transform:scaleX(0)}}
/* 轻提示（showtips）。原来用 files/dream-msg.min.js，现已整个去掉：那个库是青色浅底、4px 圆角、内容最小宽度写死 240px，和现在这套绿色卡片不是一路。这里自己画，位置在屏幕正中偏上、不带遮罩，不挡操作；可以连着弹多条，自动纵向排队。 */
.wx-tip-stage{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:99998;display:flex;flex-direction:column;align-items:center;gap:6px;pointer-events:none;max-height:calc(100vh - 32px)}
.wx-tip{pointer-events:auto;position:relative;display:flex;align-items:center;gap:8px;max-width:520px;cursor:default;box-sizing:border-box;padding:7px 14px 7px 10px;background:#fff;border:1px solid rgba(15,23,42,.10);border-color:color-mix(in srgb,var(--c,var(--primary-color)) 25%,transparent);border-radius:18px;box-shadow:0 4px 14px rgba(15,23,42,.08);font-size:13px;line-height:1.5;color:#1f2933;animation:wx-tip-in .18s ease}
.wx-tip::before{content:none}
.wx-tip.wx-tip-out{animation:wx-tip-out .2s ease forwards}
@keyframes wx-tip-in{from{opacity:0;transform:translateY(-14px) scale(.96)}}
@keyframes wx-tip-out{to{opacity:0;transform:translateY(-10px) scale(.97)}}
.wx-tip-i{flex:0 0 auto;width:16px;height:16px;margin-top:0;border-radius:50%;background:var(--c,var(--primary-color));display:flex;align-items:center;justify-content:center}
.wx-tip-i::after{content:"";width:10px;height:10px;background:#fff;-webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat}
/* 长提示（存储过程返回的多行结果等）：最高 60% 屏高，超出在提示里滚动，不会顶出屏幕 */
.wx-tip-t{flex:1 1 auto;min-width:0;max-height:60vh;overflow:auto;word-break:break-word;overscroll-behavior:contain}
.wx-tip-x{flex:0 0 auto;margin:0 -6px 0 2px;width:22px;height:22px;border:0;background:none;cursor:pointer;color:#a8b2ac;font-size:17px;line-height:1;font-family:inherit;border-radius:5px}
.wx-tip-x:hover{background:#f1f4f2;color:#5b6a60}
/* 四种类型只差一个颜色变量和一个图标；info 用主题绿。 */
.wx-tip.info{--c:var(--primary-color);--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 12 12%22 fill=%22black%22%3E%3Ccircle cx=%226%22 cy=%222.5%22 r=%221.2%22/%3E%3Crect x=%224.9%22 y=%224.6%22 width=%222.2%22 height=%225.6%22 rx=%221.1%22/%3E%3C/svg%3E")}
.wx-tip.success{--c:var(--primary-color);--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 12 12%22 fill=%22none%22 stroke=%22black%22 stroke-width=%221.9%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M2.2 6.3l2.6 2.6L9.8 3.3%22/%3E%3C/svg%3E")}
.wx-tip.warning{--c:var(--primary-color);--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 12 12%22 fill=%22black%22%3E%3Crect x=%224.9%22 y=%221.8%22 width=%222.2%22 height=%225.4%22 rx=%221.1%22/%3E%3Ccircle cx=%226%22 cy=%229.5%22 r=%221.2%22/%3E%3C/svg%3E")}
.wx-tip.error{--c:#e53935;--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 12 12%22 fill=%22none%22 stroke=%22black%22 stroke-width=%221.9%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M3.3 3.3l5.4 5.4M8.7 3.3L3.3 8.7%22/%3E%3C/svg%3E")}
/* 居中卡片的图标与双按钮：ErrDlg 用红叉、QuestionDlg 用黄问号，成功变体备用。 */
.wx-toast-ico{width:34px;height:34px;border-radius:50%;margin:0 auto 10px;display:flex;align-items:center;justify-content:center}
.wx-toast-ico::after{content:"";width:18px;height:18px;background:#fff;-webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat}
.wx-toast-err .wx-toast-ico{background:#e53935;--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222.6%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M6 6l12 12M18 6L6 18%22/%3E%3C/svg%3E")}
.wx-toast-ask .wx-toast-ico{background:var(--primary-color);--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222.6%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M9 9a3 3 0 1 1 4 2.8c-.7.3-1 .9-1 1.7v.5%22/%3E%3Cpath d=%22M12 17.6v.2%22/%3E%3C/svg%3E")}
.wx-toast-ok .wx-toast-ico{background:var(--primary-color);--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222.6%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M5 12.5l4.5 4.5L19 7.5%22/%3E%3C/svg%3E")}
.wx-toast-btns{display:flex;gap:8px;justify-content:center;margin-top:14px}
.wx-toast-btns .wx-toast-btn{margin-top:0;min-width:80px}
.wx-toast-btn2{background:#fff;color:#5b6a60;border:1px solid #d8dee4}
.wx-toast-btn2:hover{background:#f5f7f6;filter:none}
/* 提示规范：卡片图标用主题色（信息 / 询问），第 3 级危险确认（删除 / 作废 / 反审核 / 清空）红色垃圾桶 + 红色确定按钮 */
.wx-toast-info .wx-toast-ico{background:var(--primary-color);--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22black%22%3E%3Ccircle cx=%2212%22 cy=%226%22 r=%222.2%22/%3E%3Crect x=%229.9%22 y=%2210%22 width=%224.2%22 height=%2210%22 rx=%222.1%22/%3E%3C/svg%3E")}
.wx-toast-danger .wx-toast-ico{background:#e53935;--i:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 24 24%22 fill=%22none%22 stroke=%22black%22 stroke-width=%222.2%22 stroke-linecap=%22round%22 stroke-linejoin=%22round%22%3E%3Cpath d=%22M5 7h14M10 7V5h4v2M7 7l1 12h8l1-12%22/%3E%3C/svg%3E")}
.wx-toast-danger .wx-toast-btn:not(.wx-toast-btn2){background:#e53935}
.wx-toast-btn:focus{outline:none}
.wx-toast-btn:focus-visible,.wx-toast-btns .wx-toast-btn:focus{box-shadow:0 0 0 3px var(--primary-hover)}
.wx-toast-danger .wx-toast-btns .wx-toast-btn:focus{box-shadow:0 0 0 3px rgba(229,57,53,.20)}
/* 两个及以上按钮时点了卡片外面：晃一下，提示要在按钮里选 */
.wx-toast.wx-toast-shake{animation:wx-toast-shake .32s ease}
@keyframes wx-toast-shake{0%,100%{transform:translateX(0)}20%,60%{transform:translateX(-6px)}40%,80%{transform:translateX(6px)}}
/* 手机、窄屏：卡片和轻提示左右各留 16px，不贴边；刘海屏 / 底部横条按安全区再让一点 */
.wx-toast-mask{padding:env(safe-area-inset-top,0) env(safe-area-inset-right,0) env(safe-area-inset-bottom,0) env(safe-area-inset-left,0);box-sizing:border-box}
@media (max-width:480px){
.wx-toast{min-width:0;width:calc(100vw - 32px);max-width:none;box-sizing:border-box;padding:16px 16px 12px}
.wx-toast-btns{flex-wrap:wrap}
.wx-toast-btns .wx-toast-btn{flex:1 1 0;min-width:0}
.wx-tip{max-width:calc(100vw - 32px)}
}
/* [提示规范 2026-09-28] 结束 */
/* ===== 手机端 ===== */
/* 允许双指缩放后（ServerModule 的 viewport 去掉了 user-scalable=no），把"双击放大"关掉，免得连点两下按钮页面就放大 */
html{touch-action:manipulation}
@media (max-width:480px){
.record-card{width:100%;box-sizing:border-box}
.wx-dq-menu{grid-template-columns:repeat(2,minmax(84px,1fr));max-width:calc(100vw - 16px);box-sizing:border-box}
.wx-sb-ver{display:none}
}
/* ===== 可访问性 ===== */
/* 键盘操作时（Tab / 方向键）给页签、菜单项、左侧菜单、表格单元格、下拉项一圈主色焦点环；鼠标点击不显示（:focus-visible）。
   只点名这几类，不用 [tabindex] 通配：ExtJS 的窗口、面板也带 tabindex，服务端弹窗时会被整块描上绿框 */
.x-tab:focus-visible,.x-menu-item:focus-visible,.x-grid-cell:focus-visible,.x-grid-item:focus-visible,.x-boundlist-item:focus-visible,.x-tool:focus-visible,.x-treelist:focus-visible,.wx-tip-x:focus-visible,a[href]:focus-visible{outline:2px solid var(--primary-color)!important;outline-offset:-2px}
/* [2026-09-29] 系统设置了“减少动态效果”（远程桌面 mstsc 默认就是）：只缩短动画，不动过渡。
   原来这里还有 *{transition-duration:.01ms}：元素默认 transition-property 是 all，时长一改成非 0，页面上所有元素的宽、高、位置、显示隐藏
   都变成过渡，ExtJS 切页签时刚设完尺寸马上读回来还是旧值，布局算错再排一次，看起来像刷新布局。
   页签内容保留纯淡入（不位移），查询遮罩保留原来的延迟显示（短请求不闪白），都只是透明度变化 */
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;animation-delay:0s!important;scroll-behavior:auto!important}.x-tabpanel-child{animation:wx-tab-fade .3s ease!important}@keyframes wx-tab-fade{from{opacity:0}to{opacity:1}}.x-mask:has(>.x-mask-msg)::after,.x-mask-msg-inner{animation-duration:.4s!important}}
/* 左侧菜单收起（Micro）时的弹出子菜单：子项太多时 wx-ui.js 给弹出层加 wx-tl-cols，子项在右边分列排开（2026-10-16） */
.x-treelist-floater.wx-tl-cols .x-treelist-container{column-gap:0;column-fill:balance}
.x-treelist-floater.wx-tl-cols .x-treelist-container>li{break-inside:avoid;-webkit-column-break-inside:avoid;page-break-inside:avoid}
.x-treelist-floater.wx-tl-cols{box-shadow:0 4px 16px rgba(0,0,0,.15)}
