/* ============================================================
   pm.com 统一主题 pm_theme.css（核心层）
   设计目标：现代、专业、清爽的项目管理后台风格。
   仅做"增量增强"，与原有 daxian_style.css / bootstrap 并存。
   P1-1 拆分后，本文件只含全站核心模块；页面特化模块见 pm_page_*.css。
   ============================================================ */

/* ============================================================ pm.com 统一主题 pm_theme.css 设计目标：现代、专业、清爽的项目管理后台风格。 仅做"增量增强"，与原有 daxian_style.css / bootstrap 并存，不直接覆盖其布局类。 ============================================================ */ :root {

  /* V2.6.66 配色重构：品牌色提饱和提明度（鲜亮），正文/底色走中性（沉稳）。
     五套主题的派生色统一按「主色兑白」的固定比例算，视觉轻重一致。 */
  --pm-primary:#1c6fd0;
  --pm-primary-d:#14539e;
  --pm-primary-h:#3c83d7;   /* hover：主色兑白 14% */
  --pm-primary-a:#1964bb;   /* active：主色压暗 10% */
  --pm-accent:#4d9bf5;
  --pm-bg:#f7fafd;
  --pm-text:#1f2937;
  --pm-muted:#6b7280;
  --pm-border:#e4eef9;
  --pm-card:#ffffff;
  --pm-radius:14px;
  --pm-shadow:0 10px 30px rgba(20,40,80,.10);
  --pm-shadow-lg:0 20px 60px rgba(0,0,0,.22);

  /* 派生：浅色标签底/描边、信息条（主题文件会整体覆盖） */
  --pm-tag-bg:#e8f1fa;
  --pm-tag-bd:#8eb7e8;
  --pm-info-bg:#f1f6fc;
  --pm-info-bd:#b6d1f0;

  /* 顶栏 / 插件顶栏（主题文件会整体覆盖；不覆盖时用下面这组深海军蓝） */
  --pm-topbar-bg:#0f3d78;
  --pm-topbar-a:#cad4e1;
  --pm-topbar-ink:#82b9f8;
  --pm-topbar-hover:#355c8e;
  --pm-topbar-shadow:0 2px 6px rgba(10,40,78,.38);
  --pm-nav-sel-bd:#82b9f8;
  --pm-clock-bd:#bbd9fb;

}
/* ---------- 通用工具类（供首页/统计/各页复用） ---------- */ /* .pagemargin 宽度由 99% 改为 100%： Bootstrap 的 .table-responsive 用 `margin-left/right:-15px` + `overflow-x:auto` 撑满栅格列。 容器只有 99% 宽时，这 15px 的负 margin 会顶出容器 —— 表格一横向滚动， 整页就跟着多出一条横向滚动条，页脚会被这条滚动条从中间切开（role.php 权限矩阵最明显）。 同时清掉 min-width，让窄屏能正常收缩。 */ .pagemargin {

  width:100%;
  max-width:none;
  box-sizing:border-box;
  overflow-x:hidden;
  /* 内容区左右留白（v2.3.43）。
     原先 .pagemargin 没有左右内边距，卡片边框直接贴内容区边缘、文字又贴边框，
     看起来像「没留白」；只有基本设置页靠页面内联的 .pm-setting-pad 才拉开，
     于是出现「同一套系统只有设置页好看」的错位。
     这里统一加在容器上——注意必须加在容器而不是卡片上：syslog 这类页面
     顶部还有 <h3> 标题、说明文字、统计行，它们也是 .pagemargin 的子元素，
     若只给卡片加 margin，标题仍贴边、与卡片左边缘差 16px，看着更歪。
     加在容器上则标题与卡片一起内缩，和基本设置页完全一致。
     16px 与卡片内 padding（18px 20px）、栅格 gutter 同一量级。
     各页面原先自建的 .pm-*-pad 左右留白已同步改为 0，避免叠成 32px。 */
  padding-left:16px;
  padding-right:16px;

}
/* 顶栏与内容卡片之间留出呼吸间距。 这里必须用通用兄弟选择器 `~` 而不是相邻选择器 `+`： head.php 结尾会无条件输出一段「导航分组下拉」的 <script>， .topbar / .anc_div 与 .pagemargin 之间永远夹着这段 script， `+` 一次也没命中过 —— 宽屏（≥1600px）下首页公告实测间距为 0，紧贴导航条。 间距取 24px（比其它处的 16px 略大）：它是内容区最顶部的一道留白， 下方还压着一张公告卡，16px 在 1920 屏上仍显局促。 中间隔着 .subnav 的页面由下方 .subnav ~ .pagemargin(20px) 覆盖，不会双重留白。 */ .topbar ~ .pagemargin, .anc_div ~ .pagemargin {
 margin-top:24px; 
}
/* 「页签工具条 .subnav（含按钮）+ 内容卡片」之间原本只有 .subnav 自带的 8px， 按钮会与下方列表粘在一起。这里统一把卡片往下推。 用通用兄弟选择器 `~` 而不是 `+`：default_announcement.php 等页面在 .subnav 与 .pagemargin 之间还夹着 <div class="clearboth">，相邻选择器命中不到。 */ .subnav ~ .pagemargin {
 margin-top:20px; 
}
.subnav {
 margin-bottom:0; 
}
/* ============================================================ 页面头组件（V2.6.35 · gantt.php 首次引入） ------------------------------------------------------------ .pm-page-head 面包屑 + 标题 + 描述 + 右侧动作按钮 的一行头 .pm-breadcrumb 面包屑（span 分隔符 + .is-current 当前页） .pm-tabs/.pm-tab 胶囊下划线式页签（.is-active 高亮） ⚠ 这三个块在 gantt.php 里位于 .pagemargin 之外，必须自带 16px 左右内边距（与 .pagemargin 的 padding-left/right 对齐）， 否则整块贴屏幕左缘（上线首日实测面包屑顶到 0,0）。 V2.6.35b：页面头改为与全站 .subnav 一致的「白色卡片工具条」风格 （背景 + 边框 + 圆角 + 阴影，margin 0 16px），消除 gantt.php 头部与 task/project 等列表页视觉语言不一致的突兀感。 ============================================================ */ .pm-page-head {

  display:flex; align-items:center; justify-content:space-between; gap:16px;
  margin:20px 16px 12px;
  padding:12px 16px;
  background:var(--pm-surface);
  border:1px solid var(--pm-line);
  border-radius:var(--pm-r-lg);
  box-shadow:var(--pm-sh-1);

}
.pm-page-head__main {
 min-width:0; 
}
.pm-page-head__title {

  display:flex; align-items:center; gap:9px;
  font-size:17px; font-weight:700; color:var(--pm-text);
  margin:5px 0 2px; line-height:1.3;

}
.pm-page-head__title .glyphicon {
 color:var(--pm-primary); font-size:16px; 
}
.pm-page-head__desc {
 font-size:12px; color:var(--pm-muted); margin:0; line-height:1.6; 
}
.pm-page-head__actions {
 flex:none; display:flex; align-items:center; gap:8px; padding-bottom:0; 
}
.pm-breadcrumb {
 font-size:12px; line-height:1.6; color:var(--pm-muted); 
}
.pm-breadcrumb a {
 color:var(--pm-muted); text-decoration:none; 
}
.pm-breadcrumb a:hover {
 color:var(--pm-primary); text-decoration:underline; 
}
.pm-breadcrumb__sep {
 margin:0 7px; color:#c3ccd9; 
}
.pm-breadcrumb .is-current {
 color:var(--pm-text); font-weight:600; 
}
.pm-tabs {

  display:flex; flex-wrap:wrap; gap:4px;
  margin:0 0 14px;
  padding-left:16px; padding-right:16px;
  border-bottom:1px solid var(--pm-border);

}
.pm-tab {

  display:inline-block; padding:8px 16px; margin-bottom:-1px;
  font-size:13px; line-height:1.4; color:var(--pm-muted); text-decoration:none;
  border:1px solid transparent; border-bottom:none;
  border-radius:8px 8px 0 0;
  transition:color .12s ease, background .12s ease;

}
.pm-tab:hover {
 color:var(--pm-primary); background:#f4f8fe; text-decoration:none; 
}
.pm-tab.is-active {

  color:var(--pm-primary); font-weight:700;
  background:var(--pm-card);
  border-color:var(--pm-border);
  border-bottom:1px solid var(--pm-card);   /* 激活页签用底色「焊」住分隔线 */

}
@media (max-width:720px) {

  .pm-page-head{ flex-direction:column; align-items:stretch; }
  .pm-page-head__actions{ padding-bottom:0; }

}
/* 列表页搜索条（.search_div）与下方列表/卡片之间原本零间距，粘成一坨。 这里统一给搜索条加下间距，并做轻微圆角，与整体卡片风格呼应。 pm_theme.css 在 daxian_style.css 之后加载，同特异性直接覆盖其 margin 定义。 */ .search_div {

  margin-bottom:14px;
  border-radius:8px;

}
/* ============================================================ 遗留小节标题：全站大量页面用 <span class="font_big18 fontbold">小节名</span> 当标题（项目概述 / 商机需求 / 任务描述 / 备注 / 操作记录 …）。 统一改造成「左侧渐变彩条 + 加粗深色字」的现代小节标题， 一处 CSS 生效于全部页面，不必逐个改老模板。 ============================================================ */ .font_big18.fontbold {

  display:inline-flex; align-items:center; gap:8px;
  font-size:15px; font-weight:700; line-height:1.5;
  color:var(--pm-text,#1f2b3d); letter-spacing:.2px;

}
.font_big18.fontbold::before {

  content:""; flex:0 0 auto;
  width:4px; height:15px; border-radius:3px;
  background:linear-gradient(180deg,var(--pm-primary,#2c6ecb),var(--pm-accent,#18a999));

}
/* 详情页区块间距（v2.6.34 优雅化）：替换历史 <tr><td>&nbsp;</td></tr> 空行， 用固定高度统一区块间呼吸，避免空行高度随字体/行高漂移 */ tr.pm-section-gap td {

  height:22px; padding:0; border:0; background:none; line-height:0;

}
tr.pm-section-gap td:hover {
 background:none; 
}
tr.pm-section-gap td br {
 display:none; 
}
/* message.php 等把它当表头（<th>）用，居中会难看，这里不做特殊处理即可 */ /* ============================================================ 富文本 / 长文本内容块 .pm-rich ------------------------------------------------------------ 项目概述、商机需求项、投标技术方案、交流确认情况、任务描述、备注、 操作记录、公告正文、文档正文……这些区块原本是「裸 HTML 直接 echo」， 贴着白色背景没有任何容器感，长文本读起来很散。 统一包一层淡色卡片：柔和描边 + 浅渐变底 + 舒适行高， 并给 h1~h6 / p / ul / ol / table / blockquote / code / img 补上版式。 ============================================================ */ .pm-rich {

  margin:10px 0 0;
  padding:14px 16px;
  background:linear-gradient(180deg,#fcfdff,#f7f9fd);
  border:1px solid #e8edf6;
  border-radius:12px;
  font-size:13.5px; line-height:1.9; color:#3a4860;
  word-break:break-word; overflow-wrap:break-word;

}
.pm-rich > :first-child {
 margin-top:0 !important; 
}
.pm-rich > :last-child {
 margin-bottom:0 !important; 
}
.pm-rich p {
 margin:0 0 10px; 
}
.pm-rich br + br {
 display:block; content:""; margin-top:4px; 
}
.pm-rich ul, .pm-rich ol {
 margin:0 0 10px; padding-left:22px; 
}
.pm-rich li {
 margin:3px 0; 
}
.pm-rich h1,.pm-rich h2,.pm-rich h3,.pm-rich h4,.pm-rich h5,.pm-rich h6 {

  margin:14px 0 8px; font-weight:700; color:var(--pm-text,#1f2b3d); line-height:1.5;

}
.pm-rich h1 {
 font-size:19px; 
}
.pm-rich h2 {
 font-size:17px; 
}
.pm-rich h3 {
 font-size:15.5px; 
}
.pm-rich h4,.pm-rich h5,.pm-rich h6 {
 font-size:14px; 
}
.pm-rich blockquote {

  margin:10px 0; padding:8px 14px;
  border-left:3px solid var(--pm-primary,#2c6ecb);
  background:#fff; border-radius:0 8px 8px 0; color:#5b6b82;

}
.pm-rich img {
 max-width:100%; height:auto; border-radius:10px;
}
/* ============================================================ 视频容器（V2.6.93 全功能编辑器） ------------------------------------------------------------ wangEditor 产出的视频是 <figure data-w-e-type="video"> 包 <video>， 对齐方式由 figure 上的 style/controls 处理；这里保证：  · 视频不撑破卡片（max-width + 自适应高度）；  · 默认给一块 16:9 的底，未加载/极短视频时不是一块空白；  · controls 显示（净化层已保留 controls 属性）。 ============================================================ */
.pm-rich figure[data-w-e-type="video"] {
 margin:10px 0;
}
.pm-rich figure[data-w-e-type="video"] video {
 max-width:100%; height:auto; border-radius:10px;
 background:#0b1626; min-height:120px;
}
.pm-rich figcaption {
 margin:6px 0 0; font-size:12.5px; color:#5b6b82; text-align:center;
}
.pm-rich table {
 width:100%; border-collapse:collapse; margin:8px 0 12px; font-size:13px; 
}
.pm-rich th, .pm-rich td {
 border:1px solid #e8edf6; padding:6px 9px; text-align:left; 
}
.pm-rich th {
 background:#f3f7fd; font-weight:600; color:var(--pm-text,#1f2b3d); 
}
.pm-rich code {

  padding:1px 5px; border-radius:5px; font-size:12.5px;
  background:#eef3fb; color:#38507a;

}
.pm-rich pre {

  margin:8px 0 12px; padding:12px 14px; border-radius:10px;
  background:#1f2937; color:#e5eaf3; overflow:auto; font-size:12.5px; line-height:1.7;

}
.pm-rich pre code {
 background:none; color:inherit; padding:0; 
}
.pm-rich a {
 color:var(--pm-primary,#2c6ecb); 
}
.pm-rich a:hover {
 text-decoration:underline; 
}
/* 纯文本（后台只填了文字、没有 HTML）时的简化版：不加容器，只优化行高 */ .pm-rich--plain {
 background:none; border:0; border-radius:0; padding:0; margin:6px 0 0; 
}
/* ============================================================ 页内列表（操作记录 / 备注 / 日志 / 子任务……） ------------------------------------------------------------ 老代码统一用 <table class="table table-striped table-hover glink">， Bootstrap 3 的默认观感偏"表格"：满框线、字号大、斑马纹对比强。 这里改成"卡片式列表"：外框圆角、内部分隔线、悬停高亮， 并把斑马纹降到几乎看不见，长列表更容易逐行扫读。 （选择器特意带上 .table-striped 以匹配 Bootstrap 的特异性，靠加载顺序取胜） ============================================================ */ table.glink {

  border-collapse:separate; border-spacing:0;
  border:1px solid #e8edf6; border-radius:11px;
  overflow:hidden; font-size:12.5px;

}
table.glink > thead > tr > th {

  background:#f4f7fc; border:0; border-bottom:1px solid #e8edf6;
  color:#5b6b82; font-weight:600; padding:9px 12px; vertical-align:middle;

}
table.glink > tbody > tr > td {

  border:0; border-top:1px solid #f0f4fa;
  padding:9px 12px; vertical-align:middle; line-height:1.8; color:#3a4860;

}
table.glink > tbody > tr:first-child > td {
 border-top:0; 
}
table.glink.table-striped > tbody > tr:nth-child(odd) > td, table.glink.table-striped > tbody > tr:nth-child(odd) > th {
 background-color:#fbfcfe; 
}
table.glink.table-striped > tbody > tr:hover > td, table.glink.table-striped > tbody > tr:hover > th {
 background-color:#f2f7ff; 
}
/* ============================================================ 过期任务卡片（home.php 首页看板，展示口径与 index.php 一致） ============================================================ */ .pm-card--warn {

  border-color:#f5dcc0;
  background:linear-gradient(180deg,#fffdf9,#fffaf3);
  box-shadow:0 8px 24px rgba(200,140,40,.10);

}
.pm-section-title--warn::before {

  background:linear-gradient(180deg,#f0a431,#e2712b);

}
.pm-section-title--warn .glyphicon {
 color:#d9821a; font-size:14px; 
}
.pm-section-title--warn .pm-section-sub {
 font-weight:400; 
}
.pm-od-live {

  display:inline-flex; align-items:center; gap:4px;
  padding:2px 9px; border-radius:999px;
  font-size:11.5px; font-weight:700; white-space:nowrap;
  color:#c0392b; background:#fdeeec; border:1px solid #f6d2cd;

}
/* 简易分页（首页过期任务用） */ .pm-pager {

  display:flex; align-items:center; gap:10px;
  margin-top:10px; padding-top:10px;
  border-top:1px solid #f3e4cf;
  font-size:12.5px;

}
.pm-pager a {

  padding:3px 10px; border-radius:7px;
  color:var(--pm-primary,#2c6ecb); background:#fff;
  border:1px solid #dde4ee; text-decoration:none;

}
.pm-pager a:hover {
 background:#f5f9ff; border-color:#bcd2f2; 
}
.pm-pager .pm-muted {
 padding:3px 10px; color:#b3bcc9; 
}
.pm-pager__info {
 margin-left:auto; color:#86909f; font-variant-numeric:tabular-nums; 
}
/* v2.4.12：禁用方向的分页按钮「隐身占位」——保持槽位尺寸、不响应点击。 若直接不渲染元素，flex 布局会随元素增减变化，点翻页后按钮位置跳动。 */ .pm-pager__off {
 visibility:hidden; pointer-events:none; 
}
/* 插件页脚（erp_footer / file_footer / help_footer 三处共用） 原为各自 inline style + 用「·」分隔，导致「关于」入口看起来像误插入的字符。 统一为：居中、灰色小字、「|」分隔、Powered by 带链接、链接有 hover 反馈。 */ .pm-plugin-foot {

	color:#9aa7bd;
	font-size:12px;
	line-height:1.9;
	text-align:center;
	padding-bottom:18px;

}
.pm-plugin-foot a {
 color:#8f9cb0; text-decoration:none; 
}
.pm-plugin-foot a:hover {
 color:var(--pm-primary,#2c6ecb); text-decoration:underline; 
}
/* project_view.php / default_task_edit.php 用的是「顶部导航后直接跟一张布局 table」 的老写法（没有 .pagemargin 包裹），页头会紧贴导航栏。 注意：这两页在 head 与布局 table 之间还夹着若干 <script>， 相邻兄弟选择器 `+` 命中不到，所以用「导航之后的第一个 body 级 table」来补白。 两栏布局里的 #main_right 高度由 pmFitRight() 实时测量，间距变化会自动适配。 */ .topbar ~ table:first-of-type {
 margin-top:16px; 
}
.pm-card {

  background:var(--pm-card);
  border:1px solid var(--pm-border);
  border-radius:var(--pm-radius);
  box-shadow:var(--pm-shadow);
  padding:18px 20px;
  /* 流式堆叠的卡片（update.php / setting.php / 系统菜单等多卡页面）之间留出间距。
     原 Bootstrap .panel 自带 20px 下边距，改版为 .pm-card 后该间距丢失，
     又只在部分页面用内联 style="margin-*" 补回、且常常漏补，导致卡片紧贴。
     这里统一给默认下边距，一劳永逸；flex/grid 容器不会用 .pm-card 作子项，不会与 gap 叠加。 */
  margin-bottom:16px;

}
/* 卡片直挂 .pagemargin 时的左右留白（v2.3.43）统一由 .pagemargin 的 padding-left/right 提供（见文件顶部 .pagemargin 规则），此处不再给卡片加 margin —— 加在卡片上会让同页的 <h3> 标题、说明文字、统计行仍贴边， 与卡片左边缘差 16px，比原来更歪。 */ .pm-section-title {

  display:flex; align-items:center; gap:8px;
  font-size:16px; font-weight:700; color:var(--pm-text);
  margin:0 0 14px;

}
.pm-section-title::before {

  content:""; width:4px; height:16px; border-radius:3px;
  background:linear-gradient(180deg,var(--pm-primary),var(--pm-accent));

}
.pm-muted {
 color:var(--pm-muted); 
}
.pm-badge {

  display:inline-block; padding:2px 9px; border-radius:999px;
  font-size:12px; line-height:1.6; background:#eef3fb; color:var(--pm-primary);
  border:1px solid #dce7f8;

}
.pm-badge--accent {
 background:#e6f7f4; color:var(--pm-accent); border-color:#cdeee9; 
}
.pm-badge--warn {
 background:#fff4e5; color:#c9760a; border-color:#ffe2bd; 
}
.pm-badge--done {
 background:#e8f7ec; color:#1f9d5b; border-color:#c8ecd6; 
}
.pm-badge--member {
 background:#eef3fb; color:var(--pm-primary); border-color:#dce7f8; text-decoration:none; 
}
.pm-stat {

  background:var(--pm-card); border:1px solid var(--pm-border); border-radius:var(--pm-radius);
  box-shadow:var(--pm-shadow); padding:14px 10px; text-align:center;
  display:block; text-decoration:none; color:inherit; cursor:pointer;
  position:relative; z-index:1;
  transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease;

}
.pm-stat:hover {

  transform:translateY(-2px); border-color:var(--pm-primary);
  box-shadow:0 6px 16px rgba(44,110,203,.14);
  /* v2.4.2：抬起的卡片必须压在同排/下排卡片之上。
     提升 z-index 只能解决「被相邻卡片盖住」，解决不了祖先 overflow 的裁剪 ——
     那由 .pm-stat-row 的 padding-top 让位处理。 */
  z-index:2;

}
.pm-stat__num {
 font-size:22px; font-weight:800; color:var(--pm-primary); line-height:1.1; 
}
.pm-stat__label {
 font-size:12px; color:var(--pm-muted); margin-top:4px; white-space:nowrap; 
}
/* 顶部导航轻微增强（不破坏原有 .topbar 布局） */ .topbar {
 box-shadow:0 1px 0 rgba(20,40,80,.06); 
}
/* ============================================================
   V2.6.90：顶栏吸顶（后台「系统设置 → 顶栏固定（吸顶）」可开关）
   ------------------------------------------------------------
   背景：页面一长，顶栏滚出视口后就再也点不到导航，长列表 / 长表单尤其难受。
   实现要点：
     · 用 position:sticky 而**不是** fixed —— 顶栏是 <body> 的直接子元素，
       sticky 不抽离文档流，下方内容无需额外补 padding-top，
       也不会出现 fixed 在打印、页面缩放、移动端软键盘弹出时的定位漂移。
     · z-index 取 1030：高于页面内容与表格吸顶表头，低于模态遮罩（2000），
       保证「模态能盖住顶栏、顶栏自身的提示气泡不被自己盖住」。
     · 顶栏底色本来是实色（--pm-topbar-bg），吸顶后不会透出下方内容；
       配了背景图时是「实色 + 图片」，同样不透明。
     · 修饰类由 pm_topbar_extra_class() 统一输出，主站与 10 个插件页一致。
   ============================================================ */
.topbar.pm-topbar--sticky {
 position: sticky;
 top: 0;
 z-index: 1030;
}
/* 真正贴住顶部之后才加投影：静止在页首时不投影，免得页面顶端多出一道横线。
   类由 pm_topbar_sticky_js() 在滚动超过 4px 时切换。 */
.topbar.pm-topbar--sticky.pm-topbar--stuck {
 box-shadow:0 6px 18px rgba(4,18,40,.22);
}
/* 窄屏自适应 */ @media (max-width:720px) {

  .pm-login__card{ flex-direction:column; }
  .pm-login__brand{ width:100%; }
  .pm-login__form{ width:100%; }

}
/* ============================================================ 首页（home.php）布局类 ============================================================ */ .pm-stat-row {

  display:grid; grid-template-columns:repeat(7,1fr); gap:12px;
  /* v2.4.2：给「悬停上移」留 3px 让位。
     .pm-stat:hover 会 translateY(-2px)，而本行常常是 .pagemargin（overflow:hidden auto
     滚动容器）里的第一个元素，卡片顶边贴着容器上沿（实测偏移 0）→ 抬起时顶部边框与圆角
     被裁掉，表现为「卡片被遮了一截」。这 3px 只影响首行顶部，视觉上察觉不到。 */
  padding-top:3px;

}
.pm-stat--done .pm-stat__num {
 color:#1f9d5b; 
}
.pm-stat--doing .pm-stat__num {
 color:#c9760a; 
}
.pm-stat--rate .pm-stat__num {
 color:var(--pm-accent); 
}
@media (max-width:1100px) {

  .pm-stat-row{ grid-template-columns:repeat(4,1fr); }

}
@media (max-width:640px) {

  .pm-stat-row{ grid-template-columns:repeat(2,1fr); }

}
.pm-section-sub {
 font-size:12px; font-weight:400; color:var(--pm-muted); 
}
/* 断点取 900：1024 的笔记本（常见分辨率）仍能保持「左窄右宽」； 页面本身有 min-width:960（daxian_style.css），再窄就会横向滚动。 */ @media (max-width:900px) {

  .pm-home-grid{ grid-template-columns:minmax(0,1fr); }
  .pm-home-grid__side{ display:block; }

}
@media (max-width:900px) {
 .pm-stat-row--home{ grid-template-columns:repeat(4,minmax(0,1fr)); } 
}
@media (max-width:640px) {
 .pm-stat-row--home{ grid-template-columns:repeat(2,minmax(0,1fr)); } 
}
.pm-card .pm-section-title {
 margin-bottom:10px; 
}
.pm-quick-grid {

  display:grid; grid-template-columns:repeat(2,1fr); gap:8px;

}
.pm-quick-item {

  display:flex; align-items:center; gap:7px;
  padding:9px 10px; border-radius:9px; text-decoration:none;
  background:#f6f9ff; border:1px solid #e2ebfa; color:var(--pm-text,#2b3445);
  font-size:13px; line-height:1.35; min-height:38px;
  transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease, background .12s ease;

}
.pm-quick-item:hover {

  background:#fff; border-color:var(--pm-primary,#2c6ecb); color:var(--pm-primary,#2c6ecb);
  transform:translateY(-1px); box-shadow:0 6px 14px rgba(44,110,203,.13);

}
.pm-quick-item .glyphicon {
 font-size:15px; color:var(--pm-primary,#2c6ecb); flex:0 0 auto; 
}
.pm-quick-item__t {

  min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:600;

}
/* 偶数项：让 4 个一行的卡片在视觉上两两成组 */ .pm-quick-item--alt {
 background:#f3fbf8; border-color:#d9efe9; 
}
.pm-quick-item--alt .glyphicon {
 color:var(--pm-accent,#18a999); 
}
.pm-quick-item--alt:hover {
 background:#fff; border-color:var(--pm-accent,#18a999); color:#128a7d; 
}
.pm-quick-empty {

  padding:22px 10px; text-align:center; font-size:13px; color:var(--pm-muted,#8a94a6);
  background:#fbfcfe; border:1px dashed var(--pm-border,#e3e8f0); border-radius:10px;

}
.pm-quick-empty .glyphicon {
 display:block; font-size:22px; margin-bottom:6px; opacity:.5; 
}
.pm-quick-empty a {
 color:var(--pm-primary,#2c6ecb); 
}
/* 全部模块被关闭时的首页空态（v2.6.3） */ .pm-home-empty {
 padding:48px 20px; text-align:center; 
}
.pm-home-empty__icon {
 font-size:40px; color:var(--pm-muted,#8a94a6); opacity:.45; margin-bottom:12px; display:block; 
}
.pm-home-empty__t {
 font-size:16px; font-weight:600; color:var(--pm-text,#2b3445); margin-bottom:6px; 
}
.pm-home-empty__d {
 font-size:13px; color:var(--pm-muted,#8a94a6); margin-bottom:16px; 
}
/* 后台「首页模块显示」：卡片式勾选框网格（v2.6.3） ⚠ 不要用 Bootstrap 的 .checkbox-inline + .col-sm-3 —— 本主题的行高会把 一行行标签压在一起（实测行距只剩 13px，看着像叠字）。 */ .pm-home-mod-list {

  display:grid; grid-template-columns:repeat(4,minmax(0,1fr));
  gap:10px 14px; margin:8px 0 16px;

}
@media (max-width:1100px) {
 .pm-home-mod-list{ grid-template-columns:repeat(3,minmax(0,1fr)); } 
}
@media (max-width:767px) {
 .pm-home-mod-list{ grid-template-columns:repeat(2,minmax(0,1fr)); } 
}
.pm-home-mod-item {

  display:flex; align-items:center; gap:8px; margin:0;
  padding:9px 12px; font-size:13px; font-weight:400; color:var(--pm-text);
  background:#f7fafd; border:1px solid var(--pm-border); border-radius:9px;
  cursor:pointer; transition:border-color .15s, background .15s;

}
.pm-home-mod-item:hover {
 border-color:var(--pm-primary); background:#f1f7ff; 
}
.pm-home-mod-item input {
 margin:0; flex:0 0 auto; 
}
.pm-home-mod-item.is-off {
 color:var(--pm-muted); background:#fff; 
}
.pm-home-mod-act {
 display:flex; align-items:center; gap:12px; flex-wrap:wrap; 
}
.pm-home-mod-tip {
 font-size:12px; color:var(--pm-muted); 
}
.pm-home-mod-tip b {
 color:var(--pm-primary); 
}
/* 后台「快捷工作台」配置页 */ .pm-quick-table td {
 vertical-align:middle !important; 
}
.pm-quick-table code {
 word-break:break-all; 
}
.pm-quick-form__act {
 margin-top:6px; display:flex; gap:8px; flex-wrap:wrap; 
}
.pm-navsort-off {

  display:inline-block; margin-left:8px; padding:1px 7px; border-radius:999px;
  font-size:11px; font-style:normal; font-weight:400;
  background:#fff4e5; color:#c9760a; border:1px solid #ffe2bd;

}
/* 导航排序页：归属下拉分组的徽章（如「项目管理」） */ .pm-navsort-grp {

  display:inline-block; margin-left:8px; padding:1px 7px; border-radius:999px;
  font-size:11px; font-style:normal; font-weight:400;
  background:#e8f0fe; color:var(--pm-primary,#2c6ecb); border:1px solid #c9dcfa;

}
.pm-navsort-bulk {

  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  margin-top:6px; padding-top:12px; border-top:1px dashed var(--pm-border,#e3e8f0);

}
.pm-filter-label {
 font-size:13px; color:var(--pm-muted); margin:0 6px 0 14px; 
}
#pm-filter .form-control {
 display:inline-block; width:auto; 
}
#pm-filter {
 padding:4px 2px; 
}
.pm-table {
 font-size:13px; margin-bottom:0; 
}
.pm-table th {
 white-space:nowrap; background:#f7f9fc; color:var(--pm-text); font-weight:600; 
}
.pm-table td {
 vertical-align:middle; 
}
.pm-nowrap {
 white-space:nowrap; 
}
/* 定宽表格：列宽严格按 th 的百分比分配，长文本不会把列撑开。 配合 .pm-cell-clip 做单行省略（全文用 data-pm-tip 悬停浮层看）。 用于列多、但必须一屏放下的管理列表（如客户单位：12 列）。 */ .pm-table-fixed {
 table-layout:fixed; width:100%; 
}
.pm-cell-clip {
 display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; 
}
/* 窄屏（≤1200px）：起止 / 实际完成时间两列是 10 字符日期，1024/960 档位 装不下「2027-01-30」这类内容会被裁（V2.6.23 发现：旧探针只测了 第一行所以漏掉）—— 压缩字号与左右内边距，保证任何行都不被裁。 V2.6.24：起止改单行后内容更长（「2026-08-22 ~ 2026-08-31」），窄屏下 起止列优先保完整（13%→15%、字号 10px），项目名让出宽度（18%→16%）—— 名称超长时省略号 + 悬停浮层有全文（含客户单位），不丢信息。 */ @media (max-width: 1200px) {

  .pm-proj-table .pm-proj-range,
  .pm-proj-table .pm-finish-time { font-size: 10px; }
  .pm-proj-table td { padding-left: 5px; padding-right: 5px; }
  .pm-proj-col-range { width:15%; }
  .pm-proj-col-name { width:16%; }

}
/* 系统设置表格：按内容量身分配列宽（说明列最宽，配置项/当前值/操作列收紧）
   v2.2.1：操作列由 90px 放宽到 200px —— 该列已从原来的「设置」单项增长为
   「设置 | 排序 | 快捷工作台 | 删除」多段入口，90px 会把整串挤成竖排换行。

   V2.6.120：table-layout 由 fixed 改回 auto。
   ⚠ 旧写法 fixed + 操作列定宽 200px + nowrap，是个「迟早溢出」的组合：
     定宽布局**忽略内容宽度**，而操作列内容（顶部导航那一行是
     「排序与显示 | 快捷工作台 | 快捷卡片」）实测 211px > 200px，
     多出来的 11px 直接撑宽整张表 → .table-responsive 冒出横向滚动条。
     表格本身仍是 100% 宽、页面没有横向滚动，所以只有盯着表格下沿才看得见，
     表现为设置页平白多出一条丑滚动条。
   auto 布局下百分比宽度退化为「期望宽度」提示：说明列按需收缩、
     操作列按内容自然撑到刚好放下 nowrap 链接串 → 恒等于容器宽，永不溢出。
   下面再给单元格补 overflow-wrap:anywhere：auto 布局的「最小宽度」按最长不可断
   片段算，而配置值里有长 URL（远程升级源 / 回执上报地址），不加这条会把
   整列顶宽、反而溢出。anywhere 参与最小宽度计算（break-word 不参与）。 */ .pm-set-table {
 table-layout:auto; width:100%; 
}
.pm-set-table td, .pm-set-table th {
 overflow-wrap:anywhere; 
}
.pm-set-table .pm-set-col-title {
 width:15%; 
}
.pm-set-table .pm-set-col-value {
 width:20%; 
}
.pm-set-table .pm-set-col-desc {
 width:auto; 
}
.pm-set-table .pm-set-col-act {
 width:200px; white-space:nowrap; 
}
.pm-set-table .pm-set-act {
 white-space:nowrap; 
}
.pm-set-table td {
 word-break:break-word; 
}
/* 操作列内的链接串：统一行内间距，避免「|」分隔符两侧贴字 */ .pm-set-table .pm-set-act > a, .pm-set-table .pm-set-act > span {
 display:inline-block; 
}
.pm-set-table td:first-child {
 font-weight:600; 
}
.pm-set-table td:nth-child(2) b {
 color:var(--pm-primary); 
}
/* 「顶部导航菜单」行：值列第一行是顺序链，第二行挂显隐徽章 */ .pm-set-navhide {
 margin-top:6px; font-size:12px; line-height:1.7; 
}
/* v2.4.3：配置项列表上方的固定说明（插件内部配置为何不在本页列出） */ .pm-set-hint {

  margin:-2px 0 10px; padding:7px 11px; font-size:12px; line-height:1.7;
  color:#5b6b82; background:#f4f7fc; border:1px solid var(--pm-border,#e2e9f5); border-radius:8px;

}
.pm-list {
 list-style:none; padding:0; margin:0; 
}
.pm-list li {
 padding:9px 2px; border-bottom:1px dashed var(--pm-border); font-size:14px; 
}
.pm-list li:last-child {
 border-bottom:none; 
}
.pm-list a {
 color:var(--pm-text); text-decoration:none; 
}
.pm-list a:hover {
 color:var(--pm-primary); 
}
.pm-list-meta {
 display:block; font-size:12px; color:var(--pm-muted); margin-top:2px; 
}
.pm-user-chips {
 display:flex; flex-wrap:wrap; gap:8px; 
}
.pm-user-chips .pm-badge--member {
 padding:5px 12px; font-size:13px; 
}
/* 项目成员管理 */ .pm-mem-stats {
 display:flex; flex-wrap:wrap; gap:8px; 
}
.pm-mem-alert {
 margin:0 0 14px 0; 
}
/* 标题为 flex 容器，float 无效，用 margin-left:auto 靠右 */ .pm-mem-search {
 display:flex; align-items:center; gap:6px; margin:0 0 0 auto; font-weight:400; 
}
.pm-mem-search .form-control {
 width:170px; 
}
.pm-mem-code {
 margin-top:3px; font-size:12px; color:var(--pm-muted,#8a94a6); 
}
.pm-mem-table td {
 vertical-align:middle; 
}
.pm-mem-chip {
 position:relative; padding-right:22px; 
}
.pm-mem-chip-del {

  position:absolute; right:6px; top:50%; transform:translateY(-50%);
  color:#c0504d; text-decoration:none; font-size:14px; line-height:1; font-weight:700;

}
.pm-mem-chip-del:hover {
 color:#a02c29; text-decoration:none; 
}
.pm-mem-editrow>td {
 background:#f7f9fc; 
}
/* 筛选条：四维度（关键字 / 状态 / 年份 / 成员配置）一行并列，窄屏自动换行。 原 .pm-mem-search 是「贴在标题右侧」的窄条，项目一多就不够用了，这里改为整行块级。 */ .pm-mem-filter {
 display:block; margin:0 0 12px; padding:12px 14px; background:#f7f9fc; border:1px solid var(--pm-border,#e6ebf3); border-radius:10px; font-weight:400;
}
.pm-mem-filter-row {
 display:flex; flex-wrap:wrap; align-items:center; gap:8px; 
}
.pm-mem-filter-row .form-control {
 width:auto; flex:0 1 auto; 
}
.pm-mem-filter-row .form-control[name="keyword"] {
 flex:1 1 260px; min-width:200px; 
}
.pm-mem-filter-row .form-control[name="psid"], .pm-mem-filter-row .form-control[name="year"], .pm-mem-filter-row .form-control[name="scope"] {
 flex:0 0 auto; min-width:118px; 
}
.pm-mem-filter-row .btn {
 flex:0 0 auto; 
}
.pm-mem-filter-tip {
 margin-top:8px; font-size:12px; line-height:1.7; color:#5a6b85; 
}
.pm-mem-edithd {
 margin-bottom:10px; font-size:14px; 
}
.pm-mem-edithd .pm-muted {
 display:block; margin-top:4px; font-size:12px; font-weight:400; 
}
.pm-mem-grid {
 display:flex; flex-wrap:wrap; gap:8px; 
}
.pm-mem-item {

  display:inline-flex; align-items:center; gap:6px; margin:0; font-weight:400;
  padding:5px 12px; border-radius:999px; font-size:13px; cursor:pointer;
  background:#fff; color:#6b7688; border:1px solid var(--pm-border,#e3e8f0);
  transition:background .12s ease, color .12s ease, border-color .12s ease;

}
.pm-mem-item input {
 margin:0; 
}
.pm-mem-item:hover {
 border-color:#b9c6dc; 
}
.pm-mem-item.is-on {
 background:#eef3fb; color:var(--pm-primary,#2f6fd0); border-color:#bcd4f5; 
}
.pm-mem-editft {
 margin-top:12px; display:flex; flex-wrap:wrap; align-items:center; gap:8px; 
}
.pm-mem-cnt {
 font-size:13px; color:var(--pm-muted,#8a94a6); 
}
.pm-bar {
 background:#eef1f7; border-radius:6px; height:12px; overflow:hidden; 
}
.pm-bar__fill {
 display:block; height:100%; border-radius:6px; 
}
/* 后台页面前台化：统一顶部子导航（卡片式工具条，与内容卡片留出间距） */ /* clear:both 不能去掉：顶栏里的 .nav_normal2 / .logininfo2 是左右浮动， head.php 结尾又没有可靠清除，浮动会一直「伸」到子导航这一行。 .pm-admin-nav 是 display:flex，自身形成 BFC，遇到浮动必须避让， 于是被压进两个浮动之间的窄缝（实测只剩 35px 宽）， 十几个按钮只好一列排下来、贴在右边缘 —— 看着像「设置导航塌成一坨」。 .pm-admin-subnav 是普通块，加 clear 把它挪到所有浮动下面，宽度就恢复正常。 */ .pm-admin-subnav {
 width:99%; margin:12px auto 14px 0; padding:0; clear:both; 
}
.pm-admin-nav {

  display:flex; flex-wrap:wrap; align-items:center; gap:8px;
  background:var(--pm-card);
  border:1px solid var(--pm-border);
  border-radius:var(--pm-radius);
  padding:10px 12px;

}
.pm-admin-nav .btn {
 margin:0; 
}
.pm-admin-nav .btn.active {

  background:#eef3fb;
  border-color:var(--pm-primary);
  color:var(--pm-primary);
  font-weight:600;
  box-shadow:none;

}
.pm-admin-nav-right {
 margin-left:auto; 
}
/* 后台表单卡片：表单控件间距与标签样式 */ .pm-form .form-group {
 margin-bottom:16px; 
}
.pm-form label {
 font-weight:600; 
}
.pm-form .help-block {
 font-size:12px; color:var(--pm-muted); 
}
/* 关键任务节点标记（朱红徽标） */ .pm-critical-tag {

  display:inline-block;
  background:#fdeaea;
  color:#d0021b;
  border:1px solid var(--pm-danger-bd,#f5c6c6);
  border-radius:4px;
  font-size:12px;
  line-height:1.5;
  padding:1px 7px;
  margin-right:6px;
  font-weight:700;
  vertical-align:middle;
  white-space:nowrap;

}
/* 实际完成时间 */ .pm-finish-time {
 color:#1f9d5b; font-weight:600; white-space:nowrap; 
}
/* ============================================================ 任务优先级标识（v2.6.0 · 公共层） ------------------------------------------------------------ 优先级自 v2.6.0 起由 daxian_task_priority 表驱动，全站统一用 pm_task_priority_badge() 输出「彩色圆点 + 名称」，因此样式必须放公共层， 否则任务列表 / 项目详情 / 我的任务 / 任务详情四处各写一份必然走样。 ⚠ 为什么不用整块彩色底 + 白字：颜色是用户在后台自选的， 选到浅黄/浅绿时白字直接看不清。圆点是「形状固定、只换颜色」， 深浅都不影响可读性，也不会在窄列（70px）里把行高撑开。 ⚠ 类名以 pm-prio- 开头独占一族：pm_theme.css 里已有 .pm-bar（进度条） 被顶栏撞过一次，新增公共类前一定先 grep 同名规则。 ============================================================ */ .pm-prio {
 display:inline-flex; align-items:center; white-space:nowrap; line-height:1.4; 
}
.pm-prio > i {

  display:inline-block; width:9px; height:9px; border-radius:50%;
  margin-right:5px; flex:0 0 auto;
  box-shadow:0 0 0 1px rgba(0,0,0,.08) inset;

}
/* 大一号（配置页、详情页标题区用） */ .pm-prio--lg > i {
 width:13px; height:13px; margin-right:6px; 
}
/* 无此项 / 已删除时自动回落成灰点，无需页面额外判断 */ .pm-prio--none > i {
 background:#ced4da; 
}
/* ============================================================ 任务超期标记 / 延期次数（v2.6.0 · 公共层） ------------------------------------------------------------ 超期是「必须立刻看见」的状态，所以用实心红底白字 + 警示图标， 与优先级那种「只是分类」的灰调圆点区分开： · .pm-task-overdue 红底胶囊，任务列表 / 项目详情 / 审批页通用 · .pm-task-ext 琥珀色「延期 N 次」，0 次不出现（否则满屏 0 很吵） ⚠ 这两个类名不要复用去表达其他含义，超期/延期在全站是唯一的语义。 ============================================================ */ .pm-task-overdue {

  display:inline-block; padding:1px 7px; margin:0 2px; border-radius:9px;
  background:#e03131; color:#fff; font-size:12px; line-height:18px;
  white-space:nowrap; font-weight:600;

}
.pm-task-overdue .glyphicon {
 font-size:11px; margin-right:2px; 
}
/* 表格行内的「超期」不要撑高行高 */ .pm-table .pm-task-overdue {
 line-height:17px; 
}
/* v2.6.9 严重超期：更深红底色，与常规超期区分 */ .pm-task-overdue--severe {
 background:#b71c1c; 
}
.pm-task-overdue--severe b {
 color:#ffcdd2; 
}
/* v2.6.1 蓝色信息条：计划/关联被锁定的说明。 ⚠ 与红色 .pm-lockbar（超期锁定，内联在 task_lock_notice.php）刻意分开： 红色=系统禁止你动，蓝色=这不是你的权限、但任务本身没问题。 */ .pm-notice {
 padding:9px 14px; border-radius:4px; font-size:13px; line-height:1.75; 
}
.pm-notice--info {
 background:var(--pm-info-bg,#f1f7fd); border:1px solid var(--pm-info-bd,#cfe2f3); border-left:4px solid var(--pm-primary,#2c6ecb); color:var(--pm-primary-d,#1d4a85); 
}
.pm-notice .glyphicon {
 margin-right:6px; 
}
/* v2.6.1：计划时间后面的小锁。只给「不能改计划的人」看， 颜色刻意压暗（不是错误色）——它是状态说明，不是警告。 */ .pm-plan-lock {
 font-size:11px; color:#8a94a6; margin-left:3px; cursor:help; vertical-align:1px; 
}
.pm-task-ext {

  display:inline-block; padding:1px 7px; margin:0 2px; border-radius:9px;
  background:#fff4e6; color:#b35c00; border:1px solid var(--pm-warn-bd,#ffd8a8);
  font-size:12px; line-height:18px; white-space:nowrap;

}
.pm-task-ext .glyphicon {
 font-size:11px; margin-right:2px; 
}
/* V2.6.89：延期徽章的第二张脸 —— 「已提交申请、等待审批」。
   与「已延期 N 次」（琥珀，历史累计）区分：这条说的是**当前**有没有人在流程里。
   蓝色 = 信息态，不是警告：申请中本身不是错误，超期才是（超期另有红色徽章）。 */
.pm-task-ext--wait {
 background:var(--pm-info-bg,#eaf3fd); color:var(--pm-info-fg,#1d5fa8); border-color:var(--pm-info-bd,#bcd8f5);
}
/* 超期行整体轻微染底，方便在长列表里一眼扫到（不覆盖 hover 效果） */ .pm-table > tbody > tr.pm-row-overdue > td {
 background:#fffafa; 
}
.pm-table > tbody > tr.pm-row-overdue:hover > td {
 background:#fff1f1; 
}
/* 任务阶段徽标（详情页信息表） */ .pm-stage-tag {

  display:inline-block; background:#eef3fb; color:var(--pm-primary);
  border:1px solid #dce7f8; border-radius:4px;
  font-size:12px; line-height:1.5; padding:1px 8px; font-weight:700; white-space:nowrap;

}
/* 项目完成进度条 */ .pm-progress {
 display:inline-block; width:84px; height:8px; border-radius:6px; background:#eef1f6; vertical-align:middle; overflow:hidden; margin-right:8px; 
}
.pm-progress-bar {
 height:100%; border-radius:6px; background:linear-gradient(90deg,var(--pm-primary,#2c6ecb),var(--pm-accent,#5b9bef)); 
}
.pm-progress-label {
 display:inline-block; min-width:38px; font-size:12px; color:var(--pm-muted,#8a94a6); vertical-align:middle; 
}
/* ============ 详情页信息表现代化（项目/任务/日志/用户详情共用 info_task_bg） ============ */ .info_task_bg {

  width:100%; border-collapse:separate; border-spacing:0;
  background:#fff; border:1px solid var(--pm-border); border-radius:10px;
  box-shadow:0 2px 8px rgba(20,40,80,.05); overflow:hidden;

}
.info_task_bg td {

  padding:10px 14px; border-bottom:1px solid #f0f3f8;
  font-size:13px; line-height:1.6; color:#33405a; vertical-align:middle;

}
.info_task_bg tr:last-child td {
 border-bottom:0; 
}
.info_task_bg tr:hover td {
 background:#fbfcfe; 
}
.info_task_bg .info_task_title {

  background:#f7f9fc; color:var(--pm-muted); font-weight:600;
  white-space:nowrap; border-right:1px solid #f0f3f8;

}
.info_task_bg tr:hover .info_task_title {
 background:#f2f5fa; 
}
.info_task_bg a {
 color:var(--pm-primary); text-decoration:none; 
}
.info_task_bg a:hover {
 text-decoration:underline; 
}
/* 值区内的徽章 / 状态 / 标签垂直居中，避免与文字基线错位 */ .info_task_bg td > .pm-badge, .info_task_bg td > .view_task_status, .info_task_bg td > .status_view, .info_task_bg td > .pm-finish-time, .info_task_bg td > .pm-stage-tag, .info_task_bg td > .pm-critical-tag, .info_task_bg td > .pm-task-ext {
 vertical-align:middle; 
}
/* 任务详情「完成」徽章与状态文字间距 */ .info_task_bg .view_task_status {
 display:inline-block; 
}
/* 详情信息表「标签列」胶囊化（v2.6.34 优雅化） —— 保持表格结构不变，仅把左列标题文字套上 .pm-capsule 胶囊， 扫读性优于整列灰底，且与全站徽章/标签语言统一。 */ .info_task_bg .info_task_title {

  background:#fafbfd; border-right:1px solid #f0f3f8;

}
.info_task_bg tr:hover .info_task_title {
 background:#f4f7fb; 
}
.pm-capsule {

  display:inline-block; padding:2px 10px; border-radius:999px;
  background:#f1f5fa; border:1px solid var(--pm-line,#e8edf6);
  color:var(--pm-muted); font-size:12px; font-weight:600; letter-spacing:.3px;
  white-space:nowrap; line-height:1.5;

}
.info_task_bg .info_task_title .pm-capsule {

  background:#eef3fb; border-color:#dde7f5; color:#5b6b82;

}
.info_task_bg tr:hover .info_task_title .pm-capsule {

  background:#e8eff9; border-color:#d3e1f3;

}
/* 胶囊状态变体：用于「超出/剩余」「逾期/正常」等对比语义 */ .pm-capsule--danger {

  background:#fdf1ef; border-color:#f0d3ce; color:#c0392b;

}
.pm-capsule--success {

  background:#eef8f2; border-color:#d5ecdd; color:#1e8e5a;

}
/* ============================================================
   详情/编辑页「元信息条」.pm-metabar（V2.6.84）
   ------------------------------------------------------------
   这块原本借用 <ul class="breadcrumb"> 装 3 条元信息
   （所属项目 / 上级任务 / 创建 / 任务ID），V2.6.83 只是把它挪正了位置
   却没改外观，于是暴露出三个「与整页不匹配」的问题：
     ① .breadcrumb 自带背景色（暗色下被第 13 节映射为 --pm-card），
        但 padding:0、无描边、无圆角 → 渲染成一块"比页面底色浅、
        文字紧贴四边"的裸色块；而本页其余容器（WBS 侧栏 / 信息表卡片）
        全是 描边+圆角+内边距 的卡片语言，两者根本不是一个体系；
     ② 每条都被主题改成整行块级 li（宽 100%），"上级任务: —" 只占四个字，
        右半边近 900px 全空；两条叠起来还多占一行高度；
     ③ 右侧「创建/任务ID」float:right 后与左侧各说各话，视觉重心断裂。
   方案：不再借用 breadcrumb，独立成 .pm-metabar：
     · 单行 flex：左侧元信息组 + 右侧审计信息组（aside 用 margin-left:auto 顶到右边）；
     · 自带 内边距 / 1px 描边 / 8px 圆角 / --pm-card 底 —— 与页面卡片同语言，
       但因为只有一行高、字小，读起来是"安静的补充条"，不抢标题的戏；
     · 标签 --pm-muted、值 --pm-text 两级文字，长项目名用省略号截断不换行；
     · ≤900px 自动换行，右侧组跟随换到第二行并左对齐（不再浮动）。
   ============================================================ */
.pm-metabar {
  display:flex; flex-wrap:wrap; align-items:center; gap:4px 20px;
  margin:10px 0 2px; padding:6px 12px;
  background:var(--pm-card,#ffffff);
  border:1px solid var(--pm-line,#e8f1fa);
  border-radius:var(--pm-r-md,8px);
  font-size:12px; line-height:1.7; color:var(--pm-text,#1f2937);
}
.pm-metabar__list {
  display:flex; flex-wrap:wrap; align-items:center; gap:4px 20px;
  margin:0; padding:0; list-style:none; min-width:0;
}
.pm-metabar__item {
  display:inline-flex; align-items:baseline; gap:6px;
  min-width:0; white-space:nowrap;
}
/* 标签：弱化一档，与值拉开层级（原来标签和值同为 --pm-text，一整行糊在一起） */
.pm-metabar__k {
  flex:0 0 auto; color:var(--pm-muted,#6b7280);
}
.pm-metabar__v {
  min-width:0; max-width:22em; overflow:hidden; text-overflow:ellipsis;
  color:var(--pm-text,#1f2937); font-weight:500;
}
/* 「空值」态（上级任务被删 / 无项目）降为 muted：要写成 .pm-metabar__v.pm-muted，
   因为全局 .pm-muted 与 .pm-metabar__v 同特异度且写在本文件更早处，单写 .pm-muted 压不住。
   注意里面的 <a> 仍由下一条规则给主色 —— 有内容时依旧是可点的蓝链接。 */
.pm-metabar__v.pm-muted {
  color:var(--pm-muted,#6b7280); font-weight:400;
}
/* 为什么写成 .pm-metabar__item .pm-metabar__v a（多为一个 class）而不是 .pm-metabar__v a：
   本文件不带 [data-pm-mode] 前缀，单写只有 (0,1,1)，与 pm_dark.css 里
   [data-pm-mode="dark"] a{ color:var(--pm-info-fg) } 同特异度，而它在本文件之后加载
   → 暗色下会被那条全局链接色顶掉（实测拿到 #8fc0ff，--pm-primary-ink 根本没生效）。
   加一层 .pm-metabar__item 提到 (0,2,1) 才压得住。
   --pm-primary-ink 只在暗色层定义（品牌色 62% 混白），亮色下 fallback 取品牌色本身；
   这样暗色里链接跟着 5 套配色一起提亮，与相邻信息表 .info_task_bg a 同色。 */
.pm-metabar__item .pm-metabar__v a {
  color:var(--pm-primary-ink,var(--pm-primary,#1c6fd0)); text-decoration:none;
}
.pm-metabar__item .pm-metabar__v a:hover {
  text-decoration:underline;
}
 /* 右侧审计信息（创建人 / 任务ID）：整体降一档，只作追溯用 */
.pm-metabar__aside {
  display:inline-flex; align-items:center; flex-wrap:wrap; gap:4px 18px;
  margin-left:auto; padding-left:20px; white-space:nowrap;
}
.pm-metabar__aside .pm-metabar__v {
  font-weight:400; color:var(--pm-muted,#6b7280);
}
.pm-metabar__aside .pm-metabar__v a {
  color:var(--pm-muted,#6b7280); text-decoration:underline; text-decoration-style:dotted;
}
.pm-metabar__aside .pm-metabar__v a:hover {
  color:var(--pm-primary-ink,var(--pm-primary,#1c6fd0));
}
@media (max-width:900px) {
  .pm-metabar { gap:2px 14px; padding:6px 10px; }
  .pm-metabar__list { gap:2px 14px; }
  .pm-metabar__aside { margin-left:0; padding-left:0; gap:2px 14px; }
  .pm-metabar__v { max-width:none; white-space:normal; }
}
/* 任务详情「关联交付物」只读展示行（v2.6.4）：本页只看，编辑走「编辑」入口 */ .pm-linkview {
 display:flex; flex-wrap:wrap; align-items:center; gap:8px 18px; 
}
.pm-linkview__item {
 display:inline-flex; align-items:center; gap:6px; min-width:0; 
}
.pm-linkview__k {

  flex:0 0 auto; padding:1px 7px; border-radius:5px;
  background:#eef3fb; color:var(--pm-muted); font-size:12px;

}
.pm-linkview__item a {
 max-width:320px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; 
}
.pm-linkview__edit {

  display:inline-flex; align-items:center; gap:4px;
  padding:2px 9px; border:1px solid var(--pm-border); border-radius:6px;
  font-size:12px; color:var(--pm-primary); background:#fbfcfe;

}
.pm-linkview__edit:hover {
 background:#f1f7ff; border-color:var(--pm-primary); text-decoration:none; 
}
.pm-linkview__lock {
 font-size:12px; 
}
/* 详情页大标题 */ .pm-detail-title h2 {

  margin:0 0 10px; padding-left:12px;
  font-size:20px; font-weight:700; color:#223049; line-height:1.4;
  border-left:4px solid var(--pm-primary); word-break:break-word;

}
/* 项目编号（信息表内） */ .pm-detail-code {

  display:inline-block; font-weight:700; letter-spacing:.3px; color:var(--pm-primary);
  background:#eef3fb; border:1px solid #dce7f8; border-radius:5px; padding:1px 8px;

}
@media (max-width:900px) {
 .pm-task-cols{ grid-template-columns:1fr; } 
}
.pm-task-list {
 list-style:none; margin:0; padding:0; 
}
.pm-task-list li {

  padding:8px 0; border-bottom:1px solid #eef1f6;

}
.pm-task-list li:last-child {
 border-bottom:0; 
}
.pm-task-title {

  display:block; font-size:13px; font-weight:600; color:#2c3a52; line-height:1.5;
  text-decoration:none; word-break:break-word;

}
.pm-task-title:hover {
 color:var(--pm-primary); text-decoration:none; 
}
.pm-task-meta {

  display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:5px;

}
.pm-task-proj {

  font-size:12px; color:var(--pm-primary); background:#eef3fb;
  border:1px solid #dce7f8; border-radius:4px; padding:0 6px;
  display:inline-block; max-width:100%;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;

}
.pm-task-type {

  font-size:12px; color:#5a4a8a; background:#f0edfa;
  border:1px solid #ddd5f2; border-radius:4px; padding:0 6px;
  display:inline-block; white-space:nowrap;

}
.pm-task-status {

  font-size:12px; border-radius:4px; padding:1px 7px; white-space:nowrap;

}
.pm-task-status--open {
 color:#b37400; background:#fff4e5; border:1px solid #ffe2bd; 
}
.pm-task-status--done {
 color:#17804a; background:#e8f7ec; border:1px solid #c8ecd6; 
}
.pm-task-owner {
 font-size:12px; color:#5b6478; white-space:nowrap; 
}
.pm-task-date {
 font-size:12px; color:var(--pm-muted); white-space:nowrap; 
}
.pm-task-empty {
 padding:14px 0 18px; text-align:center; font-size:13px; color:var(--pm-muted); 
}
/* 首页任务列表：单行五列（项目名称 / 任务名称 / 任务类型 / 执行人 / 日期时间） */ .pm-task-scroll {
 overflow-x:auto; 
}
.pm-task-table {

  width:100%; margin:0; font-size:12.5px; table-layout:fixed;
  background:transparent;

}
.pm-task-table th {

  background:#eef3fb; color:#46536b; font-weight:600; font-size:12px;
  padding:6px 8px; white-space:nowrap; border-bottom:1px solid #dde3ec;

}
.pm-task-table td {

  padding:7px 8px; vertical-align:middle; border-top:1px solid #eef1f6;
  word-break:break-word;

}
.pm-task-table tbody tr:hover {
 background:#f8fbff; 
}
.pm-task-table .pm-tt-proj {
 width:22%; 
}
.pm-task-table .pm-tt-title {
 width:30%; 
}
.pm-task-table .pm-tt-type {
 width:16%; 
}
.pm-task-table .pm-tt-owner {
 width:14%; 
}
.pm-task-table .pm-tt-date {
 width:18%; 
}
.pm-task-table .pm-task-title {

  display:block; max-height:3em; overflow:hidden;

}
/* 关键节点标识与任务名同行显示 */ .pm-tt-titlewrap {
 display:flex; align-items:flex-start; gap:0; 
}
.pm-tt-titlewrap .pm-critical-tag {
 flex:0 0 auto; margin-top:1px; 
}
.pm-tt-titlewrap .pm-task-title {
 flex:1 1 auto; min-width:0; 
}
.pm-task-table .pm-task-proj {
 max-width:100%; 
}
/* 宽屏时两栏并排，五列同现；窄屏（<1100px）拆为单栏，给表格更多横向空间 */ @media (max-width:1100px) {

  .pm-task-cols{ grid-template-columns:1fr; }

}
@media (max-width:760px) {

  .pm-task-table{ table-layout:auto; min-width:620px; }
  .pm-task-table .pm-tt-proj, .pm-task-table .pm-tt-title,
  .pm-task-table .pm-tt-type, .pm-task-table .pm-tt-owner,
  .pm-task-table .pm-tt-date{ width:auto; }

}
@media (max-width:640px) {

  .pm-ms-biz__row{ display:block; }
  .pm-ms-biz__date{ display:block; width:100%; margin-top:8px; }

}
@media (max-width:900px) {
 .pm-ms-cell{ width:100%; } 
}
/* 阶段分组（V2.6.39：标题层次化——序号徽章 + 主色竖条 + 渐变分隔线， 颜色全部走主题变量，四套主题自动适配；序号 counter 在 .pm-mgroups 上重置） */ .pm-mgroups {
 counter-reset:pm-mgroup-idx; 
}
/* 两项字段：节点要求 / 实际完成时间 —— 标签+数值成对排布，纵向对齐便于扫读。 第一列定宽，保证「实际完成时间」在各条目间起始位置一致（视觉更整齐）。 */ .pm-milestone__fields {

  display:flex; flex-wrap:wrap; gap:7px 16px;
  margin:7px 0 0; padding:0;

}
/* 鼠标悬停信息浮层：项目名称/编号上显示「当前阶段进度情况」 */ .pm-hover-info {
 position:relative; cursor:help; 
}
.pm-hover-info.is-link, a.pm-hover-info {
 text-decoration:none; 
}
a.pm-hover-info:hover {
 text-decoration:underline; 
}
/* 只写了 data-pm-tip 的元素（全站原生 title 已统一换成它）也给「可悬停」光标提示， 不必再逐个补 .pm-hover-info（省掉改 class 带来的重复/覆盖风险） */ [data-pm-tip] {
 cursor:help; 
}
.pm-hover-tip {

  position:fixed; z-index:20000; display:none;
  max-width:340px; min-width:180px;
  background:rgba(30,41,59,.96); color:#f2f5fa;
  border-radius:8px; padding:10px 13px;
  box-shadow:0 8px 24px rgba(15,23,42,.28);
  font-size:12.5px; line-height:1.75; font-weight:400;
  text-align:left; white-space:pre-wrap; word-break:break-word;
  pointer-events:none;

}
.pm-hover-tip.is-on {
 display:block; 
}
/* 内嵌模式（data-pm-tip-in="1"）：浮层收进元素内部。 用于统计卡片这类「下方紧跟下一行卡片」的小元素 —— 浮层落在外面会压住下排卡片。 紧凑化并贴底部内侧：气泡替代标签的位置，保住上方的主数字。 */ .pm-hover-tip--in {

  padding:6px 10px; font-size:12px; line-height:1.5; min-width:150px;
  border-radius:6px; box-shadow:0 4px 14px rgba(15,23,42,.34);

}
.pm-hover-tip__title {

  display:block; margin-bottom:5px; padding-bottom:5px;
  border-bottom:1px solid rgba(255,255,255,.18);
  font-size:12px; font-weight:700; letter-spacing:.4px;
  color:#8fc0ff;

}
.pm-hover-tip__empty {
 color:#9fb0c7; font-style:normal; 
}
/* 各类型项目统计表 */ .pm-typestat-table td, .pm-typestat-table th {
 text-align:center; 
}
.pm-typestat-table .pm-typestat-name {
 text-align:left; white-space:nowrap; font-weight:600; 
}
.pm-type-dot {

  display:inline-block; width:8px; height:8px; margin-right:7px;
  border-radius:50%; vertical-align:middle;
  background:linear-gradient(135deg,var(--pm-primary),var(--pm-accent));

}
.pm-user-dot {

  display:inline-block; width:8px; height:8px; margin-right:7px;
  border-radius:50%; vertical-align:middle;
  background:linear-gradient(135deg,var(--pm-accent,#7a5cd0),var(--pm-primary,#2c6ecb));

}
/* 公告重要标识（颜色由 daxian_anc_level.level_color 决定，样式内联生成） */ .pm-level-badge {

  display:inline-block; padding:1px 8px; border-radius:999px;
  font-size:12px; font-weight:700; line-height:1.6;
  border:1px solid transparent; white-space:nowrap; vertical-align:middle;

}
.pm-color-input {

  width:46px; height:32px; padding:2px; border:1px solid var(--pm-border);
  border-radius:6px; background:#fff; cursor:pointer; vertical-align:middle;

}
.pm-color-chip {

  display:inline-block; width:14px; height:14px; border-radius:4px;
  vertical-align:middle; margin-right:6px; border:1px solid rgba(0,0,0,.10);

}
.pm-color-row {
 display:flex; align-items:center; gap:12px; 
}
@media (max-width:640px) {

  .pm-anc-item{ flex-direction:column; align-items:flex-start; gap:6px; }
  .pm-anc-item__act{ padding-left:0; }

}
/* 公告正文列表符号的还原规则在 pm_page_announcement.css，这里只留窄屏微调。
   ⚠ V2.6.115 修复：本行原本是那段注释的残体（少了收尾符），注释一路吞掉下面
   的 @media 块与 .pm-typestat-table .pm-progress / .pm-typestat-pct 两条规则
   （花括号计数仍平衡，肉眼查不出）。动这一带先数注释收尾符。 */
@media (max-width:640px) {

  .pm-ancview{ padding:16px; }
  .pm-ancview__acts{ margin-left:0; width:100%; }
  .pm-ancview__title{ font-size:18px; }
  .pm-ancview__meta{ gap:12px; }

}
.pm-typestat-table .pm-progress {
 /* V2.6.115：改为随列宽流动（原 min-width:70px + 基态 width:84px，在定宽列里
    会顶破单元格 → 表格内部出横向滚动条）。列宽已由 table-layout:fixed 定槽，
    同一列各行宽度天然一致，不需要再靠固定像素对齐。 */
 width:100%; max-width:120px; min-width:0; margin:0 auto 3px;
}
.pm-typestat-pct {
 font-weight:700; 
}
.pm-typestat-total td {
 /* V2.6.78：#f7f9fc 是死值，暗色下不跟随（实际渲染时还被别的规则顶成透明），
    合计行与普通行完全同色，只剩 bootstrap 那条 #ddd 的白线做分隔 → 很突兀。
    改走变量：亮 #f3f7fc、暗 #1f2d44，合计行自然比数据行深一档。 */
 background:var(--pm-row-hover,#f7f9fc); font-weight:600;
}
/* 合计行顶线：bootstrap 给 .table > tfoot > tr > td 设了 border-top:1px solid #ddd，
   亮色下是条浅灰线没问题，暗色下就是一道白线。这里换成主题描边变量，
   亮暗两侧都成立（同特异性、本文件在 bootstrap 之后，能正常覆盖）。 */
.pm-typestat-table > tfoot > tr > td,
.pm-typestat-table > tfoot > tr > th {
 border-top:1px solid var(--pm-border,#ddd);
}
.pm-typestat-total .pm-typestat-name {
 color:var(--pm-text); 
}
.pm-typestat-hint {

  margin-top:10px; padding-top:9px; border-top:1px dashed var(--pm-border);
  font-size:12px; color:var(--pm-muted); line-height:1.7;

}
/* ------------------------------------------------------------
   各类型项目统计：列宽定槽 + 窄屏降档（V2.6.115）
   ------------------------------------------------------------
   问题：8 列表格的 min-content 宽约 676px。首页是「260px 侧栏 + 主列」的
   grid，视口 1024 以下主列 < 700px，表格必然超出 .table-responsive 容器，
   于是表格内部出现横向滚动条（整页并没有溢出，只有这一块出滚动条，很丑）。

   做法：
   1) table-layout:fixed + th 百分比列宽 → 表格宽恒等于容器宽，结构上不可能
      再溢出，任何宽度下都不会出现横向滚动条；
   2) 视口 ≤1128px 再降一档：只留「项目类型 / 项目完成率 / 任务完成率」三列，
      项目数・已完成・进行中・任务总数・已完成任务 5 列收起，数字改以
      .pm-typestat-sub 小字显示在类型名下方 —— 信息不丢、列不挤（比硬塞 8 列
      挤成一团好看，也比横向滚动条好看）。

   列序（改 index.php 的表格结构时同步这里）：
     1 项目类型 / 2 项目数 / 3 已完成 / 4 进行中 / 5 项目完成率 /
     6 任务总数 / 7 已完成任务 / 8 任务完成率
   ------------------------------------------------------------ */
.pm-typestat-table { table-layout:fixed; width:100%; }
/* 卡片模式：pm_table_card.js 只按 <body class="pm-rwd-card"> 全宽度注入
   .pm-table-cardable，真正的卡片样式却关在 pm_table_card.css 的 @media 768px 里
   —— 所以这里也必须带同样的媒体查询，否则宽屏下会把明细小字左缩进 88px（V2.6.115
   第一版就这么错了：1100px 下类型名下面缩进一大截）。 */
@media (max-width: 768px) {
  .pm-typestat-table.pm-table-cardable > tbody > tr > td.pm-typestat-name { flex-wrap:wrap; }
  .pm-typestat-table.pm-table-cardable > tbody > tr > td.pm-typestat-name .pm-typestat-sub {
    flex:1 1 100%; margin-left:88px;
  }
  /* 卡片里 td 是 flex + space-between：进度条改成可伸缩项撑满中间的空白，
     否则它被挤成 155px 贴在左边、百分比孤零零甩到最右，中间一大段空 */
  .pm-typestat-table.pm-table-cardable > tbody > tr > td .pm-progress {
    flex:1 1 auto; width:auto; max-width:none; margin:0;
  }
}
.pm-typestat-table > thead > tr > th:nth-child(1) { width:22%; }
.pm-typestat-table > thead > tr > th:nth-child(2) { width:10%; }
.pm-typestat-table > thead > tr > th:nth-child(3) { width:9%; }
.pm-typestat-table > thead > tr > th:nth-child(4) { width:9%; }
.pm-typestat-table > thead > tr > th:nth-child(5) { width:16%; }
.pm-typestat-table > thead > tr > th:nth-child(6) { width:10%; }
.pm-typestat-table > thead > tr > th:nth-child(7) { width:11%; }
.pm-typestat-table > thead > tr > th:nth-child(8) { width:13%; }
/* 定宽后长类型名改为省略号，避免溢出型名（如「建筑施工及装饰装修」）顶破列 */
.pm-typestat-table > tbody > tr > td.pm-typestat-name { overflow:hidden; text-overflow:ellipsis; }
.pm-typestat-tn { display:inline; }
/* 明细小字：默认不显示，窄屏降档时才出现 */
.pm-typestat-sub {
 display:none; margin-top:3px; font-size:11px; font-weight:400; line-height:1.7;
 color:var(--pm-muted); white-space:normal;
}
.pm-typestat-sub b { font-weight:700; color:var(--pm-text); }
.pm-typestat-sub__i { white-space:nowrap; }
.pm-typestat-sub__sep { opacity:.45; }
@media (max-width: 1128px) {
  /* 收起 5 个明细列（th/td 一起命中；display:none 的单元格不参与定宽计算） */
  .pm-typestat-table tr > *:nth-child(2),
  .pm-typestat-table tr > *:nth-child(3),
  .pm-typestat-table tr > *:nth-child(4),
  .pm-typestat-table tr > *:nth-child(6),
  .pm-typestat-table tr > *:nth-child(7) { display:none; }
  .pm-typestat-table > thead > tr > th:nth-child(1) { width:46%; }
  .pm-typestat-table > thead > tr > th:nth-child(5) { width:27%; }
  .pm-typestat-table > thead > tr > th:nth-child(8) { width:27%; }
  /* 类型名 + 小字可以换行，不必再省略号截断 */
  .pm-typestat-table > tbody > tr > td.pm-typestat-name { overflow:visible; text-overflow:clip; }
  .pm-typestat-table .pm-typestat-name { white-space:normal; }
  .pm-typestat-table .pm-typestat-sub {
    display:flex; flex-wrap:wrap; align-items:baseline; column-gap:9px;
  }
  .pm-typestat-table .pm-progress { max-width:160px; }
  /* 单元格左右内边距收一档，给内容留宽度 */
  .pm-typestat-table > tbody > tr > td,
  .pm-typestat-table > tfoot > tr > td { padding-left:6px; padding-right:6px; }
  /* 表头在极窄屏允许折行（正常 46/27/27 下不会触发） */
  .pm-typestat-table > thead > tr > th { white-space:normal; }
}
/* 按用户任务统计 */ .pm-ustat-cap {

  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  margin:4px 0 9px; font-size:13px; font-weight:700; color:#2c3a52;

}
.pm-ustat-cap::before {

  content:""; width:3px; height:13px; border-radius:2px; flex:0 0 auto;
  background:linear-gradient(180deg,var(--pm-primary),var(--pm-accent));

}
.pm-ustat-cap > span {
 font-weight:400; font-size:12px; color:var(--pm-muted); 
}
.pm-ustat-legend {
 margin-left:auto; display:inline-flex; align-items:center; gap:11px; flex-wrap:wrap; 
}
.pm-ustat-legend__item {

  display:inline-flex; align-items:center; gap:4px;
  font-style:normal; font-weight:400; font-size:12px; color:var(--pm-muted);

}
.pm-ustat-legend__item b {
 display:inline-block; width:9px; height:9px; border-radius:2px; 
}
.pm-ustat-table th, .pm-ustat-table td {
 text-align:center; font-size:12px; padding:6px 8px; 
}
.pm-ustat-table .pm-ustat-user {
 text-align:left; white-space:nowrap; font-weight:600; 
}
.pm-ustat-table .pm-ustat-num b {
 font-weight:700; 
}
.pm-ustat-table .pm-progress {
 margin:0 auto 2px; width:60px; min-width:60px; 
}
.pm-ustat-cnt {
 font-weight:700; 
}
.pm-ustat-zero {
 color:#c3cbd8; 
}
.pm-ustat-unit {
 color:var(--pm-muted); font-size:11px; 
}
.pm-ustat-pct {
 display:inline-block; margin-left:5px; font-size:11px; font-weight:700; color:#1f9d5b; 
}
/* v2.6 统计页：延期/超期比率超阈值转红，强调「这里有问题」 */ .pm-ustat-pct--bad {
 color:#c92a2a; 
}
/* 统计表里的任务/项目名链接：保持正文色，hover 才出下划线，避免整表像一排蓝字 */ .pm-ustat-link {
 color:#2c3e50; text-decoration:none; border-bottom:1px dashed transparent; 
}
.pm-ustat-link:hover, .pm-ustat-link:focus {
 color:var(--pm-primary-d,#1d4a85); text-decoration:none; border-bottom-color:var(--pm-tag-bd,#9bb8d6); 
}
.pm-ustat-over {
 font-weight:700; color:#c92a2a; 
}
.pm-ustat-rest {
 font-weight:700; color:var(--pm-primary,#2c6ecb); 
}
.pm-ustat-danger {
 background:#fdeaea; color:#c92a2a; border-color:#f8cfcf; 
}
.pm-ustat-key {
 background:#fdf3e3; color:#b57a10; border-color:#f5e0b7; 
}
.pm-ustat-stack {

  display:flex; height:9px; min-width:130px;
  border-radius:5px; overflow:hidden; background:#eef1f6;

}
.pm-ustat-stack i {
 display:block; height:100%; 
}
/* v2.6 统计页页内跳转条：统计页已过 10 个区块，先给一张地图 */ .pm-stat-nav {

  display:flex; flex-wrap:wrap; align-items:center; gap:6px;
  margin:0 0 12px; padding:8px 10px;
  background:#f7f9fc; border:1px solid #e3e9f2; border-radius:8px;

}
.pm-stat-nav__cap {
 font-size:12px; font-weight:700; color:var(--pm-muted); margin-right:4px; 
}
.pm-stat-nav a {

  display:inline-block; padding:3px 10px; border-radius:20px;
  font-size:12px; color:#2c3e50; background:#fff; border:1px solid #dde5ef;
  text-decoration:none; transition:background .15s,color .15s,border-color .15s;

}
.pm-stat-nav a:hover, .pm-stat-nav a:focus {
 color:#fff; background:#2c6ecb; border-color:var(--pm-primary,#2c6ecb); text-decoration:none; 
}
/* 锚点跳转时给顶栏让位，别让标题被压在导航下面 */ .pm-card[id] {
 scroll-margin-top:80px; 
}
/* v2.6：4 列小卡行（交付准时性 / 项目交付质量） ⚠ 必须写 minmax(0,1fr)：1fr 的隐式下限是 min-content， 而 .pm-stat__label 是 nowrap，「提前完成（平均提前 1 天）」这种长标签 会把所在列撑宽 → 4 张卡宽度参差不齐。 */ .pm-stat-row--4 {
 grid-template-columns:repeat(4,minmax(0,1fr)); padding-top:0; 
}
.pm-stat-row--4 .pm-stat__label {
 white-space:normal; line-height:1.35; 
}
@media (max-width:991px) {
 .pm-stat-row--4{ grid-template-columns:repeat(2,minmax(0,1fr)); } 
}
@media (max-width:640px) {
 .pm-stat-row--4{ grid-template-columns:minmax(0,1fr); } 
}
@media (max-width:900px) {

  .pm-ustat-legend{ margin-left:0; }
  .pm-ustat-stack{ min-width:90px; }

}
/* ============================================================ 全站按钮体系（现代扁平 + 柔和描边） ------------------------------------------------------------ 背景：老代码用裸 <a> + glyphicon 做操作入口，遗留类 .mouse_hover / .mouse_over 只设了 cursor:pointer，视觉上就是一行灰字链接；表单按钮则 直接沿用 Bootstrap 3 默认观感。这里统一成一套： · .pm-btn 通用按钮（.pm-btn-soft 为历史别名） · .pm-btn--primary 主操作（蓝色实心） · .pm-btn--danger 危险操作（红色描边） · .pm-btn--ghost 次要操作 / 返回（无边框） · .pm-btn--xs 更紧凑 自动生效范围（无需改老代码）： ① 工具栏容器 .pm-actbar 内的所有链接 ② 遗留操作链接 .mouse_hover / .mouse_over（导航栏、页脚内除外） ③ 表格行内的上述链接自动使用紧凑尺寸 基础规则用 :where() 包裹 → 特异性为 0，变体类可无痛覆盖。 ============================================================ */ :where(.pm-btn, .pm-btn-soft, .pm-actbar a, a.mouse_hover, a.mouse_over) {

  display:inline-flex; align-items:center; gap:6px;
  padding:5px 12px;
  font-size:12.5px; font-weight:600; line-height:1.6;
  color:#3c4a61; background:#fff;
  border:1px solid #dde4ee; border-radius:8px;
  box-shadow:0 1px 2px rgba(20,40,80,.05);
  text-decoration:none; white-space:nowrap; cursor:pointer;
  transition:background .15s ease, border-color .15s ease, color .15s ease,
             box-shadow .15s ease, transform .15s ease;

}
:where(.pm-btn, .pm-btn-soft, .pm-actbar a, a.mouse_hover, a.mouse_over) .glyphicon {

  font-size:12px; top:0; line-height:1; transition:transform .15s ease;

}
:where(.pm-btn, .pm-btn-soft, .pm-actbar a, a.mouse_hover, a.mouse_over):hover, :where(.pm-btn, .pm-btn-soft, .pm-actbar a, a.mouse_hover, a.mouse_over):focus {

  color:var(--pm-primary,#2c6ecb); background:#f5f9ff;
  border-color:#bcd2f2; box-shadow:0 4px 12px rgba(44,110,203,.15);
  transform:translateY(-1px); text-decoration:none; outline:none;

}
:where(.pm-btn, .pm-btn-soft, .pm-actbar a, a.mouse_hover, a.mouse_over):active {

  transform:translateY(0); box-shadow:0 1px 3px rgba(20,40,80,.12);

}
:where(.pm-btn, .pm-btn-soft, .pm-actbar a, a.mouse_hover, a.mouse_over):hover .glyphicon {

  transform:scale(1.08);

}
/* 表格行内的操作链接：紧凑尺寸 */ td a.mouse_hover, td a.mouse_over {

  padding:2px 9px; font-size:12px; border-radius:7px; gap:4px;

}
td a.mouse_hover .glyphicon, td a.mouse_over .glyphicon {
 font-size:11px; 
}
/* 页脚内的 .mouse_over 排除在按钮体系之外 —— 页脚是版权行，「关于 / 联系我们」这类入口应当是**纯文字链接**： 一旦被套上白底描边的小按钮，它就会在一行灰字里显得格外扎眼， 视觉上像是误插进去的控件，而不是页脚的一部分。 */ .pm-plugin-foot a.mouse_over, .pm-plugin-foot a.mouse_hover, .foot a.mouse_over, .foot a.mouse_hover {

  display:inline; padding:0; border:0; background:transparent;
  box-shadow:none; font-size:inherit; font-weight:inherit; color:#8f9cb0;
  transform:none; gap:0;

}
.pm-plugin-foot a.mouse_over:hover, .pm-plugin-foot a.mouse_over:focus, .foot a.mouse_over:hover, .foot a.mouse_over:focus {

  color:var(--pm-primary,#2c6ecb); background:transparent; border:0; box-shadow:none; transform:none;

}
/* 工具栏内的按钮恢复常规尺寸（优先级需高于上面那条 td 规则） */ .pm-actbar td a, .pm-actbar td .pm-btn {
 padding:5px 12px; font-size:12.5px; border-radius:8px; gap:6px; 
}
/* 变体 */ .pm-btn--primary, .pm-btn-soft--primary {

  background:linear-gradient(180deg,var(--pm-accent,#3d80e6),var(--pm-primary,#2c6ecb));
  border-color:#2a63b5; color:#fff;
  box-shadow:0 2px 6px rgba(44,110,203,.28);

}
.pm-btn--primary:hover, .pm-btn--primary:focus, .pm-btn-soft--primary:hover {

  background:linear-gradient(180deg,#4a8bec,#3577d4);
  border-color:#2a63b5; color:#fff;
  box-shadow:0 6px 16px rgba(44,110,203,.34);

}
.pm-btn--danger, .pm-btn-soft--danger {
 color:#c0392b; border-color:#f0d3ce; 
}
.pm-btn--danger:hover, .pm-btn--danger:focus, .pm-btn-soft--danger:hover {

  background:#fdf3f1; border-color:#e0a9a1; color:#a5281b;
  box-shadow:0 4px 12px rgba(192,57,43,.16);

}
/* 「返回 / 关闭」这类导航型次要按钮：保留与其它按钮完全一致的按钮壳体 （同样的白/淡底、描边、圆角、投影），只用略灰的底色区分操作层级， 避免在一排有边框按钮里显得像一行裸链接；hover 反馈与其它按钮统一（淡蓝描边）， 只用「箭头轻微左移」暗示后退语义。 */ .pm-btn--ghost {

  color:#5b6b82;
  background:linear-gradient(180deg,#fbfcfe,#f2f5fa);
  border-color:#dee5f0;
  box-shadow:0 1px 2px rgba(20,40,80,.05);

}
.pm-btn--ghost:hover, .pm-btn--ghost:focus {

  color:var(--pm-primary,#2c6ecb);
  background:#f5f9ff;
  border-color:#bcd2f2;
  box-shadow:0 4px 12px rgba(44,110,203,.15);

}
.pm-btn--ghost .glyphicon {
 transition:transform .18s ease; 
}
.pm-btn--ghost:hover .glyphicon, .pm-btn--ghost:focus .glyphicon {

  transform:scale(1.08);

}
/* 只有「左箭头」图标做位移，其它图标（如关闭）只放大，避免语义错位 */ .pm-btn--ghost:hover .glyphicon-arrow-left, .pm-btn--ghost:focus .glyphicon-arrow-left {

  transform:translateX(-2px) scale(1.08);

}
.pm-btn--xs {
 padding:2px 9px; font-size:12px; border-radius:7px; gap:4px; 
}
.pm-btn--xs .glyphicon {
 font-size:11px; 
}
.pm-btn[disabled], .pm-btn.is-disabled, .pm-btn-soft[disabled] {

  opacity:.45; pointer-events:none; box-shadow:none; transform:none;

}
/* ---------- 顶部 LOGO（已改为后台可配置，角标字数不定，故宽度自适应） ---------- */ .topbar .logo .brand-mark {

  width:auto; min-width:26px; max-width:96px;
  height:26px; line-height:26px;
  padding:0 6px; box-sizing:border-box;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  vertical-align:middle; font-size:12px;

}
.topbar .logo a {

  display:inline-block; max-width:420px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;

}
.topbar .logo {
 max-width:52%;
 /* V2.6.87：文字 logo 在「不带 <a>」时会继承 body 的深色（实测 rgb(51,51,51)），
    压在深 navy 顶栏（rgb(15,61,120)）上几乎看不见——help 页就是这种结构：
    pm_topbar_open( array('brand_link'=>false) ) 直接把 pm_brand_logo_html() 的
    裸文本（<span class="brand-mark">AVIC</span>系统名称）输出到 .logo 里，
    没有 <a class="logourl"> 去接 .logo a{color:#fff}。
    这里给 .logo 本身定白色，与 .logo a 一致；图片 logo（<img>）不受影响。 */
 color:#ffffff;
}
/* 导航栏 / 页脚里的遗留类：保持原有内联观感，不要变成按钮 */ .topbar a.mouse_hover, .topbar a.mouse_over, .foot a.mouse_hover, .foot a.mouse_over {

  display:inline; padding:0; gap:0; background:none; border:0; border-radius:0;
  box-shadow:none; color:inherit; font-size:inherit; font-weight:inherit;
  transform:none; text-decoration:none;

}
.topbar a.mouse_hover:hover, .topbar a.mouse_over:hover, .foot a.mouse_hover:hover, .foot a.mouse_over:hover {

  background:none; border:0; color:inherit; transform:none; box-shadow:none;
  text-decoration:underline;

}
/* ---------- 工具栏容器：把老式「一堆 <td width=x%> 摊开」的操作行 变成左对齐、等间距的现代按钮条 ---------- */ table.pm-actbar {

  display:flex; flex-wrap:wrap; align-items:center; gap:8px;
  width:100%; margin:18px 0 22px; border-collapse:separate;

}
table.pm-actbar > tbody, table.pm-actbar > tbody > tr {

  display:flex; flex-wrap:wrap; align-items:center; gap:8px;

}
table.pm-actbar > tbody > tr > td {

  display:block; width:auto !important; min-width:0;
  padding:0 !important; border:0 !important; background:none !important;
  line-height:1.6; vertical-align:middle;

}
table.pm-actbar > tbody > tr > td.pm-actbar__spacer {
 display:none; 
}
/* 操作条按钮较多时（项目详情最多 10 个：下发任务 / 新建文件夹 / 新建文档 / 添加评论 / 编辑 / 删除 / 查看交付物 / 查看库存 / 报价单 / 预采购 / 返回）， 12px 的左右内边距在 1280 宽下正好把最后一个按钮挤到第二行、孤零零一排。 收一点内边距与间距，10 个按钮在 1280 仍保持一行（1440 以上不受影响）。 */ @media (max-width:1365px) {

  table.pm-actbar,
  table.pm-actbar > tbody,
  table.pm-actbar > tbody > tr{ gap:5px; }
  .pm-actbar td a, .pm-actbar td .pm-btn{ padding:5px 8px; }

}
/* ---------- Bootstrap 按钮现代化（bootstrap.css 之后加载，同权重即可覆盖） ---------- */ .btn {

  border-radius:8px; font-weight:600; letter-spacing:.2px;
  transition:background .15s ease, border-color .15s ease, color .15s ease,
             box-shadow .15s ease, transform .15s ease;

}
.btn-sm {
 padding:5px 12px; font-size:12px; line-height:1.6; 
}
.btn-lg {
 border-radius:10px; 
}
.btn .glyphicon {
 top:1px; 
}
.btn-default {

  background:#fff; border-color:#dde4ee; color:#3c4a61;
  box-shadow:0 1px 2px rgba(20,40,80,.05);

}
.btn-default:hover, .btn-default:focus, .btn-default.active, .btn-default:active, .open > .dropdown-toggle.btn-default {

  background:#f5f9ff; border-color:#bcd2f2; color:var(--pm-primary,#2c6ecb);
  box-shadow:0 4px 12px rgba(44,110,203,.15); transform:translateY(-1px);

}
.btn-default:active, .btn-default.active {
 transform:translateY(0); box-shadow:0 1px 3px rgba(20,40,80,.12); 
}
.btn-primary {

  background:linear-gradient(180deg,var(--pm-accent,#3d80e6),var(--pm-primary,#2c6ecb)); border-color:#2a63b5;
  box-shadow:0 2px 6px rgba(44,110,203,.28);

}
.btn-primary:hover, .btn-primary:focus, .btn-primary.active, .btn-primary:active, .open > .dropdown-toggle.btn-primary {

  background:linear-gradient(180deg,#4a8bec,#3577d4); border-color:#2a63b5;
  box-shadow:0 6px 16px rgba(44,110,203,.34); transform:translateY(-1px);

}
.btn-primary:active, .btn-primary.active {
 transform:translateY(0); 
}
.btn-success {

  background:linear-gradient(180deg,#2bb673,#1f9d5b); border-color:#188a4e;
  box-shadow:0 2px 6px rgba(31,157,91,.26);

}
.btn-success:hover, .btn-success:focus {
 background:linear-gradient(180deg,#33c37e,#22a862); border-color:#188a4e; transform:translateY(-1px); 
}
.btn-danger {

  background:linear-gradient(180deg,#e35d4f,#d0442f); border-color:#b93b28;
  box-shadow:0 2px 6px rgba(208,68,47,.26);

}
.btn-danger:hover, .btn-danger:focus {
 background:linear-gradient(180deg,#ea6b5d,#da4c36); border-color:#b93b28; transform:translateY(-1px); 
}
.btn-link {
 color:var(--pm-primary,#2c6ecb); font-weight:600; text-decoration:none; box-shadow:none; 
}
.btn-link:hover, .btn-link:focus {
 color:var(--pm-primary-d,#1f4f99); text-decoration:underline; background:none; 
}
.btn[disabled], .btn.disabled {
 opacity:.5; box-shadow:none !important; transform:none !important; 
}
@keyframes pm-modal-in {
 from{ opacity:0; } to{ opacity:1; } 
}
@keyframes pm-modal-pop {
 from{ transform:translateY(-10px) scale(.97); } to{ transform:none; } 
}
@media (prefers-reduced-motion: reduce) {

  .pm-modal-mask, .pm-modal{ animation:none; }

}
@media (max-width:820px) {

  .pm-upload-item{ flex-direction:column; align-items:flex-start; }
  .pm-upload-preview{ width:100%; height:100px; }

}
/* ============================================================ 本轮新增：任务列表（index）统计条 + 日志（log）现代化 + 动态/工作日志 ============================================================ */ /* 紧凑统计行（index.php 顶部概览，卡片更小、可放 5 个） 注意：该行夹在 .subnav（margin-bottom:0）与 .pagemargin 之间， 若自身 margin 上下留白不足，会与上方页签条和下方筛选条粘成一坨， 故上下各留 14px，并保持 .pagemargin 的 20px 不被折叠掉。 */ .pm-stat-row--compact {
 grid-template-columns:repeat(5,1fr); gap:10px; margin:14px 0; 
}
.pm-stat-row--compact .pm-stat {
 padding:10px 8px; box-shadow:0 2px 8px rgba(20,40,80,.06); 
}
.pm-stat-row--compact .pm-stat__num {
 font-size:19px; 
}
.pm-stat--warn .pm-stat__num {
 color:#d9821a; 
}
.pm-stat--accent .pm-stat__num {
 color:var(--pm-accent); 
}
.pm-stat--danger .pm-stat__num {
 color:#d64545; 
}
@media (max-width:1100px) {
 .pm-stat-row--compact{ grid-template-columns:repeat(3,1fr); } 
}
@media (max-width:640px) {
 .pm-stat-row--compact{ grid-template-columns:repeat(2,1fr); } 
}
@media (max-width:768px) {

  .pm-log-col-upd,.pm-log-col-hour{ display:none; }
  .pm-log-time{ width:auto; }

}
@media (max-width:640px) {

  .pm-logfilter{ padding:8px; }
  .pm-logfilter .taskform select{ min-width:0; flex:1 1 88px; }

}
@media (max-width:900px) {

  .pm-listbar-tabs{ max-width:100%; float:none; }
  .pm-listbar-actions{ float:none; margin:10px 0 0; }

}
/* --------------------------------------------------------- 状态徽标 pm-status-tag --------------------------------------------------------- daxian_status.task_status_display 字段历史存的是带内联 background-color 的 HTML （如 <div style='background-color:#009900;color:#fff'>完成100%</div>）， 直接输出会在徽标里露出刺眼的纯色方块，且 <div> 嵌在 <span> 里是非法结构、 浏览器会拆分 DOM 导致内联样式盖过外部样式。 现统一由 pm_status_badge() 输出纯文本 + 柔和语义色，背景只做淡色晕染。 */ .pm-status-tag {

  display:inline-block; padding:2px 10px; border-radius:6px;
  font-size:12px; line-height:1.7; white-space:nowrap;
  background:#f2f5fa; color:#5b6478; border:1px solid #e6ebf3;

}
.pm-status-tag.pm-tone--done {
  background:#e9f7ef; color:#1c7f4d; border-color:#c9ead8; 
}
.pm-status-tag.pm-tone--info {
  background:#eaf2fd; color:var(--pm-primary,#2c6ecb); border-color:#d3e2f8; 
}
.pm-status-tag.pm-tone--warn {
  background:#fdf3e4; color:#b06d09; border-color:#f6e0be; 
}
.pm-status-tag.pm-tone--danger {
 background:#fdeeee; color:#c0392b; border-color:#f7d5d3; 
}
/* ============================================================ ① 项目筛选卡片上间距（home.php「两个卡片粘在一起」修复） --------------------------------------------------------- home.php 中筛选卡片紧跟「各类型项目统计」卡片之后，而筛选卡片自身只有 margin-bottom、没有 margin-top，两卡之间零间距，底部说明线与筛选栏糊成一片。 仅当筛选卡片紧邻另一张 .pm-card 之后才生效： project.php 里它是 .pagemargin 的首个元素（已有 .subnav ~ .pagemargin 的 20px 上间距），不会重复加距。 ============================================================ */ .pm-card + .pm-filter-card {
 margin-top:16px; 
}
/* ============================================================ ② 分页条美化（全站列表页 · Dreamweaver 经典 rowcon 结构） --------------------------------------------------------- 结构固定为： table.rowcon > tr ├ td > 内嵌 table > tr > td×4（首页/上一页/下一页/末页） └ td（右对齐，记录计数「x 至 y（共 z）」） 四个链接 td 的顺序在所有页面稳定为 首页→上一页→下一页→末页， 边界页只是对应 td 为空（td 本身仍在），故可安全用 nth-child 追加方向箭头。 纯 CSS 增强：不改任何 PHP、无 JS；间距挂在链接本身上（margin）， 空 td 不产生空按钮也不占位。 覆盖 13 个文件 25 处；弹窗页 log_view.php / task_add_selprj.php 需加载本文件（已补 link）。 ============================================================ */ .rowcon {
 margin:16px auto 22px; 
}
.rowcon > tbody > tr > td {
 vertical-align:middle; 
}
.rowcon > tbody > tr > td + td {

  text-align:right; font-size:12px; color:var(--pm-muted,#8a94a6);
  white-space:nowrap; padding-left:16px;

}
.rowcon td table td {
 padding:0; 
}
.rowcon td a {

  display:inline-block; margin:0 3px; padding:4px 13px;
  font-size:12px; line-height:1.7; text-decoration:none;
  color:var(--pm-primary,#2c6ecb); background:var(--pm-card,#fff);
  border:1px solid #d5dce6; border-radius:7px;
  transition:border-color .12s ease, background .12s ease, color .12s ease;

}
.rowcon td a:hover {

  background:#eef3fb; border-color:var(--pm-primary,#2c6ecb);
  color:var(--pm-primary-d,#1f4f99);

}
.rowcon td a:active {
 transform:translateY(1px); 
}
/* 方向箭头 « ‹ › »（nth-child 位置稳定，见上方说明） */ .rowcon td table td:nth-child(1) a::before {
 content:"«"; margin-right:4px; 
}
.rowcon td table td:nth-child(2) a::before {
 content:"‹"; margin-right:4px; 
}
.rowcon td table td:nth-child(3) a::after {
 content:"›"; margin-left:4px; 
}
.rowcon td table td:nth-child(4) a::after {
 content:"»"; margin-left:4px; 
}
/* ============================================================ 左侧说明栏统一卡片（13 个页面共用） ------------------------------------------------------------ 背景：default_user_edit / user_view / project_add / project_edit / project_view / default_task_add / default_task_edit / default_task_plan / file_add / file_edit / user_add / announcement_add / announcement_edit 这类页面仍是「左侧灰底栏 + 右侧表单」的旧式两栏布局，左侧原本只有 `background:#F3F3F3`（daxian_style.css 的 .input_task_right_bg）+ 灰字， 没有任何边框/内边距/层次，看起来像一块没画完的空白，视觉上比右侧表单弱一截。 方案：不去改各页 HTML 结构（改动面太大、易引入回归），而是用一个新类 `pm-sidenote` 挂到左栏 td 上，统一卡片外观： · 白底 + 1px 冷灰描边 + 圆角，与右侧 .pm-card / .panel 视觉同族 · 顶部一条 3px 主色竖条作为「说明」语义标识 · 标题去掉旧式 h4 的 40px 上边距，改为呼吸感更正常的 0 · 条目（权限清单等）左对齐悬停底色，便于逐行扫读 用法：<td class="pm-sidenote">…</td> ============================================================ */ .pm-sidenote {

	background:#fff;
	border:1px solid #e6ebf3;
	border-left:3px solid var(--pm-primary,#3d7eff);
	border-radius:10px;
	padding:16px 18px 18px;
	margin:0 8px 0 0;
	font-size:13px;
	line-height:1.85;
	color:#5b6675;
	box-shadow:0 1px 3px rgba(15,23,36,.04);

}
/* 左栏标题：旧写法是 <h4 style="margin-top:40px">，在这里归零并给足层级 */ .pm-sidenote h4, .pm-sidenote h3 {

	margin:0 0 10px;
	font-size:14px;
	font-weight:600;
	color:#1f2a38;
	line-height:1.5;

}
.pm-sidenote h4 strong, .pm-sidenote h3 strong {
 font-weight:600; 
}
/* 段落：默认收紧上下间距，避免左栏被大量空白撑开 */ .pm-sidenote p {
 margin:0 0 6px; 
}
/* 条目（user_view 的角色权限清单等）：glyphicon + 文字，逐行可扫读 */ .pm-sidenote p.glyphicon-parent, .pm-sidenote p[class*="glyphicon"] {
 margin:0 0 4px; 
}
/* 左栏内的链接（关联入口）*/ .pm-sidenote a {
 color:var(--pm-primary,#2c6ecb); text-decoration:none; 
}
.pm-sidenote a:hover {
 text-decoration:underline; 
}
/* 左栏嵌套 table（少数页面左栏里还有表格）*/ .pm-sidenote table {
 width:100%; border:0; margin:0; 
}
.pm-sidenote table td {
 border:0; padding:2px 0; 
}
/* 老式两栏布局表（左栏 295px + 右栏自撑）：V2.6.121 起加 class="pm-legacy-2col"。
   ⚠ table-layout:fixed 是必需的，不是优化项：
   默认 auto 布局下，右栏 <td> 的宽度由「内容最小宽度」决定，而右栏里是
   #main_right{overflow:auto} 包着的一堆老表格 —— 那个 overflow 并不参与
   最小宽度计算，于是 1024 视口下右栏硬要 905px，整页被撑到 1200px，
   出现页面级横向滚动条。改 fixed 后：左栏吃 295px，右栏吃掉剩下全部宽度，
   内部超宽由 #main_right 自己的滚动条承担。1440 下观感不变（原本就是 295+剩余）。 */
table.pm-legacy-2col { table-layout:fixed; }
/* 双栏形态（>860）下，右栏内容仍有比栏宽更宽的可能（10 个元信息项 + 编辑表单的
   最小宽度在 1024 视口实测 773px > 727px）。让它就地横向滚动，
   而不是把整页撑出 1070px 的页面级滚动条（页面级横滚会把顶栏、页脚也一起推走）。 */
@media (min-width: 861px) {
  table.pm-legacy-2col #main_right { overflow-x: auto; }
}

/* 窄屏：左栏不再占 25%，改为整宽堆叠在表单上方
   ⚠ V2.6.121：这里原先只写了 .pm-sidenote 的 margin，**并没有真的堆叠** ——
   外层仍是 `<table width="100%"><tr><td width="295px">左栏</td><td>右栏</td></tr>`，
   table-cell 不会因为 margin 就换行，窄屏下左栏 295px + 右栏最小内容宽（实测 935px）
   硬撑出 1230px 的页面，整块被裁在屏幕右边。
   现在改为：给外层 table 挂 class="pm-legacy-2col"，窄屏把它和它的行/单元格
   一起 display:block，左右栏自然上下堆叠。宽度用 width:auto!important 覆盖
   HTML 属性上的 width="295px"（表现性属性优先级低于任何 CSS 声明）。 */
@media (max-width: 860px) {

	.pm-sidenote { margin:0 0 14px; }

	table.pm-legacy-2col,
	table.pm-legacy-2col > tbody,
	table.pm-legacy-2col > tbody > tr { display:block; width:100%; max-width:100%; }
	table.pm-legacy-2col > tbody > tr > td { display:block; width:auto !important; padding:0; }
	/* 左栏里常还嵌一层定宽 table（width="280px"），一并放开 */
	table.pm-legacy-2col > tbody > tr > td.pm-sidenote > table { width:100% !important; }

}
/* ============================================================ 两级项目下拉（V2.6.51）· .pm-proj-select ------------------------------------------------------------ 一级「项目年份」+ 二级「项目名称」，项目多时先按年份收窄再选名。 PHP 侧由 pm_project_select()（主站）/ erp_project_select()（ERP 插件） 生成同构 DOM，联动 JS 在 /scripts/pm_proj_select.js（head.php 加载）。 ⚠ 二级下拉才是真表单字段（带 name），一级纯客户端筛选不提交 —— 服务端收到的参数名与改造前完全一致，零改动。 ⚠ 新增前已 grep 确认 pm_theme / pm_modern / daxian_style 无同名规则。 ============================================================ */ .pm-proj-select {
 display:inline-flex; align-items:center; max-width:100%; vertical-align:middle; 
}
.pm-proj-select .pm-proj-year {
 flex:0 0 auto; width:auto; min-width:88px; margin-right:6px; 
}
.pm-proj-select .pm-proj-main {
 flex:1 1 auto; width:auto; min-width:130px; 
}
/* 表单组 / 行内表单里占满可用宽度（ERP 出库页 .form-group、批量下达页 pick 表单） */ .form-group .pm-proj-select {
 display:flex; width:100%; 
}
.form-inline .pm-proj-select {
 flex:1 1 auto; 
}
.form-inline .pm-proj-select .pm-proj-main {
 max-width:420px; 
}
/* 极窄屏：两级各占一半，避免年份框被挤压换行 */ @media (max-width: 480px) {

	.pm-proj-select{ display:flex; }
	.pm-proj-select .pm-proj-year{ margin-right:4px; }

}
/* ============================================================ 公告列表 · 广播卡片（default_announcement.php，v2.3.4） 每条公告一张卡：喇叭图标（等级色/状态色）+ 标题 + 作者首字 + 操作按钮组。 ============================================================ */ .pm-ancx-list {
 display:flex; flex-direction:column; gap:12px; margin-top:4px; 
}
@media (max-width: 720px) {

  .pm-ancx{ flex-wrap:wrap; }
  .pm-ancx__act{ width:100%; justify-content:flex-end; }

}
/* ============================================================ 文档管理 · 文件管理器列表（control_file.php，v2.3.4） 文件夹/文档行：圆角图标 + 名称 + 更新人 + 更新时间 + 图标按钮操作组。 ============================================================ */ .pm-fx-card {
 padding:6px 10px 10px; 
}
/* ⚠ V2.6.121：原来这里有两段窄屏规则（≤860px 的 .pm-fx-head/.pm-fx-row、
   ≤900px 的 .pm-file-layout）——**它们从来没生效过**。原因是 pm_theme.css 之后
   还会加载页面模块 pm_page_file.css，后者里的 `.pm-fx-head,.pm-fx-row{display:grid}`
   同权重且写在后面，把 @media 里的 display:none 直接反压回去（CDP 实测：
   390px 下该规则在 CSSOM 里存在，但 computed display 仍是 grid）。
   这些规则已迁到 pm_page_file.css 尾部，那里才是它的归属。别搬回来。 */
/* 左表原底色 #D0D7DF（daxian_style 的 .tasktab_bl）会从透明单元格里透出来， 左表行因此呈灰蓝底、右表行纯白，两表同一行颜色不一致；统一为白底。 */ .tasktab_bl {
 background:#fff; 
}
/* 关键任务标记微调 */ .pm-critical-tag {

  display:inline-block; margin-right:4px; padding:0 5px; border-radius:4px;
  background:#fdecea; color:#c0453a; font-size:11px; font-weight:600; line-height:18px;

}
/* ⚠ V2.6.121：≤900px 的 archive/file.php 两栏堆叠规则已迁到 pm_page_file.css
   尾部（与 .pm-file-layout 的定义放在一起，避免加载顺序把它吃掉）。 */
/* ===== 公司信息设置（打印单据页脚） ===== */ .pm-company-form .form-group {
 margin-bottom:14px; 
}
.pm-company-form label {
 font-weight:600; color:#3d4b63; 
}
.pm-print-company {

  display:none;                 /* 屏幕态不显示，仅打印时出现在单据底部 */
  margin-top:20px; padding-top:12px;
  border-top:1px solid #333;
  font-size:12px; color:#111; line-height:1.8;

}
.pm-print-company-line {
 text-align:center; 
}
@media print {

  .pm-print-company{ display:block; }
  /* 打印时隐藏底部版权信息（Powered by 海东工作室 等），改由 pm-print-company 显示公司信息 */
  .pm-plugin-foot, .foot, .pm_foot_title{ display:none !important; }

}
@media (max-width:900px) {
 .pm-feed-list{ grid-template-columns:1fr; } 
}
/* ============================================================ 站点通用小部件：返回顶部（v2.3.19） 按钮由 skin/themes/base/pm_about.js 自动注入（该脚本在主站与全部插件页脚都加载）， 这里只放样式，保证首屏就按最终形态布局、不出现「先左下角再跳右下角」。 ============================================================ */ .pm-backtop {

  position:fixed; right:26px; bottom:30px; z-index:1040;
  width:44px; height:44px; padding:0; border:0; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:rgba(44,110,203,.94); color:#fff;
  box-shadow:0 6px 20px rgba(20,40,80,.28);
  cursor:pointer; outline:none;
  opacity:0; visibility:hidden; transform:translateY(10px);
  transition:opacity .18s ease, transform .18s ease, visibility .18s ease, background-color .15s ease;

}
.pm-backtop.is-on {
 opacity:1; visibility:visible; transform:translateY(0); 
}
.pm-backtop:hover,.pm-backtop:focus {
 background:var(--pm-primary-d,#1f4f99); color:#fff; 
}
.pm-backtop .glyphicon {
 font-size:15px; line-height:1; 
}
/* 弹窗打开时压在遮罩下面，避免盖住表单 */ .pm-backtop.is-under {
 z-index:1029; 
}
@media print {
 .pm-backtop{ display:none !important; } 
}
@media (max-width:640px) {

  .pm-backtop{ right:14px; bottom:16px; width:40px; height:40px; }

}
/* ============================================================ 通用录入表单：一行一项 / 宽屏成对（v2.3.41，自 erp 插件下沉） ------------------------------------------------------------ 由 erp 插件验证成熟后抽到公共层，任何插件给字段加上 .pm-form 即可复用；各插件不必再复制一份会各自漂移的副本。 详细取舍见下方各条注释。 ============================================================ */ /* ===== 录入表单：一行一项（左标签 / 右控件）================================= 为什么不沿用 Bootstrap 栅格（.row > .col-sm-*）： 那种写法标签在控件上方、字段横向并排，字段一多就变成「输入框矩阵」， 眼睛得在两行之间来回找「这个框对应哪个名字」，录单时最容易错行。 改成一列纵向 + 定宽右对齐标签后，标签紧贴控件成为一个视觉单元， 视线只需沿一条竖直基线往下走；再用行悬停 / 聚焦底色锁住当前项。 注：本套与 Bootstrap 的 .form-horizontal 无关，不参与栅格计算。 标签一律控制在 6 个汉字内，超出的解释放 .pm-fld-help（短标签更好扫读）。 ========================================================================= */ .pm-form {
max-width:720px;
}
/* 单列行宽 = 112(标签) + 14(间距) + 594(控件) = 720。 为什么不是 100%：控件跟着卡片拉满后，一屏几米长的输入框要让视线横跨， 反而更难填。表单设计的水线是 720 左右 —— 再宽就超出「一眼看完整行」的范围。 虚线右端与控件右端重合 —— 所以默认控件占满列宽，只有短值才收窄。 */ /* ---- 宽屏成对：解决「卡片很宽、表单只占一半、右侧大片有边框的空白」---- 留白留在卡片【边框之内】时，人眼读作「内容没做完」；留在边框之外才是版心。 主站与各插件的卡片都是拉满整行的，所以只能让表单自己长胖。而控件不能无限加宽， 于是把两个字段并到同一行 —— 每组仍是「左标签 / 右控件」，配对关系没变， 只是每屏放两对，行数减半、宽度填满。这是后台表单的主流做法（Ant Design 的 horizontal + Row/Col 就是这个形态），不是退回原来的「输入框矩阵」： 矩阵的问题是标签在上、只剩一排孤零零的框；这里标签还在控件左边。 竖排两组各自的虚线上下对齐（grid 行内等高），阅读基线仍是两条竖线。 */ .pm-form--2 {
max-width:720px;
}
@media (min-width:1200px) {

  /* 1480 = 两列各 723（112 标签 + 14 间距 + 597 控件）+ 34 列间距。
     1440 视口的卡片内容区约 1344 < 1480，所以那一档直接取满、一点不留；
     1920 才封顶在 1480（右侧余 400 左右），再往上拉只会把控件拖成横跨视线的长条。 */
  /* 必须是 stretch（默认）而不是 start：同一行两项高度常常不等
     （一边有 .pm-fld-help、一边没有），start 会让矮的那项提前收尾，
     它自己的虚线就比相邻那条高出一行字的高度，看着像两行没对齐。 */
  .pm-form--2{max-width:1480px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
               column-gap:34px;align-items:stretch;}
  /* 跨整行的项：分组标题、长文本（名称/型号/备注）、带底色小面板、整行提示、按钮行 */
  .pm-form--2 > .pm-form-h,
  .pm-form--2 > .pm-fld--wide,
  .pm-form--2 > .pm-fld--box,
  .pm-form--2 > .pm-form-foot{grid-column:1 / -1;}
  /* 两列模式下短值列不再收窄，一律撑满列宽。
     原因：两列时列宽已经比单列窄，若「数量/日期」还停在 260，右边缘就会比
     同列的「物料名称」短出一截 —— 上一轮验收已经确认「参差」比「齐平」难看得多，
     齐平的右边缘才是这套表单的视觉基线。 */
  .pm-form--2 .pm-fld-ctl--s > .form-control{max-width:100%;}
  /* 但跨整行的短值项（字段数为奇数时末尾落单的「排序」「日期」这类）
     不能跟着撑满 —— 一个 1100px 宽的数字框比留白更难看。
     虚线照旧贯穿整行，只是控件回到内容宽度，读作「这一行只填这么点」。 */
  .pm-form--2 .pm-fld--wide .pm-fld-ctl--s > .form-control{max-width:260px;}

}
.pm-fld {
display:grid;grid-template-columns:112px minmax(0,1fr);column-gap:14px;align-items:start;
         width:100%;padding:5px 8px;margin:0 0 0 -8px;border-bottom:1px dashed var(--pm-border,#e8eef6);border-radius:5px;
}
.pm-fld:last-child {
border-bottom:0;
}
.pm-fld:hover {
background:#fafcfe;
}
.pm-fld:focus-within {
background:#f4f9ff;
}
.pm-fld-lb {
grid-column:1;text-align:right;font-size:13px;font-weight:400;line-height:34px;
            color:#5c6b80;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.pm-fld:focus-within .pm-fld-lb {
color:var(--pm-primary,#2c6ecb);font-weight:700;
}
.pm-fld-lb .req {
color:#d9534f;margin-left:2px;
}
.pm-fld-ctl {
grid-column:2;min-width:0;
}
/* 表单里的下拉常带着 input-sm（历史遗留：早先是给旧 .row/.col 栅格 30px 的行高用的， 如 quote_status_select() / quote_project_select() 的 class 参数）。 放进行高 34px 的 .pm-fld 后会矮 4px，跟左右相邻输入框一眼就看出不齐。 这里统一拉回标准高度 —— 只作用在 .pm-fld-ctl 内部，筛选条与表格里的 input-sm 不受影响（那边本来就该是 30px 的紧凑尺寸）。 */ .pm-fld-ctl .form-control.input-sm {
height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;
}
/* 单选/复选组后面紧跟的说明文字：原来紧贴最后一个选项， 读成「外购自研显示本公司名称」这种连字。给一点左间距把它分出去。 */ .pm-fld-ctl > .radio-inline + .pm-muted, .pm-fld-ctl > .checkbox-inline + .pm-muted {
margin-left:8px;
}
/* 控件宽度只管「值有多长」，不管栅格：默认占满列宽（虚线右端与控件右端齐平）， 只有数字 / 日期 / 单位这类短值收窄，收窄后右边缘留白但不破坏对齐基线。 */ /* 短值列：限宽的是「控件」而不是整个单元格。 限单元格会把同格里的 .pm-fld-help 一起压到 200px，一句「数字越小越靠前， 相同时按新增顺序」被切成两行且悬在半空，比不限宽还难看。 */ .pm-fld-ctl--s {
max-width:100%;
}
.pm-fld-ctl--s > .form-control {
max-width:200px;
}
.pm-fld-ctl--m {
max-width:100%;
}
.pm-fld-ctl--inline {
display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
.pm-fld-ctl--inline > .form-control {
flex:1 1 150px;width:auto;min-width:0;
}
/* 带出面板里第一个下拉是「预采购单」（单号 + 标题，最长），给它更大的伸缩权重， 否则单号会被截成 CG20261019001 HKW… 只剩前缀，选错单都看不出来。 */ .pm-fld-ctl--inline > .form-control:first-child {
flex-grow:1.6;flex-basis:190px;
}
.pm-fld-ctl--inline > .btn {
flex:0 0 auto;
}
/* 同格两个【等宽】控件（如「传真 / 邮箱」「起止日期」这类并列短值）。 不复用 --inline：那条给首项加了 flex-grow:1.6（为「预采购单」下拉服务的）， 用在这里会让「传真」比「邮箱」宽一截，看着像两个不相干的字段。 等分用 flex:1 1 0，两格右边缘才与相邻整行控件齐平。 */ .pm-fld-ctl--pair {
display:flex;align-items:center;gap:8px;
}
.pm-fld-ctl--pair > .form-control {
flex:1 1 0;width:auto;min-width:0;
}
.pm-fld-ctl--pair > .pm-fld-suffix {
flex:0 0 auto;color:#8a97ac;font-size:12px;
}
.pm-fld-help {
grid-column:2;font-size:12px;line-height:1.7;color:#8a97ac;margin:3px 0 0;
}
/* 项目两级下拉（年份 + 项目）在 erp_common 里输出的是 inline-flex 的 span， 塞进栅格单元格后不会自己撑满，右边缘比相邻输入框短一截，看着像没对齐。 默认那条 .pm-proj-select {
display:inline-flex
}
是给筛选条用的，此处按容器改回 flex。 */ .pm-fld-ctl > .pm-proj-select {
display:flex;width:100%;
}
.pm-fld-ctl > .pm-proj-select .pm-proj-main {
min-width:0;
}
/* 带底色的小面板（如「预采购带出」）：仍是 .pm-fld 的栅格，只是多了边框 */ .pm-fld--box {
background:#f6faff;border:1px solid #d9e6f7;border-radius:8px;padding:9px 10px;margin:2px 0 10px;
}
.pm-fld--box:hover,.pm-fld--box:focus-within {
background:#eef6ff;
}
.pm-fld--box .pm-fld-help {
margin-top:4px;
}
.pm-fld--check .pm-fld-ctl {
line-height:34px;
}
.pm-fld--check .checkbox-inline {
font-weight:400;color:#3c4a5e;
}
/* 按钮行：与字段行同一套两列栅格，按钮才落在控件左边缘（112+14）而不是贴着卡片左边。 两列模式下它跨整行（见上面的 .pm-form--2 规则）。 */ .pm-form-foot {
display:grid;grid-template-columns:112px minmax(0,1fr);column-gap:14px;
               border-bottom:0;padding:14px 8px 0;margin:0 0 0 -8px;
}
/* 分组小标题：纵向表单的分段线（不占用标签列） */ .pm-form-h {
font-size:13px;font-weight:700;color:#1f2b3d;
            margin:12px 0 2px;padding-top:10px;border-top:1px solid #eef2f8;
}
.pm-form-h:first-child {
margin-top:0;padding-top:0;border-top:0;
}
.pm-form-h .erp-tip {
font-weight:400;
}
/* 窄屏：标签移到控件上方。右对齐在单列下会变成贴着右边缘，反而更难读 */ @media (max-width:767px) {

  .pm-form{max-width:100%;}
  .pm-fld{grid-template-columns:1fr;row-gap:2px;padding:5px 0;margin-left:0;}
  .pm-fld-lb,.pm-fld-ctl,.pm-fld-help{grid-column:1;text-align:left;line-height:1.6;}
  .pm-fld-ctl--s,.pm-fld-ctl--m{max-width:100%;}
  .pm-fld-ctl--s > .form-control{max-width:100%;}
  .pm-fld-ctl--pair{flex-wrap:wrap;}
  .pm-fld-ctl--pair > .form-control{flex:1 1 100%;}
  .pm-fld--check .pm-fld-ctl{line-height:1.6;}

}
/* 领用人多选盒：宽度要跟表单版心一致（单列 720 / 两列 1240）， 否则它与上方的「出库信息」右边缘错开一截，看着像两套东西。 */ .pm-recip-box {
max-width:720px;max-height:150px;overflow:auto;border:1px solid #e3e8f0;
               border-radius:6px;padding:8px;background:#fff;margin-bottom:4px;
}
@media (min-width:1200px) {
 .pm-recip-box{max-width:1480px;} 
}
/* ============================================================ 统计卡一行 / 多栏内容区（v2.3.45） ------------------------------------------------------------ 插件页原来是 Bootstrap 的 .row + .col-sm-3 / .col-md-7 拼的。 那套写法有三个毛病： 1) .row 自带 margin:0 -15px，恒比父级宽 30px，容易挤出一条横向滚动条； 2) 列宽按 1/4、1/3 硬分，卡片一多就 3+1 掉行； 3) 每张卡还要包一层 col div，想给卡片加 hover 效果得写两层选择器。 这里用 grid 统一：插件只要在卡片列表外套 .pm-stats / .pm-cols 即可， 不必每个插件再定义一套同义 CSS。 ============================================================ */ .pm-stats {
display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin:0 0 14px;
}
.pm-stats > * {
margin-bottom:0;
}
/* 卡片数不是 4 的（cms 首页 6 张、srm 汇总 5 张…）用自适应列： 每列最小 190px，能塞几张塞几张，宽度不够自动折行，不用为每个数量写一个变体。 */ .pm-stats--auto {
grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
}
/* 只有两张卡时按半宽铺开（如「登记条数 / 文件份数」） */ .pm-stats--half {
grid-template-columns:repeat(2,minmax(0,1fr));
}
/* 左主右辅：默认 7:5（列表 + 侧栏），--wide 是 8:4（表单 + 说明） */ .pm-cols {
display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);
         gap:14px;align-items:start;margin-bottom:14px;
}
.pm-cols--wide {
grid-template-columns:minmax(0,2fr) minmax(0,1fr);
}
/* 其它分栏比例：3:1（列表 + 快捷入口）、5:7（左窄右宽的主次倒置页）、1:1（双卡并排） */ .pm-cols--31 {
grid-template-columns:minmax(0,3fr) minmax(0,1fr);
}
.pm-cols--57 {
grid-template-columns:minmax(0,5fr) minmax(0,7fr);
}
.pm-cols--half {
grid-template-columns:repeat(2,minmax(0,1fr));
}
/* 栅格里的普通单元格（替代原来只用来套 Bootstrap col 宽度的那层 div）， __full 让某一格跨满整行 —— 条件渲染下同一位置可能是半宽也可能是整宽时用。 */ .pm-col {
min-width:0;
}
.pm-cols__full {
grid-column:1 / -1;
}
/* 键值行：详情页里「名称：xxx / 型号：yyy」这种两列文本， 行距要比卡片间距紧，所以单独一个小类（gap 只给行间 6px） */ .pm-kv {
display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 20px;
}
.pm-kv > .pm-col {
overflow:hidden;text-overflow:ellipsis;
}
@media (max-width:767px) {
 .pm-kv{grid-template-columns:minmax(0,1fr);} 
}
.pm-cols > * {
margin-bottom:0;
}
/* 侧栏常要叠两张卡，用 flex 堆叠而不是让单卡拉长 */ .pm-cols__side {
display:flex;flex-direction:column;gap:14px;min-width:0;
}
.pm-cols__side > * {
margin-bottom:0;
}
@media (max-width:1199px) {
 .pm-stats{grid-template-columns:repeat(2,minmax(0,1fr));} 
}
@media (max-width:991px) {
 .pm-cols,.pm-cols--wide,.pm-cols--31,.pm-cols--57,.pm-cols--half{grid-template-columns:minmax(0,1fr);} 
}
@media (max-width:575px) {
 .pm-stats{grid-template-columns:minmax(0,1fr);} 
}
/* ------------------------------------------------------------ 行内快加表单：列表页顶部「名称 + 排序 + 保存」这类一行到底的小表单 （合同类别 / 执行阶段 / 用户职位…）。 原来用 `.row` + `col-sm-*` 或 Bootstrap `.form-inline`： 前者带 -15px 外边距，后者的 label 在窄容器里会掉行到控件下面。 这里改成 flex + 每项自带 label（标签在上、控件在下）， 窄屏自动折行，控件不会被拉成半宽。 ------------------------------------------------------------ */ .pm-inline-form {
display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 12px;
}
/* 筛选条件多（导出页 8 个下拉）时用自适应网格，每列最小 190px， 能排几个排几个，不用像 col-sm-3 那样写死 4 个 */ /* 注意 align-items 必须是 start，不能是 end：各字段内容高度不一致时 （例如某格多了行说明文字），底部对齐会把矮的格子整体往下推 —— 表现为「标签有的在上、有的在下，下拉框参差不齐」（cms/export.php 实证）。 */ .pm-filter-form {
display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px 14px;align-items:start;
}
/* 定列数变体：字段数能被整除时用它，避免 auto-fit 排出「6+2」这种残行。 cms/export.php 8 个条件 → 4 列正好 4+4；窄屏降 2 列 / 1 列，仍能整除。 */ .pm-filter-form--quad {
grid-template-columns:repeat(4,minmax(0,1fr));
}
@media (max-width:991px) {
.pm-filter-form--quad{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media (max-width:575px) {
.pm-filter-form--quad{grid-template-columns:minmax(0,1fr);}
}
/* 网格内的整行说明（跨满所有列），不放进 .pm-ifld 里免得撑高单格 */ .pm-filter-form > .pm-filter-notes {
grid-column:1/-1;font-size:12px;color:#8a97ac;margin:0;line-height:1.6;
}
.pm-inline-form .pm-ifld,.pm-filter-form .pm-ifld {
display:flex;flex-direction:column;gap:4px;min-width:0;flex:0 1 auto;
}
.pm-filter-form .pm-ifld {
flex:initial;
}
.pm-inline-form .pm-ifld--grow {
flex:1 1 240px;
}
.pm-inline-form .pm-ifld > label,.pm-filter-form .pm-ifld > label {
font-size:13px;font-weight:400;color:#5a6a85;line-height:1.4;margin:0;
}
.pm-inline-form .pm-ifld > .form-control,.pm-filter-form .pm-ifld > .form-control {
height:34px;padding:6px 12px;font-size:14px;
}
.pm-inline-form .pm-ifld > .help-block,.pm-filter-form .pm-ifld > .help-block {
font-size:12px;color:#8a97ac;margin:2px 0 0;
}
.pm-inline-form .pm-ifld--act {
flex:0 0 auto;
}
/* ============================================================ 文件选择框：让原生「选择文件」按钮在框内上下居中（v2.5.10） ------------------------------------------------------------ Chrome 原生 file 按钮固定 26px 高（14px 字号：行高20 + padding2 + 边框4）， 而 .form-control 是 height:34px + padding:6px 6px —— 内容区只剩 20px， 按钮装不下就**贴底溢出**：上留白 6px、下留白 0，看着就是「按钮坐在框底」。 实测对照（像素测量，非目测）： padding 6px → 上 6 / 下 0 偏 +6 padding 0 → 上 0 / 下 6 偏 -6 padding 3px → 上 3 / 下 3 偏 0 ← 采用 display:flex + align-items:center → 无效（内部匿名块始终顶对齐） padding = (34 − 2边框 − 26按钮) ÷ 2 = 3px。同时锁死 font-size:14px， 否则字号变 12px 时按钮缩到 23px、居中又会偏（实测 3/6）。 ⚠ 各页面曾用内联 style="padding:6px" 覆盖，已全部清除 —— 内联优先级最高， 留着这条规则就永远不生效。 ============================================================ */ input[type=file].form-control, .pm-inline-form .pm-ifld > input[type=file].form-control, .pm-filter-form .pm-ifld > input[type=file].form-control, .pm-fld-ctl > input[type=file].form-control, .pm-fld-ctl > .form-control[type=file] {

  height:34px;
  padding:3px 8px;
  font-size:14px;
  line-height:1.42857143;

}
/* 动作行变体（v2.5.8）：.pm-ifld 默认是「label 在上、控件在下」的纵列，适合 label+输入框； 但里面放【按钮组】时，纵列会把每个子元素拉伸成整行宽、竖着堆两层 —— cms/import.php 与 file/import.php 第一步的「解析并预览 / 下载空白模板」就坏成了 两条巨宽按钮（截图实证）。--row 让子元素横向排列、按内容取宽、超出换行。 */ .pm-inline-form .pm-ifld--row {
flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px 10px;
}
.pm-inline-form .pm-ifld--row > .pm-muted {
margin-left:0;
}
/* ============================================================ 打印件：不带出链接地址与缩写提示（v2.3.39） ------------------------------------------------------------ Bootstrap 3 在 @media print 里默认给 a[href] 补 content:" (" attr(href) ")"，打印出来就是满纸 "/corp/project/project_view.php?recordID=24" 这样的 URL， 和要求「打印无需网页链接」相反。真值来源： bootstrap/css/bootstrap.css:210（abbr[title] 在 213 行同理）。 本文件在 bootstrap.css 之后加载，且选择器优先级相同， !important 只为压住后加载的插件内联 @media print。 ============================================================ */ @media print {

  a[href]:after,
  a[href]:visited:after,
  abbr[title]:after{
    content:"" !important;
  }
  /* 链接在纸上仍是可点的蓝色没有意义，按正文黑字排 */
  a,a:visited{ color:inherit !important; text-decoration:none !important; }

}
@keyframes pm-od-pulse {

  0%,100%{ box-shadow:0 2px 6px rgba(201,48,44,.30), 0 0 0 0 rgba(217,83,79,.45); }
  50%    { box-shadow:0 2px 6px rgba(201,48,44,.30), 0 0 0 6px rgba(217,83,79,0); }

}
/* ============================================================ 首页 + task.php 共用：过期/即将到期任务警报样式（P1-1 拆分遗漏补回，单一真源置于共享基础，首页经 head.php 已加载） ============================================================ */
/* 「已过期 N 天」实心红胶囊（task.php 与 index.php 共用） */ .pm-od-pill {

  display:inline-flex; align-items:center; gap:5px;
  padding:3px 11px; border-radius:999px;
  font-size:12px; font-weight:700; white-space:nowrap;
  color:#ffffff;
  background:linear-gradient(180deg,#e05550,#c9302c);
  border:1px solid #b82823;
  box-shadow:0 2px 6px rgba(201,48,44,.30);

}
/* 超 7 天：呼吸脉冲，越久越急（>=30 天加速） */ .pm-od-pill--severe {
 animation:pm-od-pulse 1.8s ease-in-out infinite;
}
.pm-od-pill--critical {
 animation:pm-od-pulse 1s ease-in-out infinite;
}
/* ---- 过期任务卡片（红色警报变体，index.php 与 task.php 共用） ---- */ .pm-card--alarm {

  border-color:#f0c4bd;
  border-left:4px solid #d9534f;
  background:linear-gradient(180deg,#fffafa,#fff4f2);
  box-shadow:0 8px 24px rgba(217,83,79,.12);

}
.pm-section-title--alarm::before {
 background:linear-gradient(180deg,#e05550,#c9302c);
}
.pm-section-title--alarm {
 color:#a8342e;
}
.pm-section-title--alarm .glyphicon {
 color:#c9302c; font-size:15px;
}
/* 备注「查看」链接（首页项目列表与项目表页共用，单一真源） */ .pm-remark-view {
 cursor:pointer; color:var(--pm-primary,#2c6ecb);
 text-decoration:none; border-bottom:1px dashed currentColor;
}
.pm-remark-view:hover {
 color:var(--pm-accent,#5b9bef);
}
.pm-badge--danger {
 background:#c9302c; color:#ffffff; border-color:#b82823; font-weight:700; 
}
/* ============================================================
   插件顶栏：并入主站同一套规则（V2.6.71）
   ------------------------------------------------------------
   v2.5.0 时代这里存着一份 .pm-topbar* 的「平行实现」—— 把主站的 .topbar / .logo /
   .pm-clock / .logininfo2 / .nav_normal2 抄了一遍，只为让 10 个插件页头长得像主站。
   代价是双份维护：改主站忘了改这里，插件页就悄悄退回老样子（单行 50px 顶栏、
   34px 胶囊按钮），来回跳转高度乱跳。

   V2.6.71 起插件页头由 corp/common/pm_topbar.php 渲染，DOM 与主站完全同构
   （.topbar / .logo / .nav_normal2 / .logininfo2 / .pm-clock / .pm-theme-wrap），
   样式直接命中 daxian_style.css 的真值源 —— 本段落整体退役，只留两个主站没有、
   插件才有的小部件：logo 后的「/ 模块名」后缀、插件停用告警条。
   ============================================================ */

/* logo 右侧「/ 模块名」后缀（如「天枢一体化项目协同管理平台 / 合同管理」）。
   ⚠ 只作用于 .logo--mod（组件在传了 module 时才加这个类），主站 .logo 不受影响：
   主站 .logo > a 是块级 60px 高，改成 inline-flex 会动到首屏品牌区的高度与基线。
   ⚠ 字体粗细必须写在这里：品牌文字在「可点击」时包在 <a> 里，.logo a 已给了 17px/700；
   帮助页把品牌渲染成纯文字（brand_link=false），少了这一条就是 17px/400 的细体，
   在深蓝渐变上抗锯齿后会糊成一片灰 —— 看着像「字变暗了」，其实是字重掉了。 */
.topbar .logo--mod{ display:flex; align-items:center; font-size:17px; font-weight:700; letter-spacing:.5px; }
/* V2.6.117：插件页品牌区（角标 + 平台名）必须完整显示。
   ── 历史坑（V2.6.114 回归，V2.6.116 修了一半）──
   ① .logo--mod > a 是 display:inline-flex，<a> 在 .logo（flex）里允许收缩，
     且 .topbar .logo a 的 overflow:hidden 把 flex 自动最小尺寸压成 0 →
     <a> 被压窄、内部 .brand-mark 被压到 min-width:26px，「AVIC」裁掉一半。
     V2.6.116 给角标加了 flex-shrink:0 修好这一层。
   ② 但 V2.6.116 同时给的 .logo--mod{max-width:260px} 把平台名也裁了 ——
     用户实测（视口约 1434px）「天枢一体化项目协同管理平台」13 个字只显示 7 个字
     就被硬切。品牌名不完整比提醒窄更伤观感，此上限废除。
   ── 现方案 ──
   品牌区整体 flex-shrink:0（角标 + 平台名完整），grid 的 auto 列按内容撑开
   （约 360px）；中窄屏空间紧张由顶栏布局自己消化：
   ≤1280 的插件页隐藏纯装饰的时钟（daxian_style.css 同版本改动），
   提醒槽保住 ≥200px，不再挤压 logo。 */
.topbar .logo--mod > a{ display:inline-flex; align-items:center; height:auto; flex-shrink:0; }
.topbar .logo--mod > a .brand-mark,
.topbar .logo--mod > .brand-mark{ flex-shrink:0; }
/* V2.6.117：brand_link=false（help 页）时品牌裸文本包在这个 span 里，同样不收缩 */
.pm-topbar-brandtext{ flex-shrink:0; white-space:nowrap; }
.pm-topbar-sep{ color:#5b7ba6; margin:0 8px; font-weight:400; font-size:15px; }
.pm-topbar-mod{ color:#a8c0e0; font-weight:400; font-size:15px; white-space:nowrap; }

/* 插件停用告警条：直接落在 .nav_normal2 里，与导航项同高，避免把顶栏撑高 */
.pm-topbar-off{
  display:inline-flex; align-items:center; gap:6px;
  height:var(--pm-topbar-h,60px);
  padding:0 16px; font-size:14px;
  color:#f0b45a; white-space:nowrap;
}
/* 告警条里的「前往设置」链接必须压回普通行内样式：
   .nav_normal2 a 是 60px 高、22px 内边距的导航按钮，直接套会把一句话拉成一根大按钮 */
.nav_normal2 .pm-topbar-off a{
  float:none; display:inline; height:auto; line-height:inherit;
  padding:0; border-bottom:0; background:none; font-size:inherit;
}
.nav_normal2 .pm-topbar-off a:hover{ background:none; color:#ffd08a; }

/* 窄屏：模块名后缀让位给导航（与主站窄屏策略一致，只隐藏装饰性文字） */
@media (max-width:1023px){
  .pm-topbar-sep, .pm-topbar-mod{ display:none; }
}
/* ============================================================ 顶部背景图片（V2.6.89 · 后台可上传） ------------------------------------------------------------ 图片与「压暗遮罩」由 pm_topbar_bg_style() 以内联 linear-gradient + url() 输出， 这里只补三件内联样式做不到的事： 1) 顶部文字/图标加投影 —— 再暗的底图也可能有一块亮区把白字吃掉； 2) 导航条（.nav_normal2）额外压一层淡黑 —— 导航项本身有 hover 底色， 亮图上不加这层会出现「文字看得见、按钮边界看不见」； 3) 告警条/提醒框保持自己的语义色，不被背景图染色。 ⚠ 只在 .pm-topbar--bgimg（配了背景图时才由 PHP 输出这个类）下生效， 没配图时整段不参与层叠，顶栏观感与 V2.6.88 完全一致。 ============================================================ */
.pm-topbar--bgimg .logo,
.pm-topbar--bgimg .logo a,
.pm-topbar--bgimg .pm-topbar-mod,
.pm-topbar--bgimg .pm-clock,
.pm-topbar--bgimg .nav_normal2 a,
.pm-topbar--bgimg .pm-theme-btn,
.pm-topbar--bgimg .logininfo2,
.pm-topbar--bgimg .logininfo2 a{ text-shadow:0 1px 3px rgba(0,0,0,.65); }
.pm-topbar--bgimg .nav_normal2{ background:rgba(0,0,0,.16); }
.pm-topbar--bgimg .nav_normal2 a:hover,
.pm-topbar--bgimg .nav_normal2 a.nav_select{ background:rgba(0,0,0,.34); }
/* 提醒框是红/橙语义色的小胶囊，背景图再花也不能把它压成半透明 */
.pm-topbar--bgimg .pm-topbar-alert{ backdrop-filter:none; }
/* ============================================================ 主题风格切换按钮（V2.6.37 · 顶栏时钟旁） ------------------------------------------------------------ 结构：.pm-theme-wrap（顶栏 flex 项）> .pm-theme-btn（胶囊按钮） + .pm-theme-menu（下拉面板）+ #pm-theme-map（JSON 映射）。 行为：scripts/pm_theme.js（点击展开 / 选择 / localStorage 记忆）。 视觉：深色顶栏上的半透明胶囊，与 .pm-clock 同语言； 下拉是白色卡片（不随主题换色，保证对比度稳定）。 ============================================================ */ .pm-theme-wrap {

  position:relative;                 /* 下拉面板的定位锚 */
  display:inline-flex;
  align-items:center;
  flex:0 0 auto;
  margin-right:12px;
  order:2;                           /* 与 .pm-clock 同组：时钟 margin-left:auto 推右后按钮紧跟其后 */

}
/* 胶囊按钮：半透明玻璃感（深顶栏上），色点显示当前主题色 */ .pm-theme-btn {

  display:inline-flex;
  align-items:center;
  gap:6px;
  height:32px;
  padding:0 12px;
  font-size:12.5px;
  line-height:1;
  color:#dbe6f4;
  background:linear-gradient(135deg,rgba(120,170,255,.14),rgba(120,170,255,.04));
  border:1px solid rgba(140,180,255,.30);
  border-radius:16px;
  cursor:pointer;
  white-space:nowrap;
  transition:border-color .15s ease, background .15s ease;

}
.pm-theme-btn:hover, .pm-theme-wrap.is-open .pm-theme-btn {

  background:linear-gradient(135deg,rgba(120,170,255,.24),rgba(120,170,255,.10));
  border-color:rgba(160,200,255,.55);
  color:#ffffff;

}
.pm-theme-btn .caret {
 margin-left:2px; color:rgba(220,235,255,.75); 
}
.pm-theme-btn__dot {

  width:12px; height:12px;
  border-radius:50%;
  background:var(--pm-primary,#2c6ecb);   /* JS 切换时同步写 style */
  box-shadow:0 0 0 2px rgba(255,255,255,.25);
  flex:0 0 auto;

}
/* 下拉面板：白色卡片，右对齐时钟旁 */ .pm-theme-menu {

  display:none;
  position:absolute;
  top:calc(100% + 8px);
  right:0;
  min-width:190px;
  padding:6px;
  background:#ffffff;
  border:1px solid #e3e8f0;
  border-radius:12px;
  box-shadow:0 12px 32px rgba(15,30,60,.18);
  z-index:1200;

}
.pm-theme-menu.is-open {
 display:block; 
}
/* is-open 由 pm_theme.js 加在 menu 上 */ .pm-theme-menu__title {

  padding:6px 10px 7px;
  font-size:11px;
  font-weight:700;
  letter-spacing:1px;
  color:#8a94a6;
  border-bottom:1px solid #eef1f6;
  margin-bottom:4px;

}
/* 选项行：色点 + 名称 + 选中勾 */ .pm-theme-item {

  display:flex;
  align-items:center;
  gap:9px;
  width:100%;
  padding:8px 10px;
  font-size:13px;
  color:#2b3445;
  background:transparent;
  border:0;
  border-radius:8px;
  cursor:pointer;
  text-align:left;
  transition:background .12s ease;

}
.pm-theme-item:hover {
 background:#f1f6ff; 
}
.pm-theme-item__dot {

  width:14px; height:14px;
  border-radius:50%;
  flex:0 0 auto;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.08);

}
.pm-theme-item__name {
 flex:1; min-width:0; 
}
.pm-theme-item__check {

  display:none;
  font-size:12px;
  color:var(--pm-primary,#2c6ecb);

}
.pm-theme-item.is-on .pm-theme-item__check {
 display:inline-block; 
}
.pm-theme-item.is-on {
 background:#f1f6ff; font-weight:600; 
}
/* 窄屏：按钮收窄只留色点+图标 */ @media (max-width:1279px) {

  .pm-theme-btn .pm-theme-name{ display:none; }
  .pm-theme-btn{ padding:0 10px; }
  .pm-theme-wrap{ margin-right:8px; }

}

/* ============================================================================
   V2.6.63 响应式：表格卡片化 + 横向滚动（配合 scripts/pm_responsive.js）
   ============================================================================ */

/* 横滑容器：JS 自动包裹 table.maintable，任何宽度下超出容器可惯性横滑 */
.pm-rwd-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; max-width:100%; }
.pm-rwd-scroll > table.maintable{ min-width:640px; }   /* 保持可读密度，窄屏横滑 */

/* ≤767px 卡片模式：JS 已从 thead 注入 data-label，这里只负责呈现 */
@media (max-width:767px){
  table.pm-rwd-cards{ min-width:0 !important; width:100% !important; border:0 !important; }
  table.pm-rwd-cards thead{ display:none; }
  table.pm-rwd-cards tbody{ display:block; }
  table.pm-rwd-cards tr{
    display:block; margin:0 0 12px; padding:6px 10px;
    border:1px solid #e3e8f0; border-radius:10px; background:#fff;
    box-shadow:0 1px 4px rgba(30,41,59,.05);
  }
  table.pm-rwd-cards td{
    display:flex; justify-content:space-between; align-items:baseline; gap:12px;
    border:0 !important; padding:6px 2px; text-align:right; word-break:break-word;
  }
  table.pm-rwd-cards td::before{
    content:attr(data-label); flex:none; padding-right:8px;
    font-weight:600; color:#64748b; text-align:left;
  }
  /* 复选框 / 操作按钮等无表头列：不占标签位，右对齐排布 */
  table.pm-rwd-cards td.pm-rwd-nolabel{ justify-content:flex-end; }
  table.pm-rwd-cards td.pm-rwd-nolabel::before{ content:none; }

  /* 窄屏全局微调：操作条按钮允许换行、分页居中 */
  .pm-btnbar, .btnbar, .toolbar{ flex-wrap:wrap; }
  .pagination{ flex-wrap:wrap; }
}

/* ≤480px 极窄屏：卡片内边距再收一档 */
@media (max-width:480px){
  table.pm-rwd-cards tr{ padding:4px 8px; }
  table.pm-rwd-cards td{ font-size:12px; }
}

/* 分段卡片式 Tab（导入页等双选项切换）V2.6.69 —— 替代 Bootstrap nav-tabs，
   解决原 tab 在卡片背景上视觉割裂、active 态不醒目、移动端拥挤的问题 */
.pm-seg-tabs{
  display:flex; gap:14px; margin-bottom:20px; flex-wrap:wrap;
}
.pm-seg-tab{
  flex:0 0 auto; min-width:210px; text-decoration:none;
  display:flex; flex-direction:column; gap:3px;
  padding:14px 20px; border:1px solid #e3e8f0; border-radius:12px;
  background:#fff; color:#334155;
  box-shadow:0 1px 4px rgba(30,41,59,.05);
  transition:transform .18s ease, border-color .18s ease, box-shadow .18s ease, background .18s ease;
}
.pm-seg-tab:hover{
  border-color:#94a3b8; color:#0e335f; transform:translateY(-1px);
  box-shadow:0 4px 14px rgba(14,51,95,.14);
}
.pm-seg-tab.is-active{
  border-color:#0e335f;
  background:linear-gradient(135deg,#0e335f 0%,#1b4f8a 100%);
  color:#fff; box-shadow:0 6px 18px rgba(14,51,95,.30);
}
.pm-seg-tab.is-active .pm-seg-tab__s{ color:rgba(255,255,255,.82); }
.pm-seg-tab__t{ font-size:15px; font-weight:600; letter-spacing:.3px; }
.pm-seg-tab__s{ font-size:12px; color:#94a3b8; }
@media (max-width:520px){
  .pm-seg-tab{ min-width:0; flex:1 1 100%; flex-direction:row; align-items:center; justify-content:space-between; padding:12px 16px; }
}

/* ============================================================================
   V2.6.69 简化「界面主题」选择框
   ------------------------------------------------------------
   需求：把主题选择框做小一点、简化一点。实现：
     · 按钮只留「色点 + 图标 + 箭头」，隐藏「航空蓝（默认）」文字名；
     · 下拉由竖排「色点+文字」改为横排「纯色点网格」，更紧凑；
     · 选中项用色点外环 + 居中勾标表示，无需文字。
   作用域为 .pm-theme-*，不影响其它组件；明/暗模式通用。
   ============================================================================ */
.pm-theme-btn .pm-theme-name{ display:none; }
.pm-theme-btn{ padding:0 10px; }

.pm-theme-menu__title{
  width:100%;
  padding:2px 4px 8px;
  margin-bottom:2px;
  font-size:10.5px;
}
.pm-theme-menu.is-open{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  width:auto;
  min-width:0;
  max-width:188px;
  padding:10px;
}
.pm-theme-item{
  position:relative;
  width:26px;
  height:26px;
  padding:0;
  border-radius:50%;
  justify-content:center;
  background:transparent;
}
.pm-theme-item:hover{ background:rgba(120,170,255,.14); }
.pm-theme-item__dot{
  width:22px;
  height:22px;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.14);
}
.pm-theme-item__name{ display:none; }
.pm-theme-item__check{
  display:none;
  position:absolute;
  top:50%; left:50%;
  transform:translate(-50%,-50%);
  font-size:12px;
  color:#fff;
  text-shadow:0 0 2px rgba(0,0,0,.65);
}
.pm-theme-item.is-on{ background:transparent; box-shadow:0 0 0 2px var(--pm-primary); }
.pm-theme-item.is-on .pm-theme-item__check{ display:inline-block; }

/* ============================================================
   V2.6.69 明 / 暗模式切换按钮（置于「界面主题」按钮右侧）
   ------------------------------------------------------------
   ⚠ 间距：上一版两个按钮紧贴（实测 gap=0），肉眼看成一坨。
   这里给 .pm-mode-btn 加 10px 左边距，并用「竖分隔线」把
   「配色主题」与「明暗切换」两组控件在视觉上切开。
   ⚠ 图标：Bootstrap 3 的 glyphicon 字体里 **没有** moon / sun 字形，
   用 <span class="glyphicon glyphicon-moon"> 只会渲染出一个空圆圈。
   改用内联 SVG（太阳 / 月亮两枚），由 CSS 依 data-pm-mode 切换显示，
   颜色走 currentColor，跟随按钮配色。
   逻辑在 scripts/pm_theme.js。
   ============================================================ */
.pm-mode-btn{
  position:relative;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:32px; height:32px;
  padding:0;
  color:#dbe6f4;
  background:linear-gradient(135deg,rgba(120,170,255,.14),rgba(120,170,255,.04));
  border:1px solid rgba(140,180,255,.30);
  border-radius:50%;
  cursor:pointer;
  flex:0 0 auto;
  margin-left:10px;          /* 与「界面主题」按钮拉开距离 */
  transition:border-color .15s ease, background .15s ease, color .15s ease;
}
/* 分隔线：把「配色」与「明暗」两组控件在视觉上切开 */
.pm-mode-btn::before{
  content:"";
  position:absolute;
  left:-6px; top:50%;
  width:1px; height:18px;
  margin-top:-9px;
  background:rgba(160,190,230,.28);
  pointer-events:none;
}
.pm-mode-btn:hover,
.pm-mode-btn[aria-pressed="true"]{
  background:linear-gradient(135deg,rgba(120,170,255,.24),rgba(120,170,255,.10));
  border-color:rgba(160,200,255,.55);
  color:#ffffff;
}
/* SVG 图标：默认隐藏月亮之外的那枚，由 [data-pm-mode] 决定显示哪一个 */
.pm-mode-btn__icon{
  width:16px; height:16px;
  fill:none;
  stroke:currentColor;
  stroke-width:1.9;
  stroke-linecap:round;
  stroke-linejoin:round;
  pointer-events:none;
}
/* 月亮是实心月牙，需要填充而非描边 */
.pm-mode-btn__icon--moon{
  fill:currentColor;
  stroke:none;
}
/* 亮色模式：显示月亮（点击切到暗）；暗色模式：显示太阳（点击切回亮） */
.pm-mode-btn__icon--sun{ display:none; }
[data-pm-mode="dark"] .pm-mode-btn__icon--sun{ display:block; }
[data-pm-mode="dark"] .pm-mode-btn__icon--moon{ display:none; }


/* ==========================================================================
   头像体系（V2.6.109）
   pm_user_avatar_html() 统一输出两类节点：
     <img class="pm-avatar">           有头像
     <span class="pm-avatar pm-avatar--txt">  无头像时「首字 + 稳定配色」
   两者共用 .pm-avatar 的尺寸/圆角/描边，页面只传 size，不写行内宽高。
   ========================================================================== */
.pm-avatar{
  display:inline-block;
  vertical-align:middle;
  border-radius:50%;
  object-fit:cover;
  flex:0 0 auto;
  background:var(--pm-thead,#eef4fb);
  box-shadow:0 0 0 1px rgba(15,35,70,.08);
}
.pm-avatar--txt{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  color:#fff;
  font-weight:700;
  line-height:1;
  text-transform:uppercase;
  user-select:none;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22), 0 0 0 1px rgba(15,35,70,.06);
}
.pm-avatar--ring{
  box-shadow:0 0 0 2px var(--pm-card,#fff), 0 0 0 4px var(--pm-accent,#2c6ecb);
}
.pm-avatar-group{ display:inline-flex; align-items:center; }
.pm-avatar-group > .pm-avatar{ margin-left:-8px; }
.pm-avatar-group > .pm-avatar:first-child{ margin-left:0; }

/* 头像上传控件（用户新增 / 用户编辑页） */
.pm-av-edit{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.pm-av-edit__pic{
  width:76px; height:76px; border-radius:50%; overflow:hidden; flex:0 0 auto;
  background:var(--pm-thead,#eef4fb); display:flex; align-items:center; justify-content:center;
  box-shadow:0 0 0 1px var(--pm-border,#e3e9f2);
}
.pm-av-edit__pic img{ width:100%; height:100%; object-fit:cover; display:block; }
.pm-av-edit__ops{ display:flex; flex-direction:column; gap:8px; min-width:0; }
.pm-av-edit__row{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.pm-av-edit__tip{ font-size:12px; color:var(--pm-ink-2,#8a94a6); line-height:1.6; }
.pm-av-edit__tip b{ color:var(--pm-ink-2,#4b5563); }

/* 顶栏用户区头像（V2.6.109）：与登录名同一行垂直居中 */
.logininfo2 .dropdown-toggle > .pm-avatar{ margin-right:6px; vertical-align:middle; }
.logininfo2 .dropdown-toggle{ display:inline-flex; align-items:center; }
