/* ========== 全局变量（莫兰迪清新色系） ========== */
:root {
  --primary: #557A82;
  --primary-dark: #44656C;
  --primary-light: #E8EEF0;
  --success: #6B8E6B;
  --warning: #A07D50;
  --danger: #9E6666;
  --purple: #7A6E8A;
  --cyan: #5E8B85;
  --text: #3D3D3D;
  --text-secondary: #6B6560;
  --text-light: #9A9590;
  --border: #E2DDD6;
  --bg: #F7F5F2;
  --bg-white: #FFFFFF;
  --sidebar-w: 220px;
  --topbar-h: 56px;
  --tabbar-h: 60px;
  /* v2.1.8 需求6：PC端内容列固定为A4宽度（210mm≈794px），居中显示 */
  --content-w: 794px;
  --radius: 10px;
  --shadow: 0 1px 3px rgba(120,110,100,.06);
}

/* ========== Reset ========== */
* { margin:0; padding:0; box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
html,body { height:100%; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif; background:var(--bg); color:var(--text); font-size:14px; overscroll-behavior:none; -webkit-text-size-adjust:100%; }
button { cursor:pointer; border:none; font-family:inherit; }
input,select,textarea { font-family:inherit; outline:none; }
a { color:var(--primary); text-decoration:none; }

/* ========== 登录页 ========== */
.login-page { position:fixed; inset:0; background:linear-gradient(135deg,#8BA8B0,#6B8A92); display:flex; align-items:center; justify-content:center; padding:20px; z-index:100; }
.login-box { width:100%; max-width:400px; }
.login-logo { text-align:center; margin-bottom:32px; }
.logo-icon { width:72px; height:72px; background:rgba(255,255,255,.2); border-radius:20px; display:inline-flex; align-items:center; justify-content:center; font-size:36px; margin-bottom:16px; }
.login-logo h1 { color:#fff; font-size:26px; font-weight:300; letter-spacing:.5px; margin:0 0 6px; white-space:nowrap; }
.login-logo p { color:#fff; font-size:21px; font-weight:700; letter-spacing:0; margin:0; white-space:nowrap; }
.login-logo-img { width:96px; height:96px; object-fit:contain; background:#fff; border-radius:16px; padding:8px; margin:0 auto 18px; display:block; box-shadow:0 6px 18px rgba(0,0,0,.18); }
.login-form { background:#fff; border-radius:16px; padding:28px 24px; box-shadow:0 8px 32px rgba(0,0,0,.15); }
.login-tip { text-align:center; margin-top:16px; font-size:12px; color:var(--text-light); }

/* ========== 表单 ========== */
.form-group { margin-bottom:16px; }
.form-group label { display:block; font-size:13px; color:var(--text-secondary); margin-bottom:6px; font-weight:500; }
.form-group input,.form-group select,.form-group textarea { width:100%; border:1px solid var(--border); border-radius:8px; padding:10px 12px; font-size:14px; background:#fafafa; transition:border-color .2s; }
.form-group input:focus,.form-group select:focus,.form-group textarea:focus { border-color:var(--primary); background:#fff; }
.form-group textarea { min-height:80px; resize:vertical; }
.form-group input[type=file] { padding:8px; background:#fff; }
.form-group input[type=checkbox] { width:15px; height:15px; padding:0; border:none; background:none; flex-shrink:0; }
.form-group input[type=radio] { width:15px; height:15px; padding:0; border:none; background:none; flex-shrink:0; }
.insp-proj-label { display:flex !important; align-items:center; gap:6px; padding:4px 0; cursor:pointer; font-size:13px; font-weight:normal !important; margin-bottom:0 !important; color:var(--text) !important; }
.form-row { display:flex; gap:12px; }
.form-row .form-group { flex:1; }
.required { color:#ff0000; font-weight:bold; font-size:15px; margin-left:2px; }

/* ========== 按钮 ========== */
.btn-primary { background:linear-gradient(135deg,var(--primary),var(--primary-dark)); color:#fff; border-radius:8px; padding:10px 20px; font-size:14px; font-weight:500; transition:opacity .2s; }
.btn-primary:active { opacity:.85; }
.btn-block { width:100%; height:46px; font-size:16px; }
.btn-success { background:var(--success); color:#fff; border-radius:8px; padding:10px 20px; font-size:14px; }
.btn-warning { background:var(--warning); color:#fff; border-radius:8px; padding:10px 20px; font-size:14px; }
.btn-danger { background:var(--danger); color:#fff; border-radius:8px; padding:10px 20px; font-size:14px; }
.btn-outline { background:#fff; color:var(--primary); border:1px solid var(--primary); border-radius:8px; padding:10px 20px; font-size:14px; }
.btn-sm { padding:6px 14px; font-size:13px; height:auto; }
.btn-text { background:none; color:var(--primary); padding:6px 10px; font-size:13px; }

/* ========== 主框架布局 ========== */
.main-frame { display:flex; height:100vh; height:100dvh; overflow:hidden; }

/* PC端侧边栏 */
.sidebar { width:var(--sidebar-w); background:#fff; border-right:1px solid var(--border); display:flex; flex-direction:column; flex-shrink:0; transition:transform .25s; z-index:200; }
.sidebar-logo { padding:26px 20px; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px; border-bottom:1px solid var(--border); }
.logo-icon-sm { font-size:24px; }
.sidebar-logo-img { height:36px; width:auto; display:block; flex:none; }
.logo-text { display:flex; flex-direction:column; align-items:center; justify-content:center; line-height:1.25; min-width:0; width:100%; text-align:center; }
.logo-text-main { font-size:15px; font-weight:700; color:var(--primary); letter-spacing:.3px; white-space:nowrap; }
.logo-text-sub { font-size:11px; color:var(--text-light); white-space:nowrap; margin-top:1px; }
.sidebar-scroll { flex:1; overflow-y:auto; display:flex; flex-direction:column; min-height:0; }
.sidebar-nav { flex:none; overflow:visible; padding:10px 0; }
.nav-group-title { padding:12px 20px 6px; font-size:11px; color:var(--text-light); font-weight:600; text-transform:uppercase; }
.nav-item { display:flex; align-items:center; gap:10px; padding:10px 20px; cursor:pointer; color:var(--text); font-size:14px; transition:all .15s; border-left:3px solid transparent; }
.nav-item:hover { background:var(--primary-light); color:var(--primary); }
.nav-item.active { background:var(--primary-light); color:var(--primary); border-left-color:var(--primary); font-weight:500; }
.nav-icon { font-size:18px; width:24px; text-align:center; }
.sidebar-footer { border-top:1px solid var(--border); padding:12px; }
.user-mini { display:flex; align-items:center; gap:10px; padding:8px; border-radius:8px; cursor:pointer; }
.user-mini:hover { background:var(--bg); }
.avatar-sm { width:36px; height:36px; border-radius:50%; background:var(--primary-light); display:flex; align-items:center; justify-content:center; font-size:18px; }
.user-mini-name { font-size:13px; font-weight:500; }
.user-mini-role { font-size:11px; color:var(--text-light); }

/* 主内容区 */
.main-content { flex:1; display:flex; flex-direction:column; overflow:hidden; min-width:0; }
.topbar { height:var(--topbar-h); background:#fff; border-bottom:1px solid var(--border); display:flex; align-items:center; justify-content:space-between; padding:0 max(20px, calc((100% - var(--content-w)) / 2)); flex-shrink:0; }
.topbar-left { display:flex; align-items:center; gap:12px; }
.menu-toggle { display:none; background:none; font-size:22px; color:var(--text); padding:4px 8px; }
.page-title { font-size:18px; font-weight:600; }
.topbar-right { display:flex; align-items:center; gap:16px; }
.notify-bell { position:relative; font-size:20px; cursor:pointer; padding:4px; }
.notify-bell .badge { position:absolute; top:0; right:0; background:var(--danger); color:#fff; font-size:10px; min-width:16px; height:16px; border-radius:8px; display:flex; align-items:center; justify-content:center; padding:0 4px; font-weight:600; }
.topbar-user { font-size:14px; color:var(--text-secondary); }
/* v2.1.8 需求6：内容列固定A4宽度居中；窗口缩小时 max() 回退为20px，随系统自适应 */
.page-content { flex:1; overflow-y:auto; padding:20px max(20px, calc((100% - var(--content-w)) / 2)); }

/* ========== 手机端底部Tab ========== */
.mobile-tab { display:none; position:fixed; bottom:0; left:0; right:0; height:var(--tabbar-h); background:#fff; border-top:1px solid var(--border); z-index:100; padding-bottom:env(safe-area-inset-bottom); }
.tab-item { flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px; color:var(--text-secondary); cursor:pointer; }
.tab-item.active { color:var(--primary); }
.tab-icon { font-size:22px; }
.tab-label { font-size:10px; font-weight:500; }

/* ========== 通用组件 ========== */
.card { background:#fff; border-radius:var(--radius); padding:16px; box-shadow:var(--shadow); margin-bottom:12px; }
.card-title { font-size:15px; font-weight:600; margin-bottom:12px; display:flex; align-items:center; justify-content:space-between; }
.card-clickable { cursor:pointer; transition:transform .1s; }
.card-clickable:active { transform:scale(.98); }

.stats-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-bottom:16px; }
.stat-card { background:#fff; border-radius:var(--radius); padding:18px 12px; text-align:center; box-shadow:var(--shadow); }
.stat-card .num { font-size:26px; font-weight:700; line-height:1.2; }
.stat-card .label { font-size:12px; color:var(--text-secondary); margin-top:4px; }
.stat-card.primary .num { color:var(--primary); }
.stat-card.warning .num { color:var(--warning); }
.stat-card.success .num { color:var(--success); }
.stat-card.danger .num { color:var(--danger); }

.section-title { font-size:15px; font-weight:600; margin:16px 4px 10px; display:flex; align-items:center; justify-content:space-between; }
.section-title .more { font-size:12px; color:var(--text-secondary); font-weight:normal; cursor:pointer; }

.search-bar { display:flex; align-items:center; gap:8px; background:#fff; border-radius:var(--radius); padding:0 14px; height:42px; margin-bottom:12px; box-shadow:var(--shadow); }
.search-bar input { flex:1; border:none; background:transparent; font-size:14px; }
.search-bar .s-icon { color:var(--text-secondary); font-size:16px; }

.filter-tabs { display:flex; gap:8px; margin-bottom:12px; overflow-x:auto; padding-bottom:4px; }
.filter-tab { padding:6px 16px; background:#fff; border-radius:20px; font-size:13px; color:var(--text); white-space:nowrap; cursor:pointer; border:1px solid transparent; flex-shrink:0; }
.filter-tab.active { background:var(--primary); color:#fff; border-color:var(--primary); }

.sub-tabs { display:flex; background:#fff; border-radius:var(--radius); padding:4px; margin-bottom:12px; gap:4px; }
.sub-tab { flex:1; text-align:center; padding:8px 0; font-size:13px; color:var(--text); border-radius:8px; cursor:pointer; font-weight:500; white-space:nowrap; }
.sub-tab.active { background:var(--primary); color:#fff; }
.recycle-bin-btn { margin-left:auto; flex:0 0 auto; width:36px; height:36px; border-radius:50%; border:1px solid var(--border); background:#fff; font-size:16px; cursor:pointer; display:flex; align-items:center; justify-content:center; transition:all .2s; padding:0; align-self:center; }
.recycle-bin-btn:hover { background:#fef2f2; border-color:#fca5a5; transform:scale(1.08); }

.status-tag { font-size:11px; padding:3px 8px; border-radius:6px; font-weight:500; white-space:nowrap; display:inline-block; }
.status-pending { background:#fff7e6; color:#fa8c16; }
.status-assigned { background:#e6f4ff; color:#1677ff; }
.status-progress { background:#E8EEF0; color:#44656C; }
.status-check { background:#EBE8EF; color:#6A5E7A; }
.status-done { background:#E8EFE8; color:#5A7A5A; }
.status-danger { background:#F0E5E5; color:#8A5555; }

.list-item { display:flex; align-items:center; padding:12px 0; border-bottom:1px solid #f3f4f6; cursor:pointer; }
.list-item:last-child { border-bottom:none; }
.list-item:hover { background:#fafafa; }

.empty-state { text-align:center; padding:60px 20px; color:var(--text-secondary); }
.empty-state .empty-icon { font-size:48px; margin-bottom:12px; opacity:.5; }

.fab { position:fixed; right:16px; bottom:80px; width:35px; height:35px; background:#EF4444; color:#fff; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:18px; box-shadow:0 2px 8px rgba(239,68,68,.3); cursor:pointer; z-index:50; }
.fab:active { transform:scale(.9); }

.badge-dot { width:8px; height:8px; border-radius:50%; display:inline-block; }

/* ========== 弹窗 ========== */
.modal-mask { position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:300; display:none; align-items:center; justify-content:center; }
.modal-mask.show { display:flex; }
.modal-box { background:#fff; width:90%; max-width:520px; max-height:85vh; border-radius:14px; display:flex; flex-direction:column; animation:modalIn .2s ease; }
@keyframes modalIn { from{transform:translateY(20px);opacity:0} to{transform:translateY(0);opacity:1} }
.modal-header { padding:16px 20px; border-bottom:1px solid var(--border); display:flex; align-items:center; justify-content:space-between; flex-shrink:0; }
.modal-header h3 { font-size:16px; font-weight:600; }
.modal-close { font-size:20px; color:var(--text-light); cursor:pointer; padding:0 4px; }
.modal-body { flex:1; overflow-y:auto; padding:20px; }
.modal-footer { padding:12px 20px; border-top:1px solid var(--border); display:flex; gap:10px; justify-content:flex-end; flex-shrink:0; }

/* ========== 详情面板 ========== */
.detail-panel { position:fixed; top:0; right:0; bottom:0; width:520px; max-width:100%; background:var(--bg); z-index:250; transform:translateX(100%); transition:transform .25s ease; display:flex; flex-direction:column; box-shadow:-4px 0 16px rgba(0,0,0,.1); }
.detail-panel.show { transform:translateX(0); }
.detail-mask { display:none; position:fixed; inset:0; background:rgba(15,23,42,.18); z-index:240; }
.detail-mask.show { display:block; }
.detail-header { height:var(--topbar-h); background:#fff; border-bottom:1px solid var(--border); display:flex; align-items:center; padding:0 16px; gap:12px; flex-shrink:0; }
.detail-back { color:var(--primary); font-size:14px; cursor:pointer; white-space:nowrap; }
.detail-title { flex:1; font-size:16px; font-weight:600; text-align:center; }
.detail-action { font-size:14px; color:var(--primary); cursor:pointer; white-space:nowrap; min-width:40px; text-align:right; }
.detail-body { flex:1; min-height:0; overflow-y:auto; -webkit-overflow-scrolling:touch; padding:16px; padding-bottom:32px; }
.detail-section { background:#fff; border-radius:var(--radius); padding:16px; margin-bottom:12px; box-shadow:var(--shadow); }
.detail-section h3 { font-size:15px; font-weight:600; margin-bottom:12px; }
.detail-row { display:flex; gap:8px; align-items:flex-start; padding:4px 0; border-bottom:1px solid #f3f4f6; font-size:13px; }
.detail-row:last-child { border-bottom:none; }
.detail-row .label { color:var(--text-secondary); width:72px; flex-shrink:0; min-width:0; white-space:normal; overflow-wrap:anywhere; margin-right:6px; }
.detail-row .value { color:var(--text); flex:1; min-width:0; word-break:break-all; }
/* v2.15.40 “长名称 + 右侧数量/标签”清单行：名称弹性换行、右侧值固定不收缩，杜绝长名称与右侧重叠 */
.detail-row.split-row { align-items:flex-start; }
.detail-row.split-row .label { width:auto; flex:1 1 auto; white-space:normal; overflow-wrap:anywhere; color:var(--text); margin-right:8px; }
.detail-row.split-row .value { flex:0 0 auto; white-space:nowrap; text-align:right; max-width:46%; overflow-wrap:anywhere; }
/* v2.15.216 设备详情：分组小标题 + 长编码等宽换行 + 状态按钮移动端平铺 */
.detail-group-title{font-size:12px;font-weight:600;color:var(--text-secondary);letter-spacing:.03em;margin:16px 0 2px;padding-bottom:6px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:6px;}
.detail-group-title:first-child{margin-top:6px;}
.detail-group-title .dgt-dot{width:6px;height:6px;border-radius:50%;background:var(--primary);flex-shrink:0;}
.mono-break{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;font-size:12px;line-height:1.55;letter-spacing:.01em;word-break:break-all;white-space:normal;}
.dev-status-btns .btn-sm{min-width:0;}
@media (max-width:768px){
  .dev-status-bar{flex-direction:column !important;align-items:stretch !important;gap:8px !important;}
  .dev-status-btns{width:100% !important;}
  .dev-status-btns .btn-sm{flex:1 1 0;padding-left:4px;padding-right:4px;}
}
/* v2.5.9 需求7：仅维修工单详情的基础信息行与操作记录局部还原行距（其它页面维持紧凑） */
.repair-info-section .detail-row { padding: 8px 0 !important; }
.repair-log-row { padding: 10px 0 !important; }

/* ========== 时间线 ========== */
.timeline { position:relative; padding-left:20px; }
.timeline::before { content:''; position:absolute; left:6px; top:6px; bottom:6px; width:2px; background:#e5e7eb; }
.timeline-item { position:relative; padding-bottom:16px; }
.timeline-item:last-child { padding-bottom:0; }
.timeline-item::before { content:''; position:absolute; left:-20px; top:4px; width:12px; height:12px; border-radius:50%; background:#fff; border:2px solid var(--primary); z-index:1; }
.timeline-item.done::before { background:var(--success); border-color:var(--success); }
.timeline-item .tl-title { font-size:13px; font-weight:600; margin-bottom:2px; }
.timeline-item .tl-time { font-size:11px; color:var(--text-light); }
.timeline-item .tl-desc { font-size:12px; color:var(--text-secondary); margin-top:4px; }

/* ========== Toast ========== */
.toast { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); background:rgba(0,0,0,.78); color:#fff; padding:12px 24px; border-radius:10px; font-size:14px; z-index:500; display:none; max-width:80%; text-align:center; }
.toast.show { display:block; animation:fadeIn .2s; }
@keyframes fadeIn { from{opacity:0} to{opacity:1} }

/* ========== 进度条 ========== */
.progress-bar { height:6px; background:#f0f0f0; border-radius:3px; overflow:hidden; }
.progress-bar-fill { height:100%; background:linear-gradient(90deg,var(--primary),var(--primary-dark)); border-radius:3px; transition:width .3s; }
.progress-bar-fill.warning { background:linear-gradient(90deg,var(--warning),#d48806); }
.progress-bar-fill.danger { background:linear-gradient(90deg,var(--danger),#cf1322); }

/* ========== 表格（PC端） ========== */
.data-table { width:100%; border-collapse:collapse; background:#fff; border-radius:var(--radius); overflow:hidden; box-shadow:var(--shadow); }
.data-table th { background:#fafafa; padding:12px 14px; text-align:left; font-size:13px; color:var(--text-secondary); font-weight:600; border-bottom:1px solid var(--border); white-space:nowrap; }
.data-table td { padding:12px 14px; font-size:13px; border-bottom:1px solid #f3f4f6; }
.data-table tr:hover td { background:#f9fafb; }
.data-table tr:last-child td { border-bottom:none; }
.table-wrap { overflow-x:auto; }

/* ========== 遮罩 ========== */
.overlay { position:fixed; inset:0; background:rgba(0,0,0,.4); z-index:150; display:none; }
.overlay.show { display:block; }

/* ========== 响应式：手机端 ========== */
@media (max-width:768px) {
  .sidebar { position:fixed; top:0; left:0; bottom:0; transform:translateX(-100%); }
  .sidebar.show { transform:translateX(0); }
  .menu-toggle { display:block; }
  .mobile-tab { display:flex; }
  .page-content { padding:12px; padding-bottom:calc(var(--tabbar-h) + 12px); }
  .stats-grid { grid-template-columns:repeat(2,1fr); }
  .stat-card .num { font-size:22px; }
  .topbar-user { display:none; }
  .fab { bottom:calc(var(--tabbar-h) + 16px); }
  .detail-panel { width:100%; }
  .form-row { flex-direction:column; gap:0; }
  .data-table { font-size:12px; }
  .data-table th,.data-table td { padding:8px 10px; }
}

/* ========== 工具类 ========== */
.flex { display:flex; }
.flex-between { display:flex; justify-content:space-between; align-items:center; }
.flex-center { display:flex; align-items:center; justify-content:center; }
.gap-8 { gap:8px; }
.gap-12 { gap:12px; }
.mt-8 { margin-top:8px; }
.mt-12 { margin-top:12px; }
.mt-16 { margin-top:16px; }
.mb-8 { margin-bottom:8px; }
.mb-12 { margin-bottom:12px; }
.text-sm { font-size:12px; }
.text-secondary { color:var(--text-secondary); }
.text-danger { color:var(--danger); }
.text-success { color:var(--success); }
.text-warning { color:var(--warning); }
.text-primary { color:var(--primary); }
.font-bold { font-weight:600; }
.text-right { text-align:right; }
.w-full { width:100%; }

/* 优先级整卡着色：普通默认无额外色；高=橙；紧急=红（置于 card-overdue 之前，超时仍以超时红为准） */
.card-pri-high {
  border: 1px solid #FCD34D;
  border-left: 4px solid #F59E0B !important;
  background: #FFF8EC;
}
.card-pri-urgent {
  border: 1px solid #FCA5A5;
  border-left: 4px solid #DC2626 !important;
  background: #FEF1F1;
}

/* 超时工单卡片 */
.card-overdue {
  border-left: 4px solid var(--danger) !important;
  background: #fff5f5;
}

/* 照片预览 */
.photo-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
}
.photo-grid img {
  width: 100%;
  border-radius: 8px;
  cursor: pointer;
  object-fit: cover;
  aspect-ratio: 1;
}

/* 进度条 */
.progress-bar {
  height: 8px;
  background: #e5e7eb;
  border-radius: 4px;
  overflow: hidden;
}
.progress-bar-fill {
  height: 100%;
  background: var(--primary);
  border-radius: 4px;
  transition: width 0.3s;
}

/* 里程碑时间线 */
.milestone-item {
  display: flex;
  gap: 12px;
  padding: 10px 0;
  border-bottom: 1px solid var(--border);
}
.milestone-dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  margin-top: 4px;
  flex-shrink: 0;
}
.milestone-dot.done { background: var(--success); }
.milestone-dot.doing { background: var(--primary); }
.milestone-dot.todo { background: #d1d5db; }

/* 财务金额 */
.amount-positive { color: var(--success); font-weight: 600; }
.amount-negative { color: var(--danger); font-weight: 600; }

/* ========== 深色主题 ========== */
[data-theme="dark"] {
  --primary: #4096ff;
  --primary-dark: #44656C;
  --primary-light: #111d35;
  --success: #73d13d;
  --warning: #ffc53d;
  --danger: #ff7875;
  --purple: #9254de;
  --text: #e5e7eb;
  --text-secondary: #9ca3af;
  --text-light: #6b7280;
  --border: #374151;
  --bg: #111827;
  --bg-white: #1f2937;
  --shadow: 0 1px 3px rgba(0,0,0,.3);
}
[data-theme="dark"] .sidebar { background: #1f2937; border-right-color: #374151; }
[data-theme="dark"] .topbar { background: #1f2937; border-bottom-color: #374151; }
[data-theme="dark"] .card { background: #1f2937; border-color: #374151; }
[data-theme="dark"] .modal-content { background: #1f2937; }
[data-theme="dark"] .input, [data-theme="dark"] input, [data-theme="dark"] select, [data-theme="dark"] textarea { background: #111827; color: #e5e7eb; border-color: #374151; }
[data-theme="dark"] .mobile-tab { background: #1f2937; border-top-color: #374151; }
[data-theme="dark"] .login-box { background: #1f2937; }
[data-theme="dark"] .login-page { background: linear-gradient(135deg, #111827, #1f2937); }
[data-theme="dark"] .empty-state { color: #6b7280; }
[data-theme="dark"] .timeline-item::before { background: #374151; }
[data-theme="dark"] .detail-section { border-bottom-color: #374151; }
[data-theme="dark"] .filter-tab.active { background: var(--primary-light); color: var(--primary); }
[data-theme="dark"] .sub-tab.active { color: var(--primary); border-bottom-color: var(--primary); }
[data-theme="dark"] .stat-card { background: #111827; }
[data-theme="dark"] table { color: #e5e7eb; }
[data-theme="dark"] th { background: #111827; }
[data-theme="dark"] .list-item:hover { background: #111827; }

/* ========== 权限树布局 ========== */
.perm-toolbar { display:flex; align-items:center; justify-content:space-between; padding:8px 12px; background:var(--primary-light); border-radius:8px; margin-bottom:10px; }
.perm-select-all { display:flex !important; align-items:center; gap:6px; font-size:13px; font-weight:600; color:var(--primary); cursor:pointer; margin-bottom:0; }
.perm-select-all input[type=checkbox] { width:15px !important; height:15px; flex-shrink:0; padding:0; border:none; background:none; }
.perm-count { font-size:12px; color:var(--text-secondary); }
.perm-tree { max-height:400px; overflow-y:auto; border:1px solid var(--border); border-radius:8px; }
.perm-group { border-bottom:1px solid var(--border); }
.perm-group:last-child { border-bottom:none; }
.perm-group-header { display:flex; align-items:center; justify-content:space-between; padding:10px 12px; background:#fafbfc; cursor:pointer; user-select:none; }
.perm-group-header:hover { background:#f0f5ff; }
.perm-group-label { display:flex !important; align-items:center; gap:8px; font-size:13px; font-weight:600; cursor:pointer; flex:1; margin-bottom:0; }
.perm-group-label input[type=checkbox] { width:15px !important; height:15px; flex-shrink:0; padding:0; border:none; background:none; }
.perm-module-name { color:var(--text); }
.perm-module-count { font-size:11px; color:var(--text-light); font-weight:400; background:#fff; padding:1px 8px; border-radius:10px; border:1px solid var(--border); }
.perm-toggle { font-size:12px; color:var(--text-secondary); width:20px; text-align:center; }
.perm-group-items { display:grid; grid-template-columns:1fr 1fr; gap:0; padding:4px 12px 8px 28px; }
.perm-item { display:flex !important; align-items:center; gap:6px; font-size:12px; padding:6px 4px; cursor:pointer; border-radius:4px; color:var(--text-secondary); margin-bottom:0; }
.perm-item:hover { background:var(--primary-light); color:var(--primary); }
.perm-item input[type=checkbox] { width:15px !important; height:15px; flex-shrink:0; padding:0; border:none; background:none; }
@media (max-width:600px) { .perm-group-items { grid-template-columns:1fr; } }

/* v2.15.179 角色权限：手勾 vs 实际生效对照 */
.perm-item-auto { color: var(--text); }
.perm-auto-tag { flex-shrink:0; font-size:10px; line-height:1.4; padding:2px 6px; border-radius:8px; font-weight:600; white-space:nowrap; font-style:normal; }
.perm-auto-view { background:#e6f4ff; color:#0f6fc8; border:1px solid #b6dcff; }
.perm-auto-eq { background:#f3e8ff; color:#8b2fd0; border:1px solid #e0c6f7; }
.perm-auto-base { background:#fff4e5; color:#c47a06; border:1px solid #ffddaa; }
.perm-diff-bar { font-size:12px; color:var(--text-secondary); background:#fafbfc; border:1px dashed var(--border); border-radius:8px; padding:8px 10px; margin:8px 0 6px; line-height:1.7; }
.perm-diff-bar b { color:var(--text); }
.perm-legend { display:flex; flex-wrap:wrap; gap:6px 14px; font-size:11px; color:var(--text-light); margin:0 0 8px; align-items:center; }
.perm-builtin-tip { font-size:12px; color:#c47a06; background:#fff8ec; border:1px solid #ffe3ad; border-radius:8px; padding:7px 10px; margin-bottom:8px; line-height:1.6; }

/* v9.5 知识库搜索框placeholder */
#kbSearch::placeholder { color: rgba(255,255,255,.6); }

/* ========== v9.6 科技感UI ========== */
:root {
  --primary: #557A82;
  --primary-dark: #44656C;
  --primary-light: #e8f1ff;
  --cyan: #5E8B85;
  --radius: 8px;
  --shadow: 0 1px 4px rgba(0,0,0,.06);
}

/* 顶部快捷操作条 */
.quick-bar {
  display: flex;
  gap: 4px;
  overflow-x: auto;
  padding: 10px 6px;
  margin-bottom: 12px;
  background: #fff;
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.quick-bar::-webkit-scrollbar { display: none; }
.quick-item {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 6px 12px;
  border-radius: 6px;
  cursor: pointer;
  transition: background .15s;
  min-width: 52px;
}
.quick-item:active { background: var(--primary-light); }
.quick-icon {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  background: linear-gradient(135deg, #557A82, #7BA0A5);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 16px;
  font-weight: 700;
}
.quick-label {
  font-size: 11px;
  color: var(--text-secondary);
  white-space: nowrap;
}

/* 紧凑统计卡片 */
.stat-row {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 8px;
  margin-bottom: 12px;
}
.stat-mini {
  background: #fff;
  border-radius: var(--radius);
  padding: 12px 8px;
  text-align: center;
  box-shadow: var(--shadow);
  border-top: 2px solid var(--c);
  cursor: pointer;
  transition: transform .15s;
}
.stat-mini:active { transform: scale(.97); }
.stat-mini-num {
  font-size: 22px;
  font-weight: 700;
  color: var(--c);
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
}
.stat-mini-label {
  font-size: 11px;
  color: var(--text-secondary);
  margin-top: 2px;
}

/* 卡片科技感微调 */
.card {
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  border: 1px solid rgba(0,0,0,.04);
}

/* 按钮科技感 */
.btn-primary {
  background: linear-gradient(135deg, #3B82F6, #EF4444, #F59E0B);
  box-shadow: 0 2px 6px rgba(85,122,130,.25);
}

/* 侧边栏科技感 */
.sidebar {
  background: #fff;
  border-right: 1px solid var(--border);
}
.nav-item.active {
  background: linear-gradient(90deg, var(--primary-light), transparent);
  border-left-color: var(--primary);
}

/* 顶部导航栏 */
.topbar {
  background: rgba(255,255,255,.92);
  backdrop-filter: blur(8px);
  border-bottom: 1px solid var(--border);
}

/* 状态标签更精致 */
.status-tag {
  border-radius: 4px;
  font-size: 11px;
  font-weight: 500;
  padding: 2px 8px;
}

/* 输入框聚焦科技感 */
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 2px rgba(85,122,130,.15);
}

/* 筛选标签 */
.filter-tab.active {
  background: var(--primary);
  color: #fff;
  border-radius: 6px;
}

/* 导航图标科技感样式 */
.nav-icon {
  font-size: 16px;
  width: 28px;
  height: 28px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 6px;
  background: transparent;
  transition: all .15s;
  font-weight: 600;
}
.nav-item:hover .nav-icon {
  background: var(--primary-light);
}
.nav-item.active .nav-icon {
  background: var(--primary);
  color: #fff;
}

/* 空状态图标简化 */
.empty-icon {
  font-size: 36px !important;
  opacity: .3;
}

/* 底部tabbar图标 */
.tab-item {
  font-size: 11px;
}
.tab-icon {
  font-size: 18px;
}

/* FAB按钮科技感 */
.fab {
  background: #EF4444;
  box-shadow: 0 2px 8px rgba(239,68,68,.3);
}

/* 卡片点击效果 */
.card-clickable:active {
  transform: scale(.98);
  transition: transform .1s;
}

/* 详情弹窗科技感 */
.detail-panel {
  border-radius: 12px 0 0 12px;
}

/* 标签科技感 */
.sub-tab.active {
  color: #fff;
  font-weight: 600;
}

/* 搜索栏科技感 */
.search-bar {
  background: #f5f7fa;
  border-radius: 8px;
  border: 1px solid transparent;
  transition: all .2s;
}
.search-bar:focus-within {
  background: #fff;
  border-color: var(--primary);
  box-shadow: 0 0 0 2px rgba(85,122,130,.15);
}

/* Logo科技感 */
.logo-icon-sm {
  width: 32px;
  height: 32px;
  background: linear-gradient(135deg, #557A82, #7BA0A5);
  color: #fff;
  border-radius: 8px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
}
.login-page .logo-icon {
  background: linear-gradient(135deg, rgba(255,255,255,.3), rgba(255,255,255,.15));
  border: 1px solid rgba(255,255,255,.3);
  font-size: 32px;
}

/* ========== v9.7 莫兰迪清新主题 - 图标与细节优化 ========== */
/* SVG图标统一对齐 */
.nav-icon svg, .tab-icon svg, .quick-icon svg, .empty-icon svg,
.s-icon svg, .logo-icon svg, .logo-icon-sm svg, .avatar-sm svg,
.list-item svg, .btn svg, .btn-outline svg, .btn-primary svg,
.btn-sm svg, .stat-mini svg, .fab svg { vertical-align: middle; }

/* 空状态图标居中 */
.empty-state { text-align: center; padding: 40px 20px; color: var(--text-light); }
.empty-state .empty-icon { display: flex; align-items: center; justify-content: center; margin: 0 auto 12px; }
.empty-state .empty-icon svg { opacity: .35; }

/* 搜索图标 */
.search-bar .s-icon { display: inline-flex; align-items: center; }

/* 个人中心列表项图标颜色 */
.list-item span svg { color: var(--text-secondary); }
.list-item span[style*="danger"] svg { color: var(--danger) !important; }

/* 头像 */
.avatar-sm { color: var(--primary); overflow: hidden; }

/* 按钮内图标间距 */
.btn svg, .btn-outline svg, .btn-primary svg, .btn-sm svg { margin-right: 4px; }

/* 顶部栏通知按钮 */
.topbar-actions button { color: var(--text-secondary); transition: color .15s; }
.topbar-actions button:hover { color: var(--primary); }

/* 莫兰迪色系微调 */
.search-bar { background: #F0EDE8; }
.search-bar:focus-within { background: #fff; }

/* 卡片圆角和阴影更柔和 */
.card { border-radius: 12px; box-shadow: 0 1px 4px rgba(120,110,100,.05); }

/* 按钮圆角统一 */
.btn, .btn-primary, .btn-outline { border-radius: 8px; font-weight: 500; transition: all .15s; }
.btn-primary { background: var(--primary); border-color: var(--primary); }
.btn-primary:hover { background: var(--primary-dark); border-color: var(--primary-dark); }
.btn-outline { color: var(--primary); border-color: var(--border); }
.btn-outline:hover { border-color: var(--primary); background: var(--primary-light); color: var(--primary-dark); }

/* 输入框聚焦 */
input:focus, select:focus, textarea:focus { border-color: var(--primary) !important; box-shadow: 0 0 0 2px rgba(85,122,130,.12) !important; }

/* 状态标签莫兰迪色 */
.status-pending { background:#F0EDE8; color:#8A8580; }
.status-assigned { background:#e6f4ff; color:#1677ff; }
.status-progress { background:#E8EEF0; color:#44656C; }
.status-check { background:#EBE8EF; color:#6A5E7A; }
.status-done { background:#E8EFE8; color:#5A7A5A; }
.status-danger, .status-urgent { background:#F0E5E5; color:#8A5555; }

/* 标签页激活态 */
.filter-tab.active, .sub-tab.active { color: #fff; }

/* 登录页输入框 */
.login-form input { background: rgba(255,255,255,.9); border: 1px solid rgba(255,255,255,.5); }
.login-form input:focus { border-color: #fff; box-shadow: 0 0 0 2px rgba(255,255,255,.3); }

/* 快捷操作图标hover */
.quick-item:hover .quick-icon { transform: scale(1.08); transition: transform .15s; }

/* 统计卡片 */
.stat-mini { border-radius: 10px; }

/* 弹窗头部 */
.modal-header { border-bottom: 1px solid var(--border); }
.modal-footer { border-top: 1px solid var(--border); }

/* 徽章 */
.badge { background: var(--danger); }

/* 滚动条美化 */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-light); }

/* ========== 渐变页面头部 ========== */
.page-header-gradient {
  background: linear-gradient(135deg, #667eea, #764ba2);
  border-radius: 12px;
  padding: 18px 20px;
  color: #fff;
  margin-bottom: 14px;
}
.phg-row { display:flex; justify-content:space-between; align-items:center; gap:10px; flex-wrap:wrap; }
.phg-title { font-size:18px; font-weight:600; margin:0; }
.phg-subtitle { font-size:12px; opacity:.8; margin:2px 0 0; }
.phg-actions { display:flex; gap:6px; flex-shrink:0; }
.phg-actions .btn-outline {
  background: rgba(255,255,255,.2);
  color: #fff;
  border-color: rgba(255,255,255,.3);
}
.phg-actions .btn-outline:hover {
  background: rgba(255,255,255,.3);
  color: #fff;
}
.phg-actions .btn-primary {
  background: rgba(255,255,255,.25);
  border-color: rgba(255,255,255,.4);
  color: #fff;
}
.phg-actions .btn-primary:hover {
  background: rgba(255,255,255,.35);
}

/* ========== 手机端全局收敛（仅 <=640px 生效，电脑端不受影响） ========== */
@media (max-width: 640px) {
  /* 纯标题头：手机隐藏省空间；带操作按钮的头：去渐变/隐标题文字，只保留按钮行，避免功能按钮被一并隐藏 */
  .page-header-gradient.phg-plain { display: none !important; }
  .page-header-gradient:not(.phg-plain) { background:none !important; padding:0 !important; margin:0 0 10px !important; border-radius:0 !important; color:inherit !important; }
  .page-header-gradient:not(.phg-plain) .phg-title,
  .page-header-gradient:not(.phg-plain) .phg-subtitle { display:none !important; }
  .page-header-gradient:not(.phg-plain) .phg-row { display:block !important; }
  .page-header-gradient:not(.phg-plain) .phg-actions { display:flex !important; flex-wrap:wrap; gap:6px; }
  .page-header-gradient:not(.phg-plain) .phg-actions .btn-outline { background:#fff !important; color:var(--primary) !important; border:1px solid var(--border) !important; }
  /* 兜底：主内容不出现整页横向滚动（数据表格仍可在自身 .table-wrap 内横滑） */
  html, body { overflow-x: hidden; }
  .page-content, .main-content, #pageContent { max-width: 100%; }
  img, video, canvas { max-width: 100%; }
  /* 内联写死 4/5/6 列的统计/概览/表单网格，手机统一降 2 列（照片3列、日历7列不在此列） */
  [style*="grid-template-columns:repeat(4"], [style*="grid-template-columns: repeat(4"],
  [style*="grid-template-columns:repeat(5"], [style*="grid-template-columns: repeat(5"],
  [style*="grid-template-columns:repeat(6"], [style*="grid-template-columns: repeat(6"] {
    grid-template-columns: repeat(2, minmax(0,1fr)) !important;
  }
  .stat-grid { grid-template-columns: repeat(2, minmax(0,1fr)) !important; }
  /* 网格/弹性子项允许收缩，不被内容撑破 */
  [style*="display:grid"] > *, [style*="display: grid"] > * { min-width: 0; }
  .form-group[style] { min-width: 0 !important; }
  /* 长文本/长链接/数字在容器内正常换行，不顶破布局 */
  .card, .detail-section, .modal-content, .list-item { word-break: break-word; }
  /* 卡片内输入、下拉、文本域不超出宽度 */
  .card input, .card select, .card textarea { max-width: 100%; }
}

/* ========== 工单参数网格（响应式） ========== */
.work-params-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px 12px;
}
.work-params-grid input {
  width: 100%;
  min-width: 0;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: #fafafa;
}
.work-params-grid input:focus {
  border-color: var(--primary);
  background: #fff;
  outline: none;
}
@media (max-width: 600px) {
  .work-params-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 380px) {
  .work-params-grid { grid-template-columns: 1fr; }
}

/* 工作台快捷操作响应式 */
@media (max-width: 480px) {
  .quick-actions .quick-label { display: none !important; }
}

/* 开关组件 */
.switch { position:relative; display:inline-block; width:44px; height:24px; flex-shrink:0; }
.switch input { opacity:0; width:0; height:0; }
.switch .slider { position:absolute; cursor:pointer; inset:0; background:#ccc; border-radius:24px; transition:.3s; }
.switch .slider::before { content:''; position:absolute; height:18px; width:18px; left:3px; bottom:3px; background:#fff; border-radius:50%; transition:.3s; box-shadow:0 1px 3px rgba(0,0,0,.2); }
.switch input:checked + .slider { background:var(--primary); }
.switch input:checked + .slider::before { transform:translateX(20px); }

/* ========== 移动端精细化优化（2026-08-31 v2） ========== */
@media (max-width: 768px) {
  /* 弹窗：合理宽度，不占满全屏 */
  .modal-content { width: 92% !important; max-width: 92% !important; max-height: 88vh; overflow-y: auto; padding: 18px !important; }
  .modal-content h2 { font-size: 17px !important; margin-bottom: 14px !important; }
  /* 表单：保持原有多列布局，只调字体和内边距 */
  .form-group { margin-bottom: 14px !important; }
  .form-group label { font-size: 13px !important; margin-bottom: 5px !important; }
  .form-group input, .form-group select, .form-group textarea { font-size: 14px !important; padding: 9px 10px !important; }
  /* 按钮：适中大小 */
  .btn, .btn-primary, .btn-outline, .btn-success, .btn-danger, .btn-warning { font-size: 14px !important; padding: 9px 14px !important; min-height: 38px; }
  .btn-sm { font-size: 12px !important; padding: 5px 10px !important; min-height: 30px; }
  /* 列表项：保持单行，不强制换行 */
  .list-item { padding: 11px 0 !important; font-size: 14px !important; }
  .list-item .text-sm { font-size: 12px !important; }
  /* 卡片 */
  .card { padding: 14px !important; margin-bottom: 10px !important; }
  .card h3 { font-size: 15px !important; }
  /* 统计卡片：保持4列一行 */
  .stats-grid { grid-template-columns: repeat(2, 1fr) !important; gap: 8px !important; }
  .stat-card { padding: 10px !important; }
  .stat-card .num { font-size: 17px !important; }
  .stat-card .label { font-size: 11px !important; }
  .stat-row { grid-template-columns: repeat(2, 1fr) !important; gap: 6px !important; }
  .stat-mini { padding: 9px 4px !important; }
  .stat-mini-num { font-size: 15px !important; }
  .stat-mini-label { font-size: 10px !important; }
  /* 表格：横向滚动 */
  .data-table-wrapper { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .data-table { min-width: 600px; font-size: 12px !important; }
  .data-table th, .data-table td { padding: 8px !important; white-space: nowrap; }
  /* 详情：保持左右布局 */
  .detail-section { padding: 14px !important; margin-bottom: 10px !important; }
  .detail-section h3 { font-size: 15px !important; margin-bottom: 8px !important; }
  .detail-row { padding: 4px 0 !important; }
  .detail-row .label { font-size: 13px !important; }
  .detail-row .value { font-size: 14px !important; }
  /* 顶部栏 */
  .topbar { padding: 8px 12px !important; }
  /* 快捷栏：横向滚动 */
  .quick-bar { gap: 6px !important; overflow-x: auto; -webkit-overflow-scrolling: touch; padding-bottom: 4px; }
  .quick-item { min-width: 58px !important; padding: 8px 4px !important; }
  .quick-icon { width: 32px !important; height: 32px !important; font-size: 16px !important; }
  .quick-label { font-size: 11px !important; }
  /* 标签页：横向滚动 */
  .sub-tabs, .filter-tabs { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-wrap: nowrap !important; }
  .sub-tab, .filter-tab { white-space: nowrap; font-size: 13px !important; padding: 8px 14px !important; }
  /* 里程碑 */
  .milestone-item { gap: 10px !important; padding: 10px 0 !important; }
  /* 搜索栏 */
  .search-bar { gap: 8px !important; }
  /* 空状态 */
  .empty-state { padding: 30px 20px !important; }
  .empty-state p { font-size: 14px !important; }
  /* 进度条 */
  .progress-bar { height: 6px !important; }
  /* 状态标签 */
  .status-tag { font-size: 11px !important; padding: 2px 8px !important; }
  /* 底部导航 */
  .mobile-tab { height: calc(var(--tabbar-h) + env(safe-area-inset-bottom)) !important; }
  .mobile-tab .nav-item { padding: 4px 2px !important; }
  .mobile-tab .nav-icon { font-size: 18px !important; }
  .mobile-tab .nav-label { font-size: 10px !important; }
  /* 浮动按钮 */
  .fab { width: 50px !important; height: 50px !important; font-size: 22px !important; bottom: calc(var(--tabbar-h) + 18px) !important; }
  /* 照片网格 */
  .photo-grid { grid-template-columns: repeat(3, 1fr) !important; gap: 6px !important; }
  /* 时间线 */
  .timeline-item { padding: 10px 0 !important; }
  .timeline-item .tl-title { font-size: 13px !important; }
  .timeline-item .tl-desc { font-size: 12px !important; }
}
@media (max-width: 480px) {
  /* 小屏：统计卡片仍保持4列，缩小字体 */
  .stats-grid { grid-template-columns: repeat(2, 1fr) !important; gap: 6px !important; }
  .stat-row { grid-template-columns: repeat(2, 1fr) !important; gap: 4px !important; }
  .stat-mini-num { font-size: 14px !important; }
  .stat-mini-label { font-size: 9px !important; }
  .stat-card .num { font-size: 15px !important; }
  .stat-card .label { font-size: 10px !important; }
  .data-table { min-width: 500px; }
  .modal-content { width: 95% !important; max-width: 95% !important; }
}

/* ============================================================
   监控汇聚页面样式
   ============================================================ */
.monitor-page {
  display: flex;
  flex-direction: column;
  min-height: calc(100vh - 120px);
}
.monitor-toolbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 15px;
  background: #fff;
  border-bottom: 1px solid #e8e8e8;
  flex-shrink: 0;
}
.monitor-toolbar-right {
  display: flex;
  gap: 8px;
  align-items: center;
}
.layout-btn.active {
  background-color: #337ab7 !important;
  color: #fff !important;
  border-color: #2e6da4 !important;
}
.monitor-main {
  display: flex;
  flex: 1;
  overflow: hidden;
}
.monitor-sidebar {
  width: 280px;
  background: #fff;
  border-right: 1px solid #e8e8e8;
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
}
.monitor-sidebar-header {
  padding: 10px;
  border-bottom: 1px solid #e8e8e8;
}
.monitor-camera-tree {
  flex: 1;
  overflow-y: auto;
  padding: 5px;
}
.monitor-group-section {
  margin-bottom: 10px;
}
.monitor-group-title {
  font-weight: bold;
  font-size: 13px;
  color: #666;
  padding: 8px 5px;
  border-bottom: 1px solid #f0f0f0;
}
.monitor-device-item {
  margin-bottom: 2px;
}
.monitor-device-header {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 6px 8px;
  cursor: pointer;
  border-radius: 4px;
  font-size: 13px;
}
.monitor-device-header:hover {
  background: #f5f5f5;
}
.monitor-device-header .badge {
  margin-left: auto;
}
.monitor-camera-list {
  padding-left: 20px;
}
.monitor-camera-item {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 5px 8px;
  cursor: pointer;
  border-radius: 4px;
  font-size: 12px;
  color: #555;
}
.monitor-camera-item:hover {
  background: #e8f4fd;
  color: #337ab7;
}
.monitor-content {
  flex: 1;
  display: flex;
  flex-direction: column;
  background: #1a1a1a;
  position: relative;
  overflow: hidden;
}
/* v2.6.1 上下布局：监控画面在上方，摄像头列表在下方 */
.monitor-content-vertical {
  display: flex;
  flex-direction: column;
  background: #1a1a1a;
  position: relative;
  flex-shrink: 0;
}
.monitor-single-grid {
  width: 100%;
  height: 56vh;
  min-height: 320px;
}
.monitor-camera-section {
  background: #fff;
  border-top: 1px solid #e8e8e8;
  display: flex;
  flex-direction: column;
  max-height: 38vh;
}
.monitor-camera-section .monitor-camera-tree {
  max-height: 34vh;
  overflow-y: auto;
}
.monitor-video-grid {
  flex: 1;
  display: grid;
  gap: 2px;
  padding: 2px;
}
.monitor-video-window {
  background: #000;
  border: 2px solid transparent;
  display: flex;
  flex-direction: column;
  position: relative;
  overflow: hidden;
  cursor: pointer;
}
.monitor-video-window.selected {
  border-color: #337ab7;
}
.monitor-window-header {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  background: rgba(0,0,0,0.6);
  color: #fff;
  padding: 4px 8px;
  font-size: 12px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  z-index: 10;
}
.monitor-window-actions {
  display: flex;
  gap: 4px;
}
.monitor-window-actions .btn {
  padding: 1px 6px;
  font-size: 11px;
}
.monitor-window-body {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}
.monitor-window-placeholder {
  text-align: center;
  color: #666;
}
.monitor-window-placeholder p {
  margin-top: 10px;
  font-size: 12px;
}
.monitor-window-error {
  text-align: center;
  color: #e74c3c;
}
.monitor-window-error p {
  margin-top: 10px;
}
/* 云台控制面板 */
.monitor-ptz-panel {
  position: absolute;
  right: 10px;
  bottom: 10px;
  background: rgba(255,255,255,0.95);
  border-radius: 8px;
  padding: 10px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.3);
  z-index: 20;
  width: 180px;
}
.ptz-header {
  font-size: 12px;
  font-weight: bold;
  margin-bottom: 8px;
  color: #333;
  text-align: center;
}
.ptz-controls {
  display: flex;
  gap: 10px;
  align-items: center;
  justify-content: center;
}
.ptz-grid {
  display: grid;
  grid-template-columns: repeat(3, 36px);
  grid-template-rows: repeat(3, 36px);
  gap: 2px;
}
.ptz-btn {
  background: #f0f0f0;
  border: 1px solid #ddd;
  border-radius: 4px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  color: #555;
  transition: all 0.1s;
}
.ptz-btn:hover {
  background: #337ab7;
  color: #fff;
  border-color: #2e6da4;
}
.ptz-btn:active {
  background: #286090;
}
.ptz-center {
  background: #e0e0e0;
}
.ptz-zoom {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.ptz-zoom .ptz-btn {
  width: 50px;
  height: 40px;
  font-size: 11px;
  flex-direction: column;
}
/* 加载遮罩 */
.monitor-loading {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0,0,0,0.7);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  z-index: 100;
  color: #fff;
}
.loading-spinner {
  width: 40px;
  height: 40px;
  border: 4px solid #f3f3f3;
  border-top: 4px solid #337ab7;
  border-radius: 50%;
  animation: spin 1s linear infinite;
  margin-bottom: 15px;
}
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
.loading-text {
  font-size: 14px;
}
/* 监控页面响应式 */
@media (max-width: 768px) {
  .monitor-sidebar {
    width: 200px;
  }
  .monitor-toolbar {
    flex-wrap: wrap;
    gap: 8px;
  }
  .monitor-toolbar-right {
    flex-wrap: wrap;
  }
  .monitor-single-grid {
    height: 42vh;
    min-height: 240px;
  }
  .monitor-camera-section {
    max-height: none;
  }
  .monitor-camera-section .monitor-camera-tree {
    max-height: 50vh;
  }
  .monitor-ptz-panel {
    width: 150px;
  }
  .ptz-grid {
    grid-template-columns: repeat(3, 30px);
    grid-template-rows: repeat(3, 30px);
  }
}

.perm-disabled{opacity:.45!important;cursor:not-allowed!important;pointer-events:none!important;filter:grayscale(.4);}

/* v2.15.66 知识库教程内容排版 */
.tutorial-content img{max-width:100%;height:auto;border-radius:8px;margin:6px 0;display:block}
.tutorial-content table{border-collapse:collapse;width:100%;margin:10px 0;display:block;overflow-x:auto}
.tutorial-content th,.tutorial-content td{border:1px solid #c8cdd3;padding:6px 10px;font-size:13px}
.tutorial-content th{background:#f5f7fa}
.tutorial-content h1,.tutorial-content h2,.tutorial-content h3{margin:14px 0 8px}
.tutorial-content blockquote{border-left:3px solid #12a3c9;margin:8px 0;padding:4px 12px;background:#f6fafb;color:#555}
.tutorial-content pre{background:#f5f6f8;padding:10px;border-radius:8px;overflow:auto}
.tutorial-content a{color:#0e6fb5}
#kbTutorial table{border-collapse:collapse}
#kbTutorial th,#kbTutorial td{border:1px solid #999;padding:6px;min-width:56px}
/* 通用输入联想候选浮层（替代手机端原生 datalist 深色大框） */
.ac-panel{position:fixed;z-index:400;background:#fff;border:1px solid var(--border,#e5e7eb);border-radius:10px;box-shadow:0 8px 24px rgba(15,23,42,.16);max-height:300px;overflow:hidden;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;margin-top:4px;display:none;flex-direction:column;padding:0}
.ac-panel.show{display:flex}
#_acSearchBtn{position:fixed;z-index:401;display:none;align-items:center;justify-content:center;color:#64748b;background:#f1f5f9;border:1px solid var(--border,#e5e7eb);border-radius:8px;cursor:pointer;box-sizing:border-box}
#_acSearchBtn:active{background:#e2e8f0;color:var(--primary,#2563eb)}
.ac-pick-ro{padding-right:34px !important}
.ac-list{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.ac-empty{padding:16px;text-align:center;color:#94a3b8;font-size:13px}
.ac-clear .ac-name{color:#dc2626}
.ac-item{padding:8px 12px;cursor:pointer;display:flex;flex-direction:column;gap:2px;border-bottom:1px solid #f1f5f9}
.ac-item:last-child{border-bottom:none}
.ac-item.on,.ac-item:active{background:#eff6ff}
.ac-line1{display:flex;align-items:center;gap:8px;font-size:14px;color:#1f2937;min-width:0}
.ac-tag{font-size:10px;line-height:1.5;padding:0 6px;border-radius:4px;flex-shrink:0;font-weight:600}
.ac-tag.prod{background:#e0f2fe;color:#0369a1}
.ac-tag.part{background:#fef3c7;color:#b45309}
.ac-tag.sup{background:#ede9fe;color:#6d28d9}
.ac-tag.mat{background:#dcfce7;color:#15803d}
.ac-tag.labor{background:#ffe4e6;color:#be123c}
.ac-tag.machine{background:#cffafe;color:#0e7490}
.ac-tag.price{background:#fef9c3;color:#a16207}
.ac-tag.misc{background:#f1f5f9;color:#475569}
.ac-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.ac-line2{font-size:11px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ac-empty{padding:10px 12px;font-size:12px;color:#94a3b8}
datalist{display:none!important}
/* v2.15.110 弹窗细滚动条，避免纵向滚动条占位导致内容左右边距不等 */
.modal-body{scrollbar-width:thin;scrollbar-color:#cbd5e1 transparent;}
.modal-body::-webkit-scrollbar{width:4px;height:4px}
.modal-body::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}
.modal-body::-webkit-scrollbar-track{background:transparent}
/* v2.15.112 统一原生 select 收起态外观：去系统箭头、统一浅色下拉箭头（展开项由系统渲染，高频选择已改为可搜索白底浮层） */
.form-group select, select {
  -webkit-appearance:none; -moz-appearance:none; appearance:none;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 10px center; background-size:12px;
  padding-right:32px; cursor:pointer;
}
.form-group select[multiple], select[multiple] { -webkit-appearance:none; appearance:none; background-image:none; padding-right:10px; cursor:default; }
[data-theme="dark"] .form-group select, [data-theme="dark"] select { background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E"); }

/* ============================================================
   Mobile Shell（移动端外壳）样式 —— 仅手机端生效，电脑端无变化
   ============================================================ */
/* 选择器底部抽屉（.ac-sheet 由 DLAC 在触屏纯选择时挂载，桌面不会出现该类） */
.ac-panel.ac-sheet{
  left:0 !important; right:0 !important; top:auto !important; bottom:0 !important;
  width:auto !important; max-width:100% !important; max-height:64vh !important;
  border-radius:16px 16px 0 0 !important; border-left:none !important; border-right:none !important; border-bottom:none !important;
  padding-bottom:env(safe-area-inset-bottom,0); animation:acSheetUp .18s ease;
}
@keyframes acSheetUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
.ac-sheet-bar{position:sticky;top:0;z-index:1;display:flex;justify-content:center;align-items:center;
  padding:16px 14px 10px;background:#f8fafc;border-bottom:1px solid #eef2f7;color:var(--primary,#2563eb);
  font-size:13px;cursor:pointer;user-select:none;}
.ac-sheet-bar::before{content:'';position:absolute;top:5px;left:50%;transform:translateX(-50%);width:32px;height:4px;border-radius:2px;background:#cbd5e1;}
.ac-panel.ac-sheet .ac-item{min-height:46px;justify-content:center;}
@media (max-width:768px){
  /* 按钮文字不被折行切碎 */
  .btn,.btn-primary,.btn-outline,.btn-success,.btn-danger,.btn-warning{white-space:nowrap;}
  /* 纯操作按钮排：外露按钮自然排列、允许换行兜底（不再横向只露一小截） */
  .ms-toolrow{flex-wrap:wrap !important;overflow:visible !important;align-items:center;}
  .ms-toolrow>.btn,.ms-toolrow>button{flex-shrink:0;}
  /* 混排工具行：状态页签独占整行，操作按钮落到下一行横向排列 */
  .ms-stack{flex-direction:row !important;flex-wrap:wrap !important;align-items:center !important;}
  .ms-stack>.filter-tabs,.ms-stack>.sub-tabs{flex:0 0 100% !important;width:100% !important;max-width:100% !important;margin-left:0 !important;margin-bottom:0 !important;flex-wrap:nowrap !important;overflow-x:auto !important;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .ms-stack>.filter-tabs::-webkit-scrollbar,.ms-stack>.sub-tabs::-webkit-scrollbar{display:none;}
  .ms-stack>.filter-tabs>*,.ms-stack>.sub-tabs>*{flex-shrink:0;}
  .ms-stack>div{margin-left:0 !important;flex:0 0 auto;}
  .ms-stack>.btn,.ms-stack>button{margin-left:0 !important;flex:0 0 auto;}
  /* 筛选芯片条：整行横滑、不收缩、不折行 */
  .ms-chiprow{flex-wrap:nowrap !important;overflow-x:auto !important;-webkit-overflow-scrolling:touch;scrollbar-width:none;align-items:center;}
  .ms-chiprow::-webkit-scrollbar{display:none;}
  .ms-chiprow>*{flex-shrink:0 !important;white-space:nowrap;}
  /* 更多：底部上弹抽屉（满宽、大命中），不用小浮层 */
  .ms-more-wrap{position:static;flex-shrink:0;}
  .ms-more-btn{flex-shrink:0;}
  .ms-more-pop.ms-sheet{position:fixed;left:0 !important;right:0 !important;bottom:0 !important;top:auto !important;
    width:auto !important;max-width:100% !important;min-width:0 !important;z-index:600;display:none;flex-direction:column;gap:6px;
    background:#fff;border-radius:16px 16px 0 0;border:none;box-shadow:0 -8px 30px rgba(15,23,42,.22);
    padding:10px 14px calc(14px + env(safe-area-inset-bottom,0));max-height:62vh;overflow-y:auto;animation:acSheetUp .18s ease;}
  .ms-more-pop.ms-sheet::before{content:'更多操作';display:block;text-align:center;font-size:12px;color:#94a3b8;padding:4px 0 8px;}
  .ms-more-pop.ms-sheet.show{display:flex;}
  .ms-more-pop.ms-sheet .btn,.ms-more-pop.ms-sheet button{width:100%;text-align:center;justify-content:center;margin:0 !important;min-height:46px;}
  /* 详情 名称:值 上下堆叠（金额型 split-row 保持左右） */
  .detail-row:not(.split-row){flex-direction:column !important;align-items:flex-start !important;gap:2px !important;}
  .detail-row:not(.split-row) .label{width:auto !important;margin-right:0 !important;}
  /* FAB 避开底部导航与安全区 */
  .fab{bottom:calc(var(--tabbar-h) + 14px + env(safe-area-inset-bottom,0)) !important;z-index:48;}
}


/* ============================================================
   v2.15.129 FAB 双动作（新建/补发）+ 可拖动；工单筛选下拉（电脑/手机通用）
   ============================================================ */
/* 圆+ 展开栈：主按钮 + 两个子动作 */
.fab-stack{position:fixed;right:16px;bottom:80px;z-index:50;display:flex;flex-direction:column;align-items:flex-end;gap:12px;touch-action:none;}
.fab-stack .fab-main{position:static !important;right:auto !important;bottom:auto !important;margin:0 !important;}
.fab-stack .fab-items{display:flex;flex-direction:column;align-items:flex-end;gap:10px;}
.fab-item{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border,#e5e7eb);cursor:pointer;
  background:#fff;color:#334155;border-radius:999px;padding:7px 14px;font-size:13px;line-height:1;
  box-shadow:0 2px 10px rgba(15,23,42,.14);white-space:nowrap;
  opacity:0;transform:translateY(8px) scale(.92);pointer-events:none;
  transition:opacity .16s ease,transform .16s ease,background .12s ease;}
.fab-item:active{transform:scale(.95);}
.fab-stack.open .fab-items .fab-item,.fab-stack:hover .fab-items .fab-item{opacity:1;transform:translateY(0) scale(1);pointer-events:auto;}
.fab-stack.open .fab-items .fab-item:nth-child(2),.fab-stack:hover .fab-items .fab-item:nth-child(2){transition-delay:.05s;}
.fab-dragging{transition:none !important;opacity:.94;box-shadow:0 8px 22px rgba(239,68,68,.45) !important;}
.fab-stack.fab-dragging .fab-items{opacity:0 !important;pointer-events:none !important;}
/* “筛选▾”下拉（我的/我负责/超时/本周新增） */
.wo-chip-menu-wrap{position:relative;display:inline-flex;flex-shrink:0;}
.wo-chip-menu{display:none;position:absolute;top:calc(100% + 6px);right:0;min-width:136px;z-index:300;
  background:#fff;border:1px solid var(--border,#e5e7eb);border-radius:10px;box-shadow:0 10px 28px rgba(15,23,42,.18);
  padding:6px;flex-direction:column;gap:2px;}
.wo-chip-menu.show{display:flex;}
.wo-chip-menu button{text-align:left;border:none;background:transparent;width:100%;padding:9px 12px;border-radius:8px;
  font-size:13px;color:var(--text,#1f2937);cursor:pointer;white-space:nowrap;}
.wo-chip-menu button:hover{background:#f1f5f9;}
.wo-chip-menu button.on{background:var(--primary,#557A82);color:#fff;}
#woChipCnt{font-weight:700;}
@media (max-width:768px){
  .fab-stack{right:14px;bottom:calc(var(--tabbar-h) + 14px + env(safe-area-inset-bottom,0));z-index:48;}
  .fab-stack .fab-main{width:50px !important;height:50px !important;font-size:22px !important;}
  .fab-item{padding:10px 16px;font-size:14px;}
  .wo-chip-menu{min-width:150px;box-shadow:0 10px 30px rgba(15,23,42,.22);}
  /* 手机端隐藏工具行“多选”按钮（长按工单行进入多选）；电脑端不受影响 */
  .ms-hide{display:none !important;}
}


/* ============================================================
   v2.15.130 手机端外壳优化：页签一行均分 / 隐藏内部滚动条 /
   搜索收成图标 / FAB圆形弹出动画 / 触摸加固 / standalone全屏
   ============================================================ */
/* 工单卡：禁止浏览器长按选中与系统菜单，纵向滚动仍可用（长按多选由JS接管） */
[data-woid]{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:pan-y;}
/* FAB 实际触摸目标也要禁用浏览器默认触摸手势，否则真机 pointermove 被滚动抢走（拖不动） */
.fab,.fab-main,.fab-stack{touch-action:none;-webkit-tap-highlight-color:transparent;}
/* 主圆展开时变小并旋转为关闭态 */
.fab-stack .fab-main{transition:transform .22s cubic-bezier(.34,1.56,.64,1),box-shadow .2s;}
.fab-stack.open .fab-main{transform:rotate(135deg) scale(.9);}
/* 子动作：圆形单字按钮，从主圆位置弹性弹出 */
.fab-item{border-radius:50% !important;width:44px;height:44px;min-width:44px;padding:0 !important;
  display:inline-flex;align-items:center;justify-content:center;gap:0 !important;
  background:var(--primary,#557A82);color:#fff !important;border:none !important;font-weight:700;
  opacity:0;transform:translateY(14px) scale(.3);transform-origin:center bottom;
  transition:opacity .18s ease,transform .24s cubic-bezier(.34,1.56,.64,1),background .12s ease;}
.fab-item-char{font-size:18px;line-height:1;}
.fab-stack.open .fab-items .fab-item,.fab-stack:hover .fab-items .fab-item{opacity:1;transform:translateY(0) scale(1);pointer-events:auto;}
.fab-stack.open .fab-items .fab-item:nth-child(1),.fab-stack:hover .fab-items .fab-item:nth-child(1){transition-delay:.07s;}
.fab-stack.open .fab-items .fab-item:nth-child(2),.fab-stack:hover .fab-items .fab-item:nth-child(2){transition-delay:.02s;}
/* PWA standalone 全屏：吃满安全区 */
@media (display-mode:standalone){
  .main-frame{height:100dvh;}
  body{padding-top:env(safe-area-inset-top,0);}
}
@media (max-width:768px){
  /* 1) 工具行状态页签一行均分，不再横向滑动 */
  .ms-stack>.filter-tabs,.ms-stack>.sub-tabs{overflow:visible !important;flex-wrap:nowrap !important;gap:4px !important;padding-bottom:0 !important;scrollbar-width:none !important;}
  .ms-stack>.filter-tabs::-webkit-scrollbar,.ms-stack>.sub-tabs::-webkit-scrollbar{display:none !important;}
  .ms-stack>.filter-tabs>*,.ms-stack>.sub-tabs>*{flex:1 1 0 !important;min-width:0 !important;flex-shrink:1 !important;
    padding:6px 2px !important;font-size:12px !important;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  /* 2) 手机端隐藏所有内部滚动条（仍可滑动），不再挤占页面宽度 */
  *{scrollbar-width:none !important;-ms-overflow-style:none;}
  *::-webkit-scrollbar{width:0 !important;height:0 !important;display:none !important;}
  /* 3) 搜索栏默认收成放大镜圆钮，点击/focus 才展开 */
  .search-bar{width:42px;flex:0 0 42px;min-width:42px;align-self:flex-end;margin-left:auto;margin-bottom:10px;
    padding:0 !important;justify-content:center;overflow:hidden;transition:width .22s ease;cursor:pointer;}
  .search-bar input{width:0 !important;flex:0 0 0 !important;min-width:0 !important;opacity:0;transition:opacity .15s;}
  .search-bar .s-icon{flex:0 0 auto;}
  .search-bar:focus-within{width:100%;flex:1 1 100% !important;padding:0 14px !important;justify-content:flex-start;cursor:text;}
  .search-bar:focus-within input{width:auto !important;flex:1 1 auto !important;opacity:1;}
  /* 4) FAB 子圆手机尺寸 */
  .fab-item{width:48px;height:48px;min-width:48px;}
  .fab-item-char{font-size:19px;}
}


/* ============================================================
   v2.15.131 搜索并入工具按钮行：默认行尾一枚放大镜圆钮，不再独占一整行；
   点圆钮在该行下方展开成整行搜索框，清空失焦后收回
   ============================================================ */
@media (max-width:768px){
  .ms-stack>.search-bar.ms-search-dock,.ms-toolrow>.search-bar.ms-search-dock{
    flex:0 0 36px !important;width:36px;min-width:36px;height:34px;margin:0 0 0 auto !important;padding:0 !important;
    align-self:center;justify-content:center;overflow:hidden;border-radius:50%;background:var(--card,#fff);
    border:1px solid var(--border,#e5e7eb);box-shadow:0 1px 4px rgba(15,23,42,.08);cursor:pointer;}
  .ms-stack>.search-bar.ms-search-dock .s-icon,.ms-toolrow>.search-bar.ms-search-dock .s-icon{flex:0 0 auto;}
  .ms-search-dock input{width:0 !important;flex:0 0 0 !important;min-width:0 !important;max-width:0 !important;
    opacity:0;padding:0 !important;border:none !important;background:transparent;}
  .ms-stack>.search-bar.ms-search-dock.ms-sopen,.ms-toolrow>.search-bar.ms-search-dock.ms-sopen{
    flex:1 1 100% !important;width:100% !important;min-width:0 !important;height:auto;border-radius:10px;order:20;
    margin:4px 0 0 !important;padding:0 12px !important;justify-content:flex-start;cursor:text;overflow:visible;}
  .ms-stack>.ms-search-dock.ms-sopen input,.ms-toolrow>.ms-search-dock.ms-sopen input{flex:1 1 auto !important;
    width:auto !important;max-width:none !important;opacity:1;padding:9px 0 !important;}
}


/* ============================================================
   v2.15.132 ① FAB 改 Siri 风格动态球体（去“+”，平时半透明、激活不透明）
   ② 两个子动作沿主圆周围轨道弹出 ③ 搜索圆钮放大镜绝对居中、第二行垂直对齐
   ============================================================ */
/* 主圆容器：透明底，内部 orb 呈现动态球；默认半透明 */
.fab,.fab-main{position:relative;width:50px;height:50px;padding:0 !important;border:none !important;border-radius:50% !important;
  background:transparent !important;box-shadow:none !important;overflow:visible !important;color:#fff !important;
  opacity:.55;transition:opacity .22s ease,transform .22s ease;}
.fab-stack:hover .fab-main,.fab-stack.open .fab-main,.fab:hover,.fab:active{opacity:1;transform:scale(1.06);}
/* 旋转渐变球 */
.fab-orb{position:absolute;inset:0;border-radius:50%;
  background:conic-gradient(from 0deg,#ff4d5e,#ff8a5c,#ffd166,#ff7b54,#ef476f,#ff4d5e);
  box-shadow:0 4px 14px rgba(239,71,111,.42),inset 0 0 8px rgba(255,255,255,.4);
  animation:orbSpin 4.6s linear infinite;}
.fab-core{position:absolute;inset:26%;border-radius:50%;
  background:radial-gradient(circle at 34% 30%,rgba(255,255,255,.96),rgba(255,255,255,.28) 46%,rgba(120,18,38,.5) 100%);}
.fab-halo{position:absolute;inset:-7px;border-radius:50%;z-index:-1;
  background:radial-gradient(circle,rgba(239,71,111,.38),transparent 70%);animation:orbHalo 2.6s ease-in-out infinite;}
.fab-stack.open .fab-orb,.fab-stack:hover .fab-orb,.fab:hover .fab-orb{animation-duration:1.5s;}
@keyframes orbSpin{to{transform:rotate(360deg)}}
@keyframes orbHalo{0%,100%{opacity:.4;transform:scale(.9)}50%{opacity:.9;transform:scale(1.1)}}
@media(prefers-reduced-motion:reduce){.fab-orb,.fab-halo{animation:none}}
/* 栈容器固定为主圆尺寸；子动作层绝对覆盖主圆中心，不占布局 */
.fab-stack{width:50px !important;height:50px !important;display:block !important;}
.fab-stack .fab-main{position:absolute !important;inset:0 !important;width:50px !important;height:50px !important;margin:0 !important;}
.fab-items{position:absolute !important;inset:0 !important;display:block !important;pointer-events:none;}
/* 子圆：以主圆中心为原点，收起时缩回球心，展开时沿周围轨道弹出 */
.fab-item{position:absolute !important;left:50% !important;top:50% !important;width:46px !important;height:46px !important;min-width:46px !important;
  margin:-23px 0 0 -23px !important;padding:0 !important;border-radius:50% !important;gap:0 !important;
  display:flex !important;align-items:center !important;justify-content:center !important;
  background:#fff;color:#ef476f !important;border:1px solid #ffd9e0 !important;box-shadow:0 4px 14px rgba(15,23,42,.2);
  opacity:0;transform:translate(0,0) scale(.2);pointer-events:none;
  transition:opacity .2s ease,transform .3s cubic-bezier(.34,1.56,.64,1),background .12s ease;}
.fab-item-char{font-size:17px;font-weight:700;line-height:1;}
.fab-stack.open .fab-items .fab-item,.fab-stack:hover .fab-items .fab-item{opacity:1;pointer-events:auto;}
.fab-stack.open .fab-items .fab-item:nth-child(1),.fab-stack:hover .fab-items .fab-item:nth-child(1){transform:translate(2px,-74px) scale(1);transition-delay:.04s;}
.fab-stack.open .fab-items .fab-item:nth-child(2),.fab-stack:hover .fab-items .fab-item:nth-child(2){transform:translate(-64px,-42px) scale(1);transition-delay:.1s;}
@media (max-width:768px){
  .fab,.fab-main,.fab-stack{width:54px !important;height:54px !important;}
  .fab-stack .fab-main{width:54px !important;height:54px !important;}
  .fab-item{width:50px !important;height:50px !important;min-width:50px !important;margin:-25px 0 0 -25px !important;}
  .fab-item-char{font-size:18px;}
  .fab-stack.open .fab-items .fab-item:nth-child(1),.fab-stack:hover .fab-items .fab-item:nth-child(1){transform:translate(2px,-80px) scale(1);}
  .fab-stack.open .fab-items .fab-item:nth-child(2),.fab-stack:hover .fab-items .fab-item:nth-child(2){transform:translate(-70px,-46px) scale(1);}
  /* 搜索圆钮：放大镜在圆正中；工具第二行按钮与圆钮垂直居中对齐 */
  .ms-stack{align-items:center !important;}
  .ms-stack>.btn,.ms-stack>button,.ms-stack>.search-bar{align-self:center;}
  .ms-stack>.search-bar.ms-search-dock,.ms-toolrow>.search-bar.ms-search-dock{display:inline-flex !important;align-items:center !important;justify-content:center !important;}
  .ms-search-dock .s-icon{display:inline-flex !important;align-items:center !important;justify-content:center !important;width:20px !important;height:20px !important;margin:0 !important;line-height:0;}
  .ms-search-dock .s-icon svg{display:block !important;width:17px !important;height:17px !important;margin:0 !important;vertical-align:middle !important;}
}


/* v2.15.132b 修正：FAB 栈固定右下（拖动后由 JS 覆盖 left/top）；搜索圆钮正圆、放大镜真正居中 */
.fab-stack{position:fixed !important;right:16px;bottom:84px;z-index:50;}
@media (max-width:768px){
  .fab-stack{right:14px;bottom:calc(78px + env(safe-area-inset-bottom,0px));}
  .ms-stack>.search-bar.ms-search-dock,.ms-toolrow>.search-bar.ms-search-dock{
    width:34px !important;height:34px !important;min-width:34px !important;flex:0 0 34px !important;gap:0 !important;}
  .ms-stack>.ms-search-dock.ms-sopen,.ms-toolrow>.ms-search-dock.ms-sopen{
    width:100% !important;height:auto !important;flex:1 1 100% !important;gap:8px !important;}
}


/* v2.15.132c 子圆展开方向随主圆左右位置自适应镜像 */
.fab-stack.fab-left.open .fab-items .fab-item:nth-child(2),.fab-stack.fab-left:hover .fab-items .fab-item:nth-child(2){transform:translate(64px,-42px) scale(1);}
@media (max-width:768px){
  .fab-stack.fab-left.open .fab-items .fab-item:nth-child(2),.fab-stack.fab-left:hover .fab-items .fab-item:nth-child(2){transform:translate(70px,-46px) scale(1);}
}


/* ============================================================
   v2.15.133 ① 对象详情三张统计小卡一行、基本信息 label/值同一行
   ② 工程管理状态页签与报表按钮同一行(报表靠右) ③ FAB 改中空呼吸圆环+绕转光点
   ============================================================ */
/* 工程管理：状态页签(左) + 预算预警/延期分析/回款报表(右) 同一行 */
.ep-oneline{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:nowrap;}
.ep-oneline .ep-tabs{flex:1 1 auto;min-width:0;}
.ep-oneline .ep-tabs .filter-tabs{margin-bottom:0;}
.ep-oneline .ep-reports{margin-left:auto;flex:0 0 auto;display:flex;gap:6px;align-items:center;}
@media (max-width:768px){
  .ep-oneline{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}
  .ep-oneline .ep-reports .btn-sm{padding:4px 8px;font-size:12px;white-space:nowrap;}
  /* 对象详情：三个统计小卡一行（覆盖全局两列） */
  .detail-section>.stats-grid{grid-template-columns:repeat(3,1fr) !important;gap:6px !important;margin-bottom:0 !important;}
  .detail-section>.stats-grid .stat-card{padding:8px 4px !important;}
  .detail-section>.stats-grid .stat-card .num{font-size:16px !important;}
  .detail-section>.stats-grid .stat-card .label{font-size:10px !important;margin-top:2px !important;}
  /* 基本信息：label 与值回到同一行（覆盖早期强制竖排） */
  .detail-row:not(.split-row){flex-direction:row !important;align-items:flex-start !important;gap:8px !important;}
  .detail-row:not(.split-row) .label{width:80px !important;min-width:80px;max-width:80px;flex:0 0 auto !important;margin-right:0 !important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  /* 内联多列统计卡：手机降两列，避免 5列/4列挤成一团；桌面仍按内联列数 */
  .m-ovgrid,.m-sumgrid{grid-template-columns:repeat(2,1fr) !important;}
  .m-sumgrid{gap:8px !important;}
}

/* ---------- FAB：中空圆环 + 一个光点绕转 + 呼吸，整体缩小 1/5 ---------- */
.fab,.fab-main{width:40px !important;height:40px !important;padding:0 !important;border:none !important;border-radius:50% !important;
  background:transparent !important;box-shadow:none !important;color:#ef476f !important;overflow:visible !important;
  animation:fabBreathe 3.2s ease-in-out infinite;}
.fab-stack:hover .fab-main,.fab-stack.open .fab-main,.fab:hover,.fab:active{animation:none;opacity:1 !important;transform:scale(1.06);}
.fab-ring{position:absolute;inset:0;border-radius:50%;border:1.5px solid rgba(239,71,111,.85);
  box-shadow:0 0 6px rgba(239,71,111,.28),inset 0 0 6px rgba(255,150,120,.28);}
.fab-trace{position:absolute;inset:0;border-radius:50%;animation:orbSpin 4.2s linear infinite;}
.fab-trace::before{content:'';position:absolute;top:-2px;left:50%;transform:translateX(-50%);
  width:6px;height:6px;border-radius:50%;
  background:radial-gradient(circle,#ffffff 0%,#ffeeb4 55%,rgba(255,209,102,0) 100%);
  box-shadow:0 0 6px 1.5px rgba(255,222,150,.95);}
@keyframes fabBreathe{0%,100%{opacity:.4;transform:scale(.96)}50%{opacity:.72;transform:scale(1.03)}}
.fab-stack{width:40px !important;height:40px !important;}
.fab-stack .fab-main{width:40px !important;height:40px !important;}
/* 子圆：主圆 1/2、无描边、纯白，文字占约 4/5；视觉小但透明热区扩大便于点按 */
.fab-item{width:20px !important;height:20px !important;min-width:20px !important;margin:-10px 0 0 -10px !important;padding:0 !important;
  border:none !important;background:#fff;box-shadow:0 2px 8px rgba(15,23,42,.22);border-radius:50% !important;}
.fab-item::before{content:'';position:absolute;inset:-13px;border-radius:50%;}
.fab-item-char{font-size:15px !important;font-weight:700;line-height:1;color:#ef476f !important;}
.fab-stack.open .fab-items .fab-item:nth-child(1),.fab-stack:hover .fab-items .fab-item:nth-child(1){transform:translate(2px,-40px) scale(1);}
.fab-stack.open .fab-items .fab-item:nth-child(2),.fab-stack:hover .fab-items .fab-item:nth-child(2){transform:translate(-26px,-30px) scale(1);}
.fab-stack.fab-left.open .fab-items .fab-item:nth-child(2),.fab-stack.fab-left:hover .fab-items .fab-item:nth-child(2){transform:translate(26px,-30px) scale(1);}
@media (max-width:768px){
  .fab,.fab-main,.fab-stack{width:43px !important;height:43px !important;}
  .fab-stack .fab-main{width:43px !important;height:43px !important;}
  .fab-item{width:22px !important;height:22px !important;min-width:22px !important;margin:-11px 0 0 -11px !important;}
  .fab-item-char{font-size:17px !important;}
  .fab-stack.open .fab-items .fab-item:nth-child(1),.fab-stack:hover .fab-items .fab-item:nth-child(1){transform:translate(2px,-46px) scale(1);}
  .fab-stack.open .fab-items .fab-item:nth-child(2),.fab-stack:hover .fab-items .fab-item:nth-child(2){transform:translate(-31px,-33px) scale(1);}
  .fab-stack.fab-left.open .fab-items .fab-item:nth-child(2),.fab-stack.fab-left:hover .fab-items .fab-item:nth-child(2){transform:translate(31px,-33px) scale(1);}
}


/* ============================================================
   v2.15.134 浮动黑色流动光球 FAB（覆盖 132/133 的渐变球/中空环）
   主圆=纯黑+5色光斑缓慢流动+呼吸光晕；卫星小圆=新(蓝紫)/补(粉橙)，
   默认左侧上下等距分布，按主圆位置智能切 左/右/上/下 保证不出屏。
   尺寸：手机主48/子22；电脑主52/子24（用户示例为100/40，按屏等比缩小，改下面数值即可）
   ============================================================ */
.fab-stack>.fab-main,.fab:not(.fab-main){width:48px !important;height:48px !important;min-width:0 !important;padding:0 !important;
  border:none !important;border-radius:50% !important;background:transparent !important;
  box-shadow:none !important;color:#fff !important;overflow:visible !important;position:relative;
  -webkit-tap-highlight-color:transparent;isolation:isolate;}
.fab-main{animation:fabSoftPulse 3.6s ease-in-out infinite;}
.fab-stack.open .fab-main,.fab-main:active{animation:none;}
/* 黑色球体视窗（裁住内部光斑） */
.fab-orbview{position:absolute;inset:0;border-radius:50%;overflow:hidden;background:#05050a;
  box-shadow:0 0 0 1px rgba(255,255,255,.08),0 6px 16px rgba(0,0,0,.45),0 0 14px rgba(124,92,246,.35);}
/* 外层呼吸光晕 */
.fab::after{content:'';position:absolute;inset:-7px;border-radius:50%;z-index:-1;
  background:radial-gradient(circle,rgba(139,92,246,.40) 0%,rgba(59,130,246,.14) 55%,transparent 72%);
  animation:fabHalo 3.6s ease-in-out infinite;pointer-events:none;}
.fab-stack.open .fab::after,.fab:active::after{animation:none;opacity:.9;}
/* 5 个流动光斑：粉 紫 蓝 青 橙 */
.fab-blob{position:absolute;border-radius:50%;filter:blur(5px);opacity:.9;mix-blend-mode:screen;}
.fab-blob.b1{width:62%;height:62%;top:-8%;left:6%;background:radial-gradient(circle,#ff5e8a,transparent 70%);animation:bf1 8s ease-in-out infinite alternate;}
.fab-blob.b2{width:58%;height:58%;top:6%;right:-10%;background:radial-gradient(circle,#a855f7,transparent 70%);animation:bf2 9.5s ease-in-out infinite alternate;}
.fab-blob.b3{width:60%;height:60%;bottom:-14%;left:16%;background:radial-gradient(circle,#3b82f6,transparent 70%);animation:bf3 11s ease-in-out infinite alternate;}
.fab-blob.b4{width:52%;height:52%;bottom:4%;right:4%;background:radial-gradient(circle,#22d3ee,transparent 70%);animation:bf4 8.6s ease-in-out infinite alternate;}
.fab-blob.b5{width:46%;height:46%;top:30%;left:30%;background:radial-gradient(circle,#fb923c,transparent 70%);animation:bf5 10s ease-in-out infinite alternate;}
@keyframes bf1{to{transform:translate(20%,32%) scale(1.15)}}
@keyframes bf2{to{transform:translate(-24%,26%) scale(1.1)}}
@keyframes bf3{to{transform:translate(16%,-28%) scale(1.2)}}
@keyframes bf4{to{transform:translate(-22%,-20%) scale(1.08)}}
@keyframes bf5{to{transform:translate(-26%,22%) scale(1.25)}}
@keyframes fabHalo{0%,100%{opacity:.5;transform:scale(.96)}50%{opacity:1;transform:scale(1.06)}}
@keyframes fabSoftPulse{0%,100%{transform:scale(.97)}50%{transform:scale(1.03)}}
/* 卫星小圆容器与按钮 */
.fab-items{position:absolute;inset:0;pointer-events:none;}
.fab-item{position:absolute !important;left:50% !important;top:50% !important;width:22px !important;height:22px !important;
  min-width:0 !important;margin:-11px 0 0 -11px !important;padding:0 !important;border:none !important;border-radius:50% !important;
  display:flex;align-items:center;justify-content:center;color:#ffffff !important;font-weight:300;letter-spacing:0;
  opacity:0;transform:scale(0);pointer-events:none;z-index:0;
  transition:transform .34s cubic-bezier(.34,1.56,.64,1),opacity .22s ease;}
.fab-item::before{content:'';position:absolute;inset:-13px;border-radius:50%;}
.fab-item-char{font-size:15px !important;line-height:1;font-weight:300;color:#ffffff !important;}
.fab-item-new{background:linear-gradient(135deg,#6366f1,#a855f7) !important;box-shadow:0 0 10px 2px rgba(124,102,246,.6);}
.fab-item-reissue{background:linear-gradient(135deg,#ff5e8a,#fb923c) !important;box-shadow:0 0 10px 2px rgba(255,120,90,.6);}
.fab-stack.open .fab-item{opacity:1;pointer-events:auto;z-index:1;}
.fab-stack.open .fab-items .fab-item:nth-child(2){transition-delay:.05s;}
/* 四向定位（手机）：两小圆到主圆中心等距 sqrt(45^2+30^2) */
.fab-stack.open.fab-left   .fab-items .fab-item:nth-child(1){transform:translate(-45px,-30px) scale(1)}
.fab-stack.open.fab-left   .fab-items .fab-item:nth-child(2){transform:translate(-45px, 30px) scale(1)}
.fab-stack.open.fab-right  .fab-items .fab-item:nth-child(1){transform:translate( 45px,-30px) scale(1)}
.fab-stack.open.fab-right  .fab-items .fab-item:nth-child(2){transform:translate( 45px, 30px) scale(1)}
.fab-stack.open.fab-top    .fab-items .fab-item:nth-child(1){transform:translate(-30px,-45px) scale(1)}
.fab-stack.open.fab-top    .fab-items .fab-item:nth-child(2){transform:translate( 30px,-45px) scale(1)}
.fab-stack.open.fab-bottom .fab-items .fab-item:nth-child(1){transform:translate(-30px, 45px) scale(1)}
.fab-stack.open.fab-bottom .fab-items .fab-item:nth-child(2){transform:translate( 30px, 45px) scale(1)}
@media (min-width:769px){
  .fab-stack>.fab-main,.fab:not(.fab-main){width:52px !important;height:52px !important;}
  .fab-item{width:24px !important;height:24px !important;margin:-12px 0 0 -12px !important;}
  .fab-item-char{font-size:16px !important;}
  .fab-stack.open.fab-left   .fab-items .fab-item:nth-child(1){transform:translate(-50px,-34px) scale(1)}
  .fab-stack.open.fab-left   .fab-items .fab-item:nth-child(2){transform:translate(-50px, 34px) scale(1)}
  .fab-stack.open.fab-right  .fab-items .fab-item:nth-child(1){transform:translate( 50px,-34px) scale(1)}
  .fab-stack.open.fab-right  .fab-items .fab-item:nth-child(2){transform:translate( 50px, 34px) scale(1)}
  .fab-stack.open.fab-top    .fab-items .fab-item:nth-child(1){transform:translate(-34px,-50px) scale(1)}
  .fab-stack.open.fab-top    .fab-items .fab-item:nth-child(2){transform:translate( 34px,-50px) scale(1)}
  .fab-stack.open.fab-bottom .fab-items .fab-item:nth-child(1){transform:translate(-34px, 50px) scale(1)}
  .fab-stack.open.fab-bottom .fab-items .fab-item:nth-child(2){transform:translate( 34px, 50px) scale(1)}
}

/* ============================================================
   v2.15.136 光球层级修正：必须高于底部移动标签栏(.mobile-tab z100)，
   但低于遮罩(.overlay z150)/手机侧栏抽屉(z200)/弹窗(z300)/Toast(z500)，
   这样手机光球不会被底部“首页/工单/设备/库存/我的”盖住，抽屉/弹窗打开时仍由它们盖住光球。
   ============================================================ */
.fab,.fab-main,.fab-stack{z-index:120 !important;}

/* ============================================================
   v2.15.137 ①卫星小圆只在“点击主圆(.open)”时弹出，鼠标悬停不再预览；
   ②卫星字母黑色；③固定一上一下：X 在主圆正上、B 在主圆正下，沿垂直中轴，
   !important 压过历史四向(fab-left/right/top/bottom)弧形定位与 :hover 规则。
   ============================================================ */
.fab-stack:not(.open) .fab-items .fab-item{opacity:0 !important;pointer-events:none !important;}
.fab-item,.fab-item-char{color:#111111 !important;}
.fab-stack{width:48px !important;height:48px !important;padding:0 !important;margin:0 !important;}
@media (min-width:769px){.fab-stack{width:52px !important;height:52px !important;}}
.fab-stack.open .fab-items .fab-item:nth-child(1){transform:translate(0,-48px) scale(1) !important;transition-delay:.02s;}
.fab-stack.open .fab-items .fab-item:nth-child(2){transform:translate(0, 48px) scale(1) !important;transition-delay:.06s;}
@media (min-width:769px){
  .fab-stack.open .fab-items .fab-item:nth-child(1){transform:translate(0,-54px) scale(1) !important;}
  .fab-stack.open .fab-items .fab-item:nth-child(2){transform:translate(0, 54px) scale(1) !important;}
}


/* ============================================================
   v2.15.168 手机端：① 搜索框常驻全宽展开（取消圆钮折叠、不再独占空行）
   ② 状态/子页签按内容宽度横滑、文字完整，不再均分压成“待…”
   ============================================================ */
@media (max-width:768px){
  .search-bar{width:100% !important;flex:1 1 100% !important;min-width:0 !important;height:42px !important;
    margin-left:0 !important;align-self:stretch !important;padding:0 12px !important;border-radius:var(--radius) !important;
    justify-content:flex-start !important;overflow:visible !important;cursor:text !important;}
  .search-bar input{width:auto !important;flex:1 1 auto !important;min-width:0 !important;max-width:none !important;opacity:1 !important;padding:0 !important;}
  .ms-stack>.search-bar.ms-search-dock,.ms-toolrow>.search-bar.ms-search-dock{
    flex:1 1 100% !important;width:100% !important;min-width:0 !important;height:42px !important;margin:0 0 8px !important;
    border-radius:var(--radius) !important;background:#fff !important;justify-content:flex-start !important;
    overflow:visible !important;cursor:text !important;order:20;}
  .ms-search-dock input{width:auto !important;flex:1 1 auto !important;min-width:0 !important;max-width:none !important;
    opacity:1 !important;padding:0 !important;border:none !important;background:transparent !important;}
  .ms-stack>.filter-tabs,.ms-stack>.sub-tabs{overflow-x:auto !important;overflow-y:hidden !important;flex-wrap:nowrap !important;}
  .ms-stack>.filter-tabs>*,.ms-stack>.sub-tabs>*{flex:0 0 auto !important;width:auto !important;min-width:0 !important;
    padding:6px 14px !important;font-size:13px !important;overflow:visible !important;text-overflow:clip !important;white-space:nowrap !important;}
}
