/* ============================================================
   PULSE DESIGN SYSTEM — 共享样式表
   用于「栖屋·房东管理台」全部页面：landlord-dashboard / bills / property-detail
   令牌(OKLCH) + 基础组件 + 页面级组件(账单/时间线/批量栏等)
   ============================================================ */
:root {
  /* ---- 字体与排版 ---- */
  --font-sans: "Instrument Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  --fs-2xs: 0.6875rem; --fs-xs: 0.75rem; --fs-sm: 0.875rem; --fs-base: 1rem;
  --fs-md: 1.125rem; --fs-lg: 1.375rem; --fs-xl: 1.75rem; --fs-2xl: 2.25rem;
  --lh-tight: 1.15; --lh-snug: 1.3; --lh-base: 1.55;
  --tracking-tight: -0.02em; --tracking-wide: 0.06em;

  /* ---- 间距 / 圆角 / 动效 ---- */
  --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem;
  --space-5: 1.5rem; --space-6: 2rem; --space-7: 3rem; --space-8: 4rem;
  --r-xs: 6px; --r-sm: 9px; --r-md: 13px; --r-lg: 18px; --r-full: 999px;
  --ease: cubic-bezier(0.16, 1, 0.3, 1);
  --t-fast: 140ms var(--ease); --t-base: 240ms var(--ease); --t-slow: 420ms var(--ease);
  --sidebar-w: 252px; --sidebar-w-collapsed: 72px; --topbar-h: 64px; --content-max: 1480px;

  /* ---- 亮色主题（唯一主题，暗色模式已移除）---- */
  --bg:           oklch(98.5% 0.003 260);
  --surface-1:    oklch(100% 0 0);
  --surface-2:    oklch(98.5% 0.003 260);
  --surface-3:    oklch(96% 0.004 260);
  --border:       oklch(92% 0.005 260);
  --border-strong:oklch(85% 0.006 260);
  --text-1:       oklch(25% 0.02 260);
  --text-2:       oklch(44% 0.02 260);
  --text-3:       oklch(58% 0.02 260);

  /* 强调色：降低饱和度，更柔和清爽（白字对比度仍满足 WCAG AA）*/
  --accent:       oklch(53% 0.13 255);
  --accent-hover: oklch(48% 0.14 255);
  --accent-press: oklch(43% 0.15 255);
  --accent-soft:  oklch(96% 0.04 255);
  --accent-line:  oklch(60% 0.10 255);
  --on-accent:    oklch(99% 0.01 260);

  --success:      oklch(54% 0.12 158);
  --success-soft: oklch(96% 0.04 158);
  --warning:      oklch(64% 0.12 80);
  --warning-soft: oklch(97% 0.04 80);
  --danger:       oklch(56% 0.16 25);
  --danger-soft:  oklch(96% 0.04 25);
  --info:         oklch(54% 0.11 230);
  --info-soft:    oklch(96% 0.04 230);

  --shadow-sm:    0 1px 2px oklch(0% 0 0 / 0.05);
  --shadow-md:    0 10px 30px oklch(0% 0 0 / 0.08);
  --grid-line:    oklch(92% 0.005 260 / 0.9);
}
/* ---- Reset ---- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; }
body {
  font-family: var(--font-sans); font-size: var(--fs-sm); line-height: var(--lh-base);
  color: var(--text-1); background: var(--bg);
  font-variant-numeric: tabular-nums; -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility; transition: background var(--t-base), color var(--t-base);
}
button { font: inherit; color: inherit; cursor: pointer; border: none; background: none; }
a { color: inherit; text-decoration: none; }
svg { display: block; }
input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--accent); cursor: pointer; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-xs); }
::selection { background: var(--accent-soft); color: var(--text-1); }

/* ---- App shell ---- */
.app { display: grid; grid-template-columns: var(--sidebar-w) 1fr; min-height: 100vh; transition: grid-template-columns var(--t-base); }
.app.is-collapsed { grid-template-columns: var(--sidebar-w-collapsed) 1fr; }

.sidebar { background: var(--surface-1); border-right: 1px solid var(--border); display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; overflow: hidden; }
.brand { display: flex; align-items: center; gap: var(--space-3); height: var(--topbar-h); padding: 0 var(--space-5); flex-shrink: 0; border-bottom: 1px solid var(--border); }
.brand-mark { width: 34px; height: 34px; border-radius: var(--r-sm); background: linear-gradient(150deg, var(--accent), var(--accent-press)); display: grid; place-items: center; color: var(--on-accent); flex-shrink: 0; box-shadow: 0 4px 14px var(--accent-soft); }
.brand-name { font-weight: 700; font-size: var(--fs-md); letter-spacing: var(--tracking-tight); white-space: nowrap; }
.brand-sub { font-size: var(--fs-2xs); color: var(--text-3); letter-spacing: var(--tracking-wide); text-transform: uppercase; }
.nav { flex: 1; overflow-y: auto; padding: var(--space-4) var(--space-3); display: flex; flex-direction: column; gap: var(--space-1); }
.nav-label { font-size: var(--fs-2xs); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--text-3); padding: var(--space-4) var(--space-3) var(--space-2); white-space: nowrap; }
.nav-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); border-radius: var(--r-sm); color: var(--text-2); font-weight: 500; white-space: nowrap; position: relative; transition: background var(--t-fast), color var(--t-fast); }
.nav-item svg { width: 19px; height: 19px; flex-shrink: 0; }
.nav-item:hover { background: var(--surface-2); color: var(--text-1); }
.nav-item.is-active { background: var(--accent-soft); color: var(--text-1); }
.nav-item.is-active::before { content: ""; position: absolute; left: -1px; top: 50%; transform: translateY(-50%); width: 3px; height: 20px; border-radius: var(--r-full); background: var(--accent); }
.nav-item .badge-count { margin-left: auto; font-size: var(--fs-2xs); background: var(--surface-3); color: var(--text-2); padding: 1px 7px; border-radius: var(--r-full); }
.nav-item .badge-count.danger { background: var(--danger-soft); color: var(--danger); }
.is-collapsed .nav-item span, .is-collapsed .nav-label, .is-collapsed .brand-text, .is-collapsed .upgrade-card > *:not(.upgrade-icon), .is-collapsed .user-meta { display: none; }
.is-collapsed .nav-item { justify-content: center; } .is-collapsed .brand { justify-content: center; padding: 0; } .is-collapsed .upgrade-card { display: grid; place-items: center; padding: var(--space-3); }
.upgrade-card { margin: var(--space-3); padding: var(--space-4); border-radius: var(--r-md); background: var(--surface-2); border: 1px solid var(--border); display: flex; gap: var(--space-3); align-items: flex-start; }
.upgrade-icon { width: 32px; height: 32px; flex-shrink: 0; border-radius: var(--r-sm); background: var(--accent-soft); color: var(--accent); display: grid; place-items: center; }
.upgrade-card h4 { font-size: var(--fs-sm); font-weight: 600; }
.upgrade-card p { font-size: var(--fs-xs); color: var(--text-3); margin: var(--space-1) 0 var(--space-3); }
.upgrade-card .link { font-size: var(--fs-xs); font-weight: 600; color: var(--accent); display: inline-flex; align-items: center; gap: 4px; }
.user { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-top: 1px solid var(--border); flex-shrink: 0; }
.avatar { width: 36px; height: 36px; border-radius: var(--r-full); background: linear-gradient(140deg, var(--accent), var(--info)); display: grid; place-items: center; color: var(--on-accent); font-weight: 700; font-size: var(--fs-sm); flex-shrink: 0; }
.user-meta { line-height: 1.2; min-width: 0; }
.user-meta .name { font-weight: 600; font-size: var(--fs-sm); white-space: nowrap; }
.user-meta .role { font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; }

.main { display: flex; flex-direction: column; min-width: 0; }
.topbar { height: var(--topbar-h); display: flex; align-items: center; gap: var(--space-4); padding: 0 var(--space-6); border-bottom: 1px solid var(--border); background: color-mix(in oklch, var(--bg) 82%, transparent); backdrop-filter: blur(12px); position: sticky; top: 0; z-index: 20; }
.crumbs { display: flex; align-items: center; gap: var(--space-2); font-size: var(--fs-sm); color: var(--text-3); white-space: nowrap; }
.crumbs strong { color: var(--text-1); font-weight: 600; }
.crumbs a:hover { color: var(--text-1); }
.crumbs .sep { opacity: 0.5; }
.search { margin-left: var(--space-4); flex: 1; max-width: 420px; display: flex; align-items: center; gap: var(--space-2); background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-sm); padding: var(--space-2) var(--space-3); color: var(--text-3); transition: border-color var(--t-fast), background var(--t-fast); }
.search:focus-within { border-color: var(--accent-line); background: var(--surface-2); }
.search svg { width: 17px; height: 17px; flex-shrink: 0; }
.search input { border: none; background: none; outline: none; color: var(--text-1); font: inherit; width: 100%; }
.search input::placeholder { color: var(--text-3); }
.kbd { margin-left: auto; font-size: var(--fs-2xs); border: 1px solid var(--border); border-radius: var(--r-xs); padding: 2px 6px; color: var(--text-3); }
.top-actions { display: flex; align-items: center; gap: var(--space-2); margin-left: auto; }
.icon-btn { width: 38px; height: 38px; border-radius: var(--r-sm); display: grid; place-items: center; color: var(--text-2); border: 1px solid transparent; transition: background var(--t-fast), color var(--t-fast); position: relative; }
.icon-btn:hover { background: var(--surface-2); color: var(--text-1); }
.icon-btn .dot { position: absolute; top: 9px; right: 10px; width: 7px; height: 7px; border-radius: var(--r-full); background: var(--danger); border: 2px solid var(--bg); }

/* ---- Buttons ---- */
.btn { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-radius: var(--r-sm); font-weight: 600; font-size: var(--fs-sm); transition: background var(--t-fast), transform var(--t-fast), border-color var(--t-fast), opacity var(--t-fast); white-space: nowrap; }
.btn svg { width: 17px; height: 17px; }
.btn-primary { background: var(--accent); color: var(--on-accent); }
.btn-primary:hover:not(:disabled) { background: var(--accent-hover); transform: translateY(-1px); }
.btn-primary:active:not(:disabled) { background: var(--accent-press); transform: translateY(0); }
.btn-ghost { color: var(--text-2); border: 1px solid var(--border); background: var(--surface-1); }
.btn-ghost:hover { background: var(--surface-2); color: var(--text-1); border-color: var(--border-strong); }
.btn-danger { background: var(--danger); color: var(--on-accent); }
.btn-danger:hover { filter: brightness(1.08); }
.btn:disabled { opacity: 0.45; cursor: not-allowed; }
.btn-sm { padding: var(--space-2) var(--space-3); font-size: var(--fs-xs); }

/* ---- Content ---- */
.content { padding: var(--space-6); max-width: var(--content-max); width: 100%; margin: 0 auto; }
.page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-4); margin-bottom: var(--space-6); flex-wrap: wrap; }
.page-head h1 { font-size: var(--fs-xl); font-weight: 700; letter-spacing: var(--tracking-tight); }
.page-head .sub { color: var(--text-3); font-size: var(--fs-sm); margin-top: var(--space-1); }
.head-actions { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.seg { display: inline-flex; background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-sm); padding: 3px; }
.seg button { padding: var(--space-2) var(--space-3); border-radius: var(--r-xs); font-size: var(--fs-xs); font-weight: 600; color: var(--text-3); transition: background var(--t-fast), color var(--t-fast); display: inline-flex; align-items: center; gap: 6px; }
.seg button.is-on { background: var(--surface-3); color: var(--text-1); }
.seg button .cnt { font-size: var(--fs-2xs); background: var(--surface-2); color: var(--text-2); padding: 0 6px; border-radius: var(--r-full); }
.seg button.is-on .cnt { background: var(--accent); color: var(--on-accent); }

/* ---- KPI / stat cards ---- */
.kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-4); margin-bottom: var(--space-5); }
.kpi { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--space-5); position: relative; overflow: hidden; transition: border-color var(--t-base), transform var(--t-base), background var(--t-base); }
.kpi:hover { border-color: var(--border-strong); transform: translateY(-2px); background: var(--surface-2); }
.kpi .label { font-size: var(--fs-xs); color: var(--text-3); display: flex; align-items: center; gap: var(--space-2); }
.kpi .ico { width: 30px; height: 30px; border-radius: var(--r-xs); background: var(--surface-3); color: var(--accent); display: grid; place-items: center; }
.kpi .val { font-size: var(--fs-2xl); font-weight: 700; letter-spacing: var(--tracking-tight); margin: var(--space-3) 0 var(--space-2); line-height: 1; }
.kpi .val small { font-size: var(--fs-md); font-weight: 600; color: var(--text-3); }
.kpi .foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); }
.delta { display: inline-flex; align-items: center; gap: 3px; font-size: var(--fs-xs); font-weight: 600; }
.delta.up { color: var(--success); } .delta.down { color: var(--danger); }
.delta svg { width: 13px; height: 13px; }
.spark { width: 96px; height: 34px; }

/* slim stat (账单页汇总) */
.stats { display: grid; grid-template-columns: repeat(4,1fr); gap: var(--space-4); margin-bottom: var(--space-5); }
.stat { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--space-4) var(--space-5); }
.stat .lab { font-size: var(--fs-xs); color: var(--text-3); }
.stat .num { font-size: var(--fs-xl); font-weight: 700; letter-spacing: var(--tracking-tight); margin-top: var(--space-2); }
.stat .num.accent { color: var(--accent); }
.stat .num.danger { color: var(--danger); }
.stat .num.success { color: var(--success); }
.stat .hint { font-size: var(--fs-xs); color: var(--text-3); margin-top: 2px; }

/* ---- Panels ---- */
.grid-2 { display: grid; grid-template-columns: 2fr 1fr; gap: var(--space-4); margin-bottom: var(--space-5); }
.grid-2b { display: grid; grid-template-columns: 1fr 1.25fr; gap: var(--space-4); margin-bottom: var(--space-5); }
.grid-3-7 { display: grid; grid-template-columns: 1fr 320px; gap: var(--space-4); align-items: start; }
.panel { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--space-5); min-width: 0; }
.panel-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-5); }
.panel-head h3 { font-size: var(--fs-md); font-weight: 600; }
.panel-head .sub { font-size: var(--fs-xs); color: var(--text-3); margin-top: 2px; }
.legend { display: flex; gap: var(--space-4); font-size: var(--fs-xs); color: var(--text-2); }
.legend i { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 5px; vertical-align: middle; }
.chart-area { width: 100%; height: auto; }
.bars { display: flex; align-items: flex-end; gap: var(--space-3); height: 180px; padding-top: var(--space-2); }
.bar-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: var(--space-2); height: 100%; justify-content: flex-end; }
.bar-track { width: 100%; max-width: 38px; flex: 1; display: flex; align-items: flex-end; }
.bar-fill { width: 100%; border-radius: var(--r-xs) var(--r-xs) 2px 2px; background: linear-gradient(var(--accent), var(--accent-press)); height: var(--h); transition: filter var(--t-fast); }
.bar-col:hover .bar-fill { filter: brightness(1.15); }
.bar-val { font-size: var(--fs-2xs); color: var(--text-3); font-weight: 600; }
.bar-lab { font-size: var(--fs-xs); color: var(--text-2); }
.donut-wrap { display: flex; align-items: center; gap: var(--space-5); flex-wrap: wrap; }
.donut { position: relative; width: 150px; height: 150px; flex-shrink: 0; }
.donut .center { position: absolute; inset: 0; display: grid; place-content: center; text-align: center; }
.donut .center .big { font-size: var(--fs-lg); font-weight: 700; letter-spacing: var(--tracking-tight); }
.donut .center .small { font-size: var(--fs-xs); color: var(--text-3); }
.donut-legend { flex: 1; min-width: 150px; display: flex; flex-direction: column; gap: var(--space-3); }
.donut-legend li { display: flex; align-items: center; gap: var(--space-2); font-size: var(--fs-sm); list-style: none; }
.donut-legend .sw { width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; }
.donut-legend .nm { color: var(--text-2); }
.donut-legend .pc { margin-left: auto; font-weight: 600; }

/* ---- Table ---- */
.table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
.table th { text-align: left; font-size: var(--fs-2xs); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--text-3); font-weight: 600; padding: 0 var(--space-3) var(--space-3); }
.table td { padding: var(--space-3); border-top: 1px solid var(--border); color: var(--text-1); }
.table tbody tr { transition: background var(--t-fast); }
.table tbody tr:hover { background: var(--surface-2); }
.table tr.is-selected { background: var(--accent-soft); }
.table .muted { color: var(--text-3); }
.table .amt { font-weight: 600; }
.cell-user { display: flex; align-items: center; gap: var(--space-3); }
.cell-user .av { width: 30px; height: 30px; border-radius: var(--r-full); background: var(--surface-3); color: var(--text-1); display: grid; place-items: center; font-weight: 600; font-size: var(--fs-xs); flex-shrink: 0; }
.row-act { color: var(--text-3); font-size: var(--fs-xs); font-weight: 600; display: inline-flex; align-items: center; gap: 4px; }
.row-act:hover { color: var(--accent); }

/* ---- Status tag ---- */
.tag { display: inline-flex; align-items: center; gap: 5px; font-size: var(--fs-xs); font-weight: 600; padding: 3px 9px; border-radius: var(--r-full); }
.tag::before { content: ""; width: 6px; height: 6px; border-radius: var(--r-full); background: currentColor; }
.tag.ok { color: var(--success); background: var(--success-soft); }
.tag.warn { color: var(--warning); background: var(--warning-soft); }
.tag.bad { color: var(--danger); background: var(--danger-soft); }
.tag.info { color: var(--info); background: var(--info-soft); }
.tag.neutral { color: var(--text-2); background: var(--surface-3); }

/* ---- Live pulse ---- */
.pulse { display: inline-flex; align-items: center; gap: var(--space-2); font-size: var(--fs-xs); color: var(--text-2); }
.pulse .ring { width: 8px; height: 8px; border-radius: var(--r-full); background: var(--success); position: relative; }
.pulse .ring::after { content: ""; position: absolute; inset: 0; border-radius: inherit; background: var(--success); animation: ping 1.8s var(--ease) infinite; }
@keyframes ping { 0% { transform: scale(1); opacity: 0.7; } 80%,100% { transform: scale(2.6); opacity: 0; } }

/* ============================================================
   账单页组件
   ============================================================ */
/* 批量操作浮栏 */
.batchbar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
  display: flex; align-items: center; gap: var(--space-4);
  padding: var(--space-4) var(--space-6);
  background: color-mix(in oklch, var(--surface-2) 92%, transparent);
  backdrop-filter: blur(14px);
  border-top: 1px solid var(--border-strong);
  transform: translateY(120%); transition: transform var(--t-base);
  box-shadow: 0 -10px 30px oklch(0% 0 0 / 0.25);
}
.batchbar.is-show { transform: translateY(0); }
.batchbar .sel-info { font-size: var(--fs-sm); color: var(--text-2); }
.batchbar .sel-info b { color: var(--text-1); }
.batchbar .spacer { flex: 1; }
.batchbar .total { font-size: var(--fs-sm); color: var(--text-3); }
.batchbar .total b { color: var(--text-1); font-size: var(--fs-md); }

/* 行内操作按钮（表格内） */
.link-btn { color: var(--accent); font-size: var(--fs-xs); font-weight: 600; }
.link-btn:hover { text-decoration: underline; }

/* ============================================================
   房源详情页组件
   ============================================================ */
/* 房源头部 */
.prop-head {
  display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-4);
  flex-wrap: wrap; margin-bottom: var(--space-5);
}
.prop-head .ttl { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.prop-head h1 { font-size: var(--fs-xl); font-weight: 700; letter-spacing: var(--tracking-tight); }
.prop-head .addr { color: var(--text-3); font-size: var(--fs-sm); display: flex; align-items: center; gap: 6px; margin-top: 4px; }

/* 信息网格 */
.info-grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 1px; background: var(--border); border-radius: var(--r-md); overflow: hidden; border: 1px solid var(--border); }
.info-item { background: var(--surface-1); padding: var(--space-4) var(--space-5); }
.info-item .k { font-size: var(--fs-xs); color: var(--text-3); }
.info-item .v { font-size: var(--fs-md); font-weight: 600; margin-top: 4px; }
.info-item .v small { font-size: var(--fs-xs); color: var(--text-3); font-weight: 500; }

/* 租约时间线 */
.timeline { position: relative; padding-left: 26px; }
.timeline::before { content: ""; position: absolute; left: 7px; top: 6px; bottom: 6px; width: 2px; background: var(--border); border-radius: 2px; }
.tl-item { position: relative; padding-bottom: var(--space-5); }
.tl-item:last-child { padding-bottom: 0; }
.tl-dot { position: absolute; left: -26px; top: 3px; width: 16px; height: 16px; border-radius: var(--r-full); background: var(--surface-1); border: 3px solid var(--border-strong); display: grid; place-items: center; }
.tl-item.done .tl-dot { border-color: var(--accent); background: var(--accent); }
.tl-item.done .tl-dot::after { content: ""; width: 5px; height: 5px; border-radius: var(--r-full); background: var(--on-accent); }
.tl-item.active .tl-dot { border-color: var(--success); background: var(--success-soft); animation: pulseRing 1.8s var(--ease) infinite; }
@keyframes pulseRing { 0%,100% { box-shadow: 0 0 0 0 oklch(74% 0.15 158 / 0.5); } 50% { box-shadow: 0 0 0 6px oklch(74% 0.15 158 / 0); } }
.tl-item.warn .tl-dot { border-color: var(--warning); background: var(--warning-soft); }
.tl-date { font-size: var(--fs-2xs); color: var(--text-3); letter-spacing: var(--tracking-wide); }
.tl-title { font-size: var(--fs-sm); font-weight: 600; margin: 3px 0 2px; }
.tl-desc { font-size: var(--fs-xs); color: var(--text-2); }

/* 详情侧栏小列表 */
.mini-list { display: flex; flex-direction: column; }
.mini-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) 0; border-top: 1px solid var(--border); }
.mini-item:first-child { border-top: none; }
.mini-item .mi-main { min-width: 0; flex: 1; }
.mini-item .mi-t { font-size: var(--fs-sm); font-weight: 500; }
.mini-item .mi-s { font-size: var(--fs-xs); color: var(--text-3); }
.mini-item .mi-amt { font-weight: 600; font-size: var(--fs-sm); }

/* 租客卡 */
.tenant-card { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-4); background: var(--surface-2); border-radius: var(--r-md); border: 1px solid var(--border); }
.tenant-card .av-lg { width: 48px; height: 48px; border-radius: var(--r-full); background: linear-gradient(140deg, var(--accent), var(--info)); display: grid; place-items: center; color: var(--on-accent); font-weight: 700; flex-shrink: 0; }
.tenant-card .t-name { font-weight: 600; font-size: var(--fs-md); }
.tenant-card .t-sub { font-size: var(--fs-xs); color: var(--text-3); margin-top: 2px; }
.progress { height: 6px; border-radius: var(--r-full); background: var(--surface-3); overflow: hidden; margin-top: var(--space-3); }
.progress > i { display: block; height: 100%; background: linear-gradient(90deg, var(--accent), var(--info)); border-radius: var(--r-full); }

/* ---- Toast ---- */
.toast-wrap { position: fixed; bottom: var(--space-6); right: var(--space-6); z-index: 60; display: flex; flex-direction: column; gap: var(--space-3); }
.toast { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4) var(--space-5); background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: var(--r-md); box-shadow: var(--shadow-md); min-width: 280px; transform: translateY(20px); opacity: 0; transition: transform var(--t-base), opacity var(--t-base); }
.toast.is-show { transform: translateY(0); opacity: 1; }
.toast .ti { width: 30px; height: 30px; border-radius: var(--r-full); background: var(--success-soft); color: var(--success); display: grid; place-items: center; flex-shrink: 0; }
.toast .tt { font-size: var(--fs-sm); font-weight: 600; }
.toast .ts { font-size: var(--fs-xs); color: var(--text-3); }

/* ---- Modal ---- */
.modal-overlay { position: fixed; inset: 0; background: oklch(0% 0 0 / 0.55); backdrop-filter: blur(3px); display: grid; place-items: center; z-index: 80; padding: var(--space-4); opacity: 0; pointer-events: none; transition: opacity var(--t-base); }
.modal-overlay.is-open { opacity: 1; pointer-events: auto; }
.modal { width: min(580px, 100%); max-height: 90vh; overflow: auto; background: var(--surface-1); border: 1px solid var(--border-strong); border-radius: var(--r-lg); box-shadow: var(--shadow-md); transform: translateY(12px) scale(.98); transition: transform var(--t-base); }
.modal-overlay.is-open .modal { transform: none; }
.modal-head { display: flex; align-items: center; justify-content: space-between; padding: var(--space-5) var(--space-5) var(--space-4); border-bottom: 1px solid var(--border); }
.modal-title { font-size: var(--fs-md); font-weight: 700; }
.modal-body { padding: var(--space-5); display: grid; gap: var(--space-4); }
.modal-foot { display: flex; justify-content: flex-end; gap: var(--space-3); padding: var(--space-4) var(--space-5); border-top: 1px solid var(--border); }
.modal-close { width: 34px; height: 34px; border-radius: var(--r-full); display: grid; place-items: center; color: var(--text-3); transition: background var(--t-fast); }
.modal-close:hover { background: var(--surface-3); color: var(--text-1); }
.form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); }
@media (max-width: 640px) { .form-grid { grid-template-columns: 1fr; } }

/* ============================================================
   房源总览 · 楼层图
   ============================================================ */
.bldg-summary { display: grid; grid-template-columns: repeat(4,1fr); gap: var(--space-4); margin-bottom: var(--space-5); }
.bldg-summary .stat { background: var(--surface-1); }

.floor-map { display: flex; flex-direction: column; gap: var(--space-3); }
.floor-row { display: grid; grid-template-columns: 64px 1fr; align-items: center; gap: var(--space-4); }
.floor-label { font-size: var(--fs-xs); font-weight: 700; color: var(--text-3); letter-spacing: var(--tracking-wide); text-align: right; }
.floor-label small { display: block; font-weight: 500; color: var(--text-3); opacity: 0.7; font-size: var(--fs-2xs); }
.units { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-3); }
.units.is-shop { grid-template-columns: repeat(2, 1fr); max-width: 50%; }
.unit {
  position: relative; border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: var(--space-3); background: var(--surface-1); cursor: pointer;
  transition: border-color var(--t-fast), transform var(--t-fast), background var(--t-fast);
  display: flex; flex-direction: column; gap: 2px; min-height: 78px; text-decoration: none;
}
.unit:hover { border-color: var(--border-strong); transform: translateY(-2px); background: var(--surface-2); }
.unit .u-no { font-size: var(--fs-sm); font-weight: 700; letter-spacing: var(--tracking-tight); color: var(--text-1); }
.unit .u-rent { font-size: var(--fs-xs); color: var(--text-2); font-weight: 600; }
.unit .u-st { font-size: var(--fs-2xs); color: var(--text-3); margin-top: auto; display: inline-flex; align-items: center; gap: 4px; }
.unit .u-st::before { content: ""; width: 6px; height: 6px; border-radius: var(--r-full); background: currentColor; }
.unit.rented { border-color: color-mix(in oklch, var(--accent) 35%, var(--border)); }
.unit.rented .u-st { color: var(--success); }
.unit.vacant { border-style: dashed; border-color: color-mix(in oklch, var(--warning) 45%, var(--border)); background: color-mix(in oklch, var(--warning-soft) 40%, var(--surface-1)); }
.unit.vacant .u-st { color: var(--warning); }
.unit.shop { border-color: color-mix(in oklch, var(--info) 38%, var(--border)); }
.unit.shop .u-st { color: var(--info); }

.map-legend { display: flex; gap: var(--space-5); font-size: var(--fs-xs); color: var(--text-2); flex-wrap: wrap; }
.map-legend span { display: inline-flex; align-items: center; gap: 6px; }
.map-legend i { width: 12px; height: 12px; border-radius: 4px; display: inline-block; }
.map-legend .lg-rented { background: color-mix(in oklch, var(--accent) 35%, var(--border)); }
.map-legend .lg-vacant { background: color-mix(in oklch, var(--warning) 45%, var(--border)); border: 1px dashed var(--warning); }
.map-legend .lg-shop { background: color-mix(in oklch, var(--info) 38%, var(--border)); }

/* ============================================================
   6 大模块总览卡
   ============================================================ */
.modules { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-4); }
.module-card { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--space-5); transition: border-color var(--t-base), transform var(--t-base), background var(--t-base); }
.module-card:hover { border-color: var(--border-strong); transform: translateY(-2px); background: var(--surface-2); }
.module-card .mc-head { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-3); }
.module-card .mc-ico { width: 38px; height: 38px; border-radius: var(--r-sm); background: var(--accent-soft); color: var(--accent); display: grid; place-items: center; flex-shrink: 0; }
.module-card .mc-num { font-size: var(--fs-2xs); color: var(--text-3); letter-spacing: var(--tracking-wide); }
.module-card .mc-title { font-size: var(--fs-base); font-weight: 700; }
.module-card .mc-desc { font-size: var(--fs-xs); color: var(--text-3); margin-bottom: var(--space-3); line-height: 1.5; }
.module-card .mc-feats { display: flex; flex-direction: column; gap: var(--space-2); }
.module-card .mc-feat { display: flex; align-items: flex-start; gap: var(--space-2); font-size: var(--fs-xs); color: var(--text-2); }
.module-card .mc-feat svg { width: 14px; height: 14px; color: var(--success); flex-shrink: 0; margin-top: 2px; }
.module-card .mc-feat.muted svg { color: var(--text-3); }

/* ============================================================
   表单 / 设置 / 抄表出账 组件
   ============================================================ */
.form-label { font-size: var(--fs-xs); color: var(--text-3); font-weight: 600; margin-bottom: var(--space-2); display: block; }
.field { display: flex; flex-direction: column; gap: var(--space-2); }
.input, .select {
  width: 100%; background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: var(--space-3); color: var(--text-1); font: inherit; font-weight: 500;
  transition: border-color var(--t-fast), background var(--t-fast);
}
.input:focus, .select:focus { outline: none; border-color: var(--accent-line); background: var(--surface-2); }
.input::placeholder { color: var(--text-3); }
.select { appearance: none; cursor: pointer; background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2399a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>"); background-repeat: no-repeat; background-position: right 12px center; padding-right: 36px; }

.input-group { display: flex; align-items: stretch; background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-sm); overflow: hidden; transition: border-color var(--t-fast); }
.input-group:focus-within { border-color: var(--accent-line); }
.input-group .input { border: none; background: none; flex: 1; }
.input-group .suffix { padding: 0 var(--space-4); color: var(--text-3); font-size: var(--fs-xs); font-weight: 600; border-left: 1px solid var(--border); background: var(--surface-2); display: flex; align-items: center; white-space: nowrap; }

.rate-cards { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-4); margin-bottom: var(--space-5); }
.rate-card { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--space-5); }
.rate-card .rc-head { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-4); }
.rate-card .rc-ico { width: 38px; height: 38px; border-radius: var(--r-sm); display: grid; place-items: center; flex-shrink: 0; }
.rate-card.water .rc-ico { background: var(--info-soft); color: var(--info); }
.rate-card.elec .rc-ico { background: var(--warning-soft); color: var(--warning); }
.rate-card .rc-title { font-weight: 600; }
.rate-card .rc-sub { font-size: var(--fs-xs); color: var(--text-3); }
.rate-card .rc-now { font-size: var(--fs-xs); color: var(--text-3); margin-top: var(--space-3); }

.room-picker { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: var(--space-2); }
.room-chip { padding: var(--space-3) var(--space-2); border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface-1); cursor: pointer; text-align: center; transition: border-color var(--t-fast), background var(--t-fast), transform var(--t-fast); }
.room-chip:hover { border-color: var(--border-strong); background: var(--surface-2); transform: translateY(-1px); }
.room-chip.is-on { border-color: var(--accent); background: var(--accent-soft); }
.room-chip .chip-no { font-size: var(--fs-sm); font-weight: 700; letter-spacing: var(--tracking-tight); }
.room-chip .chip-rent { font-size: var(--fs-2xs); color: var(--text-3); margin-top: 2px; }
.room-chip.is-on .chip-rent { color: var(--text-2); }

.rent-table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
.rent-table th { text-align: left; font-size: var(--fs-2xs); letter-spacing: var(--tracking-wide); text-transform: uppercase; color: var(--text-3); font-weight: 600; padding: 0 var(--space-3) var(--space-3); }
.rent-table td { padding: var(--space-2) var(--space-3); border-top: 1px solid var(--border); }
.rent-table .rent-input { width: 130px; }
.rent-table .tag-mini { font-size: var(--fs-2xs); padding: 1px 7px; border-radius: var(--r-full); background: var(--surface-3); color: var(--text-2); }

.upload-card { border: 2px dashed var(--border-strong); border-radius: var(--r-md); padding: var(--space-6); text-align: center; background: var(--surface-1); cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast); position: relative; }
.upload-card:hover { border-color: var(--accent); background: var(--surface-2); }
.upload-card.is-reading { border-color: var(--accent); }
.upload-card.has-file { border-style: solid; border-color: var(--success); background: var(--success-soft); }
.upload-card .up-ico { width: 40px; height: 40px; margin: 0 auto var(--space-3); color: var(--text-3); }
.upload-card.has-file .up-ico { color: var(--success); }
.upload-card .up-t { font-size: var(--fs-sm); font-weight: 600; }
.upload-card .up-s { font-size: var(--fs-xs); color: var(--text-3); margin-top: 2px; }
.upload-card .up-spin { font-size: var(--fs-xs); color: var(--accent); margin-top: var(--space-2); display: inline-flex; align-items: center; gap: 6px; }
.upload-card .up-spin::before { content: ""; width: 12px; height: 12px; border: 2px solid var(--accent); border-top-color: transparent; border-radius: var(--r-full); animation: spin 0.7s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }

.meter-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); }
.meter-result { display: flex; align-items: center; gap: var(--space-3); margin-top: var(--space-3); padding: var(--space-3); background: var(--surface-2); border-radius: var(--r-sm); border: 1px solid var(--border); font-size: var(--fs-sm); flex-wrap: wrap; }
.meter-result .mr-label { color: var(--text-3); font-size: var(--fs-xs); }
.meter-result .mr-used { color: var(--accent); font-weight: 700; }
.meter-result .mr-cost { margin-left: auto; font-weight: 700; color: var(--success); }

.steps { display: flex; gap: var(--space-5); margin-bottom: var(--space-6); flex-wrap: wrap; }
.step { display: flex; align-items: center; gap: var(--space-2); color: var(--text-3); font-size: var(--fs-sm); }
.step .s-no { width: 26px; height: 26px; border-radius: var(--r-full); background: var(--surface-3); display: grid; place-items: center; font-size: var(--fs-xs); font-weight: 700; flex-shrink: 0; }
.step.is-active { color: var(--text-1); }
.step.is-active .s-no { background: var(--accent); color: var(--on-accent); }
.step.is-done .s-no { background: var(--success); color: var(--on-accent); }
.step .s-line { width: 32px; height: 2px; background: var(--border); margin-left: var(--space-2); }

.bill-preview { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--space-5); }
.bill-preview .bp-head { display: flex; justify-content: space-between; align-items: flex-start; padding-bottom: var(--space-4); border-bottom: 1px dashed var(--border); margin-bottom: var(--space-3); }
.bill-preview .bp-title { font-size: var(--fs-md); font-weight: 700; }
.bill-preview .bp-meta { font-size: var(--fs-xs); color: var(--text-3); margin-top: 2px; }
.bill-row { display: flex; justify-content: space-between; align-items: baseline; padding: var(--space-2) 0; font-size: var(--fs-sm); }
.bill-row .bl-label { color: var(--text-1); font-weight: 500; }
.bill-row .bl-sub { color: var(--text-3); font-size: var(--fs-xs); font-weight: 400; }
.bill-row .bl-val { font-weight: 600; font-variant-numeric: tabular-nums; }
.bill-row.divider { border-top: 1px dashed var(--border); margin-top: var(--space-2); padding-top: var(--space-3); }
.bill-total { display: flex; justify-content: space-between; align-items: baseline; padding-top: var(--space-3); border-top: 1px solid var(--border); margin-top: var(--space-2); }
.bill-total .bt-label { font-weight: 700; }
.bill-total .bt-val { font-size: var(--fs-xl); font-weight: 700; color: var(--accent); letter-spacing: var(--tracking-tight); }

/* ---- Responsive ---- */
@media (max-width: 1100px) { .grid-2, .grid-2b, .grid-3-7 { grid-template-columns: 1fr; } .kpis, .stats { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 860px) { .app { grid-template-columns: 1fr; } .sidebar { position: fixed; z-index: 50; width: var(--sidebar-w); transform: translateX(-100%); transition: transform var(--t-base); } .app.nav-open .sidebar { transform: translateX(0); } .menu-toggle { display: grid !important; } .search { display: none; } }
.menu-toggle { display: none; }
@media (max-width: 560px) { .kpis, .stats { grid-template-columns: 1fr; } .info-grid { grid-template-columns: repeat(2,1fr); } .content { padding: var(--space-4); } .topbar { padding: 0 var(--space-4); } }
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; } }
