/* ==========================================================================
   mobile-base.css — 移动端基础层（学生端 / 教师端共用）
   --------------------------------------------------------------------------
   只处理「所有页面都需要、且与业务无关」的移动端底噪，**不含任何布局重排**。
   布局级改造（表格改卡片、侧栏改抽屉、吸底按钮等）属于各页面自己的事。

   引入方式：
       <link rel="stylesheet" href="/public/css/mobile-base.css">

   为什么不做下面这些（避免后续返工）：
     · 不加 viewport-fit=cover —— 一旦加了就必须把每一个安全区都自己处理干净，
       漏一处就是内容被刘海/底部横条压住。不加时 iOS 会自动让出安全区，是更稳的默认。
     · 不改 input/select/textarea 的 font-size —— 会撑开表格内的紧凑输入框，
       属于逐页权衡的事，不放全局。
     · 不设 button{min-height:44px} —— 会把工具栏里的小按钮一并撑高。
       触摸目标尺寸在各自页面按需处理。

   ⚠️ 所有规则都限定在 ≤768px（与教师端 nav.js 的 MOBILE_MAX 一致），桌面端零影响。
   ========================================================================== */

@media (max-width: 768px) {
  /* 横屏时 iOS 会擅自放大字号；改为跟随布局视口 */
  html {
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
  }

  /* 触屏点击会闪一层灰色高亮，去掉；按压反馈交回样式里的 :active */
  a, button, [role="button"], label, summary,
  input[type="checkbox"], input[type="radio"] {
    -webkit-tap-highlight-color: transparent;
  }

  /* 消除移动端 300ms 点击延迟（双击缩放探测）。
     只放开 pan/zoom 相关手势，不写 touch-action:none，否则页面无法滚动。 */
  a, button, [role="button"], label, summary,
  input[type="checkbox"], input[type="radio"], select {
    touch-action: manipulation;
  }

  /* 长按按钮/链接不应弹出「选择文字」菜单（正文仍可正常选中） */
  button, [role="button"] {
    -webkit-user-select: none;
    user-select: none;
  }

  /* 横向滚动容器：加惯性滚动，避免部分 Android WebView 里滑不动 */
  .overflow-x-auto {
    -webkit-overflow-scrolling: touch;
  }

  /* KaTeX 块级公式（$$...$$）在窄屏放不下时会顶破整页 —— KaTeX 内部一律 white-space:nowrap
     且是 inline-block，既不会换行也不会收缩，只能溢出。
     实测：学生端实验页 #principleContent 里一条公式内部盒子右边缘到 434px（视口 360），
     整页可左右拖动 73px。overflow-y:hidden 是 KaTeX 官方推荐写法，
     避免滚动条占位与上下裁切冲突。
     注：这里**不**统一缩小字号 —— 「装不下才缩」交给 js/mobile-tables.js 按需处理，
     这样正常的公式保持原尺寸，只有真超宽的那一两条会变小。 */
  .katex-display {
    overflow-x: auto;
    overflow-y: hidden;
    max-width: 100%;
  }

  /* 上面那条还不够：KaTeX 的隐藏 MathML 层（.katex-mathml，position:absolute、1px、
     overflow:hidden）里，<math>/<semantics> 内部盒会「逃出」这层裁剪 —— 实测一个
     394px 的 <semantics> 把整页撑到 411px（视口 360）。
     原因是 .katex 是 position:static 时，那个绝对定位盒的包含块落在很外层，
     于是连 .katex-display 的 overflow:auto 也剪不到它。
     把包含块收回到 .katex 自身即可被上一层的滚动容器正常裁剪。
     （备选是 .katex-mathml{display:none}，同样有效，但会丢掉给屏幕阅读器的 MathML 副本，故不采用。） */
  .katex {
    position: relative;
  }

  /* 行内公式（$...$）无法用 CSS 换行，超长时至少让父级能断词，减少溢出概率 */
  .prose {
    overflow-wrap: break-word;
  }

  /* ==================== 触屏点按尺寸（实测教师端学生管理页有 168 处 < 40px） ==================== */

  /* 1) 复选框 / 单选框：浏览器默认 13×13，手指点不准。
        用 transform 放大「视觉 + 命中区域」，**不改布局尺寸**，避免撑开表格列宽
        （改 width/height 会真的改变占位，与各处已调好的列宽打架）。 */
  input[type="checkbox"],
  input[type="radio"] {
    transform: scale(1.4);
    transform-origin: center;
  }

  /* 2) 成片的工具按钮/输入框：全是 Tailwind 的 py-1.5（实测 33px 高）。
        抬到 42px。选择器带 body 前缀是为了在特异性上压过 Tailwind 运行时注入的
        .py-1\.5（两者同为 0,1,0 时由文档顺序决定，而 Tailwind 的 <style> 后注入）。
        只作用于可交互元素，不波及用 py-1.5 做内边距的装饰性 span。 */
  body button.py-1\.5,
  body a.py-1\.5,
  body input.py-1\.5,
  body select.py-1\.5,
  body textarea.py-1\.5 {
    padding-top: 10px;
    padding-bottom: 10px;
  }

  /* 3) 表格行内的文字按钮/链接（学生管理「详情/联系」实测 28×20、
        教师管理「管理实验/学习详情」22px、重置密码 24px）：撑到 38px 可点。 */
  body td > button,
  body td > a,
  body th > button,
  body th > a {
    display: inline-flex;
    align-items: center;
    min-height: 38px;
    padding-left: 6px;
    padding-right: 6px;
  }
}

/* ---------- 显隐工具类（不依赖 Tailwind，两端通用；注意与各页 Tailwind 的
   hidden/md:flex 等互不影响——这两个类名项目内没有被占用） ---------- */
.u-m-only { display: none; }
@media (max-width: 768px) {
  .u-m-only { display: block !important; }
  .u-d-only { display: none !important; }
}

/* ==========================================================================
   窄屏：宽表格转卡片（配合 /public/js/mobile-tables.js）
   --------------------------------------------------------------------------
   手机上不出现左右滑动。表格最小宽度由列数决定（实测 7 列 696px、11 列 1062px），
   375px 屏上换行/缩字号都救不回来，所以把每行折成一张卡片。

   类名 m-card 由 JS 在**实测溢出后**才加上，装得下的表格不受影响；
   mt-nolabel / mt-ctrl 也是 JS 打的（避免用 :has() 时与空字段名规则的特异性纠缠）。

   之所以用 JS 打类而不是纯 CSS：卡片布局依赖「每个单元格知道自己的字段名」，
   而字段名只能从 thead 读出来（CSS 读不到别的元素文本）。
   ⚠️ 表头**不能** display:none —— ldTable / expTable 的排序入口就是点击列头，
      隐藏表头等于在手机上弄丢排序功能，故改成横向换行的「排序胶囊」。
   ========================================================================== */
@media (max-width: 768px) {

  /* 承载卡片的滚动容器：不再需要滚动与外框（卡片自带边框） */
  .overflow-x-auto:has(> table.m-card) {
    overflow: visible !important;
    border: none !important;
    border-radius: 0 !important;
  }

  table.m-card {
    display: block;
    width: 100% !important;
    /* 压掉表上的 whitespace-nowrap（learning-detail 的 ldTable 就写在 table 上） */
    white-space: normal !important;
    border-collapse: separate;
    border-spacing: 0;
  }
  /* 双写类名抬高特异性：experiment.css 里有一条 `.prose table{display:block;overflow-x:auto}`
     给报告模板表做滚动兜底，两者特异性相同而那条在文档里更靠后，会盖掉卡片态。
     卡片态下不能再有滚动容器，否则套在卡片外多一层横向滚动。
     （不用 !important 是为了保留以后正常覆盖的余地。） */
  table.m-card.m-card {
    display: block;
    overflow: visible;
    word-break: normal;
  }

  /* --- 表头 → 排序胶囊（保留点击排序） --- */
  table.m-card thead { display: block; }
  table.m-card thead > tr {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 10px;
  }
  table.m-card thead > tr > th {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    /* 允许收缩 + 换行：表头里可能含 KaTeX 公式（实测「平均磁场 B̄ (mT)」这类），
       公式是 inline-block 不可断行，胶囊若 nowrap 且不收缩就会顶出屏幕（320px 屏实测溢出 11px）。 */
    flex: 0 1 auto;
    min-width: 0;
    max-width: 100%;
    padding: 7px 11px !important;
    border: 1px solid #d1d5db !important;
    border-radius: 999px;
    background: #fff;
    color: #374151 !important;
    font-size: .78rem !important;
    font-weight: 600 !important;
    line-height: 1.4 !important;
    white-space: normal;
    overflow-wrap: anywhere;
    text-align: left !important;
  }
  /* 胶囊里的公式也要跟着缩小字号，否则单条公式本身就比胶囊还宽 */
  table.m-card thead > tr > th .katex { font-size: 1em; }
  /* 勾选框表头（学生名单首列）压缩成小胶囊 */
  table.m-card thead > tr > th:has(input[type="checkbox"]) { padding: 3px 8px !important; }

  /* --- 表体 → 卡片 --- */
  table.m-card tbody { display: block; width: 100%; }
  table.m-card tbody > tr {
    display: block;
    margin-bottom: 10px;
    background: #fff;
    border: 1px solid #e5e7eb;
    border-radius: 10px;
    overflow: hidden;
  }
  table.m-card tbody > tr:last-child { margin-bottom: 0; }
  table.m-card tbody > tr > td {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    width: auto;
    max-width: none;
    padding: 8px 12px !important;
    border: none !important;
    text-align: left !important;
    white-space: normal !important;
    overflow-wrap: anywhere;
    word-break: break-word;
  }
  /* 字段名（取自 thead） */
  table.m-card tbody > tr > td::before {
    content: attr(data-label);
    flex: 0 0 30%;
    min-width: 0;
    color: #6b7280;
    font-size: .78rem;
    font-weight: 600;
    line-height: 1.6;
  }
  /* 无字段名的列：不占位 */
  table.m-card tbody > tr > td.mt-nolabel::before { display: none; }
  /* 空单元格直接不显示，免得卡片里出现一排空的「字段名 —」 */
  table.m-card tbody > tr > td:empty { display: none; }
  /* 数字/状态列原本居中，卡片里统一左对齐更整齐 */
  table.m-card tbody > tr > td.text-center { text-align: left !important; }
  /* 单元格里的内容不许再撑破卡片 */
  table.m-card tbody > tr > td > * { min-width: 0; max-width: 100%; }

  /* --- 含控件的格（操作列、可点姓名）：字段名独占一行，控件在下方换行排布 --- */
  table.m-card tbody > tr > td.mt-ctrl {
    display: block;
    padding-top: 10px !important;
    padding-bottom: 10px !important;
  }
  table.m-card tbody > tr > td.mt-ctrl::before {
    display: block;
    margin: 0 0 2px;
    line-height: 1.5;
  }
  /* 卡片里的操作按钮/链接排成一行并自动换行 */
  table.m-card tbody > tr > td.mt-ctrl > button,
  table.m-card tbody > tr > td.mt-ctrl > a {
    display: inline-flex;
    align-items: center;
    min-height: 40px;
    padding: 6px 12px;
    margin: 2px 8px 0 0;
    border: 1px solid #e5e7eb;
    border-radius: 8px;
    background: #f9fafb;
    font-size: .82rem;
    text-decoration: none;
  }
  table.m-card tbody > tr > td.mt-ctrl > button:active,
  table.m-card tbody > tr > td.mt-ctrl > a:active { background: #f3f4f6; }

  /* ======================================================================
     容器留白收缩 —— 手机上 24~32px 的水平内边距太贵（360px 屏能吃掉 1/6 宽度）
     只改左右，纵向节奏保持不变。
     ====================================================================== */

  /* 页面级容器（学习详情/邮件记录的 main.p-8 实测吃掉 56px，只剩 248px 给表格） */
  body main.p-8,
  body main.p-6 { padding-left: 12px; padding-right: 12px; }
  body .container.px-4,
  body main.container { padding-left: 12px; padding-right: 12px; }

  /* 承载表格的白卡：有 :has() 就精确命中，没有就只是不生效，不影响其它样式 */
  body .p-6:has(table),
  body .p-5:has(table),
  body .p-4:has(table),
  body .px-6:has(table),
  body .px-5:has(table),
  body .px-4:has(table) {
    padding-left: 12px;
    padding-right: 12px;
  }
}

