/* =========================================================================
   骑安通 · qiantong 管理端设计系统（品牌橙）
   -------------------------------------------------------------------------
   · 仅由 pages/qiantong/** 使用，类名统一 `qt-` 前缀，变量统一 `--qt-*`
   · 与 base.css / admin 模块的任何选择器都不冲突，可安全全局引入
   · 单位换算：本文件对应设计稿 375px 画框
       1 设计稿 px = 0.02rem（H5，750 稿下即 1px = 0.01rem）
       1 设计稿 px = 2rpx  （小程序）
   · 引入方式：index.html 中置于 base.css 之后
   ========================================================================= */

/* ---------- 1. 设计 Token ---------- */
:root {
  /* 品牌色 */
  --qt-primary: #FE6B04;
  --qt-primary-deep: #E25E00;
  --qt-primary-soft: #FFF1E6;
  --qt-primary-light: #FF9A4D;

  /* 中性色 */
  --qt-bg: #f6f1ea;
  --qt-bg-soft: #f7f2ec;
  --qt-card: #ffffff;
  --qt-card-tint: #fdfaf6;
  --qt-text: #2f2a24;
  --qt-muted: #8d8276;
  --qt-placeholder: #c2b8ab;
  --qt-line: #f0e5da;
  --qt-line-soft: #f7f0e8;
  --qt-line-strong: #f0c9a6;
  --qt-line-mid: #d8cdbf;      /* 中性描边（勾选圈 / 清除按钮） */
  --qt-fill: #f4ece3;          /* 输入框 / 胶囊底色 */
  --qt-primary-line: #f5cfa8;  /* 主色选中态描边 */
  --qt-danger-line: #f6c9c9;   /* 危险态描边 */

  /* 语义色 */
  --qt-danger: #e03131;
  --qt-danger-soft: #fdecec;
  --qt-success: #1a9e5c;
  --qt-success-soft: #e7f7ef;
  --qt-success-line: #b9e6cd;
  --qt-warn: #E8A800;
  --qt-warn-soft: #fdf3e2;
  --qt-warn-line: #f4dcae;
  --qt-edit: #3D7EE8;
  --qt-off: #98a3b3;
  --qt-off-soft: #f0f2f5;
  --qt-owner-text: #B25E00;
  --qt-owner-bg: #FFF3DC;
  --qt-owner-line: #F5DFAE;

  /* 圆角 / 阴影 / 渐变 */
  --qt-r-lg: 0.36rem;   /* 18px */
  --qt-r: 0.28rem;      /* 14px */
  --qt-r-sm: 0.24rem;   /* 12px */
  --qt-r-xs: 0.18rem;   /* 9px  */
  --qt-shadow-card: 0 0.04rem 0.16rem rgba(120, 60, 0, .06);
  --qt-shadow-raise: 0 0.12rem 0.32rem rgba(120, 60, 0, .12);
  --qt-shadow-modal: 0 0.40rem 1rem rgba(60, 30, 0, .3);
  --qt-grad: linear-gradient(135deg, #FF7A1A, #E25E00);
  --qt-grad-bar: linear-gradient(135deg, #FE6B04, #E25E00);
  --qt-shadow-btn: 0 0.16rem 0.40rem rgba(226, 94, 0, .35);
  --qt-shadow-btn-sm: 0 0.12rem 0.28rem rgba(226, 94, 0, .28);
}

/* ---------- 2. 页面与容器 ---------- */
.qt-page {
  min-height: 100vh;
  background: var(--qt-bg);
  color: var(--qt-text);
  font-size: 0.26rem;
  -webkit-font-smoothing: antialiased;
}

/* ---------- 3. 顶部标题栏 ---------- */
.qt-bar {
  background: var(--qt-grad-bar);
  color: #fff;
  padding: 0.32rem 0.36rem 0.36rem;
  position: sticky;
  top: 0;
  z-index: 5;
}
.qt-bar-row { display: flex; align-items: center; gap: 0.20rem; }
.qt-bar-title {
  flex: 1;
  font-size: 0.33rem;
  font-weight: 700;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.qt-bar-sub {
  font-size: 0.23rem;
  opacity: .85;
  margin-top: 0.12rem;
  display: flex;
  align-items: center;
  gap: 0.10rem;
}
.qt-icon-btn,
.qt-back {
  width: 0.60rem;
  height: 0.60rem;
  border-radius: var(--qt-r-xs);
  background: rgba(255, 255, 255, .16);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  border: none;
  color: #fff;
  flex: none;
}

/* ---------- 4. 卡片 ---------- */
.qt-card {
  background: var(--qt-card);
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  box-shadow: var(--qt-shadow-card);
}
.qt-card-tint { background: var(--qt-card-tint); }

/* ---------- 5. 按钮 ---------- */
.qt-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.12rem;
  border: none;
  border-radius: var(--qt-r-sm);
  cursor: pointer;
  font-weight: 600;
  font-family: inherit;
  font-size: 0.27rem;
  padding: 0.22rem 0;
}
.qt-btn-primary {
  background: var(--qt-grad);
  color: #fff;
  box-shadow: var(--qt-shadow-btn-sm);
}
.qt-btn-primary:active { transform: scale(.985); }
.qt-btn-block { width: 100%; }
.qt-btn-lg { padding: 0.28rem 0; font-size: 0.31rem; border-radius: var(--qt-r-sm); font-weight: 700; }
.qt-btn-ghost {
  background: #fff;
  border: 1.5px solid var(--qt-line);
  color: var(--qt-text);
}
.qt-btn-danger { background: var(--qt-danger); color: #fff; }
.qt-btn-soft { background: var(--qt-primary-soft); color: var(--qt-primary); border-radius: 999px; }

/* ---------- 6. 统计卡 ---------- */
.qt-stats { display: flex; gap: 0.20rem; padding: 0 0.28rem; }
.qt-stats.qt-overlap { margin-top: -0.48rem; position: relative; z-index: 3; }
.qt-stat {
  flex: 1;
  background: var(--qt-card);
  border-radius: var(--qt-r);
  padding: 0.24rem 0.16rem 0.22rem;
  text-align: center;
  border: 1px solid var(--qt-line);
  box-shadow: var(--qt-shadow-raise);
}
.qt-stat-ic {
  width: 0.60rem;
  height: 0.60rem;
  margin: 0 auto 0.12rem;
  border-radius: var(--qt-r-xs);
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
}
.qt-stat-num { font-size: 0.48rem; font-weight: 800; color: var(--qt-primary); line-height: 1.1; }
.qt-stat-num.qt-sm { font-size: 0.40rem; }
.qt-stat-lbl { font-size: 0.23rem; color: var(--qt-muted); margin-top: 0.10rem; }

/* ---------- 7. 区块标题 ---------- */
.qt-sec-t {
  padding: 0.36rem 0.28rem 0.16rem;
  font-size: 0.29rem;
  font-weight: 700;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.qt-sec-head { display: flex; align-items: center; gap: 0.16rem; margin: 0.36rem 0 0.20rem; }
.qt-sec-head h3 { font-size: 0.29rem; font-weight: 800; margin: 0; }
.qt-sh-bar {
  width: 0.08rem;
  height: 0.30rem;
  border-radius: 0.04rem;
  background: linear-gradient(180deg, #FF9A4D, var(--qt-primary-deep));
}

/* ---------- 8. 功能宫格 ---------- */
.qt-func-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0.18rem;
  padding: 0.20rem 0.28rem 0.12rem;
}
.qt-func {
  background: var(--qt-card);
  border: 1px solid var(--qt-line);
  border-radius: 0.26rem;
  padding: 0.26rem 0.08rem 0.22rem;
  text-align: center;
  cursor: pointer;
  transition: .15s;
}
.qt-func:active { transform: scale(.96); background: var(--qt-primary-soft); }
.qt-func-ic {
  width: 0.68rem;
  height: 0.68rem;
  margin: 0 auto 0.14rem;
  border-radius: 0.20rem;
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
}
.qt-func-t { font-size: 0.24rem; font-weight: 600; }

/* ---------- 9. 折叠查询卡 ---------- */
.qt-query-card {
  background: #fff;
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  margin: 0.24rem 0.28rem 0;
  box-shadow: 0 0.04rem 0.16rem rgba(120, 60, 0, .05);
  overflow: hidden;
}
.qt-query-head {
  display: flex;
  align-items: center;
  gap: 0.16rem;
  padding: 0.26rem 0.28rem;
  font-size: 0.28rem;
  font-weight: 700;
  color: var(--qt-primary);
  cursor: pointer;
  user-select: none;
}
.qt-query-head .qt-arrow { margin-left: auto; color: var(--qt-muted); font-size: 0.22rem; transition: .2s; }
.qt-query-card.qt-open .qt-arrow { transform: rotate(180deg); }
.qt-query-body { display: none; padding: 0.04rem 0.28rem 0.28rem; border-top: 1px solid var(--qt-line-soft); }
.qt-query-card.qt-open .qt-query-body { display: block; }
.qt-qrow {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  padding: 0.22rem 0;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-qrow:last-of-type { border-bottom: none; }
.qt-qrow .qt-ql { font-size: 0.26rem; color: var(--qt-muted); width: 1.52rem; flex: none; }
.qt-qrow input {
  flex: 1;
  border: none;
  outline: none;
  text-align: right;
  font-size: 0.26rem;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
  min-width: 0;
}
.qt-qrow input::placeholder { color: var(--qt-placeholder); }
.qt-qrow .qt-qsel {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.10rem;
  font-size: 0.26rem;
  color: var(--qt-placeholder);
  cursor: pointer;
}
.qt-qbtns { display: flex; gap: 0.20rem; margin-top: 0.08rem; padding-top: 0.24rem; border-top: 1px dashed var(--qt-line); }
.qt-qbtns button { flex: 1; border-radius: var(--qt-r-xs); padding: 0.20rem 0; font-size: 0.27rem; font-weight: 600; cursor: pointer; font-family: inherit; }
.qt-qbtns .qt-btn-reset { border: 1.5px solid var(--qt-line); background: #fff; color: var(--qt-text); }
.qt-qbtns .qt-btn-query { border: none; background: var(--qt-grad); color: #fff; box-shadow: var(--qt-shadow-btn-sm); }

/* ---------- 10. 标签 / 徽标 / 胶囊 ---------- */
.qt-tag {
  font-size: 0.22rem;
  border-radius: 0.12rem;
  padding: 0.04rem 0.16rem;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: 0.08rem;
}
.qt-tag i { width: 0.10rem; height: 0.10rem; border-radius: 50%; display: inline-block; }
.qt-tag-ok { color: var(--qt-success); background: var(--qt-success-soft); border: 1px solid var(--qt-success-line); }
.qt-tag-ok i { background: var(--qt-success); }
.qt-tag-warn { color: var(--qt-warn); background: var(--qt-warn-soft); border: 1px solid var(--qt-warn-line); }
.qt-tag-warn i { background: var(--qt-warn); }
.qt-tag-off { color: var(--qt-off); background: var(--qt-off-soft); }
.qt-tag-off i { background: var(--qt-off); }
.qt-tag-primary { color: var(--qt-primary-deep); background: var(--qt-primary-soft); border: 1px solid var(--qt-owner-line); }
.qt-tag-primary i { background: var(--qt-primary-deep); }
.qt-role {
  font-size: 0.21rem;
  border-radius: 0.12rem;
  padding: 0.04rem 0.16rem;
  font-weight: 700;
  color: var(--qt-owner-text);
  background: var(--qt-owner-bg);
  border: 1px solid var(--qt-owner-line);
}
.qt-badge {
  font-size: 0.22rem;
  color: #fff;
  background: var(--qt-primary);
  border-radius: 0.12rem;
  padding: 0.04rem 0.16rem;
  font-weight: 600;
}
.qt-badge-ghost { background: var(--qt-primary-soft); color: var(--qt-primary); }
.qt-chip {
  font-size: 0.24rem;
  padding: 0.12rem 0.26rem;
  border-radius: 999px;
  background: #fff;
  color: var(--qt-muted);
  cursor: pointer;
  border: 1px solid var(--qt-line);
  transition: .15s;
}
.qt-chip.qt-active, .qt-chip.active {
  background: var(--qt-primary);
  color: #fff;
  border-color: var(--qt-primary);
  font-weight: 600;
}
/* 抽屉内筛选胶囊（灰底 → 浅橙选中） */
.qt-fs-chip {
  font-size: 0.24rem;
  padding: 0.12rem 0.28rem;
  border-radius: 999px;
  background: var(--qt-fill);
  color: var(--qt-muted);
  cursor: pointer;
  border: 1px solid transparent;
}
.qt-fs-chip.qt-active { background: var(--qt-primary-soft); color: var(--qt-primary); border-color: var(--qt-owner-line); font-weight: 700; }

/* ---------- 11. 悬底大按钮 / FAB ---------- */
.qt-fab { position: relative; padding: 0.32rem 0.28rem 0.36rem; }
.qt-fab .qt-btn-primary { box-shadow: 0 0.20rem 0.48rem rgba(190, 80, 0, .40); }
.qt-fab-note { text-align: center; font-size: 0.21rem; color: var(--qt-muted); margin-top: 0.14rem; }
.qt-fab-float {
  /* 悬浮主操作：fixed 才能在长列表滚动时保持可见 */
  position: fixed;
  right: 0.32rem;
  bottom: calc(0.56rem + env(safe-area-inset-bottom, 0px));
  display: flex;
  align-items: center;
  gap: 0.10rem;
  background: var(--qt-grad);
  color: #fff;
  border: none;
  border-radius: 999px;
  padding: 0.22rem 0.38rem;
  font-size: 0.27rem;
  font-weight: 700;
  cursor: pointer;
  font-family: inherit;
  box-shadow: 0 0.20rem 0.48rem rgba(190, 80, 0, .42);
  z-index: 8;
}

/* ---------- 12. 列表卡片（用户 / 设备 / 权限组 / 项目 共用骨架） ---------- */
.qt-list { padding: 0.24rem 0.28rem 1.92rem; }
.qt-item {
  background: var(--qt-card);
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  margin-bottom: 0.22rem;
  box-shadow: var(--qt-shadow-card);
  overflow: hidden;
}
.qt-item-top { display: flex; gap: 0.22rem; padding: 0.26rem 0.26rem 0.24rem; }
.qt-item-ic {
  width: 0.88rem;
  height: 0.88rem;
  border-radius: 0.24rem;
  flex: none;
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
}
.qt-avatar {
  width: 0.92rem;
  height: 0.92rem;
  border-radius: 0.26rem;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-size: 0.32rem;
  font-weight: 800;
  background: linear-gradient(135deg, #FF9A4D, var(--qt-primary-deep));
  box-shadow: 0 0.08rem 0.20rem rgba(226, 94, 0, .25);
}
.qt-avatar.qt-g2 {
  background: linear-gradient(135deg, #5EC26A, #1a9e5c);
  box-shadow: 0 0.08rem 0.20rem rgba(26, 158, 92, .25);
}
.qt-avatar.qt-g3 {
  background: linear-gradient(135deg, #7FB5F5, #3D7EE8);
  box-shadow: 0 0.08rem 0.20rem rgba(61, 126, 232, .25);
}
.qt-item-info { flex: 1; min-width: 0; }
.qt-item-name-row { display: flex; align-items: center; gap: 0.14rem; flex-wrap: wrap; }
.qt-item-name { font-size: 0.30rem; font-weight: 700; }
.qt-item-meta { font-size: 0.24rem; color: var(--qt-muted); line-height: 1.85; margin-top: 0.08rem; }
.qt-item-meta .qt-mv { color: var(--qt-text); font-weight: 600; }
.qt-item-meta .qt-warn-v { color: var(--qt-warn); font-weight: 700; }
.qt-item-acts { flex: none; display: flex; flex-direction: column; gap: 0.14rem; align-items: center; justify-content: center; }
.qt-acts-row { display: flex; gap: 0.14rem; }
.qt-act {
  width: 0.56rem;
  height: 0.56rem;
  border-radius: 0.18rem;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  border: none;
  padding: 0;
  font-family: inherit;
}
.qt-act-edit { background: var(--qt-primary-soft); color: var(--qt-primary); }
.qt-act-del { background: var(--qt-danger-soft); color: var(--qt-danger); }
.qt-act-toggle {
  width: auto;
  padding: 0 0.16rem;
  height: 0.48rem;
  border-radius: 0.18rem;
  background: var(--qt-success-soft);
  color: var(--qt-success);
  font-size: 0.21rem;
  font-weight: 700;
}
.qt-act-toggle.qt-off { background: var(--qt-off-soft); color: var(--qt-off); }
.qt-item-foot {
  display: flex;
  border-top: 1px solid var(--qt-line-soft);
  background: var(--qt-card-tint);
  padding: 0.18rem 0.08rem;
}
.qt-item-foot .qt-foot-act {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.08rem;
  font-size: 0.22rem;
  color: var(--qt-text);
  background: transparent;
  border: none;
  cursor: pointer;
  font-family: inherit;
  padding: 0;
}
.qt-item-foot .qt-foot-act svg { color: var(--qt-primary); }
.qt-item-foot .qt-foot-act.qt-danger,
.qt-item-foot .qt-foot-act.qt-danger svg { color: var(--qt-danger); }

/* ---------- 13. 行内表单 ---------- */
.qt-form-body { padding: 0.24rem 0.28rem 0.52rem; }
/* 底部有固定操作条时留出高度 */
.qt-form-body.qt-with-foot { padding-bottom: 1.92rem; }
.qt-form-card {
  background: #fff;
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  box-shadow: 0 0.04rem 0.16rem rgba(120, 60, 0, .05);
  overflow: hidden;
}
.qt-frow {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  padding: 0.26rem 0.28rem;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-frow:last-child { border-bottom: none; }
.qt-frow .qt-fl { font-size: 0.27rem; font-weight: 600; width: 1.48rem; flex: none; }
.qt-frow .qt-req { color: var(--qt-danger); margin-left: 0.04rem; }
.qt-frow input {
  flex: 1;
  border: none;
  outline: none;
  text-align: right;
  font-size: 0.27rem;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
  min-width: 0;
}
.qt-frow input::placeholder { color: var(--qt-placeholder); font-weight: 400; }
.qt-frow .qt-dt {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.12rem;
  font-size: 0.27rem;
  cursor: pointer;
  color: var(--qt-text);
}
.qt-frow .qt-dt .qt-chev { color: var(--qt-placeholder); font-size: 0.24rem; }
.qt-in-row {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  padding: 0.24rem 0.28rem;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-in-row:last-child { border-bottom: none; }
.qt-in-row input {
  flex: 1;
  border: none;
  outline: none;
  font-size: 0.27rem;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
  min-width: 0;
}
.qt-in-row input::placeholder { color: var(--qt-placeholder); }
.qt-icon-act {
  width: 0.60rem;
  height: 0.60rem;
  border-radius: var(--qt-r-xs);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  border: none;
  flex: none;
}
.qt-icon-act.qt-scan { background: var(--qt-primary-soft); color: var(--qt-primary); }
.qt-icon-act.qt-rm { background: var(--qt-danger-soft); color: var(--qt-danger); }
.qt-upload-btn {
  background: var(--qt-grad);
  color: #fff;
  border: none;
  border-radius: var(--qt-r-xs);
  padding: 0.14rem 0.30rem;
  font-size: 0.25rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  margin-left: auto;
}
.qt-add-dash {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.12rem;
  border: 1.5px dashed var(--qt-line-strong);
  border-radius: var(--qt-r-sm);
  padding: 0.22rem 0;
  color: var(--qt-primary);
  font-size: 0.25rem;
  font-weight: 600;
  cursor: pointer;
  background: #fffdf9;
}
.qt-add-dash:active { background: var(--qt-primary-soft); }
.qt-card-gap { height: 0.18rem; }
.qt-form-actions { display: flex; flex-direction: column; gap: 0.22rem; margin-top: 0.44rem; }

/* ---------- 14. 弹窗（居中） ---------- */
.qt-modal {
  position: fixed;
  left: 0; top: 0; right: 0; bottom: 0;
  background: rgba(40, 25, 10, .45);
  display: none;
  align-items: center;
  justify-content: center;
  z-index: 30;
}
.qt-modal.qt-show { display: flex; }
.qt-modal-card {
  width: 5.80rem;
  background: #fff;
  border-radius: var(--qt-r-lg);
  padding: 0.48rem 0.40rem 0.36rem;
  text-align: center;
  box-shadow: var(--qt-shadow-modal);
}
.qt-modal-icon {
  width: 1.04rem;
  height: 1.04rem;
  margin: 0 auto 0.24rem;
  border-radius: 0.32rem;
  background: var(--qt-danger-soft);
  color: var(--qt-danger);
  display: flex;
  align-items: center;
  justify-content: center;
}
.qt-modal-icon.qt-orange { background: var(--qt-primary-soft); color: var(--qt-primary); }
.qt-modal-title { font-size: 0.32rem; font-weight: 800; }
.qt-modal-text { font-size: 0.25rem; color: var(--qt-muted); line-height: 1.8; margin-top: 0.16rem; }
.qt-modal-btns { display: flex; gap: 0.20rem; margin-top: 0.40rem; }
.qt-modal-btns button { flex: 1; border-radius: var(--qt-r-xs); padding: 0.22rem 0; font-size: 0.28rem; font-weight: 600; cursor: pointer; font-family: inherit; }
.qt-modal-btns .qt-btn-cancel { border: 1.5px solid var(--qt-line); background: #fff; color: var(--qt-text); }
.qt-modal-btns .qt-btn-quit { border: none; background: var(--qt-danger); color: #fff; }

/* ---------- 15. 底部抽屉 ---------- */
.qt-sheet-mask {
  position: fixed;
  left: 0; top: 0; right: 0; bottom: 0;
  background: rgba(40, 25, 10, .45);
  opacity: 0;
  pointer-events: none;
  transition: .2s;
  z-index: 20;
}
.qt-sheet-mask.qt-show { opacity: 1; pointer-events: auto; }
.qt-sheet {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  background: #fff;
  border-radius: 0.40rem 0.40rem 0 0;
  transform: translateY(100%);
  transition: .28s;
  z-index: 21;
  max-height: 78vh;
  display: flex;
  flex-direction: column;
}
.qt-sheet.qt-show { transform: translateY(0); }
.qt-sheet-head {
  display: flex;
  align-items: center;
  gap: 0.16rem;
  padding: 0.30rem 0.32rem 0.24rem;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-sheet-head .qt-t { flex: 1; font-size: 0.30rem; font-weight: 800; text-align: center; }
.qt-sheet-head .qt-close {
  width: 0.52rem; height: 0.52rem;
  border-radius: var(--qt-r-xs);
  background: var(--qt-fill);
  color: var(--qt-muted);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  border: none;
  font-size: 0.24rem;
}
.qt-sheet-body { overflow-y: auto; padding: 0.08rem 0.28rem 0.24rem; }
.qt-sheet-foot { display: flex; gap: 0.20rem; padding: 0.24rem 0.32rem 0.30rem; border-top: 1px solid var(--qt-line-soft); }

/* 可选项行（抽屉 / 弹窗内） */
.qt-opt {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  padding: 0.26rem 0.24rem;
  border-radius: 0.20rem;
  margin: 0.12rem 0;
  background: #fdfbf8;
  border: 1px solid transparent;
  cursor: pointer;
}
.qt-opt .qt-opt-info { flex: 1; min-width: 0; }
.qt-opt .qt-opt-name { font-size: 0.27rem; font-weight: 700; }
.qt-opt .qt-opt-sub { font-size: 0.22rem; color: var(--qt-muted); margin-top: 0.06rem; }
.qt-opt .qt-opt-check {
  width: 0.42rem; height: 0.42rem;
  border-radius: 50%;
  border: 1.5px solid var(--qt-line-mid);
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  transition: .15s;
}
.qt-opt.qt-sel { background: var(--qt-primary-soft); border-color: var(--qt-primary-line); }
.qt-opt.qt-sel .qt-opt-check { background: var(--qt-primary); border-color: var(--qt-primary); }

/* ---------- 16. 空态 / 加载 ---------- */
.qt-empty { text-align: center; padding: 0.88rem 0.28rem; color: var(--qt-muted); }
.qt-empty .qt-empty-ic {
  width: 1.28rem; height: 1.28rem;
  margin: 0 auto 0.24rem;
  border-radius: 50%;
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
}
.qt-empty .qt-empty-t { font-size: 0.28rem; font-weight: 700; color: var(--qt-text); }
.qt-empty .qt-empty-d { font-size: 0.24rem; margin-top: 0.10rem; line-height: 1.8; }
.qt-load-all { text-align: center; font-size: 0.22rem; color: var(--qt-placeholder); padding: 0.12rem 0 0.08rem; }

/* ---------- 17. 工具类 ---------- */
.qt-pad { padding: 0.28rem; }
.qt-mt-0 { margin-top: 0; }
.qt-tc { text-align: center; }
.qt-flex { display: flex; align-items: center; }
.qt-between { justify-content: space-between; }
.qt-gap-8 { gap: 0.16rem; }

/* ---------- 18. 工作台 Hero（经销商 / 项目工作台共用） ---------- */
.qt-hero {
  margin: 0.28rem 0.28rem 0;
  background: linear-gradient(135deg, #FE6B04, #E25E00);
  border-radius: 0.32rem;
  color: #fff;
  padding: 0.32rem 0.32rem 0.76rem;
  box-shadow: 0 0.20rem 0.52rem rgba(190, 80, 0, .35);
  position: relative;
  overflow: hidden;
}
.qt-hero::after {
  content: "";
  position: absolute;
  right: -0.92rem;
  top: -0.92rem;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, .12);
}
.qt-hero::before {
  content: "";
  position: absolute;
  right: 0.76rem;
  bottom: -1.4rem;
  width: 2.4rem;
  height: 2.4rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, .08);
}
.qt-hero-top { display: flex; align-items: center; gap: 0.22rem; position: relative; z-index: 2; }
.qt-hero-logo { width: 0.84rem; height: 0.84rem; border-radius: 0.20rem; flex: none; display: block; }
.qt-hero-main { flex: 1; min-width: 0; }
.qt-hero-title { font-size: 0.34rem; font-weight: 800; letter-spacing: .5px; }
.qt-hero-sub {
  font-size: 0.23rem;
  opacity: .9;
  margin-top: 0.08rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.qt-hero .qt-icon-btn { background: rgba(255, 255, 255, .16); }

/* ---------- 19. 项目卡（经销商工作台 / 项目列表） ---------- */
.qt-proj-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0.44rem 0.28rem 0.20rem;
}
.qt-proj-head h3 { font-size: 0.30rem; font-weight: 700; margin: 0; }
.qt-proj-add {
  display: flex;
  align-items: center;
  gap: 0.10rem;
  font-size: 0.26rem;
  color: var(--qt-primary);
  background: var(--qt-primary-soft);
  border: none;
  border-radius: 999px;
  padding: 0.12rem 0.26rem;
  cursor: pointer;
  font-weight: 600;
  font-family: inherit;
}
.qt-proj-list { padding: 0 0.28rem 0.32rem; }
.qt-proj {
  background: var(--qt-card);
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  padding: 0.26rem 0.28rem;
  margin-bottom: 0.22rem;
  cursor: pointer;
  box-shadow: 0 0.04rem 0.16rem rgba(120, 60, 0, .06);
  transition: .15s;
}
.qt-proj:active { transform: scale(.985); }
.qt-proj-top { display: flex; align-items: center; gap: 0.16rem; }
.qt-proj-name { font-size: 0.30rem; font-weight: 700; flex: 1; }
.qt-proj-del {
  width: 0.52rem;
  height: 0.52rem;
  border-radius: 0.16rem;
  border: none;
  background: var(--qt-danger-soft);
  color: var(--qt-danger);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  flex: none;
  padding: 0;
}
.qt-proj-addr {
  font-size: 0.24rem;
  color: var(--qt-muted);
  margin-top: 0.12rem;
  display: flex;
  align-items: center;
  gap: 0.08rem;
}
.qt-proj-meta {
  display: flex;
  gap: 0.28rem;
  margin-top: 0.18rem;
  font-size: 0.24rem;
  color: var(--qt-muted);
  border-top: 1px dashed var(--qt-line);
  padding-top: 0.18rem;
  align-items: center;
}
.qt-proj-meta b { color: var(--qt-text); font-weight: 700; }
.qt-proj-go {
  margin-left: auto;
  color: var(--qt-primary);
  font-weight: 600;
  font-size: 0.24rem;
  display: flex;
  align-items: center;
  gap: 0.04rem;
}

/* ---------- 20. 用户管理（列表 + 表单） ---------- */

/* 项目切换条 */
.qt-proj-bar {
  display: flex;
  align-items: center;
  gap: 0.16rem;
  background: var(--qt-primary-soft);
  margin: 0.24rem 0.28rem 0;
  padding: 0.18rem 0.24rem;
  border-radius: 0.24rem;
  cursor: pointer;
  border: 1px dashed var(--qt-primary-line);
}
.qt-proj-bar .qt-pin {
  width: 0.52rem;
  height: 0.52rem;
  border-radius: 0.16rem;
  background: var(--qt-primary);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
}
.qt-proj-bar .qt-pb-n { font-size: 0.27rem; font-weight: 700; color: var(--qt-primary-deep); }
.qt-proj-bar .qt-pb-s { font-size: 0.22rem; color: var(--qt-muted); margin-top: 0.02rem; }
.qt-proj-bar .qt-pb-go {
  margin-left: auto;
  font-size: 0.23rem;
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  gap: 0.06rem;
  font-weight: 600;
}

/* 统计数字配色（列表页三色） */
.qt-stat-num.qt-c1 { color: var(--qt-primary); }
.qt-stat-num.qt-c2 { color: var(--qt-success); }
.qt-stat-num.qt-c3 { color: var(--qt-warn); }
/* 无图标版统计卡（用户管理列表） */
.qt-stats.qt-pt { padding: 0.24rem 0.28rem 0; }
.qt-stat.qt-slim { padding: 0.22rem 0.12rem 0.20rem; }

/* 成员角色徽标（业主样式在 .qt-role） */
.qt-role-member { color: #3D7EE8; background: #EAF2FE; border-color: #C7DCF9; }

/* 搜索 + 筛选 */
.qt-search-row { display: flex; gap: 0.18rem; padding: 0.24rem 0.28rem 0; }
.qt-search-box {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 0.14rem;
  background: #fff;
  border: 1.5px solid var(--qt-line);
  border-radius: 0.24rem;
  padding: 0.18rem 0.24rem;
}
.qt-search-box input {
  border: none;
  outline: none;
  font-size: 0.26rem;
  flex: 1;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
  min-width: 0;
}
.qt-search-box input::placeholder { color: var(--qt-placeholder); }
.qt-filter-btn {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.10rem;
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  border: none;
  border-radius: 0.24rem;
  padding: 0 0.28rem;
  font-size: 0.26rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  flex: none;
}
.qt-filter-btn.qt-has { background: var(--qt-primary); color: #fff; }
.qt-fb-dot {
  position: absolute;
  top: -0.08rem;
  right: -0.08rem;
  width: 0.32rem;
  height: 0.32rem;
  border-radius: 50%;
  background: var(--qt-danger);
  color: #fff;
  font-size: 0.20rem;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  border: 0.04rem solid #fff;
}
.qt-chips-row {
  display: flex;
  gap: 0.14rem;
  padding: 0.22rem 0.28rem 0.04rem;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.qt-chips-row::-webkit-scrollbar { display: none; }
.qt-chips-row .qt-chip { white-space: nowrap; flex: none; }

/* 用户卡：设备关联区 */
.qt-u-dev {
  border-top: 1px dashed var(--qt-line);
  padding: 0.20rem 0.26rem;
  background: var(--qt-card-tint);
  cursor: pointer;
}
.qt-u-dev .qt-ud-row { display: flex; align-items: center; gap: 0.16rem; }
.qt-u-dev .qt-ud-t { font-size: 0.25rem; font-weight: 700; }
.qt-u-dev .qt-ud-arrow { margin-left: auto; color: var(--qt-muted); font-size: 0.22rem; transition: .2s; }
.qt-u-dev.qt-open .qt-ud-arrow { transform: rotate(180deg); }
.qt-perm-panel { display: none; margin-top: 0.20rem; }
.qt-u-dev.qt-open .qt-perm-panel { display: block; }
.qt-auth-mini {
  font-size: 0.21rem;
  color: var(--qt-primary);
  background: var(--qt-primary-soft);
  border-radius: 0.12rem;
  padding: 0.04rem 0.16rem;
  font-weight: 700;
}
.qt-auth-mini.qt-none { color: var(--qt-off); background: var(--qt-off-soft); }
.qt-perm-group {
  display: flex;
  align-items: center;
  gap: 0.16rem;
  background: #fff;
  border: 1px solid var(--qt-line);
  border-radius: 0.20rem;
  padding: 0.16rem 0.20rem;
  margin-bottom: 0.14rem;
}
.qt-perm-group .qt-pg-ic {
  width: 0.56rem;
  height: 0.56rem;
  border-radius: 0.16rem;
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
}
.qt-perm-group .qt-pg-info { flex: 1; min-width: 0; }
.qt-perm-group .qt-pg-n { font-size: 0.25rem; font-weight: 600; }
.qt-perm-group .qt-pg-m { font-size: 0.22rem; color: var(--qt-muted); margin-top: 0.02rem; }
.qt-perm-group .qt-pg-devices { margin-left: auto; font-size: 0.22rem; color: var(--qt-primary); font-weight: 700; flex: none; }
.qt-perm-empty { font-size: 0.24rem; color: var(--qt-muted); text-align: center; padding: 0.20rem 0 0.08rem; }
.qt-perm-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.08rem;
  width: 100%;
  margin-top: 0.14rem;
  padding: 0.16rem 0;
  border-radius: 0.20rem;
  border: 1.5px solid var(--qt-line-strong);
  background: #fff;
  color: var(--qt-primary);
  font-size: 0.24rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
}

/* 小尺寸按钮（section 操作） */
.qt-mini-btn {
  display: flex;
  align-items: center;
  gap: 0.08rem;
  font-size: 0.24rem;
  font-weight: 600;
  padding: 0.10rem 0.22rem;
  border-radius: 0.18rem;
  border: none;
  cursor: pointer;
  font-family: inherit;
}
.qt-mini-btn.qt-orange { background: var(--qt-primary-soft); color: var(--qt-primary); }
.qt-mini-btn.qt-line { background: #fff; color: var(--qt-primary); border: 1px solid var(--qt-primary); }

/* 分区标题右侧的计数与按钮组 */
.qt-sec-cnt {
  font-size: 0.22rem;
  color: var(--qt-muted);
  background: #fff;
  border: 1px solid var(--qt-line);
  border-radius: 999px;
  padding: 0.04rem 0.18rem;
}
.qt-sec-btns { margin-left: auto; display: flex; gap: 0.14rem; }

/* 表单：带内边距的卡片（.qt-frow 在其中有独立内边距） */
.qt-fcard {
  background: var(--qt-card);
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  padding: 0.10rem 0.28rem;
  box-shadow: 0 0.04rem 0.16rem rgba(120, 60, 0, .05);
}
.qt-fcard .qt-frow { padding: 0.24rem 0; }
.qt-avatar-up {
  width: 0.88rem;
  height: 0.88rem;
  border-radius: 0.24rem;
  border: 1.5px dashed var(--qt-line-strong);
  background: var(--qt-primary-soft);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--qt-primary);
  cursor: pointer;
  margin-left: auto;
  overflow: hidden;
  flex: none;
}
.qt-avatar-up img { width: 100%; height: 100%; object-fit: cover; }
.qt-date-cell {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.10rem;
  font-size: 0.26rem;
  color: var(--qt-text);
  cursor: pointer;
}
.qt-quick {
  font-size: 0.21rem;
  color: var(--qt-primary);
  background: var(--qt-primary-soft);
  border-radius: 0.12rem;
  padding: 0.04rem 0.14rem;
  font-weight: 600;
}
.qt-del-img {
  font-size: 0.24rem;
  color: #fff;
  border-radius: 0.12rem;
  padding: 0.08rem 0.20rem;
  background: var(--qt-danger);
  margin-left: 0.20rem;
}

/* 卡 / 电动车条目 */
.qt-item-row {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  background: var(--qt-card-tint);
  border: 1px solid var(--qt-line);
  border-radius: 0.24rem;
  padding: 0.20rem 0.22rem;
  margin: 0.20rem 0 0.08rem;
}
.qt-item-row .qt-ir-ic {
  width: 0.68rem;
  height: 0.68rem;
  border-radius: 0.20rem;
  background: var(--qt-primary-soft);
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
}
.qt-item-row .qt-ir-info { flex: 1; min-width: 0; }
.qt-item-row input.qt-it-n {
  width: 100%;
  border: none;
  outline: none;
  font-size: 0.26rem;
  font-weight: 700;
  letter-spacing: .5px;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
}
.qt-item-row input.qt-it-n::placeholder { color: var(--qt-placeholder); font-weight: 400; }
.qt-it-m { font-size: 0.22rem; color: var(--qt-muted); margin-top: 0.04rem; }
.qt-rm {
  width: 0.52rem;
  height: 0.52rem;
  border-radius: 0.16rem;
  border: none;
  background: var(--qt-danger-soft);
  color: var(--qt-danger);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  flex: none;
  padding: 0;
}
.qt-ebike-card {
  background: var(--qt-card-tint);
  border: 1px solid var(--qt-line);
  border-radius: 0.24rem;
  padding: 0.22rem;
  margin: 0.20rem 0 0.08rem;
}
.qt-ebike-top { display: flex; align-items: center; gap: 0.14rem; }
.qt-ebike-top .qt-rm { margin-left: auto; }
input.qt-plate {
  font-size: 0.24rem;
  font-weight: 800;
  color: #fff;
  background: linear-gradient(135deg, #3D7EE8, #2B5FC4);
  border: none;
  outline: none;
  border-radius: 0.14rem;
  padding: 0.08rem 0.20rem;
  letter-spacing: 1px;
  font-family: inherit;
  width: 2.6rem;
  min-width: 0;
}
input.qt-plate::placeholder { color: rgba(255, 255, 255, .7); font-weight: 400; }
.qt-ebike-fields { display: flex; gap: 0.16rem; margin-top: 0.18rem; }
.qt-ebike-fields .qt-ef {
  flex: 1;
  background: #fff;
  border: 1px solid var(--qt-line);
  border-radius: 0.18rem;
  padding: 0.14rem 0.18rem;
  min-width: 0;
}
.qt-ef-l { font-size: 0.20rem; color: var(--qt-muted); }
.qt-ef input {
  border: none;
  outline: none;
  width: 100%;
  font-size: 0.23rem;
  font-weight: 600;
  margin-top: 0.04rem;
  font-family: inherit;
  color: var(--qt-text);
  background: transparent;
  min-width: 0;
}
.qt-ef input::placeholder { color: var(--qt-placeholder); font-weight: 400; }
.qt-ef-err {
  font-size: 0.22rem;
  color: var(--qt-danger);
  padding: 0.08rem 0.04rem 0;
}

/* 表单底部操作条 */
.qt-form-foot {
  position: fixed;
  left: 0.28rem;
  right: 0.28rem;
  bottom: 0.28rem;
  display: flex;
  gap: 0.20rem;
  z-index: 6;
}
.qt-form-foot .qt-btn-back {
  flex: 1;
  background: #fff;
  border: 1.5px solid var(--qt-line);
  color: var(--qt-text);
  border-radius: var(--qt-r-sm);
  padding: 0.24rem 0;
  font-size: 0.29rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
}
.qt-form-foot .qt-btn-primary { flex: 2.2; }

/* 筛选抽屉内的表单行 */
.qt-fs-row { display: flex; align-items: center; gap: 0.20rem; margin-bottom: 0.24rem; }
.qt-fs-row .qt-fl { font-size: 0.25rem; color: var(--qt-muted); width: 1.2rem; flex: none; }
.qt-fs-row input {
  flex: 1;
  border: 1.5px solid var(--qt-line);
  border-radius: 0.20rem;
  padding: 0.18rem 0.24rem;
  font-size: 0.26rem;
  font-family: inherit;
  outline: none;
  background: #fdfbf8;
  color: var(--qt-text);
  min-width: 0;
}
.qt-fs-row input:focus { border-color: var(--qt-primary); background: #fff; }
.qt-fs-chips { display: flex; flex-wrap: wrap; gap: 0.16rem; }

/* 抽屉头部标题（左对齐） */
.qt-sheet-title { flex: 1; font-size: 0.30rem; font-weight: 800; text-align: left; }

/* 抽屉内可选项（项目切换） */
.qt-pick-item {
  display: flex;
  align-items: center;
  gap: 0.22rem;
  padding: 0.26rem 0.24rem;
  border-radius: 0.24rem;
  cursor: pointer;
  border: 1.5px solid transparent;
  margin-bottom: 0.16rem;
  background: #fdfbf8;
}
.qt-pick-item.qt-active { border-color: var(--qt-primary); background: var(--qt-primary-soft); }
.qt-pick-item .qt-pi-ic {
  width: 0.72rem;
  height: 0.72rem;
  border-radius: 0.22rem;
  background: #fff;
  color: var(--qt-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--qt-line);
  flex: none;
}
.qt-pick-item .qt-pi-info { flex: 1; min-width: 0; }
.qt-pick-item .qt-pi-n { font-size: 0.27rem; font-weight: 700; }
.qt-pick-item .qt-pi-m { font-size: 0.22rem; color: var(--qt-muted); margin-top: 0.04rem; }
.qt-pick-item .qt-pi-check {
  margin-left: auto;
  width: 0.40rem;
  height: 0.40rem;
  border-radius: 50%;
  border: 1.5px solid #ddd2c4;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
}
.qt-pick-item.qt-active .qt-pi-check { background: var(--qt-primary); border-color: var(--qt-primary); }

/* ---------- 21. 设备管理 / 权限组管理 / 车牌识别 ---------- */

/* 通用：卡片内可点击的设备行（权限组「关联设备」） */
.qt-pgd-row {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  background: #fff;
  border: 1px solid #f0e6d8;
  border-radius: 0.22rem;
  padding: 0.20rem 0.24rem;
  margin-bottom: 0.14rem;
  cursor: pointer;
}
.qt-pgd-row.qt-sel { border-color: var(--qt-primary); background: var(--qt-primary-soft); }
.qt-pgd-info { flex: 1; min-width: 0; }
.qt-pgd-name { font-size: 0.26rem; font-weight: 700; color: var(--qt-text); }
.qt-pgd-meta { font-size: 0.22rem; color: var(--qt-muted); line-height: 1.8; margin-top: 0.06rem; }
.qt-pgd-meta .qt-mv { color: var(--qt-text); font-weight: 600; }
.qt-pgd-meta .qt-mv.qt-warn { color: var(--qt-warn); }
.qt-pgd-radio {
  width: 0.44rem;
  height: 0.44rem;
  border-radius: 50%;
  border: 1.5px solid var(--qt-line-mid);
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
}
.qt-pgd-row.qt-sel .qt-pgd-radio { background: var(--qt-primary); border-color: var(--qt-primary); }
.qt-pgd-empty { font-size: 0.23rem; color: var(--qt-placeholder); text-align: center; padding: 0.20rem 0 0.08rem; }

/* 权限组数量徽标 / 设备数徽标 */
.qt-cnt-badge {
  font-size: 0.20rem;
  color: var(--qt-owner-text);
  background: var(--qt-owner-bg);
  border: 1px solid var(--qt-owner-line);
  border-radius: 999px;
  padding: 0.04rem 0.16rem;
  font-weight: 700;
  white-space: nowrap;
}
.qt-cnt-badge.qt-plain {
  color: var(--qt-muted);
  background: #fff;
  border-color: var(--qt-line);
  font-weight: 600;
}

/* 设备卡：启用/停用小按钮 */
.qt-u-enable {
  font-size: 0.24rem;
  color: var(--qt-success);
  font-weight: 700;
  cursor: pointer;
  background: transparent;
  border: none;
  font-family: inherit;
  padding: 0;
  white-space: nowrap;
}
.qt-u-enable.qt-off { color: var(--qt-off); }

/* 可折叠的胶囊选择行（查询条件里的「权限组类型」/弹窗里的类型） */
.qt-dv-chips {
  display: none;
  flex-wrap: wrap;
  gap: 0.14rem;
  padding: 0.08rem 0 0.20rem;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-dv-chips.qt-open { display: flex; }
.qt-dv-type {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.10rem;
  font-size: 0.26rem;
  color: var(--qt-text);
  cursor: pointer;
}
.qt-dv-type .qt-chev { color: var(--qt-placeholder); font-size: 0.24rem; }

/* 弹窗表单：设备 / 权限组 共用（.qt-dev-card） */
.qt-dev-card {
  width: 6.36rem;
  max-height: 86vh;
  overflow-y: auto;
  background: #fff;
  border-radius: var(--qt-r-lg);
  padding: 0.36rem 0.32rem 0.32rem;
  box-shadow: var(--qt-shadow-modal);
}
.qt-dev-title { font-size: 0.31rem; font-weight: 800; text-align: center; margin-bottom: 0.12rem; }
.qt-dv-row {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  padding: 0.22rem 0;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-dv-row:last-of-type { border-bottom: none; }
.qt-dv-row .qt-fl { font-size: 0.26rem; width: 1.44rem; flex: none; font-weight: 600; }
.qt-dv-row .qt-req { color: var(--qt-danger); margin-right: 0.04rem; }
.qt-dv-row input {
  flex: 1;
  border: none;
  outline: none;
  font-size: 0.26rem;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
  min-width: 0;
}
.qt-dv-row input::placeholder { color: var(--qt-placeholder); }
.qt-dv-scan {
  background: var(--qt-grad);
  color: #fff;
  border: none;
  border-radius: 0.16rem;
  padding: 0.12rem 0.26rem;
  font-size: 0.24rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  display: flex;
  align-items: center;
  gap: 0.08rem;
  flex: none;
}
.qt-dev-ok {
  margin-top: 0.32rem;
  background: var(--qt-grad);
  color: #fff;
  border: none;
  border-radius: var(--qt-r-sm);
  padding: 0.24rem 0;
  font-size: 0.29rem;
  font-weight: 700;
  cursor: pointer;
  font-family: inherit;
  width: 100%;
  box-shadow: var(--qt-shadow-btn-sm);
}
.qt-field-err {
  display: none;
  font-size: 0.22rem;
  color: var(--qt-danger);
  padding: 0 0 0.12rem 1.68rem;
  margin-top: -0.08rem;
  text-align: left;
}
.qt-field-err.qt-show { display: block; }

/* 车牌识别：扫描区 */
.qt-plate-wrap { padding: 0 0.28rem 1.48rem; }
.qt-scan-hero {
  margin: 0 -0.28rem;
  height: 5rem;
  background: linear-gradient(160deg, #FF8A2B, #FE6B04 46%, #E25E00);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  overflow: hidden;
}
.qt-scan-hero::after {
  content: "";
  position: absolute;
  right: -1.2rem;
  top: -1.2rem;
  width: 3.8rem;
  height: 3.8rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, .09);
}
.qt-scan-box {
  width: 3.4rem;
  height: 3.4rem;
  border-radius: 0.32rem;
  background: rgba(52, 34, 20, .55);
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 0.28rem 0.68rem rgba(90, 40, 0, .35);
}
.qt-sc-corner { position: absolute; width: 0.48rem; height: 0.48rem; border: 0.06rem solid #fff; opacity: .95; }
.qt-sc-corner.qt-tl { top: 0.24rem; left: 0.24rem; border-right: none; border-bottom: none; border-radius: 0.12rem 0 0 0; }
.qt-sc-corner.qt-tr { top: 0.24rem; right: 0.24rem; border-left: none; border-bottom: none; border-radius: 0 0.12rem 0 0; }
.qt-sc-corner.qt-bl { bottom: 0.24rem; left: 0.24rem; border-right: none; border-top: none; border-radius: 0 0 0 0.12rem; }
.qt-sc-corner.qt-br { bottom: 0.24rem; right: 0.24rem; border-left: none; border-top: none; border-radius: 0 0 0.12rem 0; }
.qt-scan-core {
  width: 1.04rem;
  height: 1.04rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, .16);
  display: flex;
  align-items: center;
  justify-content: center;
}
.qt-scan-line {
  position: absolute;
  left: 0.32rem;
  right: 0.32rem;
  top: 0.44rem;
  height: 0.05rem;
  border-radius: 0.04rem;
  background: linear-gradient(90deg, transparent, #fff 30%, #fff 70%, transparent);
  box-shadow: 0 0 0.24rem rgba(255, 255, 255, .85);
  opacity: 0;
}
.qt-scan-box.qt-scanning .qt-scan-line { opacity: 1; animation: qtScanY 1.1s ease-in-out infinite alternate; }
@keyframes qtScanY {
  from { top: 0.44rem; }
  to { top: calc(100% - 0.52rem); }
}
.qt-scan-tip { text-align: center; padding: 0.44rem 0.20rem 0.08rem; }
.qt-scan-tip h3 { margin: 0; font-size: 0.34rem; font-weight: 800; color: var(--qt-text); }
.qt-scan-tip p { margin: 0.18rem 0 0; font-size: 0.24rem; color: var(--qt-muted); line-height: 1.8; }
.qt-or-div { display: flex; align-items: center; gap: 0.24rem; font-size: 0.22rem; color: var(--qt-placeholder); padding: 0.28rem 0.52rem; }
.qt-or-div .qt-or-line { flex: 1; height: 1px; background: var(--qt-line); }
.qt-manual-link {
  display: flex;
  align-items: center;
  gap: 0.12rem;
  margin: 0 auto;
  padding: 0.16rem 0.32rem;
  background: none;
  border: none;
  color: var(--qt-primary);
  font-size: 0.27rem;
  font-weight: 700;
  cursor: pointer;
  font-family: inherit;
  border-radius: 0.20rem;
}
.qt-manual-link:active { background: var(--qt-primary-soft); }

/* 车牌识别：结果卡 */
.qt-plate-result {
  margin-top: 0.32rem;
  background: var(--qt-card);
  border: 1px solid var(--qt-line);
  border-radius: var(--qt-r);
  padding: 0.28rem 0.30rem;
  box-shadow: 0 0.04rem 0.16rem rgba(120, 60, 0, .06);
}
.qt-pr-head { display: flex; align-items: center; justify-content: space-between; }
.qt-pr-plate {
  display: inline-block;
  font-size: 0.30rem;
  font-weight: 800;
  letter-spacing: 1px;
  color: #0c7a43;
  background: #E8F7EE;
  border: 1.5px solid #BCE8CC;
  border-radius: 0.16rem;
  padding: 0.08rem 0.24rem;
}
.qt-pr-acts { display: flex; gap: 0.20rem; margin-top: 0.24rem; }
.qt-pr-btn {
  flex: 1;
  border: none;
  border-radius: 0.22rem;
  padding: 0.20rem 0;
  font-size: 0.26rem;
  font-weight: 700;
  cursor: pointer;
  font-family: inherit;
  background: var(--qt-grad);
  color: #fff;
  box-shadow: 0 0.10rem 0.24rem rgba(226, 94, 0, .24);
}
.qt-pr-btn.qt-ghost { background: #fff; color: var(--qt-muted); border: 1.5px solid var(--qt-line); box-shadow: none; }

/* 底部通栏大按钮（车牌识别） */
.qt-fab-scan {
  position: fixed;
  left: 0.32rem;
  right: 0.32rem;
  bottom: 0.36rem;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.14rem;
  background: var(--qt-grad);
  color: #fff;
  border: none;
  border-radius: 0.28rem;
  padding: 0.28rem 0;
  font-size: 0.30rem;
  font-weight: 800;
  cursor: pointer;
  font-family: inherit;
  box-shadow: 0 0.20rem 0.48rem rgba(190, 80, 0, .42);
  z-index: 6;
  letter-spacing: 1px;
}
.qt-fab-scan:active { transform: scale(.98); }
.qt-fab-scan:disabled { opacity: .75; }

/* 手动输入车牌弹窗内的行/按钮 */
.qt-mp-row {
  display: flex;
  align-items: center;
  gap: 0.20rem;
  padding: 0.24rem 0;
  border-bottom: 1px solid var(--qt-line-soft);
}
.qt-mp-row .qt-mp-label { font-size: 0.27rem; font-weight: 600; width: 1.16rem; flex: none; }
.qt-mp-row input {
  flex: 1;
  border: none;
  outline: none;
  font-size: 0.28rem;
  font-family: inherit;
  background: transparent;
  color: var(--qt-text);
  min-width: 0;
  letter-spacing: 1px;
}
.qt-mp-row input::placeholder { color: var(--qt-placeholder); }
.qt-mp-btns { display: flex; gap: 0.20rem; margin-top: 0.32rem; }
.qt-mp-btns button {
  flex: 1;
  border-radius: 0.22rem;
  padding: 0.22rem 0;
  font-size: 0.28rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
}
.qt-mp-cancel { border: 1.5px solid var(--qt-line); background: #fff; color: var(--qt-text); }
.qt-mp-ok { border: none; background: var(--qt-grad); color: #fff; box-shadow: 0 0.10rem 0.24rem rgba(226, 94, 0, .24); }

/* ---------- 22. 同构列表页（访客 / 开门日志 / 通话记录 / 管理员 / 选择页 / 登录注册） ---------- */

/* 卡片头：图标 + 名称·副标题 + 右侧徽标 */
.qt-item-head { display: flex; align-items: center; gap: 0.20rem; padding: 0.26rem 0.26rem 0.22rem; }
.qt-item-head .qt-hd { flex: 1; min-width: 0; }
.qt-item-head .qt-nm {
  font-size: 0.29rem;
  font-weight: 700;
  display: flex;
  align-items: center;
  gap: 0.14rem;
  flex-wrap: wrap;
}
.qt-item-head .qt-sub { font-size: 0.22rem; color: var(--qt-muted); margin-top: 0.08rem; }
.qt-item-head .qt-hd-right { flex: none; display: flex; align-items: center; gap: 0.14rem; }

/* 卡片内信息行（两列：标签 / 值） */
.qt-kvs { padding: 0.06rem 0.26rem 0.24rem; }
.qt-kvs.qt-divide { border-top: 1px solid var(--qt-line-soft); padding-top: 0.20rem; }
.qt-kv { display: flex; gap: 0.16rem; font-size: 0.24rem; line-height: 1.9; }
.qt-kv .qt-k { color: var(--qt-muted); width: 1.52rem; flex: none; }
.qt-kv .qt-v { flex: 1; min-width: 0; color: var(--qt-text); word-break: break-all; }
.qt-kv .qt-v.qt-strong { font-weight: 700; }
.qt-kv .qt-v.qt-warn { color: var(--qt-warn); font-weight: 700; }

/* 楼栋选择树 */
.qt-tree { padding: 0.08rem 0.20rem 0.20rem; }
.qt-tn { border-bottom: 1px solid var(--qt-line-soft); }
.qt-tn:last-child { border-bottom: none; }
.qt-tn-row { display: flex; align-items: center; gap: 0.16rem; padding: 0.24rem 0.08rem; cursor: pointer; }
.qt-tn-toggle {
  width: 0.44rem;
  height: 0.44rem;
  flex: none;
  border-radius: 0.12rem;
  background: var(--qt-fill);
  color: var(--qt-muted);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.20rem;
  font-weight: 700;
  transition: .18s;
}
.qt-tn-toggle.qt-open { transform: rotate(90deg); }
.qt-tn-spacer { width: 0.44rem; flex: none; }
.qt-tn-name { flex: 1; min-width: 0; font-size: 0.27rem; font-weight: 600; }
.qt-tn-check {
  width: 0.40rem;
  height: 0.40rem;
  flex: none;
  border-radius: 50%;
  border: 1.5px solid var(--qt-line-strong);
  background: #fff;
  color: transparent;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: .15s;
}
.qt-tn-row.qt-sel .qt-tn-check { background: var(--qt-primary); border-color: var(--qt-primary); color: #fff; }
.qt-tn-kids { padding-left: 0.56rem; }

/* 底部固定操作条（选择页 / 表单页 / 列表页主操作） */
.qt-foot-bar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 8;
  display: flex;
  gap: 0.20rem;
  padding: 0.22rem 0.32rem 0.22rem;
  padding-bottom: calc(0.22rem + env(safe-area-inset-bottom, 0px));
  background: rgba(255, 255, 255, .97);
  border-top: 1px solid var(--qt-line);
}
.qt-foot-bar .qt-btn { flex: 1; }

/* 登录 / 注册（H5 管理员端） */
.qt-auth { min-height: 100vh; background: var(--qt-bg); }
.qt-auth-hero {
  background: var(--qt-grad-bar);
  color: #fff;
  padding: 0.92rem 0.52rem 1.76rem;
  text-align: center;
}
.qt-auth-hero .qt-logo-wrap { display: flex; justify-content: center; margin-bottom: 0.28rem; }
.qt-auth-hero h1 { font-size: 0.46rem; font-weight: 800; margin: 0; letter-spacing: 3px; }
.qt-auth-hero p { font-size: 0.24rem; opacity: .9; margin: 0.16rem 0 0; }
.qt-auth-card {
  margin: -1.30rem 0.36rem 0.40rem;
  background: #fff;
  border: 1px solid var(--qt-line);
  border-radius: 0.32rem;
  box-shadow: 0 0.16rem 0.48rem rgba(120, 60, 0, .12);
  padding: 0.44rem 0.40rem 0.20rem;
}
.qt-auth-card .qt-auth-title { font-size: 0.34rem; font-weight: 800; text-align: center; }
.qt-auth-card .qt-auth-desc { font-size: 0.23rem; color: var(--qt-muted); text-align: center; margin-top: 0.10rem; }
.qt-auth-card .qt-frow { padding: 0.26rem 0; }
.qt-auth .qt-cap-row { display: flex; align-items: center; gap: 0.20rem; }
.qt-auth .qt-cap-row input { flex: 1; min-width: 0; }
.qt-auth .qt-cap-img {
  width: 2.00rem;
  height: 0.72rem;
  border-radius: 0.16rem;
  flex: none;
  object-fit: cover;
  background: var(--qt-fill);
}
.qt-auth-foot { text-align: center; font-size: 0.25rem; color: var(--qt-muted); padding: 0.36rem 0 0.64rem; }
.qt-auth-foot .qt-link { color: var(--qt-primary); font-weight: 700; cursor: pointer; }





