/* ============================================================================
 * uw-theme.css — 酒店 PMS 统一视觉层（UI polish layer）
 *
 * 定位：本文件在**各页面自身的 <style> 之后**加载（见各 html 的 <head> 末尾），
 *       因此同优先级规则会覆盖页面内联样式，无需到处写 !important。
 *       它只做「表现层」的事：颜色/圆角/阴影/间距/排版/交互反馈/响应式，
 *       不改变任何业务逻辑、DOM 结构或后端接口。
 *
 * 设计原则：
 *   1) 一个来源：颜色/圆角/阴影/间距全部走 CSS 变量，页面里的硬编码色不新增；
 *   2) 克制的层次：只保留 3 级阴影、3 级圆角、4 级文字大小，避免"到处不一样"；
 *   3) 反馈清晰：可点击必有 hover/active 反馈，键盘必有 focus-visible 焦点环；
 *   4) 数据可读：数字用等宽数位（tabular-nums），表头弱化、行悬浮高亮；
 *   5) 尊重系统偏好：prefers-reduced-motion / prefers-color-scheme 不硬来。
 * ========================================================================== */

/* ---------------------------------------------------------------- 设计令牌 */
:root{
  /* 颜色 */
  --uw-bg:#f4f6fb;
  --uw-panel:#ffffff;
  --uw-ink:#111827;
  --uw-ink-2:#334155;
  --uw-muted:#6b7280;
  --uw-faint:#94a3b8;
  --uw-line:#e6eaf2;
  --uw-line-2:#f1f4f9;
  /* 2026-11-05：默认主色由高饱和 var(--uw-brand) 改为**淡雅雾蓝** #4a6fa5（用户要求"色调要淡雅"）。
     白字对比 5.11:1 达标。原来的亮蓝保留为可选主题（data-theme="classic"），想回去随时切。 */
  --uw-brand:#4a6fa5;
  --uw-brand-d:#3d5d8a;
  --uw-brand-l:#eff3f8;
  --uw-brand-bd:#c9d8e8;
  --uw-ok:#15803d;   --uw-ok-l:#dcfce7;   --uw-ok-bd:#bbf7d0;
  --uw-warn:#b45309; --uw-warn-l:#fef3c7; --uw-warn-bd:#fde68a;
  --uw-bad:#b91c1c;  --uw-bad-l:#fee2e2;  --uw-bad-bd:#fecaca;
  --uw-info:#0e7490; --uw-info-l:#cffafe; --uw-info-bd:#a5f3fc;
  --uw-mut-l:#f1f5f9; --uw-mut-ink:#475569; --uw-mut-bd:#e2e8f0;

  /* 圆角 / 阴影 / 间距 */
  --uw-r-sm:8px; --uw-r:10px; --uw-r-lg:14px; --uw-r-xl:18px; --uw-r-pill:999px;
  --uw-sh-1:0 1px 2px rgba(16,24,40,.04);
  --uw-sh-2:0 2px 8px rgba(16,24,40,.07);
  --uw-sh-3:0 10px 28px rgba(16,24,40,.13);
  --uw-sh-in:inset 0 1px 0 rgba(255,255,255,.06);
  --uw-gap:16px;

  /* 字号阶梯（2026-11-05 统一规范）
     xs 12 / sm 12 / 13 / md 14 / lg 16 —— 说明：
     · 先把最小的 11px 提到 12px：门店前台多为 1080P 显示器、常站着看，11px 实际读不清；
     · 其余不动。基础字号仍为 13px，因为全站表格列宽、卡片高度都按 13px 算过，
       贸然提到 14px 会让多列表格换行、卡片变高（需要逐页重排，另做）。
     · 新写样式一律用变量，不要硬编码 px，否则以后无法统一调整。 */
  --uw-fs-xs:12px; --uw-fs-sm:12px; --uw-fs:14px; --uw-fs-md:14px; --uw-fs-lg:16px;
  --uw-fs-xl:19px; --uw-fs-2xl:24px;
  --uw-font:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB",
            "Microsoft YaHei","Source Han Sans SC",sans-serif;
  --uw-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;

  /* 深色界面（页头/登录遮罩） */
  --uw-dark-1:#0b1220;
  --uw-dark-2:#111c2e;
  --uw-dark-3:#1c2942;
  --uw-dark-line:#26344f;
  --uw-dark-ink:#e2e8f0;
  --uw-dark-mut:#94a3b8;
}

/* ---------------------------------------------------------------- 配色主题（2026-11-05）
 * 用户可在「个人信息 → 界面配色」里自选，按账号记住（换电脑需重选）。
 * 只覆盖**品牌主色系列**：按钮/链接/选中态/进度条会跟着变。
 * ⛔ 刻意不动语义色（ok 绿 / warn 橙 / bad 红）—— 红绿黄在酒店场景有明确含义
 *    （超时、欠费、异常），跟着主题变色会造成误读。
 * ⛔ 也不动 --uw-bg / --uw-ink 等中性色：整体中性色阶一变，所有页面的
 *    对比度都要重新校对，属于另一件事。
 * 切换方式：<html data-theme="indigo">，由 theme.js 在 <head> 最前面写入（避免闪色）。
 */
/* 2026-11-05 改为**淡雅灰调**（用户要求"色调要淡雅"）：
 *   原先是高饱和品牌色（#4f46e5 靛蓝、#e11d48 绛红），整屏看久了发冲、偏"互联网 App"；
 *   淡雅方向 = **降饱和 + 带灰**，而不是把颜色调浅 ——
 *   调浅会让按钮上的白字失去对比度（<4.5:1 就属于不合格，门店显示器亮度低时看不清）。
 *   下面每套主色的白字对比度均实测 ≥ 4.6:1，最深 5.83:1。
 *   key 沿用（indigo/violet/teal/rose/slate）→ 已经选过配色的账号不会丢设置，
 *   只是同一位置的色值与名称换成了淡雅版。
 */
:root[data-theme="classic"]{  /* 经典蓝：保留原来那套亮蓝，供习惯旧观感的门店切回 */
  --uw-brand:#2563eb; --uw-brand-d:#1d4ed8; --uw-brand-l:#eff6ff; --uw-brand-bd:#bfdbfe;
}
:root[data-theme="indigo"]{   /* 雾青：安静的灰绿 */
  --uw-brand:#4a7d76; --uw-brand-d:#3d6862; --uw-brand-l:#f1f7f5; --uw-brand-bd:#c9e2dd;
}
:root[data-theme="violet"]{   /* 藕荷：灰紫 */
  --uw-brand:#6b5f85; --uw-brand-d:#584d6f; --uw-brand-l:#f5f3f9; --uw-brand-bd:#d9d2e6;
}
:root[data-theme="teal"]{     /* 苔绿：沉静的低饱和绿 */
  --uw-brand:#5c7a4d; --uw-brand-d:#4b653e; --uw-brand-l:#f3f8ef; --uw-brand-bd:#d3e4c6;
}
:root[data-theme="rose"]{     /* 暖沙：带灰的暖褐，替代原来的艳红 */
  --uw-brand:#8a6a4f; --uw-brand-d:#725740; --uw-brand-l:#faf6f1; --uw-brand-bd:#ebdccb;
}
:root[data-theme="slate"]{    /* 岩灰：中性冷灰 */
  --uw-brand:#5f6a7a; --uw-brand-d:#4d5666; --uw-brand-l:#f4f6f8; --uw-brand-bd:#d8dfe8;
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  font-family:var(--uw-font);background:var(--uw-bg);color:var(--uw-ink);
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  line-height:1.55;
}
/* 数字统一等宽，金额/房号/统计列不会跳动 */
.occ,.stat .n,.dash-count,.tl-amt,.gt-occ b,td.num,.num,code,kbd{font-variant-numeric:tabular-nums}

/* ---------------------------------------------------------------- 焦点可达 */
:focus{outline:none}
:focus-visible{outline:2px solid var(--uw-brand);outline-offset:2px;border-radius:var(--uw-r-sm)}
.nav-group button:focus-visible,nav button:focus-visible{outline-offset:1px}
::selection{background:#c7d7fe;color:#0f172a}

/* 滚动条（桌面端） */
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:var(--uw-r-pill);border:2px solid transparent;background-clip:padding-box}
*::-webkit-scrollbar-thumb:hover{background:#94a3b8;background-clip:padding-box;border:2px solid transparent}
*::-webkit-scrollbar-track{background:transparent}

/* ---------------------------------------------------------------- 页头 */
header{
  background:linear-gradient(180deg,var(--uw-dark-2),var(--uw-dark-1));
  border-bottom:1px solid rgba(255,255,255,.06);
  box-shadow:0 1px 0 rgba(0,0,0,.2);
  position:sticky;top:0;z-index:40;
  min-height:56px;
}
header h1{font-size:var(--uw-fs-lg);font-weight:650;letter-spacing:.2px;display:flex;align-items:center;gap:8px;white-space:nowrap}
header h1,header .loginbox,header .loginbox>span,header .loginbox label{white-space:nowrap}
header button{white-space:nowrap}
header h1 small{font-weight:400;font-size:var(--uw-fs-sm);color:var(--uw-dark-mut);margin-left:2px}
header .uw-brand-mark{
  width:28px;height:28px;border-radius:9px;flex:0 0 auto;
  background:linear-gradient(135deg,#3b82f6,#1e40af);color:#fff;
  display:inline-flex;align-items:center;justify-content:center;
  font-weight:800;font-size:15px;box-shadow:0 2px 8px rgba(37,99,235,.45);
}
.loginbox{gap:8px}
.loginbox select,.loginbox input{
  border-radius:var(--uw-r-sm);border:1px solid var(--uw-dark-line);
  background:var(--uw-dark-3);color:var(--uw-dark-ink);transition:border-color .15s,background .15s;
}
.loginbox select:hover,.loginbox input:hover{border-color:#3b4a67}
.loginbox .who{color:#93c5fd;font-weight:600}
.who-dot{width:7px;height:7px;border-radius:50%;background:#4ade80;display:inline-block;margin-right:5px;box-shadow:0 0 0 3px rgba(74,222,128,.18)}

/* ---------------------------------------------------------------- 导航 */
nav, nav.nav-groups{
  /* ⚠️ 页头也是 sticky，导航必须贴在页头下方，否则滚动时两者重叠。
     --uw-head-h 由 uw-ui.js 实测页头高度写入，未启用 JS 时退回 56px。 */
  position:sticky;top:var(--uw-head-h,56px);z-index:30;
  background:rgba(255,255,255,.92);
  -webkit-backdrop-filter:saturate(180%) blur(10px);
  backdrop-filter:saturate(180%) blur(10px);
  border-bottom:1px solid var(--uw-line);
  padding:8px 18px;
  box-shadow:var(--uw-sh-1);
}
nav.nav-groups{gap:6px 14px;align-items:center;row-gap:6px}
/* 分组标题做成"可点开的胶囊"，非当前分组收起按钮，避免 33 个按钮铺满屏 */
/* 分组标题：做成"区域标题"而非按钮 —— 左侧一道竖条 + 无边框，避免与 33 个按钮混成一片 */
.nav-label{
  display:inline-flex;align-items:center;gap:5px;
  font-size:var(--uw-fs-xs);font-weight:800;color:#64748b;
  letter-spacing:.5px;
  background:transparent;border:none;border-left:2px solid #c7d2e4;
  border-radius:0;padding:3px 8px 3px 7px;white-space:nowrap;
  cursor:default;user-select:none;
}
.nav-label:after{content:'';display:none}
.nav-group{position:relative}

nav button, nav.nav-groups button{
  border:1px solid var(--uw-line);background:#fff;color:var(--uw-ink-2);
  padding:5px 10px;border-radius:var(--uw-r-pill);
  font-size:var(--uw-fs-sm);font-weight:500;line-height:1.25;cursor:pointer;
  transition:background .14s,border-color .14s,color .14s,box-shadow .14s,transform .06s;
}
nav.nav-groups{gap:5px 10px;row-gap:4px;padding:7px 16px;overflow-x:auto;overflow-y:hidden}
/* 分组作为整体参与换行：不压缩、组内不换行（否则窄屏会把每组压成一条竖柱） */
.nav-group{flex:0 0 auto;flex-wrap:nowrap}
.nav-group>button{flex:0 0 auto}
nav button:hover,nav.nav-groups button:hover{
  border-color:var(--uw-brand-bd);color:var(--uw-brand);background:var(--uw-brand-l);
}
nav button:active,nav.nav-groups button:active{transform:translateY(1px)}
nav button.active,nav.nav-groups button.active{
  background:var(--uw-brand);color:#fff;border-color:var(--uw-brand);
  box-shadow:0 2px 8px rgba(37,99,235,.30);font-weight:600;
}
nav button .badge,nav.nav-groups button .badge{
  background:var(--uw-bad);color:#fff;border-radius:var(--uw-r-pill);
  font-size:10px;font-weight:700;padding:1px 6px;margin-left:6px;line-height:1.4;
}
nav button.active .badge{background:rgba(255,255,255,.28)}
/* 只读/紧急提示用的红色小点 */
.nav-dot{width:7px;height:7px;border-radius:50%;background:var(--uw-bad);display:inline-block;margin-left:5px;vertical-align:1px}

/* 分组之间加一条极淡的分隔线，行内更好认 */
.nav-group + .nav-group{position:relative}
.nav-group + .nav-group:before{
  content:'';position:absolute;left:-8px;top:2px;bottom:2px;width:1px;
  background:linear-gradient(180deg,transparent,var(--uw-line),transparent);
}
@media (max-width:860px){ .nav-group + .nav-group:before{display:none} }

/* 导航右侧的搜索/命令入口 */
.uw-cmd-btn{
  display:inline-flex;align-items:center;gap:6px;margin-left:auto;
  background:#fff;border:1px solid var(--uw-line);border-radius:var(--uw-r-pill);
  color:var(--uw-muted);font-size:var(--uw-fs-sm);padding:6px 12px;cursor:pointer;
  transition:border-color .14s,color .14s,background .14s;
}
.uw-cmd-btn:hover{border-color:var(--uw-brand-bd);color:var(--uw-brand);background:var(--uw-brand-l)}
kbd{
  font-family:var(--uw-mono);font-size:10px;background:var(--uw-mut-l);color:var(--uw-mut-ink);
  border:1px solid var(--uw-mut-bd);border-bottom-width:2px;border-radius:5px;padding:1px 4px;
}

/* ⚠️ 深色页头里的幽灵按钮：主题默认 button.ghost 是白底，
   index/fd/hk/biz 的 header 是深色，页面里又写着 style="color:#fff" →
   白底 + 白字 = 按钮直接"隐形"（本次截图走查抓到）。这里统一回深色语境。

   2026-11-05 修正：原来写的是 `.loginmask .ghost`，把「深色语境的浅色文字」
   套到了**全部 39 个弹层**上；但业务弹层（订单详情/备份恢复/协议客户…）的卡片是**白底**，
   于是「关闭」「取消」变成浅灰字＋几乎透明底 → 用户看不见按钮（表现为"只能点右上角叉"）。
   改为只对深色全屏层 `.loginfull`（登录 / 选工作台）生效，白底业务弹层回归正常深色文字。 */
header .ghost, header button.ghost, .bar .ghost, .loginmask.loginfull .ghost{
  background:rgba(255,255,255,.08);color:#e2e8f0;border-color:rgba(255,255,255,.22);
}
header .ghost:hover, header button.ghost:hover, .bar .ghost:hover, .loginmask.loginfull .ghost:hover{
  background:rgba(255,255,255,.16);color:#fff;border-color:rgba(255,255,255,.36);
}
header .act, header button.act{box-shadow:none}
header select,header input{color:#e2e8f0}

/* ---------------------------------------------------------------- 主区域 */
main{padding:18px;max-width:1400px;margin:0 auto}

/* 页面标题条（由 index.html 的 JS 依据当前模块渲染） */
.uw-pagehead{
  display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap;
  margin:0 0 14px;
}
.uw-crumb{font-size:var(--uw-fs-sm);color:var(--uw-faint);margin-bottom:2px;display:flex;align-items:center;gap:6px}
.uw-crumb b{color:var(--uw-muted);font-weight:600}
.uw-pagehead h2{margin:0;font-size:20px;font-weight:700;letter-spacing:.2px;display:flex;align-items:center;gap:8px}
.uw-pagehead .uw-desc{font-size:var(--uw-fs-sm);color:var(--uw-muted);margin-top:3px;max-width:70ch}
.uw-pageacts{display:flex;gap:8px;align-items:center;flex-wrap:wrap}

/* ---------------------------------------------------------------- 卡片/面板 */
.panel,.card{
  background:var(--uw-panel);border:1px solid var(--uw-line);
  border-radius:var(--uw-r-lg);padding:16px;margin-bottom:var(--uw-gap);
  box-shadow:var(--uw-sh-1);
}
.panel:hover,.card:hover{box-shadow:var(--uw-sh-2)}
.stat{
  background:linear-gradient(180deg,#fff,#fcfdff);
  border:1px solid var(--uw-line);border-radius:var(--uw-r-lg);
  padding:14px 15px;box-shadow:var(--uw-sh-1);transition:box-shadow .15s,transform .1s;
}
.stat:hover{box-shadow:var(--uw-sh-2);transform:translateY(-1px)}
.stat .n{font-size:26px;font-weight:750;letter-spacing:-.4px;line-height:1.15}
.stat .l{font-size:var(--uw-fs-sm);color:var(--uw-muted);margin-top:5px}
.stat.alert{border-color:var(--uw-bad-bd);background:linear-gradient(180deg,#fff,#fff7f7)}
.stat.alert .n{color:var(--uw-bad)}
.grid.cards{grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:12px}
.seg{border-radius:var(--uw-r-lg)}
.sec-title{font-size:var(--uw-fs-lg);font-weight:700;margin:0 0 10px;letter-spacing:.2px}
.sec-head{margin-bottom:12px}
.sec-sub{margin:20px 0 9px}
.hint{font-size:var(--uw-fs-sm);color:var(--uw-muted);line-height:1.7}
hr{border:none;border-top:1px dashed var(--uw-line);margin:14px 0}

/* 筛选/表单行：控件底对齐，按钮不挤压（.row + align-items:flex-end 的常见形态） */
.row{align-items:flex-end;gap:10px 12px}
.row label{margin-bottom:4px}
.row>div>[label]{display:block}
.row button.act{flex:0 0 auto;white-space:nowrap}
.row .field{min-width:0}

/* ---------------------------------------------------------------- 表格 */
table{background:#fff;font-size:var(--uw-fs)}
th{
  background:#f7f9fc;color:var(--uw-muted);font-size:var(--uw-fs-sm);
  font-weight:700;letter-spacing:.2px;
  border-bottom:1px solid var(--uw-line);padding:9px 11px;white-space:nowrap;
}
td{padding:9px 11px;border-bottom:1px solid var(--uw-line-2);vertical-align:middle}
tbody tr{transition:background .12s}
tbody tr:nth-child(even){background:#fcfdff}
tbody tr:hover{background:#f3f7ff}
tbody tr:last-child td{border-bottom:none}
/* 表格外层圆角容器（common.js 会包 .table-scroll） */
.table-scroll{border:1px solid var(--uw-line);border-radius:var(--uw-r-lg);overflow:auto;background:#fff}
.table-scroll>table{border-radius:var(--uw-r-lg)}
.table-scroll>table>thead>tr>th:first-child{border-top-left-radius:var(--uw-r-lg)}
.table-scroll>table>thead>tr>th:last-child{border-top-right-radius:var(--uw-r-lg)}
td .occ,td .muted{color:var(--uw-muted)}

/* ---------------------------------------------------------------- 按钮 */
button{font-family:inherit}
button.act{
  background:var(--uw-brand);color:#fff;border:1px solid var(--uw-brand);
  border-radius:var(--uw-r);padding:9px 16px;font-size:var(--uw-fs-md);font-weight:600;cursor:pointer;
  box-shadow:0 1px 2px rgba(37,99,235,.25);
  transition:background .14s,box-shadow .14s,transform .06s;
}
button.act:hover{background:var(--uw-brand-d);border-color:var(--uw-brand-d);box-shadow:0 3px 10px rgba(37,99,235,.30)}
button.act:active{transform:translateY(1px)}
button.ghost{
  background:#fff;border:1px solid var(--uw-line);border-radius:var(--uw-r);
  padding:9px 14px;font-size:var(--uw-fs-md);color:var(--uw-ink-2);cursor:pointer;
  transition:background .14s,border-color .14s,color .14s;
}
button.ghost:hover{background:var(--uw-mut-l);border-color:var(--uw-mut-bd);color:var(--uw-ink)}
button.ghost.active{background:var(--uw-brand);color:#fff;border-color:var(--uw-brand)}
button.mini{
  border-radius:var(--uw-r-sm);padding:5px 10px;font-size:var(--uw-fs-sm);font-weight:600;
  border:1px solid var(--uw-line);background:#fff;color:var(--uw-ink-2);cursor:pointer;
  transition:background .13s,border-color .13s,color .13s;
}
button.mini:hover{background:var(--uw-brand-l);border-color:var(--uw-brand-bd);color:var(--uw-brand)}
button.mini.ok{background:var(--uw-ok-l);color:var(--uw-ok);border-color:var(--uw-ok-bd)}
button.mini.ok:hover{background:#c7f0d4;color:#14532d}
button.mini.warn{background:var(--uw-warn-l);color:var(--uw-warn);border-color:var(--uw-warn-bd)}
button.mini.bad{background:var(--uw-bad-l);color:var(--uw-bad);border-color:var(--uw-bad-bd)}
button.mini.bad:hover{background:#fbd5d5;color:#7f1d1d}
button.small{padding:6px 11px;font-size:var(--uw-fs-sm);border-radius:var(--uw-r-sm)}
button:disabled,button[disabled]{opacity:.5;cursor:not-allowed;box-shadow:none!important;transform:none!important}
button.act:disabled{background:#93a8bd;border-color:#93a8bd}
a{color:var(--uw-brand);text-decoration:none}
a:hover{text-decoration:underline}

/* ---------------------------------------------------------------- 表单 */
label{font-size:var(--uw-fs-sm);color:var(--uw-muted);font-weight:500}
input,select,textarea{
  border:1px solid var(--uw-line);border-radius:var(--uw-r);padding:8px 11px;
  font-size:var(--uw-fs-md);font-family:inherit;color:var(--uw-ink);background:#fff;
  transition:border-color .14s,box-shadow .14s;
}
input:hover,select:hover,textarea:hover{border-color:#cfd8e6}
input:focus,select:focus,textarea:focus{
  border-color:var(--uw-brand);box-shadow:0 0 0 3px rgba(37,99,235,.13);outline:none;
}
input::placeholder,textarea::placeholder{color:#a8b3c4}
input[type=checkbox],input[type=radio]{width:16px;height:16px;accent-color:var(--uw-brand)}
input[type=date],input[type=datetime-local],input[type=number]{font-variant-numeric:tabular-nums}
.field{gap:5px}

/* ---------------------------------------------------------------- 徽标 */
.pill{
  border-radius:var(--uw-r-pill);padding:3px 10px;font-size:var(--uw-fs-sm);font-weight:600;
  border:1px solid transparent;display:inline-flex;align-items:center;gap:4px;line-height:1.5;
}
.s-ok{background:var(--uw-ok-l);color:var(--uw-ok);border-color:var(--uw-ok-bd)}
.s-warn{background:var(--uw-warn-l);color:var(--uw-warn);border-color:var(--uw-warn-bd)}
.s-bad{background:var(--uw-bad-l);color:var(--uw-bad);border-color:var(--uw-bad-bd)}
.s-info{background:var(--uw-info-l);color:var(--uw-info);border-color:var(--uw-info-bd)}
.s-mut{background:var(--uw-mut-l);color:var(--uw-mut-ink);border-color:var(--uw-mut-bd)}
.mchip,.tl-stage{border-radius:var(--uw-r-sm)}
code{font-family:var(--uw-mono);font-size:.92em;background:var(--uw-mut-l);padding:1px 6px;border-radius:6px;color:#334155}

/* ---------------------------------------------------------------- 空 / 载入 */
.empty{
  background:linear-gradient(180deg,#fcfdff,#f8fafd);
  border:1px dashed var(--uw-line);border-radius:var(--uw-r-lg);
  color:var(--uw-muted);padding:30px 14px;gap:8px;font-size:var(--uw-fs);
}
.empty .ico{font-size:26px;opacity:.42}
.loading{font-size:var(--uw-fs)}
.spinner{border-width:2px;width:15px;height:15px}
.skeleton{background:linear-gradient(90deg,#eef2f7 25%,#f7f9fc 37%,#eef2f7 63%);background-size:400% 100%;animation:uw-shimmer 1.2s ease-in-out infinite;border-radius:var(--uw-r-sm)}
@keyframes uw-shimmer{0%{background-position:100% 0}100%{background-position:0 0}}

/* ---------------------------------------------------------------- 弹层 */
.loginmask{
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
  background:rgba(11,18,32,.62)!important;
  padding:20px;overflow:auto;
  animation:uw-fade .16s ease-out;
}
.loginmask>div{
  border-radius:var(--uw-r-xl)!important;
  box-shadow:var(--uw-sh-3)!important;
  animation:uw-pop .18s cubic-bezier(.16,.84,.44,1);
}
.loginmask .box{border-radius:var(--uw-r-xl);box-shadow:var(--uw-sh-3);background:var(--uw-dark-2)}
.loginmask h2{letter-spacing:.3px}
@keyframes uw-fade{from{opacity:0}to{opacity:1}}
@keyframes uw-pop{from{opacity:0;transform:translateY(8px) scale(.985)}to{opacity:1;transform:none}}

/* ---------------------------------------------------------------- 提示 */
.toast{
  border-radius:var(--uw-r-lg);box-shadow:var(--uw-sh-3);
  padding:11px 16px;font-size:var(--uw-fs);font-weight:500;
  background:linear-gradient(180deg,#16233a,#0e1729);
  border:1px solid rgba(255,255,255,.08);
  animation:uw-slide .2s cubic-bezier(.16,.84,.44,1);
  display:flex;align-items:center;gap:8px;
}
.toast.err{background:linear-gradient(180deg,#7f1d1d,#5f1414);border-color:rgba(255,255,255,.12)}
@keyframes uw-slide{from{opacity:0;transform:translateX(14px)}to{opacity:1;transform:none}}
.uw-toast-ico{font-size:15px;line-height:1}
.toast:before{font-size:14px;line-height:1;flex:0 0 auto}
.toast:not(.err):before{content:'✓';color:#86efac}
.toast.err:before{content:'⚠';color:#fca5a5}

/* 回到顶部 */
.uw-top{
  position:fixed;right:20px;bottom:22px;z-index:60;
  width:40px;height:40px;border-radius:50%;
  background:#fff;border:1px solid var(--uw-line);color:var(--uw-ink-2);
  box-shadow:var(--uw-sh-2);cursor:pointer;font-size:15px;
  display:none;align-items:center;justify-content:center;
  transition:background .15s,transform .1s,box-shadow .15s;
}
.uw-top.show{display:inline-flex}
.uw-top:hover{background:var(--uw-brand-l);color:var(--uw-brand);border-color:var(--uw-brand-bd);box-shadow:var(--uw-sh-3)}
.uw-top:active{transform:translateY(1px)}

/* ---------------------------------------------------------------- 命令面板 */
.uw-cmd-mask{position:fixed;inset:0;z-index:80;background:rgba(11,18,32,.5);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:flex;justify-content:center;padding-top:12vh}
.uw-cmd{
  width:620px;max-width:92vw;max-height:64vh;background:#fff;border-radius:var(--uw-r-xl);
  box-shadow:var(--uw-sh-3);display:flex;flex-direction:column;overflow:hidden;
  animation:uw-pop .18s cubic-bezier(.16,.84,.44,1);
}
.uw-cmd input{border:none;border-bottom:1px solid var(--uw-line);border-radius:0;font-size:15px;padding:15px 18px;box-shadow:none}
.uw-cmd input:focus{box-shadow:none;border-bottom-color:var(--uw-brand)}
.uw-cmd-list{overflow:auto;padding:6px}
.uw-cmd-group{font-size:var(--uw-fs-xs);color:var(--uw-faint);font-weight:700;padding:9px 12px 4px}
.uw-cmd-item{
  display:flex;align-items:center;gap:9px;padding:9px 12px;border-radius:var(--uw-r);
  cursor:pointer;font-size:var(--uw-fs-md);color:var(--uw-ink-2);
}
.uw-cmd-item:hover,.uw-cmd-item.sel{background:var(--uw-brand-l);color:var(--uw-brand)}
.uw-cmd-item .k{margin-left:auto;font-size:var(--uw-fs-xs);color:var(--uw-faint)}
.uw-cmd-empty{padding:26px;text-align:center;color:var(--uw-muted);font-size:var(--uw-fs)}
.uw-cmd-foot{border-top:1px solid var(--uw-line);padding:8px 14px;font-size:var(--uw-fs-xs);color:var(--uw-faint);display:flex;gap:14px;background:#fafbfe}

/* ---------------------------------------------------------------- 其它细节 */
.rem{border-radius:0 var(--uw-r-lg) var(--uw-r-lg) 0;box-shadow:var(--uw-sh-1)}
.tl{border-left-color:var(--uw-line)}
.journey-pick{border-radius:var(--uw-r-lg);transition:border-color .15s,box-shadow .15s,background .15s}
.journey-pick:hover{box-shadow:var(--uw-sh-2)}
.gt-wrap{border-radius:var(--uw-r-lg);box-shadow:var(--uw-sh-1)}
.gt-bar{border-radius:6px;font-weight:500}
.dash-card{border-radius:var(--uw-r-lg)}
.dash-item{padding:9px 0}
.tag-issue{border-radius:var(--uw-r);box-shadow:var(--uw-sh-1)}
.gapbox{border-radius:var(--uw-r)}
.lvbar{border-radius:var(--uw-r-pill)}
.lvbar>i{background:linear-gradient(90deg,var(--uw-brand),#60a5fa)}

/* 页脚 */

/* ---------------------------------------------------------------- 响应式 */
@media (max-width:1024px){
  main{max-width:100%}
  .grid.cards{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
}
@media (max-width:860px){
  header{padding:10px 14px;gap:10px}
  nav,nav.nav-groups{padding:8px 12px}
  main{padding:12px}
  .uw-pagehead h2{font-size:17px}
  .uw-cmd-btn{display:none}          /* 移动端用导航横滑即可，不必塞命令入口 */
  .uw-pageacts kbd{display:none}     /* 触屏没有键盘，别显示 Ctrl+K 提示 */
  .uw-pageacts button{font-size:var(--uw-fs-sm);padding:7px 12px}
  /* 移动端导航：单行横向滚动，配合 common.css 的 nowrap */
  nav.nav-groups > .nav-group{flex:0 0 auto;flex-wrap:nowrap}
  nav.nav-groups > .nav-group > button{flex:0 0 auto;white-space:nowrap}
  /* 数据表在手机上给一点"可横滑"的暗示 */
  .table-scroll{background:
    linear-gradient(90deg,rgba(37,99,235,.05),rgba(37,99,235,0) 24px) left/24px 100% no-repeat,
    #fff}
  .uw-top{right:12px;bottom:16px}
  /* 手机端提示条贴底，避免遮挡页头操作 */
  .toast{top:auto;bottom:14px;left:12px;right:12px;max-width:none}
}
@media (max-width:480px){
  .stat .n{font-size:22px}
  .panel,.card{padding:13px}
  .uw-pagehead{align-items:flex-start}
}

/* 尊重"减少动态效果" */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
}

/* 打印：去掉导航与阴影，只留内容 */
@media print{
  header,nav,.uw-cmd-btn,.uw-top,.toast{display:none!important}
  main{max-width:100%;padding:0}
  .panel,.card,.stat{box-shadow:none;border-color:#d0d5dd}
}

/* ============================================================
   常用功能条（2026-10-22 新增）
   登录后置顶的个人快捷入口：可编辑、按账号记忆、纯前端偏好。
   只新增规则，不覆盖任何既有类名。
   ============================================================ */
.quickbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 12px;margin:0 0 12px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;position:sticky;top:0;z-index:20;box-shadow:0 2px 8px rgba(15,23,42,.05)}
.quickbar .qb-label{font-size:12px;font-weight:700;color:#64748b;white-space:nowrap}
.quickbar .qb-chip{border:1px solid #e2e8f0;background:#f8fafc;color:#1f2937;border-radius:20px;padding:5px 12px;font-size:13px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:all .15s}
.quickbar .qb-chip:hover{border-color:#93c5fd;background:#eff6ff}
.quickbar .qb-chip.active{background:var(--uw-brand);border-color:var(--uw-brand);color:#fff}
.quickbar .qb-empty{font-size:12px;color:#94a3b8}
.quickbar .qb-edit{margin-left:auto;border:1px dashed #cbd5e1;background:#fff;color:#475569;border-radius:20px;padding:5px 12px;font-size:12px;cursor:pointer;white-space:nowrap}
.quickbar .qb-edit:hover{border-color:var(--uw-brand);color:var(--uw-brand)}
.qb-opt{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #e2e8f0;border-radius:10px;cursor:pointer;font-size:13px;background:#fff}
.qb-opt.on{border-color:var(--uw-brand);background:#eff6ff;color:var(--uw-brand-d);font-weight:600}
.qb-opt input{accent-color:var(--uw-brand)}

/* ============================================================
   经营看板图表（2026-10-22 新增）：出租率趋势柱 + 客源结构条
   纯 CSS 渲染，不引第三方图表库（离线可用）。
   ============================================================ */
.qbars{display:flex;align-items:flex-end;gap:6px;height:180px;margin-top:12px;padding:0 2px;overflow-x:auto}
.qbar-col{flex:1;min-width:26px;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%}
.qbar{width:70%;max-width:22px;background:linear-gradient(180deg,#60a5fa,var(--uw-brand));border-radius:4px 4px 0 0;min-height:3px;transition:height .3s}
.qbar-v{font-size:10px;color:#475569;font-weight:600;margin-bottom:2px;white-space:nowrap}
.qbar-lb{font-size:10px;color:#94a3b8;margin-top:4px;white-space:nowrap}
.qch-row{display:flex;align-items:center;gap:10px;margin:8px 0;font-size:13px}
.qch-name{width:88px;flex:none;color:#334155;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qch-track{flex:1;height:10px;background:#f1f5f9;border-radius:6px;overflow:hidden}
.qch-track i{display:block;height:100%;background:linear-gradient(90deg,#34d399,#059669);border-radius:6px}
.qch-val{width:100px;flex:none;text-align:right;color:#475569}
