/* ============================================================
   移动端壳层 + 逐页手机样式：门店角色（body.m-store）+ ≤1024px 生效。
   断点取 1024：门店端会经集成接口内嵌到第三方平台的 UI（iframe 常见
   700~1000px 宽），这类小屏直接整套用手机版样式，不再走"桌面布局+
   折叠侧栏"的中间形态；真桌面全屏（>1024）才是桌面布局。
   - 桌面侧栏隐藏，底部 5 格 Tab 导航（app.js renderTabbar 渲染）
   - 全局弹窗变底部抽屉（bottom sheet）
   - AI 对话 = 内嵌整页（store.js aiChatMobilePage），会话列表左滑抽屉
   - 手机端隐藏说明性文字（页头副标题 / 卡片头提示 / 技术细节），排版收紧
   admin / agent 角色不加 body.m-store，手机上保持桌面布局，互不影响。
   登录页样式（文件末尾）不依赖角色，对所有账号生效。
   ============================================================ */

/* ---------- 「我的」聚合页（不限断点：桌面直链进入也可用） ---------- */
.me-head {
  display: flex; align-items: center; gap: 14px;
  padding: 6px 4px 18px;
}
.me-avatar {
  flex: none;
  width: 54px; height: 54px;
  display: grid; place-items: center;
  border-radius: 16px;
  font-size: 22px; font-weight: 800; color: #fff;
  background: linear-gradient(135deg, #52525b, #18181b);
  border: 1px solid var(--line-bold);
}
.me-head .mh-name { font-size: 17px; font-weight: 700; color: var(--ink); }
.me-head .mh-sub  { font-size: 12.5px; color: var(--ink-faded); margin-top: 2px; }

.me-group-title {
  font-size: 12px; color: var(--ink-dim);
  padding: 4px 6px 6px;
  letter-spacing: 1px;
}
.me-list {
  border: 1px solid var(--line);
  border-radius: 14px;
  overflow: hidden;
  background: rgba(255, 255, 255, 0.03);
  margin-bottom: 16px;
}
.me-item {
  display: flex; align-items: center; gap: 12px;
  width: 100%;
  padding: 13px 14px;
  background: none; border: none;
  border-top: 1px solid var(--line-soft);
  color: var(--ink-soft);
  font-size: 14px; font-family: var(--font-ui);
  text-align: left; text-decoration: none;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.me-item:first-child { border-top: none; }
.me-item:active { background: rgba(255, 255, 255, 0.06); }
.me-item .mi-ico   { flex: none; display: grid; place-items: center; color: var(--ink-faded); }
.me-item .mi-label { flex: 1 1 auto; min-width: 0; }
.me-item .mi-side  { flex: none; font-size: 12px; color: var(--ink-dim); }
.me-item .mi-arrow { flex: none; color: var(--ink-dim); display: grid; place-items: center; }

/* 列表里的 <button>（主题/退出登录）要和 <a> 条目长得一模一样：
   压掉 saas.css 全局 button:hover 的灰底/描边/浮起/变色——手机上 hover
   会在点按后一直粘住，导致被点过的条目顶着一层灰底，像被特殊高亮了 */
button.me-item,
button.me-item:hover,
html[data-theme="light"] button.me-item,
html[data-theme="light"] button.me-item:hover {
  background: none;
  color: var(--ink-soft);
  transform: none;
  box-shadow: none;
  border-radius: 0;
  border-color: var(--line-soft);
  font: inherit;
  letter-spacing: inherit;
}
button.me-item:active { background: rgba(255, 255, 255, 0.06); }

html[data-theme="light"] .me-list { background: #fff; }
html[data-theme="light"] .me-item:active,
html[data-theme="light"] button.me-item:active { background: rgba(0, 0, 0, 0.05); }
html[data-theme="light"] .me-avatar { background: linear-gradient(135deg, #3f3f46, #18181b); }

/* ---------- 桌面默认隐藏的移动端专属元素 ---------- */
.m-tabbar { display: none; }
.ai-ses-toggle { display: none; }        /* AI 整页的会话抽屉按钮：仅手机出现 */
.topbar .m-brand-title { display: none; } /* 手机顶栏品牌名：仅手机出现 */

/* ============================================================
   ≤1024px + 门店角色：移动壳层
   ============================================================ */
@media (max-width: 1024px) {

  /* saas.css 已把 html 锁成 height:100% + overflow:hidden（页面不滚，
     main#view 内部滚），与手机壳层同一套模型，这里无需再覆盖。 */

  body.m-store { -webkit-tap-highlight-color: transparent; }

  /* —— 布局翻转：单列，无侧栏；滚动改到 main 内部 ——
     壳层锁死一屏高、页面本身不滚，main#view 自己滚且下沿正好停在
     Tab 栏上沿：滚动条贴屏幕最右、不再穿过底部导航。
     高度基准 --app-h 由 app.js 从 window.innerHeight 实时写入（地址栏
     收展/键盘/转屏都会跟随）——100vh/100%/dvh 在部分移动浏览器会把
     地址栏那截算进布局高度，壳层比可视区高出几十像素，表现为
     "滚到底还差一小节、要再拽一下"；innerHeight 是唯一全端一致口径。 */
  body.m-store {
    height: 100%;
    height: var(--app-h, 100%);
    min-height: 0;      /* 覆盖桌面端 body 的 min-height:100vh */
    overflow: hidden;
  }
  body.m-store .shell {
    grid-template-columns: 1fr;
    grid-template-rows: var(--top-h) auto auto 1fr;
    grid-template-areas:
      "top"
      "banner"
      "viewas"
      "main";
    height: 100%;
    height: var(--app-h, 100%);
    min-height: 0;      /* 覆盖桌面端 .shell 的 min-height:100vh */
    overflow: hidden;
  }
  body.m-store .sidebar { display: none; }

  /* —— 顶栏：恒显平台品牌名（代理设置的名称，applyBranding 写入），
     不随导航页切换变动；面包屑整条隐藏，当前页看底部 Tab 高亮即可 —— */
  body.m-store .topbar { padding: 0 14px; gap: 10px; }
  body.m-store .topbar .crumb > .muted,
  body.m-store .topbar .crumb > .crumb-link,
  body.m-store .topbar .crumb > svg,
  body.m-store .topbar .crumb > #tb_crumb_active { display: none; }
  body.m-store .topbar .crumb {
    flex: 1 1 auto; min-width: 0;
    overflow: hidden;
  }
  body.m-store .topbar .crumb .m-brand-title {
    display: block;
    font-size: 16.5px; font-weight: 800; letter-spacing: 0.5px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  /* HA 选择器限宽，防止长门店名把标题挤出屏幕 */
  body.m-store .topbar .top-actions { flex: none; max-width: 52vw; }
  body.m-store .topbar .store-filter { max-width: 100%; min-width: 0; }
  body.m-store .topbar .store-filter-sel { max-width: calc(52vw - 30px); }

  body.m-store #view_as_host { padding: 10px 14px 0; }
  body.m-store #view_as_host:empty { padding: 0; }
  body.m-store .store-banner { padding: 10px 14px; font-size: 12.5px; }

  /* —— 内容区：main 是唯一滚动容器，给底部 Tab 栏留出空间 ——
     transform:translateZ(0)（桌面合成层优化）必须关掉：transform 会把
     fixed 后代（AI 对话整页）的定位基准从视口偷换成 main 自己，
     造成 AI 页顶部多一段空白、输入栏沉到 Tab 栏后面。 */
  body.m-store main#view {
    padding: 14px 12px calc(84px + env(safe-area-inset-bottom));
    overflow-y: auto;
    transform: none;
    isolation: auto;
  }

  /* ============ 底部 Tab 栏 ============
     参照 Material 3 底部导航：整条栏是干净的毛玻璃平面（无每项卡片皮），
     激活项 = 图标后衬一枚品牌青色胶囊指示器（弹入动效）+ 同色加粗标签；
     未激活项只有安静的灰图标灰字。按下有轻微缩放反馈。 */
  body.m-store .m-tabbar {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    position: fixed; left: 0; right: 0; bottom: 0;
    z-index: 60;
    /* 平板/iframe 宽屏：5 个 tab 收拢在中间 ~620px 内，不整条摊开 */
    padding: 6px max(8px, calc((100vw - 620px) / 2)) calc(6px + env(safe-area-inset-bottom));
    background: rgba(11, 11, 16, 0.92);
    backdrop-filter: blur(24px) saturate(160%);
    -webkit-backdrop-filter: blur(24px) saturate(160%);
    border-top: 1px solid rgba(255, 255, 255, 0.06);
  }
  body.m-store .m-tabbar .mt-item {
    appearance: none;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 4px;
    min-height: 52px;
    padding: 3px 0 1px;
    background: none; border: none; border-radius: 0; box-shadow: none;
    color: var(--ink-dim);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    transition: transform .15s ease;
  }
  body.m-store .m-tabbar .mt-item:active { transform: scale(0.94); }
  /* 图标坑位固定尺寸；胶囊指示器画在 ::before 上，激活时从 0.6 缩放弹入 */
  body.m-store .m-tabbar .mt-ico {
    position: relative;
    display: grid; place-items: center;
    width: 54px; height: 28px;
    color: inherit;
    transition: color .18s ease;
  }
  body.m-store .m-tabbar .mt-ico::before {
    content: "";
    position: absolute; inset: 0;
    border-radius: 999px;
    background: rgba(103, 232, 249, 0.16);
    opacity: 0;
    transform: scale(0.6);
    transition: opacity .18s ease, transform .22s cubic-bezier(.34, 1.4, .5, 1);
  }
  body.m-store .m-tabbar .mt-ico svg { display: block; position: relative; z-index: 1; }
  body.m-store .m-tabbar .mt-lbl {
    font-family: var(--font-ui);
    font-size: 10.5px; font-weight: 500; letter-spacing: 0.4px;
    line-height: 1.2;
    color: var(--ink-dim);
    transition: color .18s ease;
  }
  body.m-store .m-tabbar .mt-item.active .mt-ico { color: #a5f3fc; }
  body.m-store .m-tabbar .mt-item.active .mt-ico::before { opacity: 1; transform: scale(1); }
  body.m-store .m-tabbar .mt-item.active .mt-lbl { color: #e8fbff; font-weight: 700; }

  html[data-theme="light"] body.m-store .m-tabbar {
    background: rgba(255, 255, 255, 0.95);
    border-top-color: rgba(0, 0, 0, 0.07);
    box-shadow: 0 -6px 24px rgba(15, 23, 42, 0.06);
  }
  html[data-theme="light"] body.m-store .m-tabbar .mt-item { color: #64748b; }
  html[data-theme="light"] body.m-store .m-tabbar .mt-lbl { color: #64748b; }
  html[data-theme="light"] body.m-store .m-tabbar .mt-ico::before { background: rgba(8, 145, 178, 0.13); }
  html[data-theme="light"] body.m-store .m-tabbar .mt-item.active .mt-ico { color: #0e7490; }
  html[data-theme="light"] body.m-store .m-tabbar .mt-item.active .mt-lbl { color: #0f172a; }

  /* toast 抬到 Tab 栏上方，避免被遮住 */
  body.m-store .toast {
    bottom: calc(84px + env(safe-area-inset-bottom));
    max-width: calc(100vw - 32px);
  }

  /* —— 全局弹窗 → 底部抽屉（bottom sheet）——
     平板/iframe 宽屏时抽屉不整条摊开，限宽 680px 居中升起 */
  body.m-store .modal { place-items: end center; padding: 0; }
  body.m-store .modal-box,
  body.m-store .modal-box.wide,
  body.m-store .modal-box.x-wide {
    width: 100%; max-width: 680px;
    max-height: calc(100vh - 44px);
    max-height: calc(100dvh - 44px);
    border-radius: 18px 18px 0 0;
    border-left: none; border-right: none; border-bottom: none;
    animation: m-sheet-in .22s cubic-bezier(.3, .9, .4, 1);
  }
  body.m-store .modal-foot {
    padding-bottom: calc(14px + env(safe-area-inset-bottom));
  }

  /* —— 房间 / 设备操控面板（bottom sheet 内容）——
     sheet 里装的是完整卡（makeRoomCardPro / makeDeviceCard full 版），
     把卡片皮剥掉（边框/底色/内边距），内容直接充当面板本体。 */
  body.m-store .m-sheet-room > .room-pro,
  body.m-store .m-sheet-dp > .dpanel-card {
    border: none !important;
    background: none !important;
    box-shadow: none !important;
    padding: 0;
    border-radius: 0;
  }
  body.m-store .m-sheet-room > .room-pro { gap: 12px; }
  body.m-store .m-sheet-room .rp-head { padding-bottom: 10px; }
  body.m-store .m-sheet-dp > .dpanel-card .dpc-head { padding: 2px 0 10px; }
  body.m-store .m-sheet-dp > .dpanel-card .dpc-body { padding: 2px 0 6px; }

  /* ============ AI 对话：内嵌整页（全出血 chat 屏） ============
     store.js aiChatMobilePage 渲染 .ai-page-m 壳；顶栏 + 底部 Tab 都保留。
     悬浮 Dock（桌面形态）在手机端整体禁用。 */
  body.m-store #ai_dock_fab,
  body.m-store #ai_dock_win { display: none !important; }

  /* 固定定位钉死在「顶栏下沿 ~ Tab 栏上沿」之间（Tab 栏实高 7+50+7=64 + 安全区）。
     之前用负外边距 + 100dvh 拼高度，浏览器地址栏/键盘一动就差几像素，
     产生页面滚动条和输入栏下方的空白；fixed 脱离文档流后页面本身零高度，
     不可能再出滚动条，消息区是唯一的滚动容器。 */
  body.m-store .ai-page-m {
    display: flex; flex-direction: column;
    position: fixed;
    left: 0; right: 0;
    top: var(--top-h);
    bottom: calc(64px + env(safe-area-inset-bottom));
    z-index: 5;
    background: var(--bg);
  }
  /* 前置拦截（Agent 离线 / 未启用 / 加载中）只有提示卡：恢复常规排版 */
  body.m-store .ai-page-m.ai-page-m-plain {
    display: block;
    position: static;
    background: none;
  }

  /* 双栏 grid（内联 220px 1fr）→ 单栏；作为会话抽屉的定位锚点。
     去圆角去边框：整块就是页面本身 */
  body.m-store .ai-page-m .ai-layout-embedded {
    grid-template-columns: 1fr !important;
    gap: 0 !important;
    position: relative;
    overflow: hidden;
    border-radius: 0;
  }
  /* 右侧对话卡：卡片皮全部剥掉（边框/圆角/底色/外边距），成为纯 chat 区。
     margin-bottom 尤其关键：.card 全局自带 16px 下边距，在全出血布局里
     会在输入栏和 Tab 栏之间露一条页面底色。 */
  body.m-store .ai-page-m .ai-layout-embedded > .card {
    margin: 0;
  }
  body.m-store .ai-page-m .ai-layout-embedded > .card:last-child {
    border: none;
    border-radius: 0;
    background: transparent;
  }
  /* 左栏（会话列表）→ 左滑抽屉：默认推出屏外，.show-ses 滑入。
     收起时必须 visibility:hidden——translateX 用的是自身宽度百分比，
     键盘弹出/滚动条增减导致视口宽度变化时，计算值一变过渡就会把抽屉
     "滑出来又滑回去"闪一下；藏住后位移再怎么重算都不可见。 */
  body.m-store .ai-page-m .ai-layout-embedded > .card:first-child {
    position: absolute; top: 0; bottom: 0; left: 0;
    width: min(78vw, 320px);
    z-index: 5;
    margin: 0;
    border-radius: 0 14px 14px 0;
    background: var(--paper-1, #0a0a0e);
    transform: translateX(-110%);
    visibility: hidden;
    transition: transform .22s cubic-bezier(.3, .9, .4, 1), visibility 0s linear .22s;
    box-shadow: 24px 0 60px rgba(0, 0, 0, 0.45);
  }
  body.m-store .ai-page-m.show-ses .ai-layout-embedded > .card:first-child {
    transform: none;
    visibility: visible;
    transition: transform .22s cubic-bezier(.3, .9, .4, 1), visibility 0s;
  }
  /* 抽屉展开时给聊天区盖半透明遮罩（点击遮罩由 JS 收起抽屉） */
  body.m-store .ai-page-m.show-ses .ai-layout-embedded::before {
    content: "";
    position: absolute; inset: 0;
    z-index: 4;
    background: rgba(0, 0, 0, 0.50);
  }
  /* 会话抽屉开关（对话头部左侧小按钮） */
  body.m-store .ai-ses-toggle {
    display: grid; place-items: center;
    flex: none;
    width: 32px; height: 32px;
    padding: 0;
    background: rgba(255, 255, 255, 0.05);
    border: 1px solid var(--line);
    border-radius: 9px;
    color: var(--ink-soft);
    cursor: pointer;
  }
  body.m-store .ai-ses-toggle:active { background: rgba(255, 255, 255, 0.12); }
  html[data-theme="light"] body.m-store .ai-ses-toggle { background: rgba(0, 0, 0, 0.04); }

  /* 消息区：气泡放宽、工具卡去掉大缩进（内联样式需 !important）；
     上下文 token 计数徽标属于技术细节，手机不显示 */
  body.m-store #_ai_msgs { padding: 10px !important; }
  body.m-store #_ai_ctx_badge { display: none !important; }
  body.m-store .ai-msg-user .ai-bubble { max-width: 86% !important; }
  body.m-store .ai-msg-assistant .ai-bubble { max-width: 94% !important; }
  body.m-store .ai-think { max-width: 94% !important; }
  body.m-store .ai-tool-card {
    margin-left: 8px !important;
    margin-right: 0 !important;
    max-width: none !important;
  }
  body.m-store .ai-cost-confirm-card {
    margin-left: 8px !important;
    max-width: 94% !important;
  }
  /* 快捷模板栏：横滑，「✨ 模板」标签省掉 */
  body.m-store .ai-quick-bar { overflow-x: auto; }
  body.m-store .ai-quick-bar::-webkit-scrollbar { display: none; }
  body.m-store .ai-quick-bar > .muted.small { display: none; }

  /* ============ 手机端降噪：说明性文字统一隐藏 ============
     页头副标题、卡片头右侧的补充说明、控制台各处 hint、
     快捷入口卡的描述行、实体 ID 等技术细节——小屏一律不显示。 */
  body.m-store .page-head .subtitle,
  body.m-store .dash-sub,
  body.m-store .season-head-sub,
  body.m-store .dlk-desc,
  body.m-store .kpi-hint,
  body.m-store .dash-alert-eid,
  body.m-store .card-head .dim.small,
  body.m-store .card-head > .muted.small,
  body.m-store .tbl-toolbar > .muted.small,
  body.m-store .tbl-toolbar > span.muted,
  body.m-store .dpanel-bar > .muted.small { display: none; }

  /* ============ 逐页手机排版 ============ */

  /* —— 通用：页头 / 卡片密度 / 触控可点性 —— */
  body.m-store .page-head { margin-bottom: 10px; }
  body.m-store .page-head .title { font-size: 20px; }
  body.m-store .page-head .actions { gap: 6px; }
  body.m-store .page-head .actions button,
  body.m-store .page-head .actions .btn {
    font-size: 12.5px;
    padding: 7px 12px;
  }
  body.m-store .card { padding: 14px; border-radius: 14px; }
  body.m-store .card h2 { font-size: 15px; }
  body.m-store .grid-2,
  body.m-store .grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  body.m-store .field-row { grid-template-columns: 1fr; }
  body.m-store .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  /* 筛选 chip / 分页：手指可点的最小尺寸 */
  body.m-store .chip-btn { padding: 6px 12px; }
  body.m-store .range-chips { row-gap: 6px; }
  body.m-store .pager button { min-height: 36px; min-width: 36px; }
  /* 触屏没有 hover：所有"悬停才显现"的操作按钮常显 */
  body.m-store .rp-tools { opacity: 1; }

  /* —— 控制台（Dashboard）—— */
  body.m-store .dash-head { margin-bottom: 12px; }
  body.m-store .dash-title { font-size: 19px; }
  body.m-store .dash-kpi { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-bottom: 12px; }
  body.m-store .kpi-card { padding: 12px 13px; border-radius: 12px; }
  body.m-store .kpi-num { font-size: 24px; margin-top: 8px; }
  body.m-store .kpi-bar { margin-top: 8px; }
  body.m-store .kpi-foot { font-size: 11.5px; }
  body.m-store .dash-charts { grid-template-columns: 1fr; gap: 10px; }
  /* 环图 + 指标横排 → 纵排居中 */
  body.m-store .dash-chart-body { flex-direction: column; align-items: center; gap: 12px; }
  body.m-store .dash-chart-body .dash-chart-meta { width: 100%; }
  /* 告警行：房间名 + 关闭按钮一行，消息换行独占；关闭按钮加大到可点 */
  body.m-store .dash-alert-item { flex-wrap: wrap; row-gap: 4px; padding-top: 9px; padding-bottom: 9px; }
  body.m-store .dash-alert-item .dash-alert-msg { flex: 1 1 100%; order: 9; }
  body.m-store .dash-alert-dismiss { padding: 6px 12px; }
  /* 快捷入口：2 列宫格（描述行已隐藏，只剩图标+标题） */
  body.m-store .dash-links { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  body.m-store .dash-link-card { padding: 12px 13px; gap: 10px; }
  body.m-store .dash-link-card .dlk-ico { width: 32px; height: 32px; }
  body.m-store .dash-link-card .dlk-label { font-size: 13px; }

  /* —— 房间管理（房态总监）—— */
  body.m-store .console-banner { grid-template-columns: 1fr; gap: 12px; padding: 16px; }
  body.m-store .console-banner .cb-title { font-size: 19px; }
  body.m-store .console-banner .cb-right { text-align: left; }
  body.m-store .console-banner .cb-time { text-align: left; }
  body.m-store .console-banner .cb-chips { flex-wrap: wrap; justify-content: flex-start; }
  body.m-store .season-panel { padding: 13px 14px; }
  /* 头部改两行：第一行「季节预设」标签 + 两个开关；第二行巡检进度条独占整行 */
  body.m-store .season-head {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    margin-bottom: 10px;
  }
  body.m-store .season-head-l { gap: 10px; }
  /* 季节预设：一行三张迷你卡（图标+名称+编辑），温度范围/说明这类文字手机不显示 */
  body.m-store .season-row { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 7px; }
  body.m-store .season-card {
    display: flex; flex-direction: column;
    align-items: flex-start;
    gap: 5px;
    padding: 10px 11px;
    border-radius: 12px;
  }
  body.m-store .season-card .sc-ico { width: 28px; height: 28px; border-radius: 8px; }
  body.m-store .season-card .sc-ico svg { width: 15px; height: 15px; }
  body.m-store .season-card .sc-name {
    font-size: 12.5px; gap: 5px;
    flex-wrap: wrap; line-height: 1.25;
  }
  body.m-store .season-card .sc-desc,
  body.m-store .season-card .sc-range,
  body.m-store .season-card .sc-hint { display: none; }
  body.m-store .season-card .sc-edit { opacity: 1; top: 7px; right: 7px; }
  /* 巡检行：进度条弹性吃掉中间宽度，按钮靠右；上次结果文字手机放不下，不显示 */
  body.m-store .season-head-r {
    width: 100%;
    padding: 7px 10px;
  }
  body.m-store .season-head-r .patrol-bar { flex: 1 1 auto; width: auto; min-width: 40px; }
  body.m-store .season-head-r #_patrol_last { display: none; }
  body.m-store .season-head-r button.ghost.small { flex: none; padding: 4px 10px; }
  /* 分组 Tab 栏：Tab 行横向滑动不换行，操作按钮行贴在下面 */
  body.m-store .season-groups {
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    padding: 8px 9px;
    margin-bottom: 10px;
  }
  body.m-store .season-groups .sg-tabs {
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    padding-bottom: 2px;
  }
  body.m-store .season-groups .sg-tabs::-webkit-scrollbar { display: none; }
  body.m-store .sg-tab { flex: none; padding: 5px 12px; }
  body.m-store .season-groups .sg-acts { justify-content: flex-end; }
  body.m-store .season-groups .sg-acts button.ghost.small { padding: 5px 12px; font-size: 12px; }
  /* 绑定房间弹窗：单列列表更好点 */
  body.m-store .sg-room-list { grid-template-columns: 1fr; max-height: 52vh; }
  body.m-store .sg-room-item { padding: 10px 12px; }
  body.m-store .console-filter { grid-template-columns: 1fr; gap: 8px; }
  body.m-store .cf-actions {
    flex-wrap: wrap;
    white-space: normal;
    row-gap: 8px;
  }
  body.m-store .cf-toggle,
  body.m-store .cf-view-btn { min-height: 34px; }

  /* —— 房间卡：手机紧凑卡（标题=房间名，两行正文），点卡弹操控面板 ——
     标题行：房间名 + 有人/订座徽章
     第一行：电脑信息（开机 x/y · 关机 · 离线）
     第二行：左「设备下拉分组框」+ 右侧运行状态（模式+温度按 --acm 染色）
     空调运行时整卡仍走 .ac-run 的模式色描边渐变，扫一眼分清冷暖。 */
  body.m-store .room-pro-grid { grid-template-columns: 1fr; gap: 9px; }
  /* 平板/iframe 宽度（>640）：紧凑卡拉通栏太宽，排两列 */
  @media (min-width: 641px) {
    body.m-store .room-pro-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  }
  body.m-store .room-pro.rp-m {
    display: flex; flex-direction: column;
    gap: 8px;
    padding: 12px 14px;
    border-radius: 14px;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  body.m-store .room-pro.rp-m:active { transform: scale(0.98); }
  body.m-store .rp-m-head {
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
    padding-bottom: 8px;
    border-bottom: 1px dashed rgba(255, 255, 255, 0.10);
  }
  html[data-theme="light"] body.m-store .rp-m-head { border-bottom-color: rgba(0, 0, 0, 0.10); }
  body.m-store .rp-m-name {
    flex: 1 1 auto; min-width: 0;
    font-size: 15.5px; font-weight: 800; letter-spacing: 0.4px;
    color: var(--text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  body.m-store .rp-m-flags { display: inline-flex; align-items: center; gap: 5px; flex: none; }
  body.m-store .rp-m-flags .rp-badge { padding: 3px 9px; font-size: 10.5px; }
  /* 标题行的季节分组徽章：紧凑一档，房间名挤占空间时徽章不被压缩 */
  body.m-store .rp-m-head .rp-sg { margin-left: 0; padding: 1px 6px; font-size: 10px; }
  /* 第一行：电脑信息 */
  body.m-store .rp-m-pcs {
    display: flex; align-items: center; gap: 5px;
    font-size: 12px; color: var(--text-muted);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  body.m-store .rp-m-pcs .lbl {
    flex: none;
    font-size: 10.5px; font-weight: 600; letter-spacing: 0.5px;
    color: var(--text-muted); opacity: 0.75;
    margin-right: 3px;
  }
  body.m-store .rp-m-pcs b { color: var(--text); font-weight: 700; font-size: 13px; }
  body.m-store .rp-m-pcs .sep { margin: 0 5px; opacity: 0.5; }
  body.m-store .rp-m-pcs .off { color: #fda4af; }
  /* 第二行：设备下拉分组框（占满整行，点击弹底部抽屉切换设备）+ 右侧运行状态 */
  body.m-store .rp-m-devrow {
    display: flex; align-items: center; gap: 8px;
  }
  body.m-store .rp-m-devsel {
    flex: 1 1 auto; min-width: 0;
    display: inline-flex; align-items: center; gap: 6px;
    padding: 7px 10px;
    border-radius: 8px;
    font-size: 12px; font-family: inherit; text-align: left;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.10);
    color: var(--text);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  body.m-store button.rp-m-devsel:active { background: rgba(255, 255, 255, 0.09); }
  body.m-store .rp-m-devsel svg { flex: none; color: var(--text-muted); }
  body.m-store .rp-m-devsel-t {
    flex: 1 1 auto; min-width: 0;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  body.m-store .rp-m-devsel-n { flex: none; font-size: 10px; color: var(--text-muted); }
  body.m-store .rp-m-devsel-off {
    flex: none;
    font-size: 10px; font-weight: 700; white-space: nowrap;
    padding: 1px 6px; border-radius: 999px;
    background: rgba(244, 63, 94, 0.14);
    border: 1px solid rgba(244, 63, 94, 0.38);
    color: #fda4af;
  }
  html[data-theme="light"] body.m-store .rp-m-devsel-off {
    background: rgba(225, 29, 72, 0.08);
    border-color: rgba(225, 29, 72, 0.32);
    color: #be123c;
  }
  body.m-store .rp-m-devsel.empty { color: var(--text-muted); border-style: dashed; cursor: default; }
  body.m-store .rp-m-state {
    flex: none;
    display: inline-flex; align-items: center;
    padding: 6px 11px;
    border-radius: 999px;
    font-size: 11.5px; font-weight: 600;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.10);
    color: var(--text-muted);
  }
  body.m-store .rp-m-state.on {
    background: rgba(var(--acm, 103, 232, 249), 0.14);
    border-color: rgba(var(--acm, 103, 232, 249), 0.42);
    color: var(--acm-ink, #a5f3fc);
  }
  body.m-store .rp-m-state.err {
    background: rgba(244, 63, 94, 0.12);
    border-color: rgba(244, 63, 94, 0.32);
    color: #fda4af;
  }
  /* 状态胶囊/选择器条目按空调模式着色（与 saas.css .rp-ac.m-* 同一套色板） */
  body.m-store .rp-m-state.m-cool,     body.m-store .rp-m-devpick-it .s.m-cool     { --acm: 96,165,250;  --acm-ink: #93c5fd; }
  body.m-store .rp-m-state.m-heat,     body.m-store .rp-m-devpick-it .s.m-heat     { --acm: 251,146,60;  --acm-ink: #fdba74; }
  body.m-store .rp-m-state.m-dry,      body.m-store .rp-m-devpick-it .s.m-dry      { --acm: 251,191,36;  --acm-ink: #fcd34d; }
  body.m-store .rp-m-state.m-fan_only, body.m-store .rp-m-devpick-it .s.m-fan_only { --acm: 45,212,191;  --acm-ink: #5eead4; }
  body.m-store .rp-m-state.m-auto,     body.m-store .rp-m-devpick-it .s.m-auto,
  body.m-store .rp-m-state.m-heat_cool, body.m-store .rp-m-devpick-it .s.m-heat_cool { --acm: 103,232,249; --acm-ink: #a5f3fc; }
  /* 设备切换：走全局 bottom sheet（不在卡片内弹菜单），每行 = 设备名 + 运行状态 */
  body.m-store .rp-m-devpick {
    display: flex; flex-direction: column; gap: 6px;
    padding: 4px 0 2px;
  }
  body.m-store .rp-m-devpick-it {
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
    width: 100%;
    padding: 13px 13px;
    border-radius: 11px;
    background: rgba(255, 255, 255, 0.04);
    border: 1px solid rgba(255, 255, 255, 0.09);
    font-size: 13.5px; font-family: inherit; text-align: left;
    color: var(--text);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  body.m-store .rp-m-devpick-it:active { background: rgba(255, 255, 255, 0.09); }
  body.m-store .rp-m-devpick-it.active {
    background: rgba(103, 232, 249, 0.08);
    border-color: rgba(103, 232, 249, 0.35);
  }
  body.m-store .rp-m-devpick-it .t {
    flex: 1 1 auto; min-width: 0;
    font-weight: 600;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  body.m-store .rp-m-devpick-it .s { flex: none; font-size: 12px; font-weight: 600; color: var(--text-muted); }
  body.m-store .rp-m-devpick-it .s.on { color: var(--acm-ink, #67e8f9); }
  body.m-store .rp-m-devpick-it .s.err { color: #fda4af; }
  html[data-theme="light"] body.m-store .rp-m-pcs .off { color: #be123c; }
  html[data-theme="light"] body.m-store .rp-m-devsel { background: rgba(0, 0, 0, 0.03); border-color: rgba(0, 0, 0, 0.12); }
  html[data-theme="light"] body.m-store button.rp-m-devsel:active { background: rgba(0, 0, 0, 0.07); }
  html[data-theme="light"] body.m-store .rp-m-state { background: rgba(0, 0, 0, 0.03); border-color: rgba(0, 0, 0, 0.12); }
  html[data-theme="light"] body.m-store .rp-m-state.err { background: rgba(225, 29, 72, 0.08); border-color: rgba(225, 29, 72, 0.28); color: #be123c; }
  html[data-theme="light"] body.m-store .rp-m-devpick-it { background: rgba(0, 0, 0, 0.03); border-color: rgba(0, 0, 0, 0.10); }
  html[data-theme="light"] body.m-store .rp-m-devpick-it:active { background: rgba(0, 0, 0, 0.07); }
  html[data-theme="light"] body.m-store .rp-m-devpick-it.active {
    background: rgba(8, 145, 178, 0.07);
    border-color: rgba(8, 145, 178, 0.35);
  }
  html[data-theme="light"] body.m-store .rp-m-devpick-it .s.err { color: #be123c; }
  html[data-theme="light"] body.m-store .rp-m-state.m-cool,     html[data-theme="light"] body.m-store .rp-m-devpick-it .s.m-cool     { --acm: 37,99,235;  --acm-ink: #1d4ed8; }
  html[data-theme="light"] body.m-store .rp-m-state.m-heat,     html[data-theme="light"] body.m-store .rp-m-devpick-it .s.m-heat     { --acm: 234,88,12;  --acm-ink: #c2410c; }
  html[data-theme="light"] body.m-store .rp-m-state.m-dry,      html[data-theme="light"] body.m-store .rp-m-devpick-it .s.m-dry      { --acm: 217,119,6;  --acm-ink: #b45309; }
  html[data-theme="light"] body.m-store .rp-m-state.m-fan_only, html[data-theme="light"] body.m-store .rp-m-devpick-it .s.m-fan_only { --acm: 13,148,136; --acm-ink: #0f766e; }
  html[data-theme="light"] body.m-store .rp-m-state.m-auto,     html[data-theme="light"] body.m-store .rp-m-devpick-it .s.m-auto,
  html[data-theme="light"] body.m-store .rp-m-state.m-heat_cool, html[data-theme="light"] body.m-store .rp-m-devpick-it .s.m-heat_cool { --acm: 8,145,178; --acm-ink: #0e7490; }
  body.m-store .room-pro {
    padding: 14px;
    border-radius: 16px;
    gap: 11px;
    background: rgba(255, 255, 255, 0.035);
  }
  body.m-store .room-pro:hover { transform: none; }
  body.m-store .rp-head { padding-bottom: 9px; }
  /* 房间名：加大加粗，去掉桌面 hover 光晕（触屏无 hover，字号才是层级） */
  body.m-store .rp-title b { font-size: 16.5px; letter-spacing: 0.6px; }
  body.m-store .rp-badge { font-size: 11.5px; padding: 4px 11px; }
  /* 顾客控制四开关：每项一块可点的小面板（2×2），不再是裸露的桌面复选行 */
  body.m-store .rp-custops { gap: 7px; margin: 0; padding: 0; }
  body.m-store .rp-custops-toggle {
    padding: 8px 10px;
    border-radius: 10px;
    background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(255, 255, 255, 0.07);
  }
  html[data-theme="light"] body.m-store .rp-custops-toggle {
    background: rgba(0, 0, 0, 0.025);
    border-color: rgba(0, 0, 0, 0.08);
  }
  body.m-store .rp-custops-lbl { white-space: normal; line-height: 1.3; }
  /* PC 小格：6 列 → 4 列；去掉"空房也撑满两行"的桌面对齐逻辑，
     行高抬到 42px，最多 3 行后内部滚动 */
  body.m-store .rp-pc-grid {
    --rp-pc-row-h: 42px;
    grid-template-columns: repeat(4, 1fr);
    min-height: 0;
    max-height: calc(var(--rp-pc-row-h) * 3 + var(--rp-pc-gap) * 2);
  }
  body.m-store .rp-pc { border-radius: 8px; font-size: 11px; }
  /* 空调操控块：遥控器化——大温度、46px 加减圆钮、加高的模式/风速胶囊 */
  body.m-store .rp-ac { padding: 12px; border-radius: 14px; }
  body.m-store .ac-pad-temp { grid-template-columns: 46px 1fr 46px; }
  body.m-store .ac-pad-btn { width: 46px; height: 46px; }
  body.m-store .ac-pad-temp-val { font-size: 36px; }
  body.m-store .ac-mode-btn,
  body.m-store .ac-fan-btn,
  body.m-store .ac-swing-btn { padding: 8px 12px; font-size: 12px; }
  body.m-store .ac-pad-power { padding: 8px 15px; font-size: 12px; }
  /* 列表视图表格：横向滚动兜底 */
  body.m-store .room-area { overflow-x: auto; }

  /* —— 房间详情 —— */
  body.m-store .area-detail-top .row-between {
    flex-direction: column;
    align-items: stretch;
    gap: 14px;
  }
  body.m-store .area-detail-top .big-temp { font-size: 38px !important; }
  body.m-store .area-detail-stats {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    min-width: 0;
    gap: 10px;
  }

  /* —— 事件行（房间详情 + 事件中心共用）——
     桌面四列 grid（图标/类型/消息/时间）→ 首行图标+类型+时间，消息换行独占；
     列表去掉内部滚动上限，跟随页面自然滚动（手机上嵌套滚动区很难用） */
  body.m-store .event-list { max-height: none; }
  body.m-store .event-item {
    grid-template-columns: 20px minmax(0, 1fr) auto;
    row-gap: 2px;
    padding: 9px 8px;
  }
  body.m-store .event-item .ev-msg { grid-column: 1 / -1; line-height: 1.45; }
  body.m-store .event-item .ev-ts { font-size: 11px; }

  /* —— 全部电脑 —— */
  body.m-store .pcs-filter { flex-wrap: wrap; row-gap: 8px; }
  body.m-store .pcs-tabs { max-width: 100%; overflow-x: auto; }
  body.m-store .pcs-tabs::-webkit-scrollbar { display: none; }
  body.m-store .pcs-tab { flex: none; white-space: nowrap; min-height: 34px; }
  body.m-store .pcs-search-wrap { flex: 1 1 100%; }
  body.m-store .pcs-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  body.m-store .pc-card { padding: 11px 12px; gap: 8px; }
  body.m-store .pc-card-ico { width: 30px; height: 30px; }
  body.m-store .pc-card-title b { font-size: 13px; }

  /* —— 智能设备：设备卡整体 APP 化 —— */
  /* 分类 Tab：折行 → 单行横滑胶囊（加大触控高度） */
  body.m-store .dpanel-tabs {
    flex-wrap: nowrap;
    overflow-x: auto;
    gap: 7px;
    margin-bottom: 10px;
    padding-bottom: 4px;
  }
  body.m-store .dpanel-tabs::-webkit-scrollbar { display: none; }
  body.m-store .dpanel-tab {
    flex: none;
    white-space: nowrap;
    min-height: 38px;
    padding: 8px 15px;
  }
  body.m-store .dpanel-bar { flex-wrap: wrap; row-gap: 8px; }
  body.m-store .dpanel-bar > button { min-height: 36px; }
  body.m-store .dpanel-search { flex: 1 1 160px; min-width: 0; }
  body.m-store .dpanel-grid { grid-template-columns: 1fr; gap: 9px; }
  /* 平板/iframe 宽度（>640）：设备紧凑卡排两列 */
  @media (min-width: 641px) {
    body.m-store .dpanel-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  }
  /* 手机默认渲染紧凑卡（store.js .dpc-m：只有卡头一行），点卡弹操控面板 */
  body.m-store .dpanel-card.dpc-m {
    border-radius: 14px;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  body.m-store .dpanel-card.dpc-m:active { background: rgba(255, 255, 255, 0.06); }
  html[data-theme="light"] body.m-store .dpanel-card.dpc-m:active { background: rgba(0, 0, 0, 0.04); }
  body.m-store .dpc-m .dpc-head { border-bottom: none; padding: 13px 14px; }
  body.m-store .dpc-m-state {
    flex: none;
    font-size: 11px; font-weight: 600; white-space: nowrap;
    padding: 2px 8px; border-radius: 999px;
    background: rgba(var(--dpa, 103, 232, 249), 0.14);
    border: 1px solid rgba(var(--dpa, 103, 232, 249), 0.40);
    color: var(--dpa-ink, #67e8f9);
  }
  body.m-store .dpc-m-state.idle {
    background: rgba(255, 255, 255, 0.04);
    border-color: rgba(255, 255, 255, 0.12);
    color: var(--text-muted);
  }
  body.m-store .dpc-m-state.err {
    background: rgba(244, 63, 94, 0.12);
    border-color: rgba(244, 63, 94, 0.38);
    color: #fda4af;
  }
  /* 桌面版 is-offline 会在设备名后再追加一个"离线"角标（.dpc-name::after），
     手机紧凑卡右侧已有状态胶囊，双标重复——关掉名字后那个 */
  body.m-store .dpc-m.is-offline .dpc-name::after { content: none; }
  html[data-theme="light"] body.m-store .dpc-m-state.idle {
    background: rgba(0, 0, 0, 0.03);
    border-color: rgba(0, 0, 0, 0.12);
    color: var(--text-muted);
  }
  html[data-theme="light"] body.m-store .dpc-m-state.err {
    background: rgba(225, 29, 72, 0.08);
    border-color: rgba(225, 29, 72, 0.32);
    color: #be123c;
  }
  body.m-store .dpc-m-arrow { flex: none; display: inline-flex; color: var(--text-muted); opacity: 0.55; }
  /* 设备卡：大圆角；拖拽手柄触屏无用直接藏掉；编辑/删除常显且加大到可点
     （桌面上这俩按钮 hover 才出现，手机没有 hover） */
  body.m-store .dpanel-card { border-radius: 16px; }
  body.m-store .dpc-drag { display: none; }
  body.m-store .dpc-op { opacity: 1; width: 30px; height: 30px; }
  body.m-store .dpc-head { padding: 12px 14px; }
  body.m-store .dpc-ico { flex-basis: 30px; width: 30px; height: 30px; }
  body.m-store .dpc-name { font-size: 15px; }
  body.m-store .dpc-body { padding: 6px 14px 12px; }
  /* 卡内组件全面抬到触控尺寸 */
  body.m-store .dpc-row { padding: 10px 0; }
  body.m-store .dpc-row-name { font-size: 13.5px; }
  body.m-store .dpc-chip { padding: 7px 13px; font-size: 12.5px; }
  body.m-store .dpc-chip.sm { padding: 6px 11px; font-size: 12px; }
  body.m-store .dpc-step { width: 38px; height: 34px; }
  body.m-store .dpc-mode-sel { padding: 10px 12px; }
  body.m-store .dpc-action-btn { padding: 11px 12px; font-size: 13.5px; }
  body.m-store .dpc-slider input[type="range"] { height: 30px; }
  /* iOS 开关放大一号（46×27，thumb 21，checked 位移同步改） */
  body.m-store .dpc-toggle { width: 46px; height: 27px; flex-basis: 46px; }
  body.m-store .dpc-tt { top: 2px; width: 21px; height: 21px; }
  body.m-store .dpc-toggle.on .dpc-tt { left: 23px; }

  /* —— 全部设备 —— */
  /* 工具栏（.card.tight .row）：搜索框占满一行（覆盖行内 max-width:280px），下拉不撑爆 */
  body.m-store .card.tight .row input:not([type="checkbox"]) {
    flex: 1 1 100%;
    max-width: none !important;
    min-width: 0;
  }
  body.m-store .card.tight .row .combo { flex: 1 1 auto; min-width: 0; max-width: 100%; }
  body.m-store .dev-list { gap: 10px; }
  body.m-store .dev { padding: 12px 14px; backdrop-filter: none; }
  body.m-store .area-section { margin-bottom: 18px; }
  body.m-store .area-section .area-title { font-size: 13px; }

  /* —— 门店信息（概况）—— */
  body.m-store .ha-grid { grid-template-columns: 1fr; gap: 10px; }
  body.m-store .ha-card { padding: 14px; backdrop-filter: none; }

  /* —— 事件中心 / 操作日志 / AI 任务：筛选与表格 —— */
  body.m-store .filter-bar input,
  body.m-store .tbl-toolbar input {
    min-width: 0;
    flex: 1 1 auto;
    max-width: none;
  }
  /* AI 任务标签栏：折行 → 横滑 */
  body.m-store .ai-tagbar {
    flex-wrap: nowrap;
    overflow-x: auto;
    padding-bottom: 4px;
  }
  body.m-store .ai-tagbar::-webkit-scrollbar { display: none; }
  body.m-store .ai-tag-chip { min-height: 32px; }
  /* 表格页（操作日志 / AI 任务）：.logs-wrap 与 .ai-tag-section-body 桌面已有
     overflow-x:auto，手机沿用横滑；行内边距收紧一档 */
  body.m-store .logs-table th,
  body.m-store .logs-table td { padding: 8px 10px; }

  /* —— AI 对话页（内嵌整页）细节 —— */
  body.m-store .ai-page-m .ai-layout-embedded > .card:last-child > div:first-child {
    padding: 8px 10px !important;
  }
  body.m-store #_ai_chat_title {
    flex: 1 1 auto; min-width: 0;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    font-size: 13px;
  }
  body.m-store .ai-page-m #_ai_inp { min-height: 40px; max-height: 120px; }
  /* 输入区按钮只留图标级宽度，把空间让给输入框 */
  body.m-store .ai-page-m .ai-layout-embedded > .card:last-child > div:last-child {
    padding: 8px !important;
    gap: 6px !important;
  }

  /* —— 触控基础规范 —— */
  /* iOS 聚焦输入框自动放大的触发条件是字号 <16px，统一顶到 16px */
  body.m-store input,
  body.m-store select,
  body.m-store textarea { font-size: 16px; }
  body.m-store button { touch-action: manipulation; }
}

@keyframes m-sheet-in {
  from { transform: translateY(28px); opacity: .5; }
  to   { transform: none; opacity: 1; }
}

/* ============================================================
   登录页（≤640px）：APP 全屏形态。
   不依赖 body.m-store（登录时还没有角色），对所有账号生效。
   641–760px 维持 saas.css 原有的"单列卡片"样式不动。
   ============================================================ */
@media (max-width: 640px) {
  .login { padding: 0; place-items: stretch; }
  /* 玻璃卡片 → 全屏页面：去卡片边框/圆角/阴影，表单垂直居中 */
  .login-panel {
    width: 100%; height: 100%;
    max-width: none;
    display: flex; flex-direction: column;
    background: transparent;
    border: none; border-radius: 0;
    box-shadow: none;
    backdrop-filter: none; -webkit-backdrop-filter: none;
    overflow-y: auto;
  }
  .login-panel::before { display: none; }
  .login-info { display: none; }
  .login-form {
    width: 100%;
    max-width: 400px;
    /* margin:auto 居中：空间够时垂直水平居中；键盘弹出高度不足时
       自动收到 0 并配合 overflow-y 滚动，不会像 justify-content:center 那样裁掉顶部 */
    margin: auto;
    padding:
      calc(28px + env(safe-area-inset-top))
      24px
      calc(20px + env(safe-area-inset-bottom));
  }
  .lf-head { margin-bottom: 26px; }
  .lf-head h1 { font-size: 26px; }
  .lf-head p { font-size: 13px; }

  /* 触控目标放大 + 输入字号顶到 16px（防 iOS 聚焦自动放大） */
  .login-field { margin-bottom: 14px; }
  .login-field input {
    font-size: 16px;
    padding: 13px 14px 13px 42px;
    border-radius: 12px;
  }
  .captcha-field input { padding-right: 142px; }
  .lf-toggle { width: 38px; height: 38px; }
  .captcha-box { height: 40px; }
  .login-submit {
    min-height: 48px;
    font-size: 15.5px;
    border-radius: 12px;
  }
  .login-footer { padding-top: 14px; }
}
