/* style.css —— 门诊管理系统样式（Apple 设计语言：极简 · 留白 · 毛玻璃） */
:root {
  --primary: #0071e3;          /* 苹果蓝 */
  --primary-light: #e8f1fd;
  --primary-dark: #0064c4;
  --teal: #0d9488;
  --bg: #f5f5f7;               /* 苹果官网浅灰 */
  --card: #ffffff;
  --border: #d2d2d7;
  --text: #1d1d1f;             /* 苹果黑 */
  --text-sub: #6e6e73;
  --text-light: #86868b;
  --danger: #ff3b30;
  --success: #34c759;
  --warning: #ff9500;
  --radius: 16px;
  --radius-sm: 10px;
  --shadow-sm: 0 1px 2px rgba(0,0,0,.04);
  --shadow: 0 4px 20px rgba(0,0,0,.06);
  --shadow-lg: 0 16px 48px rgba(0,0,0,.16);
  --glass: rgba(255,255,255,.72);
}

* { box-sizing: border-box; margin: 0; padding: 0; }
html, body { height: 100%; }
body {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Helvetica Neue", "Microsoft YaHei", sans-serif;
  background: var(--bg); color: var(--text); font-size: 14px;
  -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
  letter-spacing: -0.01em;
  -webkit-text-size-adjust: 100%; text-size-adjust: 100%;
  display: flex; flex-direction: column; min-height: 100vh;
}

.app { display: flex; flex: 1; min-height: 0; overflow: hidden; }

/* ===== 未配置 AI 模型常驻横幅 ===== */
.model-banner {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 16px; flex-shrink: 0;
  background: linear-gradient(135deg, #fff4e5, #ffe9cc);
  border-bottom: 1px solid #ffd9a0; color: #7a4a00;
  font-size: 13px; line-height: 1.5;
}
.model-banner[hidden] { display: none; }
.model-banner-icon { font-size: 18px; flex-shrink: 0; }
.model-banner-body { flex: 1; min-width: 0; }
.model-banner-title { font-weight: 700; font-size: 13.5px; margin-bottom: 1px; }
.model-banner-desc { color: #8a5a00; }
.model-banner-desc code { background: rgba(0,0,0,.06); padding: 1px 5px; border-radius: 5px; font-size: 12px; }
.model-banner-close {
  flex-shrink: 0; border: none; background: transparent; color: #7a4a00;
  font-size: 20px; line-height: 1; cursor: pointer; padding: 4px 8px; border-radius: 8px;
}
.model-banner-close:hover { background: rgba(0,0,0,.06); }
.model-banner-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.field-tip { display: block; margin-top: 4px; color: var(--text-sub); font-size: 12px; line-height: 1.5; }
.field-check { display: flex; align-items: center; gap: 6px; cursor: pointer; font-size: 13px; }
.field-check input { width: auto; }

/* ===== 侧边栏（浅色毛玻璃，macOS 风格） ===== */
.sidebar {
  width: 224px; background: rgba(246,246,248,.72); color: var(--text);
  display: flex; flex-direction: column; flex-shrink: 0;
  backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px);
  border-right: 1px solid rgba(0,0,0,.06);
}
.logo { display: flex; align-items: center; gap: 10px; padding: 20px 18px 16px; }
.logo-icon {
  width: 34px; height: 34px; border-radius: 9px; background: linear-gradient(135deg, #0071e3, #42a5ff);
  color: #fff; display: flex; align-items: center; justify-content: center; font-size: 18px;
  box-shadow: 0 2px 8px rgba(0,113,227,.28);
}
.logo-text { line-height: 1.2; }
.logo-title { color: var(--text); font-size: 15px; font-weight: 700; letter-spacing: -0.02em; }
.logo-sub { font-size: 11px; color: var(--text-light); margin-top: 1px; }
.nav { flex: 1; overflow-y: auto; padding: 8px 0 12px; }
.nav-group { padding: 16px 22px 6px; font-size: 11px; color: var(--text-light); letter-spacing: .08em; font-weight: 600; }
.nav-item {
  display: flex; align-items: center; gap: 9px; margin: 1px 10px; padding: 9px 12px; border-radius: 10px;
  color: var(--text-sub); cursor: pointer; text-decoration: none; transition: all .16s; font-size: 13.5px;
}
.nav-item:hover { background: rgba(0,0,0,.05); color: var(--text); }
.nav-item.active { background: rgba(0,113,227,.1); color: var(--primary); font-weight: 600; }
.sidebar-foot { display: flex; flex-direction: column; gap: 8px; flex-shrink: 0; padding: 14px; border-top: 1px solid rgba(0,0,0,.06); }
.dashboard-entry {
  display: flex; align-items: center; gap: 9px; padding: 12px 10px;
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: var(--primary-light); color: var(--primary); text-decoration: none;
}
.dashboard-entry:hover { border-color: var(--primary); }
.dashboard-entry:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
.dashboard-entry strong { display: block; font-size: 13px; font-weight: 600; white-space: nowrap; }
.dashboard-entry small { display: block; margin-top: 3px; font-size: 11px; color: var(--text-sub); }
.dashboard-entry-icon { width: 22px; height: 22px; flex-shrink: 0; }
.dashboard-entry-arrow { width: 16px; height: 16px; margin-left: auto; flex-shrink: 0; }

/* ===== 顶部栏（毛玻璃 sticky） ===== */
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; }
.topbar {
  height: 52px; background: var(--glass);
  backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px);
  border-bottom: 1px solid rgba(0,0,0,.06);
  display: flex; align-items: center; justify-content: space-between; padding: 0 24px; flex-shrink: 0;
}
.topbar-title { font-size: 18px; font-weight: 700; letter-spacing: -0.02em; }
.topbar-right { display: flex; align-items: center; gap: 14px; color: var(--text-sub); font-size: 13px; }
.topbar-date { color: var(--text-light); }
.clinic-picker { display: inline-flex; align-items: center; gap: 6px; min-width: 0; }
.clinic-picker[hidden] { display: none; }
.clinic-picker select { width: auto; max-width: 220px; min-width: 100px; padding: 6px 24px 6px 10px; font: inherit; color: var(--primary); background-color: var(--card); border: 1px solid var(--border); border-radius: 8px; cursor: pointer; }
.avatar { width: 30px; height: 30px; border-radius: 50%; background: linear-gradient(135deg, #f0f2f5, #e0e4ea); display: flex; align-items: center; justify-content: center; font-size: 15px; }

.content { flex: 1; overflow-y: auto; padding: 26px 28px; }

/* ===== 通用组件 ===== */
.btn {
  display: inline-flex; align-items: center; gap: 6px; padding: 8px 16px; border-radius: 980px;
  border: 1px solid transparent; cursor: pointer; font-size: 13px; font-weight: 500; transition: all .18s;
  background: #fff; color: var(--text); white-space: nowrap; letter-spacing: -0.01em;
}
.btn:hover { filter: brightness(.97); }
.btn:active { transform: scale(.97); }
.btn-primary { background: var(--primary); color: #fff; }
.btn-primary:hover { background: var(--primary-dark); filter: none; }
.btn-teal { background: var(--teal); color: #fff; }
.btn-ghost { background: rgba(0,0,0,.03); border-color: transparent; color: var(--text-sub); }
.btn-ghost:hover { background: rgba(0,0,0,.06); filter: none; }
.btn-danger { background: rgba(255,59,48,.08); color: var(--danger); }
.btn-sm { padding: 5px 12px; font-size: 12px; }
.btn-block { width: 100%; justify-content: center; }
.btn[disabled] { opacity: .4; cursor: not-allowed; }

.card { background: var(--card); border-radius: var(--radius); box-shadow: var(--shadow); border: 1px solid rgba(0,0,0,.04); }
.card-head { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.card-title { font-size: 15px; font-weight: 700; letter-spacing: -0.01em; }
.card-body { padding: 20px; }
.card-body.no-pad { padding: 0; }

.toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 18px; }
.toolbar .spacer { flex: 1; }
input, select, textarea {
  padding: 9px 12px; border: 1px solid var(--border); border-radius: 10px; font-size: 13px;
  font-family: inherit; color: var(--text); background: #fff; outline: none; transition: all .16s;
}
input:hover, select:hover, textarea:hover { border-color: #b8b8bf; }
input:focus, select:focus, textarea:focus { border-color: var(--primary); box-shadow: 0 0 0 4px rgba(0,113,227,.12); }
textarea { resize: vertical; min-height: 70px; }

table { width: 100%; border-collapse: collapse; }
th, td { text-align: left; padding: 12px 16px; border-bottom: 1px solid rgba(0,0,0,.05); font-size: 13px; }
th { background: transparent; color: var(--text-sub); font-weight: 600; white-space: nowrap; font-size: 12px; }
tbody tr:hover { background: rgba(0,0,0,.02); }
tbody tr { cursor: pointer; transition: background .12s; }

.badge { display: inline-block; padding: 2px 10px; border-radius: 980px; font-size: 11px; font-weight: 500; }
.tag { display: inline-block; padding: 2px 9px; border-radius: 6px; font-size: 11px; margin: 2px 3px 2px 0; color: #fff; }

.empty { text-align: center; color: var(--text-light); padding: 54px 20px; font-size: 13px; }

/* ===== 统计卡片 ===== */
.stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 20px; }
.stat-card { background: var(--card); border-radius: var(--radius); box-shadow: var(--shadow); border: 1px solid rgba(0,0,0,.04); padding: 20px; transition: transform .18s, box-shadow .18s; }
.stat-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.stat-label { font-size: 12px; color: var(--text-sub); font-weight: 500; }
.stat-value { font-size: 30px; font-weight: 700; margin-top: 8px; letter-spacing: -0.02em; }
.stat-desc { font-size: 12px; color: var(--text-light); margin-top: 5px; }
.stat-value.c-primary { color: var(--primary); }
.stat-value.c-teal { color: var(--teal); }
.stat-value.c-danger { color: var(--danger); }
.stat-value.c-warning { color: var(--warning); }

/* ===== 看板 ===== */
.kanban { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
.kanban-col { background: rgba(0,0,0,.03); border-radius: var(--radius-sm); padding: 10px; min-height: 300px; }
.kanban-col-head { display: flex; align-items: center; justify-content: space-between; padding: 6px 8px 12px; font-size: 13px; font-weight: 600; }
.kanban-card { background: #fff; border-radius: 12px; padding: 14px; margin-bottom: 10px; box-shadow: var(--shadow-sm); cursor: pointer; border: 1px solid rgba(0,0,0,.04); transition: all .16s; }
.kanban-card:hover { border-color: var(--primary); box-shadow: var(--shadow); transform: translateY(-1px); }
.kanban-card .k-name { font-weight: 600; }
.kanban-card .k-meta { font-size: 12px; color: var(--text-sub); margin-top: 5px; }

/* ===== 表单 ===== */
.form-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
.form-grid .full { grid-column: 1 / -1; }
.field label { display: block; font-size: 12px; color: var(--text-sub); margin-bottom: 6px; font-weight: 500; }
.field input, .field select, .field textarea { width: 100%; }
.checkbox-group { display: flex; flex-wrap: wrap; gap: 8px; }
.checkbox-group label { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; cursor: pointer; padding: 5px 12px; border: 1px solid var(--border); border-radius: 980px; transition: all .15s; }
.checkbox-group label.checked { background: var(--primary-light); border-color: var(--primary); color: var(--primary); }

/* ===== 弹窗（毛玻璃遮罩 + 大圆角） ===== */
.modal-mask { position: fixed; inset: 0; background: rgba(0,0,0,.4); display: flex; align-items: center; justify-content: center; z-index: 100; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }
.modal { background: #fff; border-radius: 20px; box-shadow: var(--shadow-lg); width: 640px; max-width: 94vw; max-height: 90vh; overflow-y: auto; animation: modalIn .22s cubic-bezier(.2,.8,.3,1); }
.modal.modal-lg { width: 800px; }
@keyframes modalIn { from { opacity: 0; transform: translateY(14px) scale(.98); } to { opacity: 1; transform: none; } }
.modal-head { padding: 18px 22px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; position: sticky; top: 0; background: rgba(255,255,255,.9); backdrop-filter: saturate(180%) blur(12px); z-index: 2; }
.modal-title { font-size: 17px; font-weight: 700; letter-spacing: -0.02em; }
.modal-close { cursor: pointer; font-size: 22px; color: var(--text-light); border: none; background: none; width: 30px; height: 30px; border-radius: 50%; transition: all .15s; }
.modal-close:hover { background: rgba(0,0,0,.06); color: var(--text); }
.modal-body { padding: 22px; }
.modal-foot { padding: 16px 22px; border-top: 1px solid var(--border); display: flex; justify-content: flex-end; gap: 10px; position: sticky; bottom: 0; background: rgba(255,255,255,.9); backdrop-filter: saturate(180%) blur(12px); }

/* ===== toast（毛玻璃深色） ===== */
.toast { position: fixed; top: 20px; left: 50%; transform: translateX(-50%); background: rgba(29,29,31,.88); backdrop-filter: saturate(180%) blur(12px); color: #fff; padding: 11px 22px; border-radius: 980px; z-index: 200; font-size: 13px; box-shadow: var(--shadow-lg); }

/* ===== 提示块 ===== */
.alert { padding: 13px 16px; border-radius: 12px; font-size: 13px; margin-bottom: 16px; }
.alert-warn { background: #fff7f0; border: 1px solid #ffd9b0; color: #a35a00; }
.alert-info { background: var(--primary-light); border: 1px solid #c4defb; color: #005bb5; }

/* ===== 详情 ===== */
.detail-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.detail-item { font-size: 13px; }
.detail-item .d-label { color: var(--text-light); font-size: 12px; }
.detail-item .d-value { margin-top: 4px; font-weight: 500; }
.section-title { font-size: 14px; font-weight: 700; margin: 22px 0 12px; letter-spacing: -0.01em; }

.tab-bar { display: flex; gap: 4px; border-bottom: 1px solid var(--border); margin-bottom: 18px; }
.tab-item { padding: 10px 18px; cursor: pointer; font-size: 13px; color: var(--text-sub); border-bottom: 2px solid transparent; transition: all .15s; white-space: nowrap; text-align: center; }
.tab-item:hover { color: var(--text); }
.tab-item.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }

/* ===== 分段控件（iOS segmented control 风格） ===== */
.seg { display: inline-flex; background: rgba(0,0,0,.055); border-radius: 10px; padding: 3px; gap: 2px; }
.seg-btn { border: none; background: transparent; padding: 6px 14px; font-size: 13px; cursor: pointer; border-radius: 8px; color: var(--text-sub); transition: all .16s; white-space: nowrap; }
.seg-btn.active { background: #fff; color: var(--text); box-shadow: 0 1px 4px rgba(0,0,0,.12); font-weight: 600; }

/* ===== 登录层 ===== */
.auth-screen { position: fixed; inset: 0; background: var(--bg); display: flex; align-items: center; justify-content: center; z-index: 300; }
.auth-card { background: var(--glass); backdrop-filter: saturate(180%) blur(24px); -webkit-backdrop-filter: saturate(180%) blur(24px); border: 1px solid rgba(0,0,0,.05); border-radius: 24px; box-shadow: var(--shadow-lg); width: 400px; max-width: 94vw; padding: 36px 32px; }
.auth-logo { font-size: 22px; font-weight: 700; display: flex; align-items: center; gap: 10px; letter-spacing: -0.02em; }
.auth-sub { color: var(--text-sub); font-size: 13px; margin: 8px 0 22px; }
.auth-tabs { display: flex; gap: 6px; border-bottom: 1px solid var(--border); margin-bottom: 22px; }
.auth-tab { flex: 1; padding: 10px; border: none; background: none; cursor: pointer; font-size: 14px; color: var(--text-sub); border-bottom: 2px solid transparent; transition: all .15s; }
.auth-tab.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }
.auth-form .field { margin-bottom: 16px; }
.auth-form .field input { width: 100%; }
.auth-msg { font-size: 12px; margin: 6px 0; min-height: 16px; }
.auth-msg.err { color: var(--danger); }
.auth-msg.ok { color: var(--success); }
.auth-link { font-size: 12px; color: var(--primary); cursor: pointer; text-align: right; margin-top: 5px; }
.auth-guest { text-align: center; margin-top: 18px; padding-top: 18px; border-top: 1px dashed var(--border); color: var(--text-sub); font-size: 13px; cursor: pointer; transition: color .15s; }
.auth-guest:hover { color: var(--primary); }
.auth-btn { width: 100%; padding: 12px; border: none; border-radius: 980px; background: var(--primary); color: #fff; font-size: 14px; font-weight: 600; cursor: pointer; transition: all .18s; }
.auth-btn:hover { background: var(--primary-dark); }
.auth-btn:disabled { opacity: .5; cursor: not-allowed; }
.auth-row { display: flex; gap: 8px; align-items: center; }
.auth-row input { flex: 1; }
.auth-row .btn { white-space: nowrap; }
.loading-dots::after { content: '…'; animation: blink 1s infinite; }
@keyframes blink { 50% { opacity: .3; } }

/* ===== 顶栏用户 ===== */
.topbar-user { cursor: pointer; color: var(--text-sub); }
.topbar-user:hover { color: var(--text); }
.topbar-clinic { font-size: 12px; color: var(--primary); font-weight: 600; background: var(--primary-light); padding: 4px 12px; border-radius: 980px; }

/* 打印/响应式 */
@media (max-width: 900px) {
  .stat-grid { grid-template-columns: repeat(2, 1fr); }
  .kanban { grid-template-columns: repeat(2, 1fr); }
  .form-grid { grid-template-columns: 1fr; }
  .detail-grid { grid-template-columns: 1fr 1fr; }
}

/* 关键修复：确保 hidden 属性始终生效，覆盖 .auth-screen / .modal-mask 的 display:flex */
[hidden] { display: none !important; }

/* ===== 牙位图（标准十字布局，ISO 3950） ===== */
.tooth-chart { display: flex; flex-direction: column; margin: 10px 0; }
.arch { display: flex; }
.arch-half { flex: 1; padding: 8px 12px; }
.arch + .arch { border-top: 2px solid var(--border); }
.arch-half + .arch-half { border-left: 2px solid var(--border); }
.quad { display: flex; flex-direction: column; align-items: center; gap: 5px; }
.quad-label { font-size: 11px; color: var(--text-sub); }
.tooth-line { display: flex; gap: 3px; }
.tooth { width: 30px; height: 30px; border-radius: 7px; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: 10px; position: relative; }
.tooth-no { font-weight: 600; }
.tooth-mark { position: absolute; bottom: 0; font-size: 8px; opacity: .95; }
.tooth-editable { cursor: pointer; transition: transform .1s; }
.tooth-editable:hover { transform: scale(1.12); box-shadow: 0 0 0 2px var(--primary); z-index: 2; }
.tooth-type-bar { display: flex; gap: 6px; margin: 2px 0 6px; }
.tt-btn { border: 1px solid var(--border); background: #fff; border-radius: 8px; padding: 4px 14px; font-size: 12px; cursor: pointer; color: var(--text-sub); transition: all .15s; }
.tt-btn.active { background: var(--primary); color: #fff; border-color: var(--primary); }
.tooth-brush { display: flex; gap: 6px; flex-wrap: wrap; margin: 6px 0; }
.brush-btn { border: 2px solid transparent; border-radius: 8px; padding: 4px 10px; font-size: 12px; cursor: pointer; color: #fff; transition: all .15s; }
.brush-btn.active { border-color: var(--primary); box-shadow: 0 0 0 2px var(--primary-light); }

/* ===== 影像 ===== */
.img-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.img-item img { width: 100%; height: 110px; object-fit: cover; border-radius: 12px; border: 1px solid rgba(0,0,0,.06); }
.img-cap { font-size: 12px; color: var(--text-sub); margin-top: 5px; text-align: center; }
.img-chip { display: inline-block; background: var(--primary-light); color: var(--primary); border-radius: 980px; padding: 4px 12px; font-size: 12px; margin: 2px 4px 2px 0; }

/* ===== 经营分析 ===== */
.chart-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
.chart-grid .card-body { min-height: 260px; position: relative; }
.chart-grid canvas { max-height: 240px; }
.funnel { display: flex; flex-direction: column; gap: 10px; align-items: center; padding: 20px 0; }
.funnel-step { background: linear-gradient(90deg, #0071e3, #42a5ff); color: #fff; border-radius: 10px; padding: 12px 18px; display: flex; justify-content: space-between; font-size: 13px; min-width: 180px; }
.funnel-step b { font-size: 16px; }

/* ===== 经营分析：时间范围切换 ===== */
.range-switch { display: inline-flex; background: rgba(0,0,0,.055); border-radius: 8px; padding: 2px; gap: 2px; margin-left: 12px; }
.range-switch .seg-btn { padding: 3px 10px; font-size: 12px; border-radius: 6px; }

/* ===== AI 回访话术 ===== */
.ai-script { background: #fbfbfd; border: 1px solid rgba(0,0,0,.06); border-radius: 12px; padding: 16px 18px; font-size: 14px; line-height: 1.7; color: var(--text); white-space: pre-wrap; }

/* AI 分节标题（【风险预警】等，不换行） */
.ai-h2 { display: inline-block; font-weight: 700; color: var(--primary); white-space: nowrap; margin-top: 6px; }

/* 晨会报告结构化展示 */
.huddle { display: flex; flex-direction: column; gap: 14px; }
.h-sec { background: #fbfbfd; border: 1px solid rgba(0,0,0,.05); border-radius: 14px; padding: 16px; }
.h-t { font-size: 14px; font-weight: 700; color: var(--text); margin-bottom: 12px; white-space: nowrap; letter-spacing: -0.01em; }
.h-kv { display: flex; flex-wrap: wrap; gap: 8px; }
.h-kv-i { display: flex; align-items: baseline; gap: 4px; background: #fff; border: 1px solid rgba(0,0,0,.04); border-radius: 10px; padding: 8px 12px; }
.h-k { font-size: 12px; color: var(--text-sub); white-space: nowrap; }
.h-kv-i b { font-size: 18px; font-weight: 700; letter-spacing: -0.02em; }
.h-u { font-size: 12px; color: var(--text-light); white-space: nowrap; }
.h-list { margin-top: 10px; display: flex; flex-direction: column; gap: 6px; }
.h-row { display: flex; justify-content: space-between; gap: 10px; font-size: 13px; padding: 6px 0; border-bottom: 1px solid rgba(0,0,0,.04); }
.h-row:last-child { border-bottom: none; }
.h-row b { white-space: nowrap; }
.h-row span { color: var(--text-sub); font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.scribe-box { background: #fff7f0; border: 1px solid #ffd9b0; border-radius: 12px; padding: 12px 14px; font-size: 13px; line-height: 1.6; color: #7c2d12; margin-top: 8px; min-height: 40px; white-space: pre-wrap; }

/* ===== 预约排班（左小日历 + 右医生排班表） ===== */
.sched-layout { display: flex; gap: 16px; align-items: flex-start; }
.sched-cal { width: 250px; flex-shrink: 0; background: #fff; border: 1px solid rgba(0,0,0,.04); border-radius: var(--radius); padding: 16px; box-shadow: var(--shadow); }
.mcal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.mcal-nav { border: none; background: none; cursor: pointer; font-size: 17px; color: var(--text-sub); padding: 2px 8px; border-radius: 6px; transition: all .15s; }
.mcal-nav:hover { background: rgba(0,0,0,.05); color: var(--text); }
.mcal-month { font-weight: 700; font-size: 15px; letter-spacing: -0.01em; }
.mcal-dow { display: flex; margin-bottom: 2px; }
.mcal-dow span { width: 14.2857%; text-align: center; font-size: 11px; color: var(--text-light); font-weight: 600; height: 22px; line-height: 22px; overflow: hidden; }
.mcal-dow span.weekend { color: #f97316; }
.mcal-body { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); grid-template-rows: repeat(6, 42px); }
.mcal-cell { height: 42px; min-height: 0; min-width: 0; align-self: start; display: flex; flex-direction: column; align-items: center; justify-content: center; position: relative; cursor: pointer; border-radius: 10px; gap: 1px; overflow: hidden; }
.mcal-cell.empty { cursor: default; padding: 0; }
.mcal-cell:hover { background: rgba(0,0,0,.04); }
.mcal-day { font-size: 13px; line-height: 1; color: var(--text); }
.mcal-fest { font-size: 9px; line-height: 1; color: var(--danger); white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
.mcal-cell.weekend .mcal-day { color: #f97316; }
.mcal-cell.today { background: var(--primary); }
.mcal-cell.today .mcal-day { color: #fff; font-weight: 700; }
.mcal-cell.today .mcal-fest { color: #fff; }
.mcal-cell.selected { background: var(--primary); }
.mcal-cell.selected .mcal-day { color: #fff; font-weight: 700; }
.mcal-cell.selected .mcal-fest { color: #fff; }
.mcal-dot { position: absolute; bottom: 3px; left: 50%; transform: translateX(-50%); width: 4px; height: 4px; border-radius: 50%; background: var(--primary); }
.mcal-cell.selected .mcal-dot, .mcal-cell.today .mcal-dot { background: #fff; }

/* 预约弹窗：时段网格小视图 */
.slot-grid { margin-top: 4px; }
.slot-label { font-size: 11px; color: var(--text-light); margin: 8px 0 4px; }
.slot-label:first-child { margin-top: 0; }
.slot-row { display: flex; flex-wrap: wrap; gap: 6px; }
.slot-cell { width: 58px; height: 32px; display: flex; align-items: center; justify-content: center; border: 1px solid var(--border); border-radius: 8px; font-size: 12px; cursor: pointer; color: var(--text); background: #fff; transition: all .14s; }
.slot-cell:hover { border-color: var(--primary); }
.slot-cell.selected, .slot-cell.busy.selected { background: var(--primary); color: #fff; border-color: var(--primary); font-weight: 600; }
.slot-cell.selected i, .slot-cell.busy.selected i { color: #fff; }
.slot-cell.busy { background: #fff8e6; color: #a35a00; border-color: #ffe2ae; }
.slot-cell.busy i { font-style: normal; margin-left: 2px; font-size: 10px; }
.apc-dur { font-size: 12px; color: var(--primary); margin: 4px 0 10px; }

/* 预约页面：诊所/医生/咨询视角切换 */
.ap-view-switch { display: inline-flex; background: rgba(0,0,0,.055); border-radius: 10px; padding: 3px; gap: 2px; }
.avs-btn { border: none; background: transparent; padding: 6px 13px; font-size: 13px; cursor: pointer; color: var(--text-sub); border-radius: 8px; transition: all .16s; white-space: nowrap; text-align: center; }
.avs-btn.active { background: #fff; color: var(--text); box-shadow: 0 1px 4px rgba(0,0,0,.12); font-weight: 600; }

.sched-date { font-weight: 600; font-size: 15px; }
.sched-grid-wrap { flex: 1; overflow-x: auto; background: #fff; border: 1px solid rgba(0,0,0,.04); border-radius: var(--radius); box-shadow: var(--shadow); }
.sched-table { border-collapse: collapse; width: 100%; min-width: 560px; }
.sched-table th { padding: 12px 8px; font-size: 13px; border-bottom: 1px solid var(--border); background: transparent; white-space: nowrap; text-align: center; }
.sched-slot { width: 56px; font-size: 12px; color: var(--text-sub); text-align: center; padding: 6px 0; border-right: 1px solid var(--border); }
.sched-day-label { font-size: 12px; color: var(--text-sub); background: rgba(0,0,0,.025); padding: 5px 12px; }
.sched-cell { border: 1px solid var(--border); border-top: none; border-left: none; height: 46px; padding: 4px 6px; vertical-align: top; }
.sched-cell.empty { text-align: center; cursor: pointer; color: #c7c7cc; }
.sched-cell.empty:hover { background: var(--primary-light); }
.sched-cell .plus { font-size: 17px; }
.sched-name { font-size: 12px; font-weight: 600; color: var(--text); }
.sched-extra { display: inline-block; margin-left: 3px; background: #fff8e6; color: #a35a00; border-radius: 8px; padding: 0 5px; font-size: 10px; font-weight: 700; }
.sched-proj { font-size: 11px; color: var(--text-sub); margin-top: 2px; }
.sched-actions { margin-top: 3px; display: flex; gap: 2px; }
.mini-btn { border: none; background: var(--primary-light); color: var(--primary); border-radius: 5px; padding: 1px 6px; font-size: 10px; cursor: pointer; }
.sched-cell.off { background: repeating-linear-gradient(45deg, #fafafa, #fafafa 4px, #f0f0f2 4px, #f0f0f2 8px); color: var(--text-light); text-align: center; font-size: 12px; cursor: not-allowed; }
.mini-btn.off-toggle { background: #fff8e6; color: #a35a00; }
.mini-btn.off-toggle.active { background: rgba(255,59,48,.08); color: var(--danger); }

/* ===== 手机端适配（≤768px） ===== */
@media (max-width: 768px) {
  .app { flex-direction: column; height: 100vh; height: 100dvh; }
  .main { order: 1; }
  .sidebar {
    order: 2; width: 100%; height: 56px; flex-direction: row; flex-shrink: 0;
    padding-bottom: env(safe-area-inset-bottom); overflow: hidden;
    border-right: none; border-top: 1px solid rgba(0,0,0,.06);
  }
  .logo, .nav-group, .sidebar-foot { display: none; }
  .sidebar-foot { display: flex; order: -1; justify-content: center; padding: 0 8px; border-top: 0; border-right: 1px solid var(--border); }
  .sidebar-foot #btnReset, .dashboard-entry small, .dashboard-entry-arrow { display: none; }
  .dashboard-entry { padding: 8px; gap: 5px; }
  .dashboard-entry strong { font-size: 12px; }
  .nav { flex: 1; display: flex; flex-direction: row; overflow-x: auto; padding: 0 6px; }
  .nav-item {
    display: flex; align-items: center; justify-content: center; white-space: nowrap;
    gap: 4px; padding: 0 12px; height: 56px; border-radius: 0; margin: 0;
    flex-shrink: 0; font-size: 13px; text-align: center;
  }
  .nav-item.active { background: transparent; border-bottom: 3px solid var(--primary); }
  .topbar { height: 48px; padding: 0 14px; }
  .topbar-date, .topbar-clinic { display: none; }
  .topbar-title { font-size: 16px; }
  .content { padding: 14px; }
  .stat-grid { gap: 10px; }
  .stat-card { padding: 14px; }
  .stat-value { font-size: 24px; }
  .chart-grid { grid-template-columns: 1fr; }
  .chart-grid .card-body { min-height: 220px; }
  .sched-layout { flex-direction: column; }
  .sched-cal { width: 100%; }
  .card-body.no-pad { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .card-body.no-pad table { min-width: 520px; }
  .detail-grid { grid-template-columns: 1fr; }
  .img-grid { grid-template-columns: repeat(2, 1fr); }
  .img-item img { height: 90px; }
  .tooth-chart { overflow-x: auto; }
  .tooth { width: 24px; height: 24px; font-size: 9px; }
  .tooth-no { font-size: 8px; }
  .modal-mask { align-items: flex-end; }
  .modal { width: 100%; max-width: 100%; max-height: 94vh; border-radius: 20px 20px 0 0; }
  .modal-head { padding: 14px 16px; }
  .modal-body { padding: 16px; }
  .modal-foot { padding: 12px 16px; padding-bottom: calc(12px + env(safe-area-inset-bottom)); }
  .toast { width: 90%; max-width: 360px; text-align: center; }
  .toolbar { gap: 8px; }
  .toolbar input[type="date"], .toolbar select { max-width: 100%; }
  .kanban { grid-template-columns: 1fr; }
  .kanban-col { min-height: auto; }
}

/* ===== 分页控件 ===== */
.pagination { display: flex; align-items: center; justify-content: center; gap: 12px; margin-top: 16px; }
.pg-info { font-size: 13px; color: var(--text-sub); }

/* ===== 患者搜索选择器 ===== */
.patient-picker { position: relative; width: 100%; }
.patient-picker input { width: 100%; }
.patient-picker-drop { position: absolute; top: 100%; left: 0; right: 0; background: #fff; border: 1px solid rgba(0,0,0,.06); border-radius: 12px; box-shadow: var(--shadow-lg); max-height: 300px; overflow-y: auto; z-index: 60; display: none; margin-top: 4px; }
.pp-item { padding: 10px 14px; cursor: pointer; font-size: 13px; border-bottom: 1px solid rgba(0,0,0,.04); transition: background .12s; }
.pp-item:last-child { border-bottom: none; }
.pp-item:hover { background: var(--primary-light); }
.pp-sub { color: var(--text-sub); font-size: 12px; margin-left: 6px; }
.pp-empty { padding: 14px; color: var(--text-light); text-align: center; font-size: 13px; }

/* ===== 操作日志时间线 ===== */
.log-timeline { padding: 16px 20px; }
.log-item { display: flex; gap: 12px; padding: 11px 0; border-bottom: 1px solid rgba(0,0,0,.05); }
.log-item:last-child { border-bottom: none; }

/* ===== 预约排班：左栏（月历/快捷/状态） + 主区（时间轴 × 医生列） ===== */
.ap-layout { display: flex; gap: 14px; align-items: flex-start; }
.ap-side { width: 300px; flex-shrink: 0; display: flex; flex-direction: column; gap: 14px; }
.ap-panel { background: var(--bg-card, #fff); border: 1px solid var(--border); border-radius: 14px; padding: 14px; }
.ap-quick { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.ap-chip { padding: 5px 12px; border-radius: 20px; background: rgba(0,0,0,.04); color: var(--text-sub); font-size: 12px; cursor: pointer; transition: all .15s; }
.ap-chip:hover { background: var(--primary-light); color: var(--primary); }
.ap-panel-title { font-weight: 700; font-size: 13px; margin: 4px 2px 8px; }
.ap-st-list { display: flex; flex-direction: column; gap: 2px; }
.ap-st { display: flex; align-items: center; justify-content: space-between; padding: 8px 10px; border-radius: 9px; cursor: pointer; transition: background .12s; }
.ap-st:hover { background: rgba(0,0,0,.035); }
.ap-st.on { background: var(--primary-light); }
.ap-st-nm { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--text-sub); }
.ap-st-nm .dot { width: 7px; height: 7px; border-radius: 50%; }
.ap-st.on .ap-st-nm { color: var(--primary); font-weight: 600; }
.ap-st-ct { font-weight: 700; font-size: 12.5px; }
.ap-st-ct.zero { color: var(--text-light); font-weight: 500; }

.ap-main { flex: 1; min-width: 0; background: var(--bg-card, #fff); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; display: flex; flex-direction: column; }
.ap-head { display: flex; border-bottom: 1px solid var(--border); flex-shrink: 0; }
.ap-gutter { width: 56px; flex-shrink: 0; border-right: 1px solid var(--border); background: rgba(0,0,0,.015); }
.ap-doc { flex: 1; min-width: 0; padding: 11px 14px; border-right: 1px solid var(--border); display: flex; align-items: center; gap: 8px; }
.ap-doc:last-child { border-right: none; }
.ap-doc.off { background: rgba(0,0,0,.02); }
.ap-ava { width: 26px; height: 26px; border-radius: 50%; background: var(--primary-light); color: var(--primary); display: grid; place-items: center; font-size: 12px; font-weight: 700; flex-shrink: 0; }
.ap-doc-nm { font-weight: 600; font-size: 13.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ap-doc.off .ap-doc-nm { color: var(--text-light); }
.ap-doc-ct { background: var(--primary-light); color: var(--primary); font-size: 11px; padding: 2px 8px; border-radius: 10px; font-weight: 600; }
.ap-doc.off .ap-doc-ct { background: rgba(0,0,0,.05); color: var(--text-light); }
.ap-off-toggle { margin-left: auto; font-size: 11px; border: 1px solid var(--border); background: none; color: var(--text-sub); border-radius: 7px; padding: 3px 8px; cursor: pointer; white-space: nowrap; }
.ap-off-toggle:hover { border-color: var(--primary); color: var(--primary); }
.ap-off-toggle.active { background: var(--danger); border-color: var(--danger); color: #fff; }

.ap-scroll { flex: 1; overflow: auto; }
.ap-grid { display: flex; align-items: flex-start; }
.ap-axis { width: 56px; flex-shrink: 0; border-right: 1px solid var(--border); background: rgba(0,0,0,.015); position: relative; }
.ap-hr { height: 40px; position: relative; }
.ap-h { position: absolute; top: 3px; left: 7px; font-size: 11px; color: var(--text-sub); }
.ap-col { flex: 1; min-width: 130px; border-right: 1px solid var(--border); position: relative; }
.ap-col:last-child { border-right: none; }
.ap-col.off { background: repeating-linear-gradient(45deg, rgba(0,0,0,.02) 0 8px, transparent 8px 16px); }
.ap-slot { position:absolute;left:0;right:0;width:100%;border:0;border-bottom:1px dashed var(--border);background:transparent;padding:0 6px;text-align:right;color:var(--primary);font-size:10px; }
.ap-slot>span { opacity:0; }
.ap-slot.clickable { cursor: pointer; transition: background .12s; }
.ap-slot.clickable:hover,.ap-slot.clickable:focus-visible { background:var(--primary-light);outline:2px solid var(--primary);outline-offset:-2px; }
.ap-slot.clickable:hover>span,.ap-slot.clickable:focus-visible>span { opacity:1; }
.ap-col.off .ap-slot { display: none; }

.ap-card { position: absolute; border-radius: 9px; padding: 3px 6px; border-left: 3px solid var(--primary); overflow: hidden; cursor: pointer; box-shadow: 0 1px 2px rgba(31,45,61,.07); z-index: 3; transition: transform .1s, box-shadow .1s; }
.ap-card:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(31,45,61,.14); z-index: 5; }
.ap-c-nm { font-weight: 700; font-size: 12.5px; line-height: 15px; display: flex; align-items: center; gap: 5px; white-space: nowrap; overflow: hidden; }
.ap-c-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ap-c-tp { font-size: 9.5px; padding: 1px 5px; border-radius: 4px; background: rgba(255,255,255,.75); font-weight: 600; flex-shrink: 0; }
.ap-c-detail { display: flex; align-items: center; gap: 6px; margin-top: 1px; }
.ap-c-pj { flex: 0 1 auto; min-width: 0; font-size: 11px; line-height: 13px; color: var(--text-sub); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ap-c-mt { font-size: 10.5px; color: var(--text-light); margin-top: 2px; display: flex; gap: 8px; }
.ap-c-ops { display: flex; flex-shrink: 0; gap: 6px; }
.ap-c-ops button { border: 0; font-size: 10.5px; line-height: 14px; font-weight: 600; color: var(--primary); background: rgba(255,255,255,.85); padding: 0 7px; border-radius: 5px; cursor: pointer; }
.ap-c-ops button:hover { background: var(--primary); color: #fff; }

@media (max-width: 900px) {
  .ap-layout { flex-direction: column; }
  .ap-side { width: 100%; }
}

/* ===== 目标管理 ===== */
.tgt-bar { height: 10px; background: rgba(0,0,0,.06); border-radius: 6px; overflow: hidden; }
.tgt-bar.big { height: 16px; border-radius: 8px; }
.tgt-bar > i { display: block; height: 100%; background: linear-gradient(90deg, var(--primary), #4aa3ff); border-radius: 6px; transition: width .4s; }
.tgt-legend { display: flex; gap: 20px; margin-top: 10px; font-size: 13px; color: var(--text-sub); flex-wrap: wrap; }
.tgt-legend b { color: var(--text); }
.tgt-strong { color: var(--danger); font-weight: 700; }
.tgt-up { color: var(--danger); font-weight: 600; }
.tgt-sub { color: var(--text-light); font-size: 12px; }
.tgt-tag { display: inline-block; font-size: 11px; padding: 1px 7px; border-radius: 8px; margin-left: 6px; font-weight: 600; }
.tgt-tag.ok { background: #e6f7ef; color: #0f9d6a; }
.tgt-tag.gap { background: #fde8e8; color: #c0392b; }
tr.tgt-total td { background: rgba(0,0,0,.02); font-weight: 700; border-top: 2px solid var(--border); }
.tgt-concl { margin: 0; padding-left: 4px; }
.tgt-concl li { margin: 9px 0 9px 16px; font-size: 13.5px; line-height: 1.6; }

/* ===== 目标管理：可编辑表单 / 达成榜 ===== */
.tgt-bar.ok > i { background: linear-gradient(90deg, #10b981, #34d399); }
.tgt-bar.warn > i { background: linear-gradient(90deg, #f59e0b, #fbbf24); }
.tgt-hint { font-size: 12px; color: var(--text-light); line-height: 1.6; margin-top: 8px; }
.tgt-hint-inline { font-size: 12px; color: var(--text-light); }
.tgt-table { width: 100%; border-collapse: collapse; }
.tgt-table td .tgt-bar { margin: 0; }
.tgt-form .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.tgt-sec { margin-top: 18px; border: 1px solid var(--border); border-radius: 10px; overflow: hidden; }
.tgt-sec-head { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px; background: rgba(0,0,0,.02); font-size: 13px; }
.tgt-edit-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.tgt-edit-table th { text-align: left; padding: 8px 10px; color: var(--text-sub); font-size: 12px; font-weight: 500; border-bottom: 1px solid var(--border); }
.tgt-edit-table td { padding: 6px 8px; border-bottom: 1px solid rgba(0,0,0,.04); }
.tgt-edit-table input { width: 100%; padding: 7px 9px; border: 1px solid var(--border); border-radius: 8px; font-size: 13px; font-family: inherit; background: #fff; }
.tgt-edit-table input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(0,113,227,.12); }
.tgt-concl-row { display: flex; gap: 8px; align-items: flex-start; padding: 6px 10px; }
.tgt-concl-row textarea { flex: 1; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; font-size: 13px; font-family: inherit; resize: vertical; }
.tgt-concl-row textarea:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(0,113,227,.12); }
#te_concl { padding-bottom: 6px; }
@media (max-width: 700px) {
  .tgt-form .form-row { grid-template-columns: 1fr; }
  .tgt-edit-table { font-size: 12px; }
  .tgt-concl-row { padding: 6px 4px; }
}

/* ===== 患者档案页（患者中心 · 顶部切换器 + 标签面板） ===== */
.pp-head { background: #fff; border: 1px solid var(--border); border-radius: 12px; padding: 10px 15px 0; margin-bottom: 12px; }
.pp-top { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.pp-name { font-size: 16.5px; font-weight: 700; }
.pp-chip { background: #f3f4f6; color: var(--text-sub); border-radius: 5px; padding: 1px 7px; font-size: 11.5px; }
.pp-chip.m { background: #e8f2ff; color: var(--primary); }
.pp-chip.f { background: #fdeef3; color: #d05078; }
.pp-meta { display: flex; gap: 15px; flex-wrap: wrap; color: var(--text-sub); font-size: 12px; padding: 6px 0 8px; border-bottom: 1px dashed var(--border); }
.pp-meta b { color: var(--text); }
/* 平铺标签（胶囊式，分组用细线分隔，紧凑不臃肿） */
.pp-tabs { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; padding: 7px 0 8px; }
.pp-tab { border: 0; background: transparent; border-radius: 12px; padding: 3px 8px; font-size: 12px; color: var(--text-sub); cursor: pointer; font-family: inherit; white-space: nowrap; line-height: 1.5; }
.pp-tab:hover { background: var(--primary-light); color: var(--primary); }
.pp-tab.on { background: var(--primary); color: #fff; font-weight: 600; }
.pp-tab .n { font-size: 10px; opacity: .65; margin-left: 2px; }
.pp-sep { width: 1px; height: 11px; background: var(--border); margin: 0 5px; flex: 0 0 1px; }

/* 待补记录提醒（到诊必须写病历 / 回访 / 咨询留痕） */
.pp-alert { background: #fff7ed; border: 1px solid #fed7aa; border-radius: 10px; padding: 10px 13px; margin-bottom: 12px; }
.pp-alert-h { font-size: 12.5px; font-weight: 700; color: #b45309; margin-bottom: 7px; }
.pp-alert-list { display: flex; flex-direction: column; gap: 5px; }
.pp-alert-i { display: flex; align-items: center; gap: 10px; font-size: 12.5px; color: #92400e; }
.pp-alert-i > span { flex: 1; }
.pp-rec.miss { border-color: #fecaca; background: #fffafa; }
.pp-rec.miss .pp-rec-h { background: #fef2f2; }
.pp-pane { display: none; }
.pp-pane.on { display: block; }
.pp-tl-day { display: flex; gap: 14px; padding: 12px 0; border-bottom: 1px dashed var(--border); }
.pp-tl-day:last-child { border-bottom: 0; }
.pp-tl-left { flex: 0 0 112px; font-size: 12px; color: var(--text-sub); }
.pp-tl-left b { display: block; color: var(--text); font-size: 13px; }
.pp-tl-right { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.pp-ev { border: 1px solid var(--border); border-radius: 8px; padding: 9px 12px; background: #fff; }
.pp-ev-h { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; flex-wrap: wrap; }
.pp-ev-h b { font-size: 12.5px; }
.pp-ev-b { font-size: 12.5px; color: var(--text-sub); display: flex; gap: 16px; flex-wrap: wrap; }
.pp-ev-b i { font-style: normal; color: var(--text-light); }
.pp-rec { border: 1px solid var(--border); border-radius: 9px; margin-bottom: 10px; overflow: hidden; }
.pp-rec-h { display: flex; align-items: center; gap: 9px; padding: 8px 12px; background: #fafbfc; border-bottom: 1px solid var(--border); flex-wrap: wrap; }
.pp-rec-h .t { font-weight: 700; font-size: 12.5px; }
.pp-rec-b { padding: 10px 12px; }
.pp-rec-b .line { display: flex; gap: 8px; font-size: 12.5px; color: var(--text-sub); padding: 2px 0; }
.pp-rec-b .line i { font-style: normal; color: var(--text-light); flex: 0 0 auto; }
.pp-fee { margin-top: 8px; background: #fbfcfd; border: 1px dashed var(--border); border-radius: 8px; padding: 8px 10px; }
.pp-fee .sum { display: flex; gap: 20px; flex-wrap: wrap; font-size: 12.5px; padding-top: 6px; border-top: 1px dashed var(--border); margin-top: 6px; }
.pp-empty { padding: 30px 10px; text-align: center; color: var(--text-light); font-size: 12.5px; }
.pp-thumbs { display: flex; gap: 10px; flex-wrap: wrap; }
.pp-thumb { width: 96px; }
.pp-thumb .im { width: 96px; height: 70px; border: 1px solid var(--border); border-radius: 8px; display: grid; place-items: center; background: #fafbfc; font-size: 20px; overflow: hidden; }
.pp-thumb .im img { width: 100%; height: 100%; object-fit: cover; }
.pp-thumb .cap { font-size: 11.5px; color: var(--text-light); margin-top: 4px; text-align: center; }
@media (max-width: 900px) {
  .pp-tl-day { flex-direction: column; gap: 6px; }
}

/* ===== 第一道门：门店确认 ===== */
.auth-gate { display: flex; align-items: center; justify-content: center; gap: 8px; background: var(--primary-light); color: var(--primary); border-radius: 8px; padding: 6px 10px; font-size: 12.5px; margin-bottom: 10px; }
.auth-gate .ag-name { font-weight: 600; }
.auth-gate .ag-switch { color: var(--primary); cursor: pointer; text-decoration: underline; font-size: 12px; white-space: nowrap; }
.log-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--primary); margin-top: 6px; flex-shrink: 0; }
.log-body { flex: 1; min-width: 0; }
.log-line { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.log-action { font-weight: 600; font-size: 13px; color: var(--text); }
.log-time { font-size: 12px; color: var(--text-light); white-space: nowrap; }
.log-detail { font-size: 13px; color: var(--text-sub); margin-top: 2px; }
.log-operator { font-size: 12px; color: var(--text-light); margin-top: 2px; }

/* ===== RBAC 角色与权限 ===== */
.rbac-layout { display: flex; gap: 14px; align-items: flex-start; }
.rbac-side { width: 250px; flex: 0 0 250px; }
.rbac-main { flex: 1; min-width: 0; }
.rbac-list { padding: 6px; }
.rbac-item { padding: 9px 11px 9px 26px; border-radius: 8px; cursor: pointer; margin-bottom: 2px; position: relative; }
.rbac-item:hover { background: #f6f8fa; }
.rbac-item.on { background: var(--primary-light); }
.rbac-item .dot { position: absolute; left: 11px; top: 15px; width: 8px; height: 8px; border-radius: 50%; }
.rbac-item .nm { font-size: 13.5px; font-weight: 600; display: flex; align-items: center; gap: 6px; }
.rbac-item .ds { font-size: 11.5px; color: var(--text-light); margin-top: 2px; line-height: 1.4; }
.rbac-sys { font-size: 10.5px; background: #eef2f6; color: #64748b; border-radius: 4px; padding: 0 5px; font-weight: 400; }
.rbac-acts { display: flex; gap: 8px; }
.rbac-form { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.rbac-form .field.full { grid-column: 1 / -1; }
.rbac-form label { font-size: 12.5px; color: var(--text-sub); display: block; margin-bottom: 4px; }
.rbac-form input, .rbac-form select { width: 100%; }
.rbac-matrix { width: 100%; border-collapse: collapse; font-size: 13px; }
.rbac-matrix th { font-size: 12px; color: var(--text-sub); font-weight: 500; text-align: center; padding: 7px 6px; border-bottom: 1px solid var(--border); background: #fafbfc; }
.rbac-matrix th:first-child { text-align: left; }
.rbac-matrix td { padding: 6px; border-bottom: 1px solid #f1f3f5; }
.rbac-matrix td.l { font-size: 13px; }
.rbac-matrix td.ct { text-align: center; width: 72px; }
.rbac-grp td { background: #f8f9fb; font-size: 11.5px; color: var(--text-light); padding: 5px 8px; letter-spacing: .5px; }
.rbac-cb { display: inline-flex; align-items: center; justify-content: center; cursor: pointer; }
.rbac-cb.dis { cursor: not-allowed; opacity: .35; }
.rbac-cb input { width: 15px; height: 15px; accent-color: var(--primary); cursor: pointer; }
.rbac-cb.dis input { cursor: not-allowed; }
.rbac-sub { font-size: 13px; font-weight: 600; margin: 16px 0 8px; padding-top: 12px; border-top: 1px solid var(--border); }
.rbac-extras { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; }
.rbac-ex { display: flex; align-items: flex-start; gap: 8px; border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; cursor: pointer; }
.rbac-ex:hover { border-color: var(--primary); }
.rbac-ex.dis { opacity: .55; cursor: not-allowed; }
.rbac-ex input { margin-top: 2px; accent-color: var(--primary); }
.rbac-ex .tx b { display: block; font-size: 12.5px; font-weight: 600; }
.rbac-ex .tx i { display: block; font-style: normal; font-size: 11.5px; color: var(--text-light); line-height: 1.4; }
@media (max-width: 900px) {
  .rbac-layout { flex-direction: column; }
  .rbac-side { width: 100%; flex: 1 1 auto; }
  .rbac-form { grid-template-columns: 1fr; }
}

/* ===== 手机端布局修复（≤768px）=====
   根因：纵向 flex 布局里 .main 缺 min-height:0，会被内容撑高，
   把底部导航挤出屏幕（y > 视口高度），同时 overflow:hidden 裁掉内容且无法滚动。
   这里重建高度链：body 固定视口高度 → .app 占满 → .main 可压缩 → .content 内部滚动。 */
@media (max-width: 768px) {
  html, body { height: 100%; max-height: 100%; min-height: 0; overflow: hidden; }
  body > .app {
    height: auto; min-height: 0; flex: 1 1 auto; overflow: hidden;
    /* 底部安全区：导航不再贴到 home 指示条上 */
    padding-bottom: env(safe-area-inset-bottom);
  }
  body > .app > .main { flex: 1 1 auto; min-height: 0; overflow: hidden; }
  body > .app > .main > .content {
    flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch;
    padding: 12px; overscroll-behavior: contain;
  }
  body > .app > .sidebar { flex: 0 0 56px; height: 56px; }
  /* 底部导航可横滑（14 个模块，滑动查看），隐藏滚动条 */
  .nav { scrollbar-width: none; -webkit-overflow-scrolling: touch; }
  .nav::-webkit-scrollbar { display: none; }
  .nav-item { padding: 0 10px; font-size: 12.5px; }
  /* 顶栏精简：窄屏下邮箱省略、按钮紧凑 */
  .topbar { padding: 0 12px; gap: 8px; }
  .topbar-right { gap: 8px; min-width: 0; }
  .topbar-user { max-width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .btn-sm { padding: 6px 10px; font-size: 12px; }
  /* 患者档案：13 个标签在手机上单行横滑，不再折成 3 行（原来占 143px 高） */
  .pp-tabs {
    flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch;
    scrollbar-width: none; padding: 6px 0 8px;
  }
  .pp-tabs::-webkit-scrollbar { display: none; }
  .pp-tab { flex: 0 0 auto; }
  .pp-sep { flex: 0 0 1px; }
  .pp-top { gap: 7px; }
  .pp-name { font-size: 15.5px; }
  .pp-meta { gap: 10px; font-size: 12px; padding: 6px 0 8px; }
  .pp-alert { font-size: 12.5px; }
  /* 目标/权限等宽表：容器内横滑，不撑破页面 */
  #rbacMatrix { display: block; overflow-x: auto; white-space: nowrap; }
  #rbacMatrix th, #rbacMatrix td { white-space: nowrap; }
  .tgt-bar.big { height: 10px; }
  .tgt-legend { font-size: 12px; gap: 10px; }
}

@media print {body>* {visibility:hidden} #modalMask, #modalMask * {visibility:visible} #modalMask {position:absolute;inset:0;background:white;display:block} #modalBox {max-width:100%;width:100%;max-height:none;box-shadow:none} #modalBox .modal-body {max-height:none;overflow:visible} #modalBox .modal-foot,#modalBox .modal-close {display:none} }

/* Source confirmations keep the patient's unfinished form intact. */
.channel-confirm { margin:auto; border:1px solid var(--border); border-radius:20px; padding:24px; width:420px; max-width:92vw; color:var(--text); background:var(--card); box-shadow:var(--shadow-lg); }
.channel-confirm::backdrop { background:rgba(0,0,0,.4); }
.channel-confirm p { margin:16px 0 24px; line-height:1.7; }
.channel-confirm form { display:flex; justify-content:flex-end; gap:10px; }
.acquisition-picker > small { display:block; margin:8px 0; color:var(--text-sub); }
#ccFields label { margin-top:10px; }

/* Dense clinic schedule: expand the calendar only when needed. */
.ap-side[hidden] { display:none; }
.ap-date-label { display:flex;align-items:center;gap:6px;color:var(--text-sub);font-size:12px; }
.ap-date-label input { width:145px; }
.ap-compact .ap-side { width:220px; }
.ap-compact .ap-doc { padding:7px 6px;gap:4px;flex-wrap:wrap;align-content:center; }
.ap-compact .ap-ava { display:none; }
.ap-compact .ap-doc-nm { font-size:12px; }
.ap-compact .ap-doc-ct { padding:1px 5px; }
.ap-compact .ap-off-toggle { margin-left:0;padding:1px 4px;font-size:10px; }
.ap-compact .ap-card { padding:3px 4px;border-radius:5px; }
.ap-compact .ap-c-name { font-size:12px;line-height:17px;font-weight:650;white-space:nowrap; }
.ap-c-brief { display:flex;justify-content:space-between;gap:3px;font-size:10px;line-height:15px;white-space:nowrap;color:var(--text-sub); }
.ap-card:focus-visible { outline:2px solid var(--primary);outline-offset:1px; }
.ap-board-tools { padding:10px 12px;border-bottom:1px solid var(--border);background:var(--card); }
.ap-status-strip { display:flex;gap:6px;overflow-x:auto; }
.ap-status-strip .ap-st { flex:0 0 auto;border:1px solid var(--border);border-radius:7px;background:transparent;font:inherit;font-size:12px;gap:8px;padding:5px 8px;margin:0; }
.ap-status-strip .ap-st.on { background:var(--primary-light);border-color:var(--primary); }
.ap-board-help { position:relative;font-size:12px;line-height:1.6;color:var(--text-sub);margin:8px 0 0; }
#apDragStatus:not(:empty) { position:absolute;inset:0;display:block;background:var(--card);font-weight:600;color:var(--primary); }
.ap-scroll { max-height:max(280px,calc(100dvh - 330px));overscroll-behavior:contain;scrollbar-gutter:stable; }
.ap-can-reschedule .ap-c-name { padding-right:25px; }
.ap-move-handle { position:absolute;top:1px;right:2px;width:24px;height:18px;border:1px solid var(--primary);border-radius:5px;background:var(--card);color:var(--primary);font-size:15px;line-height:1;cursor:grab;touch-action:none; }
.ap-move-handle:focus-visible { outline:2px solid var(--primary);outline-offset:2px; }
.ap-drop-guide { position:absolute;left:0;right:0;border-top:2px dashed var(--primary);pointer-events:none;z-index:10; }
.ap-movable { cursor:grab;user-select:none; }
.ap-card.ap-dragging { cursor:grabbing;z-index:12;overflow:visible;transform:none;outline:2px solid var(--primary);opacity:.9;transition:none; }
.ap-dragging::after { content:attr(data-drag-time);position:absolute;left:0;bottom:calc(100% + 5px);min-width:max-content;padding:5px 8px;border-radius:5px;background:var(--primary);color:#fff;font-size:12px;box-shadow:var(--shadow);pointer-events:none; }
.ap-card.ap-drag-invalid { outline-color:var(--danger); }
.ap-drag-invalid::after { background:var(--danger); }
.ap-hover { position:fixed;z-index:900;width:min(320px,calc(100vw - 16px));max-height:calc(100vh - 16px);overflow:auto;padding:16px;background:var(--card);color:var(--text);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.2); }
.ap-hover-name { display:block;font-size:17px;margin-bottom:10px;overflow-wrap:anywhere; }
.ap-hover dl { margin:0;display:grid;gap:8px;font-size:12px;line-height:1.55; }
.ap-hover dl>div { display:grid;grid-template-columns:34px minmax(0,1fr);gap:8px; }
.ap-hover dt { color:var(--text-sub); }
.ap-hover dd { margin:0;overflow-wrap:anywhere;white-space:pre-wrap; }
.ap-hover p,.ap-move-note { color:var(--text-sub);font-size:12px;line-height:1.6; }
.ap-hover p { margin:12px 0 0;padding-top:10px;border-top:1px solid var(--border); }
.ap-move-fields { display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:18px 0; }
.ap-move-fields label { display:grid;gap:6px;font-size:13px;color:var(--text-sub);min-width:0; }
.ap-move-fields input { width:100%;min-width:0; }
.ap-move-result { padding:14px;background:var(--primary-light);border-radius:8px;line-height:1.8; }
.ap-move-result strong { white-space:nowrap;font-size:17px;margin-left:8px; }
.ap-move-error { color:var(--danger);font-size:13px; }
.ap-move-overlap { padding:10px 12px;border-left:3px solid var(--warning,#e9a23b);background:var(--primary-light);font-size:13px;line-height:1.6; }
@media(max-width:480px){.ap-move-fields{grid-template-columns:1fr}.ap-board-tools{padding:8px}.ap-move-result strong{display:block;margin-left:0}.ap-hover{max-height:55dvh}}
.ap-head { position:sticky;top:0;z-index:8;background:var(--card); }
.ap-axis,.ap-gutter { position:sticky;left:0;z-index:6;background:var(--card); }
.ap-gutter { z-index:9; }
@media(max-width:900px){.ap-compact .ap-side{width:100%}}

/* Patient filters and consultant trees share compact, readable controls. */
.patient-filters { padding:16px;margin-bottom:16px; }
.patient-filter-grid { display:grid;grid-template-columns:repeat(auto-fit,minmax(165px,1fr));gap:12px; }
.patient-filter-grid label,.patient-tag-heading label { display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--text-sub); }
.patient-filter-grid input,.patient-filter-grid select { width:100%;min-width:0; }
.patient-filter-actions { display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:14px;font-size:12px;color:var(--text-sub); }
.patient-filter-actions .btn { padding:6px 12px; }
.patient-tag-heading { display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;padding-top:14px;border-top:1px solid var(--border); }
.patient-tag-options { display:flex;flex-wrap:wrap;gap:7px;margin-top:10px; }
.patient-tag-options label { display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);padding:6px 9px;border-radius:7px;font-size:12px;background:var(--card);cursor:pointer; }
.patient-tag-options input { width:auto;accent-color:var(--primary); }
.patient-tag-options label:has(input:checked) { background:var(--primary-light);border-color:var(--primary);color:var(--primary); }
.patient-filter-note { font-size:12px;line-height:1.7;color:var(--text-sub);margin:12px 0; }
.patient-auto-tag { display:inline-block;background:var(--primary-light);color:var(--primary);border-radius:5px;padding:3px 6px;font-size:11px;margin:2px;white-space:nowrap; }
.patient-link { padding:0;border:0;background:none;color:var(--primary);cursor:pointer;text-align:left;font-weight:650;font-size:13px; }
.patient-link:hover { text-decoration:underline; }
.patient-results { overflow-x:auto; }
.patient-results td { vertical-align:top; }
.patient-results small,.consultant-board small { display:block;margin-top:4px;color:var(--text-sub);font-size:11px; }
.patient-results .patient-source,.patient-results .patient-tags { white-space:normal;min-width:140px;max-width:230px; }
.patient-pagination { display:flex;gap:14px;align-items:center;justify-content:center;margin-top:16px;font-size:12px; }
.patient-result-count { font-size:13px;color:var(--text-sub); }
#patientFilterMessage { color:var(--danger); }
.ct-tree { display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:14px;align-items:start; }
.ct-person { border:1px solid var(--border);border-radius:10px;background:var(--card);overflow:hidden; }
.ct-person>summary { padding:15px;cursor:pointer;color:var(--primary);background:var(--primary-light); }
.ct-person>summary>span { float:right;font-size:11px;margin-top:3px;color:var(--text-sub); }
.ct-branches { padding:8px 12px 12px 22px; }
.ct-branch { border-left:2px solid var(--border);padding-left:12px; }
.ct-branch>summary { display:flex;justify-content:space-between;gap:8px;padding:10px 2px;cursor:pointer;font-size:12px;position:relative; }
.ct-branch>summary::before { content:'▸';position:absolute;left:-14px;color:var(--text-sub);background:var(--card); }
.ct-branch[open]>summary::before { content:'▾'; }
.ct-branch>summary span:last-child { color:var(--text-sub);font-size:11px; }
.ct-list { max-height:280px;overflow:auto;border-top:1px solid var(--border); }
.ct-patient { display:flex;gap:10px;align-items:center;justify-content:space-between;padding:10px 4px;border-bottom:1px solid var(--border); }
.ct-patient>div { min-width:0; }
.ct-patient p { margin:4px 0;font-size:12px;line-height:1.5;overflow-wrap:anywhere; }
.ct-patient>.btn { flex-shrink:0; }
.ct-empty { margin:12px 0;font-size:12px;color:var(--text-sub); }
@media(max-width:640px){.ct-tree{grid-template-columns:1fr}.patient-filter-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.ct-person>summary>span{float:none;display:block;margin-left:14px}}

/* Reference-style appointment sheet: patient, daily board, project checklist. */
.clinic-workspace .modal.appointment-modal { width:1460px;max-width:calc(100vw - 32px);height:min(900px,calc(100dvh - 32px));max-height:calc(100dvh - 32px);border-radius:8px;display:flex;flex-direction:column;overflow:hidden; }
.appointment-modal .modal-head { padding:12px 16px;flex-shrink:0; }
.appointment-modal .modal-title { font-size:15px; }
.appointment-modal .modal-body { padding:0;flex:1;min-height:0;overflow:hidden; }
.appointment-modal .modal-foot { padding:10px 16px;flex-shrink:0;border-top:1px solid var(--border);background:var(--card);display:flex;align-items:center;gap:8px; }
.booking-columns { display:grid;grid-template-columns:290px minmax(360px,1fr) 250px;height:100%;min-height:0; }
.booking-left,.booking-right { min-width:0;overflow-y:auto;overscroll-behavior:contain;padding:12px 16px; }
.booking-left { border-right:1px solid var(--border); }
.appointment-modal h3 { font-size:13px;font-weight:600;line-height:1.25;margin:0 0 12px;padding-left:7px;border-left:3px solid #03afc8; }
.booking-fields { display:grid;grid-template-columns:1fr 1fr;gap:10px; }
.appointment-modal .field { min-width:0;margin:0;gap:5px; }
.appointment-modal .field[hidden] { display:none; }
.booking-wide { grid-column:1/-1; }
.appointment-modal .field label { font-size:12px;margin:0 0 5px;line-height:1.4;display:block; }
.clinic-workspace .appointment-modal input:not([type=checkbox]),.clinic-workspace .appointment-modal select,.clinic-workspace .appointment-modal textarea { width:100%;min-width:0;padding:7px 9px;font-size:12px;border-radius:4px;min-height:32px; }
.appointment-modal input[readonly] { background:var(--control);color:var(--text-sub); }
.booking-patient-search,.booking-duration,.booking-source-row { display:flex;gap:6px;align-items:center; }
.booking-patient-search .patient-picker { flex:1;min-width:0; }
.clinic-workspace .appointment-modal .btn { min-height:32px;height:auto;padding:6px 12px;font-size:12px;border-radius:4px;white-space:nowrap; }
.booking-patient-summary { margin:8px 0 16px;font-size:12px;line-height:1.8; }
.booking-patient-summary>div { display:flex;gap:4px; }
.booking-patient-summary>div>span:first-child { flex-shrink:0; }
.booking-patient-summary>div>span:last-child { overflow-wrap:anywhere;color:var(--text-sub); }
.booking-segments { display:flex;height:32px; }
.booking-segments button { flex:1;background:var(--card);border:1px solid var(--border);color:var(--text-sub);font-size:12px;cursor:pointer; }
.booking-segments button:first-child { border-radius:4px 0 0 4px; }
.booking-segments button:last-child { border-radius:0 4px 4px 0; }
.booking-segments button.active { border-color:#03afc8;color:#009bb3;background:var(--primary-light); }
.booking-fields small,.booking-hint { display:block;font-size:11px;color:var(--text-sub);line-height:1.6;margin:4px 0 0; }
.booking-source-row select { flex:0 0 112px; }
.booking-new-patient { margin-bottom:14px;padding:10px;background:var(--control);border-radius:4px; }
.booking-new-patient .acquisition-picker { margin-top:10px; }
.booking-new-patient .form-grid { grid-template-columns:1fr 1fr; }
.booking-new-patient>.btn { margin-top:10px; }
.booking-save-hint { margin-right:auto;color:var(--text-sub);font-size:11px; }
.booking-right>h3 { margin-bottom:12px; }
#apc_project_count { font-size:11px;color:var(--text-sub);margin:9px 0; }
.booking-project-group { border-bottom:1px solid var(--border);padding:8px 0; }
.booking-project-group>summary { cursor:pointer;list-style:none;display:flex;justify-content:space-between;font-size:12px;line-height:1.5;margin-bottom:8px; }
.booking-project-group>summary::-webkit-details-marker { display:none; }
.booking-project-group>summary::after { content:'⌄';color:var(--text-sub); }
.booking-project-group:not([open])>summary::after { content:'›'; }
.booking-project-group>div { display:grid;grid-template-columns:1fr 1fr;gap:9px 10px; }
.booking-project-group label { display:flex;gap:6px;align-items:flex-start;min-width:0;font-size:12px;cursor:pointer;line-height:1.35; }
.clinic-workspace .booking-project-group input { width:13px;height:13px;min-height:0;margin:2px 0 0;padding:0;accent-color:#03afc8;flex-shrink:0; }
.booking-project-group label small { display:block;color:var(--text-sub);font-size:10px;margin-top:2px; }
.booking-board { display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--card);border-right:1px solid var(--border); }
.booking-board>header { padding:14px 16px 0; }
.booking-board>header h3 { margin-bottom:7px; }
.booking-board>header p { font-size:12px;color:var(--text-sub);margin:0;line-height:1.6; }
.booking-board-toolbar { display:flex;align-items:flex-end;gap:6px;padding:12px 16px; }
.booking-board-toolbar .field { flex:1;max-width:190px; }
.booking-day-scope { display:flex;align-items:center;gap:4px;white-space:nowrap;font-size:11px;color:var(--text-sub);min-height:32px; }
.booking-day-scope input { accent-color:var(--primary); }
.booking-selection { padding:10px 16px;background:var(--primary-light);color:var(--primary);font-size:12px;line-height:1.6;border-top:1px solid var(--border);border-bottom:1px solid var(--border);min-height:40px; }
.booking-selection.warning { color:var(--danger); }
.booking-board-scroll { flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;position:relative; }
.booking-board-grid { display:grid;min-width:100%;width:max-content;align-items:start; }
.booking-board-corner,.booking-doctor-head { position:sticky;top:0;z-index:6;height:54px;background:var(--card);border-bottom:1px solid var(--border);border-right:1px solid var(--border);display:flex;flex-direction:column;justify-content:center;gap:3px;padding:5px 10px; }
.booking-board-corner { left:0;z-index:7;font-size:11px;color:var(--text-sub); }
.booking-doctor-head strong { font-size:12px; }
.booking-doctor-head small { font-size:10px;color:var(--text-sub); }
.booking-doctor-head.selected { box-shadow:inset 0 3px var(--primary); }
.booking-time-axis { position:sticky;left:0;z-index:5;background:var(--card);border-right:1px solid var(--border); }
.booking-time-axis>div { font-size:10px;color:var(--text-sub);padding:4px 5px;border-bottom:1px solid var(--border); }
.booking-doctor-day { position:relative;border-right:1px solid var(--border); }
.booking-doctor-day.off { background:repeating-linear-gradient(45deg,transparent 0 8px,var(--control) 8px 16px); }
.booking-time-slot { position:absolute;left:0;width:100%;padding:0 5px;border:0;border-bottom:1px dashed var(--border);background:transparent;text-align:right;color:var(--primary);cursor:pointer;font-size:10px; }
.booking-time-slot span { opacity:0; }
.booking-time-slot:hover,.booking-time-slot:focus-visible { background:var(--primary-light);outline:2px solid var(--primary);outline-offset:-2px;z-index:4; }
.booking-time-slot:hover span,.booking-time-slot:focus-visible span { opacity:1; }
.booking-time-slot:disabled { cursor:not-allowed; }
.booking-time-slot:disabled:hover { outline:0;background:transparent; }
.booking-time-slot:disabled span { display:none; }
.booking-busy { position:absolute;z-index:2;border:1px solid var(--border);border-left:3px solid var(--primary);background:var(--control);border-radius:4px;padding:3px 5px;font-size:11px;line-height:1.4;overflow:hidden; }
.booking-busy strong,.booking-busy span,.booking-busy small { display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis; }
.booking-busy span,.booking-busy small { color:var(--text-sub);font-size:10px; }
.booking-time-selection { position:absolute;z-index:3;inset-inline:0;pointer-events:none;border:2px solid var(--primary);border-radius:4px;box-shadow:inset -20px 0 var(--primary-light); }
.booking-time-selection>span { position:absolute;top:0;left:0;background:var(--primary);color:#fff;padding:1px 5px;font-size:10px;line-height:16px;border-radius:0 0 3px 0; }
.booking-board-legend { display:flex;flex-wrap:wrap;gap:6px 12px;padding:10px 12px;font-size:10px;color:var(--text-sub);border-top:1px solid var(--border); }
.booking-board-legend span { display:flex;align-items:center;gap:4px; }
.booking-board-legend i { display:inline-block;width:10px;height:10px;border-radius:2px; }
.booking-legend-selected { background:var(--primary); }.booking-legend-busy { background:var(--control);border:1px solid var(--border); }
.booking-board-empty { padding:48px 20px;text-align:center;font-size:13px;line-height:1.8;color:var(--text-sub); }
@media(max-width:1100px){.booking-columns{grid-template-columns:260px minmax(300px,1fr) 210px}.booking-left,.booking-right{padding:12px}.booking-project-group>div{grid-template-columns:1fr}}
@media(max-width:850px){.booking-columns{grid-template-columns:1fr;overflow-y:auto}.booking-left,.booking-right{overflow:visible}.booking-left{border-right:0;border-bottom:1px solid var(--border)}.booking-board{height:540px;min-height:540px;border-right:0;border-bottom:1px solid var(--border)}.booking-project-group>div{grid-template-columns:1fr 1fr}.booking-right{padding-bottom:20px}}
@media(max-width:600px){.clinic-workspace .modal.appointment-modal{max-width:100vw;width:100vw;height:100dvh;max-height:100dvh;border-radius:0}.booking-left,.booking-right{padding:10px}.booking-fields{gap:8px}.booking-source-row{flex-wrap:wrap}.booking-source-row select{flex-basis:100%}.booking-project-group>div{column-gap:5px}.booking-save-hint{max-width:45%}}
@media(max-width:420px){.booking-columns{grid-template-columns:1fr;overflow:auto}.booking-left,.booking-right{overflow:visible}.booking-left{border-right:0;border-bottom:1px solid var(--border)}}

/* Weekly doctor schedules keep every day and empty time slot visible. */
.ap-week-nav { display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 12px;flex-wrap:wrap; }
.ap-week-nav strong { font-size:14px; }
.ap-doc.ap-today { box-shadow:inset 0 3px var(--primary); }
.consultant-booking-table { min-width:960px; }
.consultant-booking-table td { vertical-align:top; }
.consultant-booking-table small { display:block;margin-top:5px;color:var(--text-sub);max-width:220px;overflow-wrap:anywhere; }
.consultant-booking-table td:last-child .btn { display:block;margin-bottom:6px; }
.work-search > .patient-filters:first-child { margin-bottom:8px; }

/* 来源渠道：按层级维护，每一级分别展示内外部联系人。 */
.channel-directory { overflow:hidden; }
.channel-directory .btn:not(.btn-primary) { background:var(--card); color:var(--primary); border-color:var(--border); }
.channel-heading { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:16px; padding:24px; border-bottom:1px solid var(--border); }
.channel-heading h2 { margin:0 0 8px; font-size:20px; }
.channel-heading p { color:var(--text-sub); line-height:1.6; }
.channel-heading-actions,.channel-filters { display:flex; align-items:center; flex-wrap:wrap; gap:10px; }
.channel-filters { padding:18px 24px; }
.channel-filters label { display:flex; align-items:center; gap:10px; }
.channel-filters select { width:140px; }
.channel-filters input { width:230px; max-width:100%; }
.channel-table-wrap { overflow-x:auto; }
.channel-tree-table { min-width:1080px; width:100%; }
.channel-tree-table th { white-space:nowrap; }
.channel-tree-table td { padding:18px 14px; vertical-align:middle; }
.channel-tree-table th:last-child,.channel-tree-table td:last-child { position:sticky; right:0; background:var(--card); border-left:1px solid var(--border); z-index:1; }
.channel-tree-table tr[data-level="2"] { background:color-mix(in srgb,var(--primary) 3%,var(--card)); }
.channel-tree-table tr[data-level="3"] { background:color-mix(in srgb,var(--primary) 6%,var(--card)); }
.channel-tree-name { display:flex; align-items:center; gap:8px; min-width:210px; }
.channel-tree-name strong { max-width:180px; white-space:normal; overflow-wrap:anywhere; }
.channel-tree-name small { white-space:nowrap; color:var(--text-sub); }
.channel-expand,.channel-tree-spacer { width:24px; flex:0 0 24px; }
.channel-expand { height:32px; border:0; background:transparent; color:var(--primary); font-size:20px; cursor:pointer; }
.channel-contact-link { display:grid; gap:7px; width:160px; max-width:180px; padding:10px 12px; border:1px solid var(--border); border-radius:8px; background:color-mix(in srgb,var(--primary) 3%,var(--card)); color:var(--text); font:inherit; text-align:left; cursor:pointer; }
.channel-contact-link:hover { border-color:var(--primary); }
.channel-contact-link small { display:block; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; color:var(--text-sub); }
.channel-status { display:inline-block; padding:4px 10px; border-radius:20px; white-space:nowrap; }
.channel-status.active { color:var(--primary); background:var(--primary-light); }
.channel-status.disabled { color:var(--text-sub); background:var(--bg); }
.channel-tree-table td>small { display:block; margin-top:6px; color:var(--text-sub); }
.channel-created { min-width:155px; white-space:normal; }
.channel-note { max-width:200px; min-width:70px; white-space:normal; overflow-wrap:anywhere; }
.channel-actions { display:flex; flex-direction:column; align-items:center; gap:8px; min-width:140px; }
.channel-actions>.btn { min-width:128px; border-color:var(--border); color:var(--primary); background:var(--card); }
.channel-move { display:flex; gap:8px; }
.channel-move .btn { border-color:var(--border); color:var(--primary); background:var(--card); }
.channel-move .btn:disabled { opacity:.35; cursor:not-allowed; }
.channel-contact-tabs { display:flex; gap:18px; margin:18px 0; border-bottom:1px solid var(--border); }
.channel-contact-tabs button { border:0; border-bottom:3px solid transparent; padding:12px 8px; font:inherit; color:var(--text-sub); background:transparent; cursor:pointer; }
.channel-contact-tabs button[aria-selected="true"] { color:var(--primary); border-color:var(--primary); font-weight:600; }
.channel-contact-fields { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:16px; }
.channel-add { margin:16px 0; }
.channel-people-table { overflow-x:auto; margin-top:20px; }
.channel-contact-path { overflow-wrap:anywhere; line-height:1.6; }
@media(max-width:720px) { .channel-heading,.channel-filters { padding:16px; } .channel-heading-actions { width:100%; } .channel-contact-fields { grid-template-columns:1fr; } }

.clinic-profile{position:relative}.clinic-profile>summary{display:flex;align-items:center;gap:8px;cursor:pointer;list-style:none}.clinic-profile>summary::-webkit-details-marker{display:none}.clinic-profile-menu{position:absolute;top:calc(100% + 12px);right:0;min-width:150px;padding:8px;background:var(--card,#fff);color:var(--text,#334155);border:1px solid var(--border,#e2e8f0);border-radius:8px;box-shadow:0 8px 24px #10203120;z-index:40}.clinic-profile-menu a{display:block;padding:10px 14px;white-space:nowrap;color:inherit;text-decoration:none}.clinic-profile-menu a:hover{background:#e8f5f2;color:#168678;border-radius:5px}.clinic-profile-menu span{font-size:12px;white-space:nowrap}

/* Appointment personnel filters keep the selected-day lanes in view. */
.ap-person-picker { display:flex;gap:8px;flex-wrap:wrap;margin:0 0 14px; }
.ap-person-name { border:0;background:none;color:inherit;padding:0;cursor:pointer;text-align:left; }
.ap-person-name:hover { color:var(--primary); }
.ap-person-name:focus-visible { outline:2px solid var(--primary);outline-offset:3px; }
