/* ============================================================================
 * styles/main.css —— 全局布局与通用组件
 *
 * 【规矩】这里不许出现写死的色值，一律用 var(--c-xxx) 引用 tokens.css。
 * ==========================================================================*/

/* ----------------------------------------------------------------------------
 * 1. 页面容器
 * -------------------------------------------------------------------------- */

body{
  min-height: 100vh;
}

.app-header{
  padding: 20px 24px 16px;
  border-bottom: 1px solid var(--c-border);
  background: var(--c-surface);
}

.app-header h1{
  font-size: 1.35rem;
  color: var(--c-text);
  letter-spacing: 0.02em;
}

.app-header .subtitle{
  margin-top: 4px;
  font-size: 0.85rem;
  color: var(--c-text-dim);
}

.app-header .brand-dot{
  display: inline-block;
  width: 8px;
  height: 8px;
  margin-right: 8px;
  border-radius: 50%;
  background: var(--c-accent);
  vertical-align: middle;
}

main{
  max-width: 880px;
  margin: 0 auto;
  padding: 24px;
}

/* ----------------------------------------------------------------------------
 * 2. 屏幕切换
 *    showScreen('login') → 只让 #screen-login 显示
 * -------------------------------------------------------------------------- */

.screen{
  display: none;
}

.screen.active{
  display: block;
}

.screen h2{
  font-size: 1.15rem;
  margin-bottom: 10px;
}

/* ----------------------------------------------------------------------------
 * 3. 卡片
 * -------------------------------------------------------------------------- */

.card{
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  padding: 20px;
  margin-bottom: 16px;
}

.card-head{
  margin-bottom: 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--c-border);
  font-size: 0.9rem;
  color: var(--c-text-dim);
}

/* 占位说明文字 */
.placeholder{
  color: var(--c-text-dim);
  font-size: 0.92rem;
  margin-bottom: 16px;
}

/* ----------------------------------------------------------------------------
 * 4. 按钮
 * -------------------------------------------------------------------------- */

.btn{
  display: inline-block;
  padding: 10px 20px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  background: var(--c-surface-2);
  color: var(--c-text);
  font-family: var(--font-sans);
  font-size: 0.95rem;
  cursor: pointer;
  transition: opacity 0.15s, border-color 0.15s;
}

.btn:hover{
  opacity: 0.85;
}

.btn:active{
  opacity: 0.7;
}

.btn:focus-visible{
  outline: 2px solid var(--c-primary);
  outline-offset: 2px;
}

/* 主按钮：医疗青底 + 深色字 */
.btn-primary{
  background: var(--c-primary);
  border-color: var(--c-primary);
  color: var(--c-bg);
  font-weight: 600;
}

/* 危险按钮：红底 */
.btn-danger{
  background: var(--c-danger);
  border-color: var(--c-danger);
  color: var(--c-bg);
  font-weight: 600;
}

/* 幽灵按钮：透明底 + 细边框 */
.btn-ghost{
  background: transparent;
  border-color: var(--c-border);
  color: var(--c-text-dim);
}

.btn-ghost:hover{
  color: var(--c-text);
  border-color: var(--c-primary);
}

/* 并排的两个判断按钮 */
.btn-row{
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

.btn-row .btn{
  flex: 1 1 160px;
  text-align: center;
}

/* ----------------------------------------------------------------------------
 * 5. 生命体征分档（颜色含义见 CONTRACT.md 2.4）
 *    ⚠️ 只反映数值偏离程度，与"真实是否需要急诊"无关
 * -------------------------------------------------------------------------- */

.vital-normal{ color: var(--c-normal); }
.vital-watch { color: var(--c-watch);  }
.vital-danger{ color: var(--c-danger); }

/* ----------------------------------------------------------------------------
 * 6. 混淆矩阵 / 数据表（三线表风格）
 * -------------------------------------------------------------------------- */

.cm-table{
  width: 100%;
  border-collapse: collapse;
  font-size: 0.9rem;
  margin-bottom: 12px;
}

.cm-table caption{
  text-align: left;
  color: var(--c-text-dim);
  font-size: 0.85rem;
  padding-bottom: 8px;
}

.cm-table th,
.cm-table td{
  padding: 8px 12px;
  text-align: right;
}

.cm-table th:first-child,
.cm-table td:first-child{
  text-align: left;
}

/* 三线表：顶线、表头下线、底线 */
.cm-table thead th{
  border-top: 2px solid var(--c-border);
  border-bottom: 1px solid var(--c-border);
  color: var(--c-text-dim);
  font-weight: 500;
}

.cm-table tbody tr:last-child td{
  border-bottom: 2px solid var(--c-border);
}

.cm-table tbody tr:hover td{
  background: var(--c-surface-2);
}

/* 强调某一行（比如"更保守"的那一轮） */
.cm-table tr.highlight td{
  color: var(--c-primary);
}

/* ----------------------------------------------------------------------------
 * 7. 开发导航条（骨架阶段的临时工具，验收完成后连同 HTML 一起删）
 *    刻意做得低调：小字号、次要文字色、无填充，不抢正式 UI 的注意力
 * -------------------------------------------------------------------------- */

.dev-nav{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  padding: 8px 24px;
  border-bottom: 1px solid var(--c-border);
}

.dev-nav-label{
  margin-right: 4px;
  font-size: 0.72rem;
  color: var(--c-text-dim);
  letter-spacing: 0.08em;
}

.dev-nav button{
  padding: 3px 10px;
  border: 1px solid var(--c-border);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--c-text-dim);
  font-family: var(--font-sans);
  font-size: 0.75rem;
  line-height: 1.4;
  cursor: pointer;
  transition: color 0.15s, border-color 0.15s;
}

.dev-nav button:hover{
  color: var(--c-text);
  border-color: var(--c-primary);
}

/* 当前所在的屏 */
.dev-nav button.active{
  color: var(--c-primary);
  border-color: var(--c-primary);
}

/* ----------------------------------------------------------------------------
 * 8. 轮次过渡文案（保留换行，用正文字体而不是 <pre> 默认的等宽字体）
 * -------------------------------------------------------------------------- */

.round-intro{
  margin-bottom: 16px;
  font-family: var(--font-sans);
  font-size: 0.95rem;
  line-height: 1.8;
  color: var(--c-text);
  white-space: pre-wrap;
  word-break: break-word;
}

/* ----------------------------------------------------------------------------
 * 9. 响应式：窄于 700px 改单列
 * -------------------------------------------------------------------------- */

@media (max-width: 700px){

  main{
    padding: 16px;
  }

  .app-header{
    padding: 16px;
  }

  .dev-nav{
    padding: 8px 16px;
  }

  .card{
    padding: 16px;
  }

  .btn-row{
    flex-direction: column;
  }

  .btn-row .btn{
    flex: 1 1 auto;
    width: 100%;
  }

  .cm-table th,
  .cm-table td{
    padding: 6px 8px;
    font-size: 0.85rem;
  }
}

/* ============================================================================
 * 概念实验室：标签栏 + 面板
 *
 * 面板默认全部隐藏，显隐由 index.html 的 showLab() 用行内 style 控制。
 *
 * ★ .lab-panel 初始就是 display: none —— 这是刻意的，不是漏写：
 *   容器还藏着的时候 ECharts 建不出图（读到的宽高都是 0），
 *   所以必须等它真正显示出来之后，才让模块去渲染。
 * ==========================================================================*/

.lab-tabs{
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 20px 0 18px;
}

.lab-tab{
  padding: 9px 18px;
  font-family: var(--font-sans);
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--c-text-dim);
  background: var(--c-surface);
  border: 1px solid var(--c-border);
  border-radius: 999px;
  cursor: pointer;
  transition: color .18s, background .18s, border-color .18s;
}

.lab-tab:hover{
  color: var(--c-text);
  border-color: var(--c-primary);
}

.lab-tab.active{
  color: var(--c-bg);
  background: var(--c-primary);
  border-color: var(--c-primary);
}

.lab-panel{
  display: none;
}

/* 图表容器：必须给确定的高度，否则 ECharts 会建成 0 高的空白 */
.chart{
  width: 100%;
  height: 340px;
}

.chart-sm{
  width: 100%;
  height: 260px;
}

@media (max-width: 700px){
  .chart{
    height: 250px;
  }

  .chart-sm{
    height: 200px;
  }
}

/* ============================================================================
 * 11. 监护仪面板（视觉层 · 第 1 阶段；M视觉1c 重画）
 *
 * 游戏屏里、患者卡片【上方】的那块仪器面板。纯增量：把 #monitorPanel 从页面上
 * 拿掉，游戏一个字都不受影响。
 *
 * 【布局】左边两条波形上下叠（各占一半高），右边一列三个读数。
 *   真监护仪就长这样：波形占大头，数字挤在右边一条。
 *
 * 【高度必须定死】面板高度写死在 .monitor-panel 上（桌面 240px / 窄屏 195px），
 *   里面的格子全靠 flex 平分 —— 于是不管患者怎么换、数字几位数、
 *   波形画成什么样，整块面板的高度一动不动。一旦某项的高度跟着内容走，
 *   下面的患者卡片就会上下跳，读数会看串行。
 *   自测里"连着渲染 20 位患者，体征行的 top 只能有 1 个值"盯的就是这里。
 *
 * 【底色比卡片更深】一块嵌在暗处的仪器屏：底色 #080D12 比 --c-bg 还暗一档，
 *   外圈一圈细边（--c-border），里面靠光晕和网格提亮。
 * ==========================================================================*/

/* 还没渲染时不留任何空隙（render 之后里面才有 .monitor-panel） */
#monitorPanel:empty{
  display: none;
}

.monitor-panel{
  display: flex;
  gap: 12px;
  height: 240px;              /* ★ 定死。桌面 220~250 的中间值 */
  margin-bottom: 16px;
  padding: 12px;
  background: #080D12;
  border: 1px solid var(--c-border);
  border-radius: var(--radius);
  /* 微弱的内发光：深色底 + 一点点青绿，像屏幕自己在发亮 */
  box-shadow: inset 0 0 26px rgba(46, 211, 166, .055);
}

/* ---- 左：两条波形 ---- */

.monitor-waves{
  flex: 1 1 70%;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

/* 波形格：一块小黑屏。
 *
 * ★ 方格网 —— 人对监护仪的记忆很大程度就是这片绿格子（任务书 §二）。
 *   用 CSS 的 repeating-linear-gradient 画，绝对不用 Canvas 画格线
 *   （Canvas 留着画波形）。
 *   四层背景叠起来：两层小格（12px，很暗）+ 两层大格（60px = 5 小格，稍亮）。
 *   颜色是【暗绿】不是白 —— 任务书给的那组 rgba(36,49,63,…) 是蓝灰的，
 *   这里按"真监护仪的格子是暗绿的"那句用了青绿的低透明度版本。
 */
.monitor-screen{
  position: relative;
  flex: 1 1 0;                /* 两格平分，各占一半高度 */
  min-height: 0;
  overflow: hidden;
  border: 1px solid var(--c-border);
  border-radius: 6px;
  background-color: #060A0E;
  background-image:
    repeating-linear-gradient(0deg,  rgba(46, 211, 166, .11) 0 1px, transparent 1px 12px),
    repeating-linear-gradient(90deg, rgba(46, 211, 166, .11) 0 1px, transparent 1px 12px),
    repeating-linear-gradient(0deg,  rgba(46, 211, 166, .24) 0 1px, transparent 1px 60px),
    repeating-linear-gradient(90deg, rgba(46, 211, 166, .24) 0 1px, transparent 1px 60px);
}

.monitor-ecg,
.monitor-pleth{
  display: block;
  width: 100%;
  height: 100%;               /* 铺满自己那一格，不留空白 */
}

/* ---- 报警灯：心电格左上角的小圆点 ---- */

.monitor-alarm{
  position: absolute;
  top: 5px;
  left: 5px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: currentColor;
  /* 光晕（任务书 §二④） */
  box-shadow: 0 0 8px currentColor, 0 0 18px currentColor;
}

/* 颜色和闪烁速度都由【灯的那一档】决定：档 = 五项生命体征里最差的那一档
   （阈值和患者卡片同一张表 —— PatientCard.VITAL_RANGES，见 js/monitor.js 第 3.1 节）。
   ★ 不读 severity：灯只汇总已经摆在卡片上的信息，一个比特都不多。 */

.monitor-alarm.normal{
  color: var(--c-normal);
  animation: none;      /* 常亮，不闪 */
  opacity: 1;
}

.monitor-alarm.watch{
  color: var(--c-watch);
  animation: monitor-blink 1s ease-in-out infinite;    /* 慢闪：约 1 秒一次 */
}

.monitor-alarm.danger{
  color: var(--c-danger);
  animation: monitor-blink .5s ease-in-out infinite;   /* 快闪：约 0.5 秒一次 */
}

/* 闪的是 opacity（不是 JS 定时器，任务书 §二③） */
@keyframes monitor-blink{
  0%, 100%{ opacity: 1;   }
  50%     { opacity: .15; }
}

/* ---- 右：读数一列三格 ---- */

.monitor-readouts{
  flex: 0 0 30%;
  min-width: 0;
  display: flex;
  flex-direction: column;
}

.monitor-readout{
  flex: 1 1 0;                /* 三格平分，每格和左边的波形格同高 */
  min-height: 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.monitor-readout + .monitor-readout{
  border-top: 1px solid var(--c-border);   /* 三格之间那道横线 */
  padding-top: 4px;
}

.monitor-readout-label{
  font-size: 0.72rem;
  line-height: 1.3;
  color: var(--c-text-dim);
  letter-spacing: 0.08em;
  margin-bottom: 2px;
  white-space: nowrap;
}

/* 大号等宽数字。字号用 clamp 跟着窗口缩 —— 窄屏上靠缩小让位，绝不折行
   （折了行，三个读数就不在一条水平线上，而且会把下面的卡片顶下去）。

   ★ 4.1vw 这个系数是量出来的，不是拍的：右边这一列只有面板宽度的 30%，
     最坏的一组读数是「200/126」+「mmHg」，等宽字体一个字符约 0.6em，
     要在 400px 视口下塞进 100 来像素，数字字号上限约 16.6px（≈4.15vw）。
     写大了就会被 text-overflow 裁掉 —— 血压只剩「200/12…」，
     玩家读数读一半，比不显示还糟。 */
.monitor-readout-value{
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: clamp(1rem, 4.1vw, 1.9rem);
  font-weight: 600;
  line-height: 1.15;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* 数字的颜色走 .vital-normal / .vital-watch / .vital-danger —— 和患者卡片
   那一行是同一套类名、同一套色值（见本文件第 5 节）。这里不重复定义颜色。 */

.monitor-readout-unit{
  font-size: 0.66em;
  font-weight: 500;
  color: var(--c-text-dim);
  margin-left: 2px;
}

/* ---- 窄屏：整体压矮一档，别把页面撑爆 ---- */

@media (max-width: 700px){

  .monitor-panel{
    height: 195px;            /* 窄屏 180~210 的中间值 */
    padding: 10px;
    gap: 8px;
    margin-bottom: 12px;
  }

  .monitor-waves{
    gap: 6px;
  }

  .monitor-readouts{
    flex: 0 0 30%;
  }

  .monitor-readout-label{
    font-size: 0.66rem;
  }

  .monitor-alarm{
    top: 4px;
    left: 4px;
    width: 8px;
    height: 8px;
  }
}
