/* ========== 项目部智管 · Demo 样式 ========== */
/* 2026-07 规范化改版：Ant Design 设计令牌体系（色彩/圆角/字阶统一由 :root 令牌管理） */

:root {
  /* 品牌色（微信生态品牌绿，经由令牌统一管理，替换主题只需改此处） */
  --c-brand: #07c160;
  --c-brand-bg: #eafaf0;      /* 品牌浅底 */
  --c-brand-bg-2: #f3fbf6;    /* 品牌次浅底 */
  --c-brand-bd: #c6ecd0;      /* 品牌浅边框 */
  --c-brand-text: #1f7a45;    /* 品牌浅底上的深绿文字 */
  /* 功能色（Ant Design 标准） */
  --c-success: #1f9d57;
  --c-success-bg: #e8f8ee;
  --c-error: #ff4d4f;
  --c-error-bg: #fff1f0;
  --c-error-bd: #ffccc7;
  --c-warning: #faad14;
  --c-warning-bg: #fffbe6;
  --c-warning-bd: #ffe58f;
  --c-warning-text: #614700;  /* 警示浅底上的深色文字 */
  --c-link: #1677ff;
  --c-link-bg: #e6f4ff;
  /* 中性色阶（Ant Design：85% / 65% / 45% / 25% 黑） */
  --c-text: #262626;
  --c-text-2: #595959;
  --c-text-3: #8c8c8c;
  --c-text-4: #bfbfbf;
  --c-line: #f0f0f0;          /* 分割线 */
  --c-border: #e2e5ea;        /* 输入框/卡片边框 */
  --c-border-2: #c9cdd4;      /* 较深边框/禁用底 */
  --c-fill: #fafbfc;          /* 输入底 */
  --c-fill-2: #f4f6f9;        /* chip/标签底 */
  /* 圆角阶（Ant Mobile：小 8 / 中 12 / 大 16） */
  --r-sm: 8px;
  --r-md: 12px;
  --r-lg: 16px;
  /* 字阶（辅助文字最小 11px） */
  --fs-xs: 11px;
  --fs-sm: 12px;
  --fs-md: 13px;
  --fs-base: 14px;
  --fs-lg: 15px;
  --fs-xl: 16px;
  --fs-title: 18px;
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

body {
  margin: 0; padding: 24px 0;
  font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
  background: #e9edf2; color: var(--c-text); display: flex; justify-content: center;
}

.phone {
  width: 390px; height: 800px; background: #f5f6f8; border-radius: 36px;
  box-shadow: 0 18px 50px rgba(0,0,0,.18); overflow: hidden; position: relative;
  display: flex; flex-direction: column; border: 8px solid #1c1c1e;
}

.wxbar { position: relative; height: 44px; background: #f5f6f8; display: flex; align-items: center; justify-content: space-between; padding: 0 12px; font-size: var(--fs-md); color: var(--c-text); flex-shrink: 0; }
.wxbar .left { font-weight: 600; min-width: 56px; z-index: 1; cursor: pointer; }
.wxbar .wxtitle { position: absolute; left: 0; right: 0; text-align: center; font-size: var(--fs-lg); font-weight: 600; color: var(--c-text); pointer-events: none; }
.wxbar .right { min-width: 56px; z-index: 1; }

.projhead { background: var(--c-brand); color: #fff; padding: 8px 16px; flex-shrink: 0; display: flex; align-items: center; gap: 12px; }
.projhead .ph-main { flex: 1; min-width: 0; }
.projhead .pname { font-size: var(--fs-lg); font-weight: 600; }
.projhead .role { font-size: var(--fs-sm); opacity: .9; margin-top: 2px; }
/* 头部工期进度环（Ant Design Progress type=circle mini 规格）：百分比整数居环心，下方配说明文字 */
.ph-ring-box { flex-shrink: 0; text-align: center; }
.ph-ring { position: relative; width: 40px; height: 40px; margin: 0 auto; }
.ph-ring svg { display: block; }
.ph-ring-num { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600; color: #fff; }
.ph-ring-label { font-size: 10px; opacity: .9; margin-top: 1px; white-space: nowrap; }

.screen { flex: 1; overflow-y: auto; padding: 16px 16px 100px; }
.screen::-webkit-scrollbar { width: 0; }
/* 无 TabBar 的流程页（如完善个人资料）：底部无悬浮导航遮挡，收敛安全区留白保障一屏展示 */
.screen.flow-page { padding-bottom: 24px; }
/* 流程页紧凑间距：骨架留白适度收紧，保障含验证码输入态在内的全部内容一屏展示 */
.flow-page .pagetitle { margin-bottom: 10px; }
.flow-page .tip { margin-bottom: 10px; }
.flow-page .phone-block { padding: 10px 12px; margin-bottom: 10px; }

.tip { background: var(--c-brand-bg); border: 1px solid var(--c-brand-bd); color: var(--c-brand-text); font-size: var(--fs-sm); padding: 8px 12px; border-radius: var(--r-sm); margin-bottom: 12px; line-height: 1.5; }

.card { background: #fff; border-radius: var(--r-md); padding: 16px; margin-bottom: 12px; box-shadow: 0 1px 3px rgba(0,0,0,.05); }
.card h3 { margin: 0 0 12px; font-size: var(--fs-base); color: var(--c-text); display:flex; justify-content:space-between; align-items:center; }
.card h3 .del { font-size: var(--fs-sm); color: var(--c-error); font-weight: 400; }

.label { font-size: var(--fs-sm); color: var(--c-text-2); margin: 12px 0 4px; }
.label:first-child { margin-top: 0; }

.req { color:var(--c-error); font-weight:600; margin-left:2px; }
/* Ant Design 风格警示条（不可逆操作提醒） */
.alert-warn { display:flex; gap:8px; background:var(--c-warning-bg); border:1px solid var(--c-warning-bd); border-radius:var(--r-sm); padding:12px; margin-bottom:16px; font-size:var(--fs-sm); line-height:1.6; color:var(--c-warning-text); }
.alert-warn .aw-ico { color:var(--c-warning); flex-shrink:0; font-size:var(--fs-base); line-height:1.5; }
.alert-warn b { color:var(--c-error); font-weight:600; }
.lock-tag { display:inline-block; margin-left:6px; font-size:var(--fs-xs); color:var(--c-error); background:var(--c-error-bg); border:1px solid var(--c-error-bd); border-radius:4px; padding:0 5px; line-height:16px; vertical-align:1px; font-weight:500; } /* vertical-align 数值微调：使色块中线与行内中文中线对齐（middle 在中文行会偏低约 2px） */
/* 侧边两行版 lock-tag：规整长方形，每行居中不折字（窄卡右侧专用） */
.lock-tag-2l { flex-shrink:0; margin-left:0; text-align:center; white-space:nowrap; line-height:15px; padding:3px 8px; }
.note { font-size:var(--fs-xs); color:var(--c-text-3); margin:4px 0 0; line-height:1.4; }

/* 工期行：标签在左、控件在右，三行等宽对齐 */
.date-row {
  display: flex; align-items: center; gap: 8px; margin-top: 12px;
}
.date-row .date-label {
  font-size: var(--fs-md); color: var(--c-text-2); white-space: nowrap; min-width: 52px; flex-shrink: 0; line-height: 42px;
}
/* 日期输入框 & 工期展示条 — 统一盒模型，确保三框完全等宽等高 */
.date-row input[type="date"],
.date-row .duration-display {
  flex: 1; min-width: 0; max-width: none;
  width: 0;                          /* flex:1 下强制等宽，忽略 content/intrinsic size */
  height: 42px; line-height: normal;   /* 弃 line-height 撑高，flex 几何居中（与小程序 .inp 同法） */
  padding: 0 12px; margin: 0;
  border-radius: var(--r-sm);
  border: 1px solid var(--c-border);
  font-size: var(--fs-md); font-family: inherit;
  box-sizing: border-box;
  display: flex; align-items: center;
}
/* 可编辑日期：白底 */
.date-row input[type="date"] {
  background: var(--c-fill); color: var(--c-text);
  -webkit-appearance: none;          /* 移除 Safari 内部 icon 占位 */
}
/* 只读工期展示：浅绿底，视觉区分 */
.date-row .duration-display {
  background: var(--c-brand-bg-2); border-color: var(--c-brand-bd);
  color: var(--c-brand-text); font-weight: 500;
}

.phone-block { border:1px solid var(--c-line); border-radius:var(--r-md); padding:12px; margin-bottom:12px; background:#fcfdfe; }
.phone-block .ph-h { font-size:var(--fs-md); font-weight:600; color:var(--c-brand); margin:0 0 8px; display:flex; justify-content:space-between; align-items:center; }
.phone-block .ph-h .x { color:var(--c-text-4); font-weight:400; cursor:pointer; font-size:var(--fs-sm); }

.module-title { font-size:var(--fs-base); font-weight:700; color:var(--c-text); margin-bottom:12px; }
/* 卡片标题行右侧文字操作位（Ant Design Card extra） */
.module-title.mt-row { display:flex; align-items:center; }
.module-title .mt-act { margin-left:auto; font-size:var(--fs-sm); font-weight:400; color:var(--c-brand); cursor:pointer; user-select:none; }
.module-title .mt-act:active { opacity:.6; }
.module-title.collapsible { display:flex; align-items:center; justify-content:space-between; margin-bottom:0; padding:4px 0; cursor:pointer; user-select:none; }
.module-title.collapsible:active { opacity:.6; }
.module-title .chev { color:var(--c-text-3); font-size:var(--fs-md); transition:transform .15s; flex-shrink:0; }
.module-body { margin-top:12px; }

.pagetitle { font-size:var(--fs-title); font-weight:700; color:var(--c-text); text-align:center; margin:2px 0 16px; }
.sub-title { font-size:var(--fs-sm); font-weight:600; color:var(--c-text-2); margin:16px 0 8px; padding-left:8px; border-left:3px solid var(--c-brand); }

.code-row { display:flex; gap:8px; align-items:center; margin-top:8px; }
.code-row input { flex:1; }
.btn-mini { background:var(--c-brand); color:#fff; border:none; border-radius:var(--r-sm); padding:8px 12px; font-size:var(--fs-md); white-space:nowrap; cursor:pointer; }
.btn-mini:disabled { background:var(--c-border-2); cursor:not-allowed; }
.btn-mini.ghost { background:#fff; color:var(--c-brand); border:1px solid var(--c-brand); }
.verified-tag { color:var(--c-success); font-size:var(--fs-md); font-weight:600; margin-top:8px; }

input, select, textarea { width: 100%; border: 1px solid var(--c-border); border-radius: var(--r-sm); padding: 10px; font-size: var(--fs-base); background: var(--c-fill); color: var(--c-text); font-family: inherit; }
input[type="radio"], input[type="checkbox"] { width: auto; min-width: auto; border: none; border-radius: 0; padding: 0; background: transparent; flex: 0 0 auto; }
textarea { resize: none; height: 60px; }

.row2 { display: flex; gap: 12px; }
.row2 > div { flex: 1; }

.field-weather { display: flex; align-items: center; justify-content: space-between; border: 1px solid var(--c-border); border-radius: var(--r-sm); padding: 10px 12px; background: var(--c-fill); }
.field-weather .wv { font-size: var(--fs-base); }
.field-weather button { border: none; background: var(--c-brand-bg); color: var(--c-brand); font-size: var(--fs-sm); padding: 4px 12px; border-radius: var(--r-sm); }

.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip { border: 1px solid var(--c-border-2); border-radius: 999px; padding: 8px 16px; font-size: var(--fs-md); background: #fff; color: var(--c-text-2); cursor: pointer; user-select: none; }
.chip.on { background: var(--c-brand); border-color: var(--c-brand); color: #fff; font-weight: 500; }
/* 部门归属竖向选择列表 */
.dept-list { display:flex; flex-direction:column; gap:12px; margin-top:4px; }
.dept-item { display:flex; align-items:center; gap:12px; padding:16px; background:#fff; border:1px solid var(--c-line); border-radius:var(--r-md); cursor:pointer; transition:border-color .15s, box-shadow .15s, transform .15s; box-shadow:0 1px 2px rgba(0,0,0,.03); }
.dept-item:hover { border-color:var(--c-brand); box-shadow:0 3px 10px rgba(7,193,96,.12); transform:translateY(-1px); }
.dept-item:active { transform:translateY(0); box-shadow:0 1px 2px rgba(0,0,0,.03); }
.dept-item .dept-ico { width:38px; height:38px; border-radius:var(--r-sm); background:var(--c-brand-bg); color:var(--c-brand); display:flex; align-items:center; justify-content:center; font-size:var(--fs-xl); font-weight:600; flex-shrink:0; }
.dept-item .dept-name { flex:1; font-size:var(--fs-lg); font-weight:500; color:var(--c-text); }
.dept-item .dept-arrow { color:var(--c-border-2); font-size:20px; line-height:1; flex-shrink:0; }

.detail { border: 1px solid var(--c-line); border-radius: var(--r-md); padding: 12px; margin-bottom: 12px; background: #fcfdfe; }
.detail.hidden { display: none; }
.detail .dh { font-size: var(--fs-md); font-weight: 600; color: var(--c-brand); margin-bottom: 8px; display:flex; justify-content:space-between; }
.detail .dh .x { color:var(--c-text-4); font-weight:400; cursor:pointer; }

.switch-row { display: flex; align-items: center; justify-content: space-between; }
/* 开关组件（与 input.weui-switch 统一几何：50×30、白色滑块 26） */
.switch { width: 50px; height: 30px; border-radius: 15px; background: var(--c-border); position: relative; transition: .25s; flex-shrink:0; }
.switch.on { background: var(--c-brand); }
.switch::after { content:""; position:absolute; top:2px; left:2px; width:26px; height:26px; border-radius:50%; background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.25); transition:.25s; }
.switch.on::after { left: 22px; }

.btn { width: 100%; background: var(--c-brand); color: #fff; border: none; border-radius: var(--r-md); padding: 13px; font-size: var(--fs-lg); font-weight: 600; cursor: pointer; margin-top: 4px; }
.btn.ghost { background: #fff; color: var(--c-brand); border: 1px solid var(--c-brand); }
/* 报告导出操作栏：图标上/文字下竖排（Ant 移动端工具栏样式），等宽均分、文字单行不折 */
.export-bar { display: flex; gap: 8px; margin: 8px 0 12px; }
.exp-btn { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 4px; margin: 0; padding: 9px 4px 7px; font-size: var(--fs-sm); font-weight: 500; white-space: nowrap; line-height: 1; }
.exp-btn svg { display: block; }
.btn.danger-btn { background: var(--c-error); }

.btn-add { display:inline-block; background:var(--c-brand-bg-2); color:var(--c-brand); border:1px solid var(--c-brand); border-radius:var(--r-sm); padding:6px 16px; font-size:var(--fs-md); font-weight:600; cursor:pointer; margin-top:8px; }
.btn-add:hover { background:var(--c-brand); color:#fff; }

.fab { position: absolute; left: 16px; right: 16px; bottom: calc(78px + env(safe-area-inset-bottom)); background: var(--c-brand); color: #fff; text-align: center; padding: 12px; border-radius: var(--r-md); font-size: var(--fs-base); font-weight: 600; cursor: pointer; box-shadow: 0 4px 14px rgba(7,193,96,.4); }

.tabbar { position: absolute; bottom: 0; left: 0; right: 0; height: calc(64px + env(safe-area-inset-bottom)); padding-bottom: env(safe-area-inset-bottom); background: #fff; border-top: 1px solid var(--c-line); display: flex; }
.tab { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: var(--fs-xs); color: var(--c-text-3); cursor: pointer; gap: 3px; }
.tab .ic { font-size: 20px; }
.tab.on { color: var(--c-brand); font-weight: 600; }
/* 中间凸起「＋填日志」按钮（方案A）*/
.tab.fab-tab { position: relative; justify-content: flex-end; padding-bottom: 8px; }
.tab.fab-tab .tab-fab { position: absolute; top: -18px; left: 50%; transform: translateX(-50%); width: 50px; height: 50px; border-radius: 50%; background: var(--c-brand); color: #fff; display: flex; align-items: center; justify-content: center; box-shadow: 0 5px 14px rgba(7,193,96,.45); border: 3px solid #fff; }
.tab.fab-tab .tab-fab svg { display: block; }
.tab.fab-tab .fab-label { font-size: var(--fs-xs); color: var(--c-text-3); }
.tab.fab-tab .fab-label.on { color: var(--c-brand); font-weight: 600; }
.tab.fab-tab:active .tab-fab { transform: translateX(-50%) scale(.94); }

.mask { position: absolute; inset: 0; background: rgba(0,0,0,.4); display: none; z-index: 30; }
.mask.show { display: block; }

.sheet { position: absolute; left: 0; right: 0; bottom: 0; background: #fff; border-radius: var(--r-lg) var(--r-lg) 0 0; padding: 16px 16px 24px; transform: translateY(100%); transition: .25s; z-index: 31; max-height: 80%; overflow-y: auto; }
.sheet.show { transform: translateY(0); }
.sheet h3 { margin: 0 0 16px; font-size: var(--fs-xl); }
.sheet .close { float: right; color: var(--c-text-3); font-size: var(--fs-base); cursor: pointer; }

/* 分包联系人胶囊（原类名 .pm 与角色标签修饰类 .role-tag.pm 冲突，margin-top 污染导致标签偏低，改名根治） */
.pm-chip { display: inline-flex; align-items: center; gap: 5px; background: var(--c-fill-2); border-radius: 999px; padding: 4px 6px 4px 12px; font-size: var(--fs-sm); margin: 4px 6px 0 0; }
.pm-chip .x { background: var(--c-border-2); color: #fff; border-radius: 50%; width: 16px; height: 16px; display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-xs); cursor: pointer; }

table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
th, td { text-align: left; padding: 8px; border-bottom: 1px solid var(--c-line); }
th { color: var(--c-text-3); font-weight: 500; }

.stat-row { display: flex; gap: 8px; }
.stat { flex: 1; min-width: 0; background: var(--c-brand-bg-2); border-radius: var(--r-md); padding: 10px 4px; text-align: center; }
/* 可下钻统计格（Ant 数据卡下钻规范）：按压态背景加深反馈可点击 */
.stat-link { cursor: pointer; transition: background .15s; }
.stat-link:active { background: var(--c-brand-bg); }
.stat .n { font-size: 20px; font-weight: 700; color: var(--c-brand); }
.stat .t { font-size: var(--fs-xs); color: var(--c-text-2); margin-top: 2px; white-space: nowrap; }

.badge { font-size: var(--fs-xs); padding: 2px 8px; border-radius: var(--r-sm); }
.b-ok { background: var(--c-success-bg); color: var(--c-success); }
.b-lag { background: var(--c-error-bg); color: var(--c-error); }
.b-ahead { background: var(--c-link-bg); color: var(--c-link); }

.empty { text-align: center; color: var(--c-text-4); font-size: var(--fs-md); padding: 24px 0; }

.toast { position: absolute; left: 50%; top: 45%; transform: translate(-50%,-50%); background: rgba(0,0,0,.8); color: #fff; padding: 12px 18px; border-radius: var(--r-sm); font-size: var(--fs-base); z-index: 50; opacity: 0; transition: .25s; pointer-events: none; max-width: 78%; text-align: center; }
.toast.show { opacity: 1; }
/* Toast 语义图标（Ant Toast：成功/失败区分） */
.toast .tico { margin-right: 6px; font-weight: 700; }
.toast.ok .tico { color: #6ee7a0; }
.toast.err .tico { color: #ff7875; }

.hidden { display: none !important; }

/* 首启页样式 */
.welcome { text-align:center; padding: 40px 28px 24px; min-height:100%; display:flex; flex-direction:column; box-sizing:border-box; }
.welcome .logo { font-size: 46px; width: 86px; height: 86px; line-height: 86px; margin: 0 auto 16px; background: var(--c-brand-bg); border-radius: 24px; }
.appname { font-size: 22px; font-weight: 700; }
.slogan { font-size: var(--fs-md); color: var(--c-text-3); margin-top: 8px; }
.agree { font-size: var(--fs-xs); color: var(--c-text-3); margin-top: 16px; line-height:1.7; text-align:center; }
.agree input[type="checkbox"] { width:auto; min-width:0; border:none; border-radius:0; padding:0; background:none; margin-right:5px; vertical-align:middle; }
.agree .lk { color:var(--c-link); cursor:pointer; }
.adv { font-size:var(--fs-lg); color:var(--c-brand); font-weight:600; margin-top:12px; }
.feat-list { text-align:left; margin-top:24px; }
.feat { font-size:var(--fs-md); color:var(--c-text-2); padding:8px 2px; display:flex; align-items:center; gap:8px; border-bottom:1px solid var(--c-line); }
.feat:last-child { border-bottom:none; }
.copyright { font-size:var(--fs-xs); color:var(--c-text-4); margin-top:auto; padding-top:24px; letter-spacing:.3px; line-height:1.7; }

.avatar { width: 48px; height: 48px; border-radius: 50%; background: var(--c-brand); color: #fff; display: flex; align-items: center; justify-content: center; font-size: var(--fs-title); font-weight: 600; flex-shrink: 0; }
img.avatar { object-fit: cover; display: block; } /* 图片头像形态（微信授权后）：裁剪填满圆形 */
.profile-head { display: flex; align-items: center; gap: 12px; }
.entry-card { display: flex; align-items: center; gap: 16px; cursor: pointer; }
.entry-card .ec-ic { font-size: 22px; width: 46px; height: 46px; display: flex; align-items: center; justify-content: center; background: var(--c-brand-bg); border-radius: var(--r-md); flex-shrink: 0; }
.entry-card .ec-sub { font-size: var(--fs-sm); color: var(--c-text-3); }
.bind-card { text-align: center; }
.bind-row { display: flex; justify-content: space-between; padding: 12px 4px; border-bottom: 1px solid var(--c-line); font-size: var(--fs-md); }
.bind-row span { color: var(--c-text-3); }
.bind-row b { font-weight: 600; }

.err-bar { background:var(--c-error-bg); color:var(--c-error); border:1px solid var(--c-error-bd); border-radius:var(--r-sm); padding:9px 12px; font-size:var(--fs-sm); margin:0 0 12px; line-height:1.5; }

.tab .ic svg { display:block; margin:0 auto; }

.set-card { background:#fff; border-radius:var(--r-md); padding:6px 16px; margin-bottom:12px; box-shadow:0 1px 3px rgba(0,0,0,.05); }
.set-row { display:flex; align-items:center; justify-content:space-between; padding:14px 2px; border-bottom:1px solid var(--c-line); font-size:var(--fs-base); cursor:pointer; }
.set-row:last-child { border-bottom:none; }
.set-row .arrow { color:var(--c-text-4); font-size:var(--fs-xl); }
.set-row .sub { font-size:var(--fs-sm); color:var(--c-text-3); margin-top:2px; }

.avatar-lg { width:60px; height:60px; border-radius:50%; background:var(--c-brand); color:#fff; display:flex; align-items:center; justify-content:center; font-size:22px; font-weight:600; flex-shrink:0; }
.mine-head { display:flex; align-items:center; gap:16px; }

.danger { color:var(--c-error); }

/* demo 安全提示 */
.demo-banner { background:var(--c-warning-bg); border:1px solid var(--c-warning-bd); color:var(--c-warning-text); font-size:var(--fs-xs); text-align:center; padding:6px 12px; position:absolute; top:0; left:0; right:0; z-index:60; }

/* 自动同步开关（与 .switch 统一几何：50×30、白色滑块 26） */
input.weui-switch { -webkit-appearance:none; appearance:none; position:relative; width:50px !important; height:30px; border-radius:15px; background:var(--c-border); border:none; padding:0; flex:0 0 auto; cursor:pointer; transition:background .25s; }
input.weui-switch::after { content:''; position:absolute; top:2px; left:2px; width:26px; height:26px; border-radius:50%; background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.25); transition:left .25s; }
input.weui-switch:checked { background:var(--c-brand); }
input.weui-switch:checked::after { left:22px; }

/* 模块行内照片槽（M9）与报告缩略图 */
.photo-slot {
  border: 1px dashed var(--c-border-2); border-radius: var(--r-sm); padding: 16px;
  background: var(--c-fill); color: var(--c-text-3); text-align: center; font-size: var(--fs-md);
  cursor: pointer; margin-bottom: 12px;
}
.photo-slot:hover { background: var(--c-brand-bg); color: var(--c-brand); border-color: var(--c-brand); }
.photo-thumb { width: 46px; height: 46px; padding: 0; line-height: 46px; font-size: 20px; flex-shrink: 0; margin: 0; }

/* AI 对话气泡 */
.ai-ava, .ai-usr {
  width: 32px; height: 32px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: var(--fs-md); font-weight: 600; flex-shrink: 0;
}
.ai-ava { background: var(--c-brand-bg); }
.ai-usr { background: var(--c-brand); color: #fff; }
.ai-bubble {
  max-width: 78%; padding: 9px 12px; border-radius: var(--r-md);
  font-size: var(--fs-md); line-height: 1.55; white-space: pre-wrap;
  word-wrap: break-word;
}
.ai-bubble.ai-l { background: #fff; border: 1px solid var(--c-line); color: var(--c-text); }
.ai-bubble.ai-r { background: var(--c-brand); color: #fff; }

/* 考勤打卡按钮禁用态补充 */
#att-punch:disabled { background: var(--c-border-2) !important; box-shadow: none !important; cursor: not-allowed; }

/* ============ 消息 tab（I 阶段）============ */
/* 二级 subtabs */
.msg-subtabs { display:flex; gap:4px; padding:8px 16px 10px; background:#fff; border-bottom:1px solid var(--c-line); }
.msg-subtab { flex:1; text-align:center; padding:6px 0; font-size:var(--fs-md); color:var(--c-text-2); border-radius:999px; background:var(--c-fill-2); cursor:pointer; }
.msg-subtab.on { background:var(--c-brand); color:#fff; font-weight:600; }
/* 红点徽标（统一组件：.msg-badge 为基准，.conv-badge 复用同一几何） */
.msg-badge, .conv-badge { display:inline-block; background:var(--c-error); color:#fff; font-size:var(--fs-xs); font-weight:600; min-width:16px; height:16px; padding:0 4px; line-height:16px; border-radius:999px; text-align:center; vertical-align:middle; flex-shrink:0; }
/* 会话列表 */
.conv-item { display:flex; align-items:center; gap:12px; padding:12px 16px; background:#fff; border-bottom:1px solid var(--c-line); cursor:pointer; }
.conv-item:active { background:#f5f7fa; }
.conv-ava { width:42px; height:42px; border-radius:50%; background:var(--c-brand-bg); display:flex; align-items:center; justify-content:center; font-size:20px; flex-shrink:0; }
.conv-body { flex:1; min-width:0; }
.conv-top { display:flex; justify-content:space-between; align-items:center; }
.conv-name { font-size:var(--fs-base); font-weight:600; color:var(--c-text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:180px; }
.conv-time { font-size:var(--fs-xs); color:var(--c-text-3); flex-shrink:0; margin-left:6px; }
.conv-last { font-size:var(--fs-sm); color:var(--c-text-3); margin-top:3px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* 通知中心 */
.notify-filter { display:flex; flex-wrap:wrap; gap:6px; padding:12px 16px; background:#fff; border-bottom:1px solid var(--c-line); }
.nf-chip { padding:5px 12px; font-size:var(--fs-sm); background:var(--c-fill-2); color:var(--c-text-2); border-radius:999px; cursor:pointer; display:inline-flex; align-items:center; gap:4px; }
.nf-chip.on { background:var(--c-brand); color:#fff; font-weight:600; }
.nf-chip .msg-badge { font-size:10px; min-width:14px; height:14px; line-height:14px; padding:0 3px; }
.nf-chip.on .msg-badge { background:#fff; color:var(--c-brand); }
.notify-item { display:flex; gap:12px; padding:12px 16px; background:#fff; border-bottom:1px solid var(--c-line); cursor:pointer; }
.notify-item.unread { background:#f7fbff; }
.notify-item.unread .notify-title { color:var(--c-brand); font-weight:600; }
.notify-icon { font-size:20px; flex-shrink:0; width:32px; text-align:center; }
.notify-body { flex:1; min-width:0; }
.notify-top { display:flex; justify-content:space-between; align-items:center; }
.notify-title { font-size:var(--fs-md); color:var(--c-text); }
.notify-time { font-size:var(--fs-xs); color:var(--c-text-3); }
.notify-text { font-size:var(--fs-sm); color:var(--c-text-2); margin-top:3px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.silent-tag { font-size:var(--fs-xs); color:var(--c-text-3); background:var(--c-fill-2); padding:2px 6px; border-radius:var(--r-sm); align-self:flex-start; flex-shrink:0; }
/* 通讯录 */
.contact-group { display:flex; justify-content:space-between; padding:12px 16px; background:#fff; border-bottom:1px solid var(--c-line); cursor:pointer; }
.contact-group:active { background:#f5f7fa; }
.cg-title { font-size:var(--fs-base); font-weight:600; color:var(--c-text); }
.cg-count { font-size:var(--fs-sm); color:var(--c-text-3); }
.contact-dept { background:#fff; border-bottom:1px solid var(--c-line); margin-top:6px; }
.cd-head { display:flex; justify-content:space-between; padding:12px 16px; cursor:pointer; background:#f8f9fb; }
.cd-head:active { background:#eff2f6; }
.cd-title { font-size:var(--fs-md); font-weight:600; color:var(--c-text-2); }
.cd-count { font-size:var(--fs-sm); color:var(--c-text-3); }
.contact-row { display:flex; align-items:center; gap:12px; padding:9px 16px 9px 30px; border-top:1px solid var(--c-line); cursor:pointer; }
.contact-row:active { background:#f5f7fa; }
.cr-ava { width:32px; height:32px; border-radius:50%; background:var(--c-brand-bg); display:flex; align-items:center; justify-content:center; font-size:var(--fs-base); font-weight:600; color:var(--c-brand); }
/* 姓名+角色标签用 flex 几何居中（Ant 规范：消除 inline-block 标签 vertical-align 在中文行内偏低的基线问题） */
.cr-name { font-size:var(--fs-md); color:var(--c-text-2); display:flex; align-items:center; }
.role-tag { display:inline-block; font-size:var(--fs-xs); padding:1px 6px; border-radius:var(--r-sm); margin-left:4px; vertical-align:middle; }
.role-tag.pm { background:var(--c-brand-bg); color:var(--c-brand); }
.role-tag.dh { background:var(--c-warning-bg); color:var(--c-warning); }
/* 公告范围标签（Ant Design 分级色：项目部级绿/部门橙/全体蓝）*/
.ann-tag { display:inline-block; font-size:var(--fs-xs); padding:1px 8px; border-radius:999px; margin-right:6px; vertical-align:middle; font-weight:500; }
.ann-tag.proj { background:var(--c-brand-bg); color:var(--c-brand); }
.ann-tag.dept { background:var(--c-warning-bg); color:var(--c-warning); }
.ann-tag.all { background:var(--c-link-bg); color:var(--c-link); }
/* 聊天室 */
.screen.chat-mode { padding:0; display:flex; flex-direction:column; }
.chat-head { display:flex; align-items:center; gap:12px; padding:12px 16px; background:#fff; border-bottom:1px solid var(--c-line); flex-shrink:0; }
.ch-back { font-size:22px; color:var(--c-brand); cursor:pointer; line-height:1; padding:0 4px; }
.ch-title { font-size:var(--fs-lg); font-weight:600; color:var(--c-text); flex:1; }
.ch-count { font-size:var(--fs-xs); color:var(--c-text-3); font-weight:normal; }
/* 聊天区（微信风格，同步小程序 pages/chat）：灰底 + 时间分隔条 + 气泡小尾巴 */
.chat-body { flex:1; min-height:0; overflow-y:auto; padding:12px 16px; background:#ededed; }
.time-div { text-align:center; font-size:11px; color:#b2b2b2; margin:8px 0 12px; }
.chat-row { display:flex; gap:8px; margin-bottom:14px; }
.chat-row.mine { flex-direction:row-reverse; }
.chat-ava { width:32px; height:32px; border-radius:50%; background:var(--c-brand-bg); display:flex; align-items:center; justify-content:center; font-size:var(--fs-md); font-weight:600; color:var(--c-brand); flex-shrink:0; }
.chat-wrap { max-width:72%; }
.chat-name { font-size:var(--fs-xs); color:var(--c-text-3); margin-bottom:2px; }
.chat-bubble { position:relative; padding:8px 12px; border-radius:6px; font-size:var(--fs-md); line-height:1.45; background:#fff; color:#191919; word-wrap:break-word; }
/* 气泡小尾巴（微信样式：贴头像一侧的小三角） */
.chat-bubble::before { content:''; position:absolute; top:12px; left:-10px; border:5px solid transparent; border-right-color:#fff; }
.chat-row.mine .chat-bubble { background:#95ec69; }
.chat-row.mine .chat-bubble::before { left:auto; right:-10px; border-right-color:transparent; border-left-color:#95ec69; }
/* 底部输入栏：微信灰底 + 白输入框 + 定宽小发送键（AI 助手仍用下方胶囊样式） */
.chat-input { flex-shrink:0; display:flex; align-items:center; gap:8px; padding:8px 12px; background:#fff; border-top:1px solid var(--c-line); }
.chat-mode:not(.ai-mode) .chat-input { background:#f7f7f7; border-top-color:#e0e0e0; }
.chat-input .ci-field { flex:1; min-width:0; background:#fff; border:none; border-radius:6px; font-size:var(--fs-md); padding:0 10px; height:38px; outline:none; }
.chat-input .ci-send { background:#07c160; color:#fff; font-size:13px; height:36px; width:64px; flex-shrink:0; border-radius:6px; display:flex; align-items:center; justify-content:center; cursor:pointer; }
.chat-input .ci-send.dis { background:#b6e3c5; }
.chat-input input { flex:1; padding:8px 12px; border:1px solid var(--c-border); border-radius:999px; font-size:var(--fs-md); outline:none; }
.chat-input input:focus { border-color:var(--c-brand); }
.chat-input input.ci-field { border:none; border-radius:6px; padding:0 10px; }
.chat-input .btn { width:auto; flex-shrink:0; padding:6px 16px; font-size:var(--fs-md); border-radius:999px; margin:0; }
/* AI 助手：复用 chat-mode 布局，快捷问题+输入区固定在手机框底部 */
.ai-foot { flex-shrink:0; background:#fff; border-top:1px solid var(--c-line); }
.ai-foot .chat-input { border-top:none; }
.ai-quick { padding:8px 12px 0; }
.ai-quick-label { display:block; font-size:var(--fs-sm); color:var(--c-text-3); margin-bottom:6px; }
/* AI 助手保留底部 TabBar 高度（chat-mode 清除了 screen 的 padding，而 AI 页仍显示 TabBar） */
.screen.chat-mode.ai-mode { padding-bottom: calc(64px + env(safe-area-inset-bottom)); }

/* 部门管理（仅项目经理） */
.dm-dhead { display:flex; justify-content:space-between; align-items:flex-start; gap:8px; }
.dm-dname { font-size:var(--fs-lg); font-weight:600; color:var(--c-text); line-height:1.5; }
.dm-dcount { font-size:var(--fs-sm); color:var(--c-text-3); font-weight:400; margin:0 6px; }
.dm-nohead { font-size:var(--fs-xs); color:var(--c-warning); white-space:nowrap; }
.dm-dsub { margin-top:4px; }
.dm-dacts { display:flex; gap:4px; flex-shrink:0; }
.dm-ibtn { border:1px solid var(--c-border); background:#fff; color:var(--c-text-2); border-radius:var(--r-sm); padding:3px 8px; font-size:var(--fs-sm); cursor:pointer; line-height:1.4; white-space:nowrap; }
.dm-ibtn:hover { border-color:var(--c-brand); color:var(--c-brand); }
.dm-ibtn:disabled { color:var(--c-border-2); border-color:var(--c-line); cursor:not-allowed; }
.dm-ibtn.danger { color:var(--c-error); border-color:var(--c-error-bd); }
.dm-ibtn.danger:hover { background:var(--c-error-bg); }
.dm-mlist { margin-top:8px; }
.dm-mrow { display:flex; justify-content:space-between; align-items:center; gap:8px; padding:8px 0; border-top:1px solid var(--c-line); flex-wrap:wrap; }
.dm-minfo { font-size:var(--fs-md); color:var(--c-text); display:flex; align-items:center; flex-wrap:wrap; gap:2px; }
.dm-mname2 { font-weight:500; }
.dm-mphone { font-size:var(--fs-xs); color:var(--c-text-3); margin-left:6px; }
.dm-macts { display:flex; gap:6px; align-items:center; flex-shrink:0; }
.dm-sel { padding:4px 6px; border:1px solid var(--c-border); border-radius:var(--r-sm); font-size:var(--fs-sm); color:var(--c-text-2); background:#fff; max-width:110px; }
.dm-empty { font-size:var(--fs-sm); color:var(--c-text-4); padding:8px 0 2px; }

/* ============ 创建项目全屏向导：Ant Design Steps 步骤条 ============ */
.cw-steps{display:flex;align-items:flex-start;margin:4px 0 14px}
.cw-step{flex:1;display:flex;flex-direction:column;align-items:center;position:relative}
.cw-step .dot{width:22px;height:22px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;background:var(--c-fill-2);color:var(--c-text-3);position:relative;z-index:1}
.cw-step.done .dot{background:var(--c-brand);color:#fff}
.cw-step.cur .dot{background:var(--c-brand);color:#fff;box-shadow:0 0 0 3px var(--c-brand-bg-2)}
.cw-step .nm{font-size:10px;color:var(--c-text-3);margin-top:4px;white-space:nowrap}
.cw-step.cur .nm{color:var(--c-brand);font-weight:600}
.cw-step.done .nm{color:var(--c-text-2)}
.cw-step::before{content:'';position:absolute;top:11px;left:-50%;width:100%;height:2px;background:var(--c-border)}
.cw-step:first-child::before{display:none}
.cw-step.done::before,.cw-step.cur::before{background:var(--c-brand)}
.cw-title{margin:0 0 16px;font-size:var(--fs-xl)}
/* 向导成员条目卡（Ant Design Form.List 动态条目）：头部序号+右侧删除，字段 2 列等宽栅格 */
.cwm-card{padding:12px;margin:8px 0}
.cwm-head{display:flex;align-items:center;font-size:var(--fs-sm);font-weight:600;color:var(--c-text-2);margin-bottom:8px}
.cwm-head .cwm-del{margin-left:auto;font-weight:400;color:var(--c-error);cursor:pointer;user-select:none}
.cwm-head .cwm-del:active{opacity:.6}
.cwm-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.cwm-grid input,.cwm-grid select{width:100%;min-width:0;margin:0}
/* 向导信息确认页（Ant Design Descriptions）：分组只读回显，标签列对齐 */
.cwp-sec{padding:12px;margin:10px 0}
.cwp-row{display:flex;align-items:flex-start;gap:10px;padding:4px 0;font-size:var(--fs-sm);line-height:1.6}
.cwp-row .cwp-k{flex:0 0 74px;color:var(--c-text-3)}
.cwp-row .cwp-k-lock{color:var(--c-error);font-weight:500} /* 不可修改项标签标红，与顶部警示条点名同色 */
.cwp-row .cwp-v{flex:1;min-width:0;color:var(--c-text);word-break:break-all}
/* 确认页人员四列表格（Ant Table 简化形态）：姓名|电话|部门|类别，四列均分列列对齐，单元格单行省略，空值占位“—” */
.cwp-tr{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;padding:5px 0;font-size:var(--fs-sm);color:var(--c-text);align-items:start}
.cwp-tr+.cwp-tr{border-top:1px solid var(--c-fill-1)}
.cwp-tr.cwp-th{color:var(--c-text-3);font-size:11px;padding-bottom:3px}
.cwp-td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.cwp-td-num{font-size:11px;letter-spacing:-.2px} /* 电话列数字小半号，11 位手机号在均分列宽内完整显示 */
.cwp-sub{font-size:10px;color:var(--c-warning);line-height:1.4} /* 行内状态小字（如“待邀请绑定”），信息不丢失 */
/* 密码有效时间：Radio 三选项等宽三列栅格（Ant Design Radio.Group 块状等分） */
.jp-opts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:4px 0}
.jp-opts label{display:flex;align-items:center;gap:6px;font-size:var(--fs-base);cursor:pointer}
/* 起止时间预览：两行 Descriptions，标签列对齐，日期字号与选项文字一致 */
.jp-range{margin-top:2px}
.jp-range-row{display:flex;align-items:baseline;gap:10px;padding:2px 0;font-size:var(--fs-base)}
.jp-range-k{flex:0 0 32px;color:var(--c-text-3)}
.jp-range-v{color:var(--c-text)}
.jp-range-days{color:var(--c-text-3);margin-left:4px}

/* ============ 考勤统计页（v1.0.2 同步，类名对齐小程序 att-stats.wxss） ============ */
.scope-line{font-size:var(--fs-sm);color:var(--c-text-2);margin:2px 2px 8px}
.scope-tag{color:var(--c-brand);font-weight:600}
.ym-bar{display:flex;align-items:center;justify-content:center;gap:18px;margin-bottom:10px}
.ym-nav{width:30px;height:30px;border-radius:50%;background:#fff;border:1px solid var(--c-border);display:flex;align-items:center;justify-content:center;font-size:16px;color:var(--c-text-2);cursor:pointer}
.ym-nav.dis{color:var(--c-text-4);cursor:default}
.ym-text{font-size:var(--fs-lg);font-weight:600}
.snap-row,.sum-row{display:flex;text-align:center;margin-top:8px}
.snap,.sum{flex:1}
.snap .n,.sum .n{font-size:18px;font-weight:700;line-height:1.3}
.snap .t,.sum .t{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:2px;white-space:nowrap}
.c-ok{color:var(--c-brand)}.c-late{color:#fa8c16}.c-early{color:#faad14}.c-leave{color:#1677ff}.c-miss{color:#ff4d4f}
.unpunch{font-size:var(--fs-sm);color:#ff4d4f;margin-top:10px;padding-top:8px;border-top:1px dashed var(--c-line)}
.unpunch.all-in{color:var(--c-brand)}
.rate-box{text-align:center;padding:6px 0 10px}
.rate-num{font-size:34px;font-weight:700;color:var(--c-brand);line-height:1.2}
.rate-pct{font-size:16px;font-weight:600;margin-left:2px}
.rate-label{font-size:var(--fs-sm);color:var(--c-text-2)}
.rate-sub{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:2px}
.dep-row{display:flex;align-items:center;padding:7px 0;border-bottom:1px solid #f0f1f3;font-size:var(--fs-md)}
.dep-row.thead{color:var(--c-text-3);font-size:var(--fs-xs);border-bottom:1px solid var(--c-line)}
.dep-row:last-child{border-bottom:none}
.dc{flex:1;text-align:center}
.dc-name{flex:1.6;text-align:left}
.mem-row{display:flex;align-items:center;justify-content:space-between;padding:9px 0;border-bottom:1px solid #f0f1f3}
.mem-row:last-child{border-bottom:none}
.mem-row.abn{background:#fffbf5;margin:0 -6px;padding-left:6px;padding-right:6px;border-radius:var(--r-sm)}
.mem-name{font-size:var(--fs-md);font-weight:600}
.mem-dept{font-size:var(--fs-xs);color:var(--c-text-3);font-weight:400;margin-left:6px}
.mem-stat{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:2px}
.mem-rate{font-size:15px;font-weight:700}
.sec-sub{font-size:var(--fs-xs);color:var(--c-text-4);font-weight:400;margin-left:6px}

/* ============ 我的项目面板（多项目，类名对齐小程序 projects.wxss） ============ */
.sec-title{font-size:var(--fs-sm);color:var(--c-text-3);margin:4px 2px 8px}
.list-card{padding:0 14px}
.proj-row{display:flex;align-items:center;justify-content:space-between;padding:13px 0;border-bottom:1px solid #f0f1f3;cursor:pointer}
.proj-row:last-child{border-bottom:none}
.pr-name{font-size:var(--fs-md);font-weight:600}
.tag-cur{display:inline-block;font-size:var(--fs-xs);color:var(--c-brand);background:var(--c-brand-bg);border-radius:var(--r-sm);padding:1px 6px;margin-left:6px;font-weight:400;vertical-align:middle}
.pr-role{font-size:var(--fs-xs);color:var(--c-text-3);margin-top:3px}
.pr-r{display:flex;align-items:center;gap:12px;flex-shrink:0}
.pr-switch{font-size:var(--fs-sm);color:var(--c-brand)}
.pr-quit{font-size:var(--fs-sm);color:#ff4d4f}
