/* ===== 基础 ===== */
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f6f5; color: #222; font-size: 14px; }
a { text-decoration: none; color: inherit; }
button { font-family: inherit; cursor: pointer; border: none; }
input, select, textarea { font-family: inherit; font-size: 14px; }

/* ===== 登录页 ===== */
.login-body { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: #1f7a46; padding: 20px; }
.login-card { width: 100%; max-width: 380px; background: #fff; border-radius: 16px; padding: 40px 32px 32px; text-align: center; }
.login-logo { font-size: 44px; }
.login-title { font-size: 20px; font-weight: 600; margin-top: 10px; }
.login-sub { font-size: 13px; color: #999; margin-top: 6px; }
.login-form { margin-top: 28px; text-align: left; }
.lf-label { display: block; font-size: 13px; color: #666; margin: 14px 0 6px; }
.lf-input { width: 100%; height: 44px; border: 1px solid #e3e5e4; border-radius: 10px; padding: 0 14px; outline: none; }
.lf-input:focus { border-color: #1f9d55; }
.lf-btn { width: 100%; height: 46px; margin-top: 24px; background: #1f9d55; color: #fff; font-size: 16px; border-radius: 23px; }
.login-tip { text-align: center; font-size: 12px; color: #aaa; margin-top: 14px; }

/* ===== 布局：PC 左侧菜单 + 主区 =====
   🔴 2026-10-09 用户澄清：主菜单**保持左侧竖排**（原有形态，不要改成顶部）。
   要固定的是球场管理页内部的筛选/搜索工具栏，见文件末尾「球场工具栏吸顶」小节。 */
.side { position: fixed; left: 0; top: 0; bottom: 0; width: 220px; background: #14352b; color: #cfe3d8; display: flex; flex-direction: column; z-index: 20; }
.side-logo { padding: 22px 20px; font-size: 17px; font-weight: 600; color: #fff; }
.side-logo span { display: block; font-size: 11px; font-weight: 400; color: #7fae9a; margin-top: 4px; }
.side-nav { flex: 1; overflow-y: auto; padding: 6px 12px; }
.nav-group { font-size: 11px; color: #6d9484; padding: 16px 10px 6px; }
.nav-item { display: flex; align-items: center; gap: 10px; padding: 11px 12px; border-radius: 8px; font-size: 14px; color: #cfe3d8; margin-bottom: 2px; cursor: pointer; }
.nav-item:hover { background: rgba(255,255,255,.06); }
.nav-item.on { background: #1f9d55; color: #fff; }
.side-foot { padding: 16px 20px; border-top: 1px solid rgba(255,255,255,.08); font-size: 13px; }
.side-out { display: block; color: #7fae9a; font-size: 12px; margin-top: 8px; }

.main { margin-left: 220px; min-height: 100vh; }
.topbar { height: 56px; background: #fff; border-bottom: 1px solid #e8eae9; display: flex; align-items: center; justify-content: space-between; padding: 0 24px; position: sticky; top: 0; z-index: 10; }
.top-title { font-size: 16px; font-weight: 600; }
.top-right { display: flex; align-items: center; gap: 14px; font-size: 13px; color: #666; }
.top-badge { font-size: 11px; color: #b8741a; background: #fdf3e0; border-radius: 10px; padding: 3px 10px; }
.view { padding: 24px; }

/* ===== 手机适配 ===== */
.tabbar { display: none; }
.sheet-mask { display: none; }
@media (max-width: 768px) {
  .side { display: none; }
  .main { margin-left: 0; padding-bottom: 64px; }
  .view { padding: 14px; }
  .top-badge { display: none; }
  .tabbar { display: flex; position: fixed; left: 0; right: 0; bottom: 0; height: 56px; background: #fff; border-top: 1px solid #e8eae9; z-index: 30; padding-bottom: env(safe-area-inset-bottom); }
  .tab-item { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: 11px; color: #888; gap: 2px; }
  .tab-item.on { color: #1f9d55; }
  .tab-item .ti { font-size: 20px; }
  .sheet-mask { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: 40; }
  .sheet-mask.show { display: flex; align-items: flex-end; }
  .sheet { width: 100%; background: #fff; border-radius: 16px 16px 0 0; padding: 18px 18px calc(20px + env(safe-area-inset-bottom)); }
  .sheet-title { font-size: 15px; font-weight: 600; margin-bottom: 14px; }
  .sheet-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
  .sheet-cell { text-align: center; font-size: 12px; color: #444; padding: 10px 0; background: #f5f6f5; border-radius: 10px; }
  .sheet-cell .sc-i { display: block; font-size: 20px; margin-bottom: 4px; }
}

/* ===== 通用组件 ===== */
.stat-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
@media (max-width: 768px) { .stat-row { grid-template-columns: repeat(2, 1fr); } }
.stat { background: #fff; border-radius: 12px; padding: 18px; }
.stat-n { font-size: 26px; font-weight: 700; color: #1a1a1a; }
.stat-n small { font-size: 12px; font-weight: 400; color: #999; margin-left: 4px; }
.stat-t { font-size: 12px; color: #888; margin-top: 6px; }

.panel { background: #fff; border-radius: 12px; padding: 18px; margin-top: 16px; }
.panel-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.panel-t { font-size: 15px; font-weight: 600; }

.btn { display: inline-flex; align-items: center; justify-content: center; height: 34px; padding: 0 16px; border-radius: 8px; font-size: 13px; background: #1f9d55; color: #fff; }
.btn.plain { background: #f0f2f1; color: #333; }
.btn.warn { background: #fff1f0; color: #e24b4a; }
.btn.sm { height: 28px; padding: 0 12px; font-size: 12px; border-radius: 6px; }
.btn.block { width: 100%; height: 44px; border-radius: 10px; font-size: 15px; }

.toolbar { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.tb-input { flex: 1; min-width: 160px; height: 36px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 12px; outline: none; background: #fff; }
.tb-select { height: 36px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 10px; background: #fff; }

/* 表格（PC） */
.tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
.tbl th { text-align: left; color: #999; font-weight: 400; padding: 10px 8px; border-bottom: 1px solid #f0f0f0; white-space: nowrap; }
.tbl td { padding: 12px 8px; border-bottom: 1px solid #f5f5f5; vertical-align: middle; }
/* 套餐列表行内改价（2026-10-08）：三个小输入框，改完即存 */
.pkp { display: flex; flex-direction: column; gap: 3px; }
/* 划线价与售价并排一行（划线在前、售价在后），会员价独占第二行 */
.pkp-line { display: flex; align-items: center; gap: 8px; }
.pkp-row { display: flex; align-items: center; gap: 4px; }
.pkp-lab { font-size: 11px; color: #8b9a94; width: 26px; flex: none; }
.pkp-in { width: 70px; height: 24px; border: 1px solid #e3e5e4; border-radius: 6px; padding: 0 6px; font-size: 12px; outline: none; background: #fff; }
.pkp-in:focus { border-color: #1f9d55; background: #f6fdf9; }
.pkp-in:disabled { background: #f5f5f5; color: #bbb; }

/* 🔴 .cimg 必须同时命中 .tbl（球场管理）与 .tb（套餐管理/订单等）两张表，
   否则图片按原图尺寸渲染（2026-10-08 套餐列表整页被 800px 大图撑爆的根因）。 */
.tbl .cimg, .tb .cimg { width: 56px; height: 40px; border-radius: 6px; object-fit: cover; display: block; background: #eee; }
.tag { display: inline-block; font-size: 11px; border-radius: 6px; padding: 2px 8px; }
.tag.on { color: #1f9d55; background: #e8f6ee; }
/* 🔴 2026-10-09：球场下架值统一成云端的 'hidden'（全库只有 on/hidden），
   这里补一个别名，否则 tag 会因为没有 .hidden 规则而丢掉灰底样式。 */
.tag.off, .tag.hidden { color: #999; background: #f0f0f0; }
.tag.warn { color: #d97706; background: #fff7ed; }
.row-acts { display: flex; gap: 8px; }
.link { color: #1f9d55; cursor: pointer; font-size: 13px; }
.link.gray { color: #999; }
.link.red { color: #e24b4a; }

/* ===== 行内改价（列表直接编辑平日价 / 假日价）=====
   需求 2026-10-07：客服不用进详情页，在列表里直接改每一行的价格。
   平时显示成「¥890 / ¥1180」文本，hover 出现可点提示；
   点击变输入框，失焦或回车保存，Esc 取消。 */
.pcell { display: flex; align-items: center; gap: 2px; position: relative; white-space: nowrap; }
.pcell .pc-yen { color: #666; font-size: 13px; margin-right: 1px; }
.pcell .pc-sep { color: #bbb; margin: 0 3px; }
.pc-in {
  width: 52px;
  padding: 4px 5px;
  font-size: 13px;
  color: #1f2733;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 5px;
  transition: border-color .12s, background-color .12s;
}
.pc-in:hover { border-color: #d8dee6; background: #fbfcfd; }
.pc-in:focus, .pc-in.editing {
  outline: none;
  border-color: #1f9d55;
  background: #fff;
  box-shadow: 0 0 0 2px rgba(31,157,85,.14);
}
.pc-in::-webkit-outer-spin-button,
.pc-in::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.pc-in[type=number] { -moz-appearance: textfield; }
.pc-in::placeholder { color: #c2c8d0; }
.pc-save { font-size: 11px; margin-left: 4px; color: #999; min-width: 0; }
.pc-save.saving { color: #999; }
.pc-save.ok { color: #1f9d55; }
.pc-save.err { color: #e24b4a; }

/* 卡片列表（手机） */
.clist { display: none; }
@media (max-width: 768px) {
  .tbl-wrap { display: none; }
  .clist { display: block; }
}
.ccard { background: #fff; border-radius: 12px; padding: 14px; margin-bottom: 12px; }
.ccard-top { display: flex; gap: 10px; }
.ccard-img { width: 84px; height: 62px; border-radius: 8px; object-fit: cover; flex-shrink: 0; background: #eee; }
.ccard-name { font-size: 14px; font-weight: 600; }
.ccard-sub { font-size: 12px; color: #999; margin-top: 4px; }
.ccard-acts { display: flex; gap: 10px; margin-top: 12px; }
.ccard-acts .btn { flex: 1; }

/* 表单 */
.form { max-width: 640px; }
.f-row { margin-bottom: 16px; }
.f-label { display: block; font-size: 13px; color: #555; margin-bottom: 6px; }
.f-label b { color: #e24b4a; }
.f-input, .f-select, .f-textarea { width: 100%; border: 1px solid #e3e5e4; border-radius: 8px; padding: 10px 12px; outline: none; background: #fff; }
.f-textarea { min-height: 90px; resize: vertical; }
.f-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 768px) { .f-2col { grid-template-columns: 1fr; } }
.f-acts { display: flex; gap: 12px; margin-top: 22px; }
.f-acts .btn { flex: 1; height: 44px; border-radius: 10px; font-size: 15px; }

/* 迷你柱状图 */
.bars { display: flex; align-items: flex-end; gap: 10px; height: 120px; padding-top: 10px; }
.bar-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; height: 100%; justify-content: flex-end; }
.bar { width: 60%; max-width: 34px; background: #1f9d55; border-radius: 4px 4px 0 0; min-height: 4px; }
.bar-d { font-size: 11px; color: #999; }

/* 待办 */
.todo { display: flex; align-items: center; gap: 10px; padding: 12px 0; border-bottom: 1px solid #f4f4f4; font-size: 13px; }
.todo:last-child { border-bottom: none; }
.todo-dot { width: 8px; height: 8px; border-radius: 50%; background: #f08300; flex-shrink: 0; }
.todo-t { flex: 1; color: #444; }
.todo-time { color: #bbb; font-size: 12px; }

/* 导入 */
.drop { border: 2px dashed #cfd8d3; border-radius: 12px; padding: 40px 20px; text-align: center; color: #888; background: #fafbfa; cursor: pointer; }
.drop:hover { border-color: #1f9d55; color: #1f9d55; }
.drop .d-i { font-size: 34px; }
.drop .d-t { margin-top: 10px; font-size: 14px; }
.drop .d-s { margin-top: 6px; font-size: 12px; color: #aaa; }
.imp-steps { display: flex; gap: 8px; margin-bottom: 16px; }
.imp-step { flex: 1; text-align: center; font-size: 12px; color: #999; padding: 8px 0; border-bottom: 2px solid #eee; }
.imp-step.on { color: #1f9d55; border-color: #1f9d55; font-weight: 600; }

/* ===== 开球时段管理 ===== */
.tt-count { font-size: 13px; color: #666; }
.tt-count b { color: #1f9d55; font-size: 16px; }
.tt-tip { background: #f2f8f4; border: 1px solid #dcece2; border-radius: 10px; padding: 12px 14px; font-size: 13px; line-height: 1.75; color: #456; }
.tt-tip b { color: #1a7a45; }
.tt-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.tt-chip { font-size: 12px; color: #3c6; background: #eef6f1; border-radius: 14px; padding: 5px 12px; }
.tt-chip.on { background: #1f9d55; color: #fff; }
.tt-results { margin-top: 10px; }
.tt-hit { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; cursor: pointer; }
.tt-hit:hover { background: #f6f8f7; }
.tt-hit img { width: 52px; height: 38px; border-radius: 6px; object-fit: cover; background: #eee; }
.tt-hit-b { flex: 1; min-width: 0; font-size: 13px; }
.tt-hit-b b { display: block; font-weight: 600; }
.tt-hit-b span { color: #999; font-size: 12px; }
.tt-empty { color: #aaa; font-size: 13px; padding: 14px; text-align: center; }
.tt-sub { font-size: 12px; color: #999; margin-top: 6px; }
.tt-acts { display: flex; gap: 8px; flex-wrap: wrap; }
.tt-cols { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 18px; align-items: start; }
@media (max-width: 1100px) { .tt-cols { grid-template-columns: 1fr; } }
.tt-side-t { font-size: 13px; font-weight: 600; margin-bottom: 10px; }
.tt-side-t i { font-weight: 400; color: #aaa; font-size: 12px; font-style: normal; }
.tt-side-p { font-size: 12px; color: #777; line-height: 1.7; }
.tt-side-p code { background: #f2f4f3; border-radius: 4px; padding: 1px 5px; }
.tt-err { background: #fff5f5; border: 1px solid #ffd9d9; color: #d43c3c; border-radius: 8px; padding: 10px 12px; font-size: 13px; line-height: 1.8; margin-bottom: 12px; }
.tt-export .tt-ta { width: 100%; height: 160px; margin-top: 8px; font-family: Menlo, Consolas, monospace; font-size: 11px; line-height: 1.5; border: 1px solid #e3e5e4; border-radius: 8px; padding: 8px; resize: vertical; }

/* 时段卡片 */
.slot { border: 1px solid #eceeed; border-radius: 12px; padding: 14px; margin-bottom: 12px; background: #fcfdfc; }
.slot.off { opacity: .55; }
.slot-h { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }
.slot-no { font-size: 12px; font-weight: 600; color: #1f9d55; background: #e8f6ee; border-radius: 6px; padding: 3px 9px; }
.slot-name { flex: 1; min-width: 120px; height: 32px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 10px; background: #fff; }
.slot-ops { display: flex; gap: 10px; font-size: 12px; }
.slot-row { display: flex; flex-wrap: wrap; gap: 14px 22px; align-items: flex-end; }
.sf { display: flex; align-items: center; gap: 6px; }
.sf label { font-size: 12px; color: #777; }
.sf input[type=time] { height: 32px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 8px; background: #fff; }
.sf input[type=number] { width: 118px; height: 32px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 10px; background: #fff; }
.sf select { height: 32px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 8px; background: #fff; }
.sf em { color: #bbb; font-style: normal; }
.sf-switch .sw { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #555; }
.slot-inc { margin-top: 14px; }
.slot-inc > label { display: block; font-size: 12px; color: #777; margin-bottom: 8px; }
.slot-inc > label i, .slot-hint { font-style: normal; color: #aaa; }
.inc-list { display: flex; flex-wrap: wrap; gap: 8px; }
.inc { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #666; background: #fff; border: 1px solid #e6e8e7; border-radius: 8px; padding: 5px 10px; cursor: pointer; }
.inc:hover { border-color: #9fd0b5; }
.inc.on { background: #e8f6ee; border-color: #1f9d55; color: #1a7a45; font-weight: 600; }
.slot-hint { font-size: 11px; margin-top: 8px; }
.tt-legend { display: flex; flex-wrap: wrap; gap: 10px 14px; }
.tt-lg { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #666; }

/* 报价包含项 icon —— 与小程序 detail.wxss 的 .qi 同一套图形（rpx 数值取半为 px） */
.qi { display: inline-block; position: relative; width: 22px; height: 20px; border: 1px solid #e3e5e8; border-radius: 4px; background: #fafbfc; flex: none; }
.qi::before, .qi::after { content: ''; position: absolute; background: #8a8f96; }
.qi.green_fee::before { left: 6px; top: 3px; width: 2px; height: 11px; border-radius: 1px; }
.qi.green_fee::after { background: transparent; left: 8px; top: 4px; border-top: 3px solid transparent; border-bottom: 3px solid transparent; border-left: 5px solid #8a8f96; }
.qi.green_fee { overflow: hidden; }
.qi.caddie::before { left: 50%; top: 3px; width: 5px; height: 5px; margin-left: -2.5px; border-radius: 50%; }
.qi.caddie::after { left: 50%; bottom: 3px; width: 9px; height: 5px; margin-left: -4.5px; border-radius: 5px 5px 2px 2px; }
.qi.cart::before { left: 3px; top: 6px; width: 11px; height: 5px; border-radius: 2px 3px 2px 2px; }
.qi.cart::after { left: 4px; bottom: 3px; width: 3px; height: 3px; border-radius: 50%; box-shadow: 6px 0 0 #8a8f96; }
.qi.locker::before { left: 50%; top: 50%; width: 9px; height: 10px; margin: -5px 0 0 -4.5px; border: 1px solid #8a8f96; border-radius: 2px; background: transparent; }
.qi.locker::after { left: 10px; top: 50%; width: 2px; height: 3px; margin-top: -1.5px; border-radius: 1px; }
.qi.insurance::before { left: 50%; top: 3px; width: 11px; height: 12px; margin-left: -5.5px; border-radius: 2px 2px 6px 6px; }
.qi.insurance::after { left: 50%; top: 7px; width: 1px; height: 6px; margin-left: -0.5px; background: #fafbfc; }
.qi.caddie_tip::before { left: 50%; top: 50%; width: 12px; height: 12px; margin: -6px 0 0 -6px; border-radius: 50%; }
.qi.caddie_tip::after { left: 50%; top: 50%; width: 6px; height: 1px; margin: -0.5px 0 0 -3px; background: #fafbfc; box-shadow: 0 -3px 0 #fafbfc, 0 3px 0 #fafbfc; }
.qi.meal::before { left: 50%; top: 50%; width: 8px; height: 8px; margin: -4px 0 0 -4px; border: 1px solid #8a8f96; border-radius: 50%; background: transparent; }
.qi.meal::after { left: 5px; top: 4px; width: 1px; height: 12px; }
.qi.practice::before { left: 50%; top: 4px; width: 7px; height: 7px; margin-left: -3.5px; border-radius: 50%; }
.qi.practice::after { left: 50%; bottom: 3px; width: 8px; height: 2px; margin-left: -4px; border-radius: 1px; }

/* 小程序效果预览（还原详情页时段卡） */
.tt-prev { background: #f5f6f7; border-radius: 12px; padding: 10px; }
.spv-card { position: relative; background: #fff; border-radius: 10px; padding: 14px 12px 10px; margin-bottom: 10px; }
.spv-flag { position: absolute; left: 0; top: 10px; background: #fa5151; color: #fff; font-size: 11px; font-weight: 600; padding: 3px 10px 3px 8px; border-radius: 0 12px 12px 0; }
.spv-head { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
.spv-bar { background: #eceff1; border-radius: 4px; font-size: 15px; font-weight: 700; color: #333; padding: 4px 10px; }
.spv-code { font-size: 10px; color: #bbb; margin-left: auto; }
.spv-ics { display: flex; align-items: center; flex-wrap: wrap; gap: 5px; margin-top: 10px; }
.spv-conf { font-size: 10px; color: #4a90d9; border: 1px solid #bcd6f2; border-radius: 3px; padding: 2px 6px; margin-left: 4px; }
.spv-cancel { font-size: 10px; color: #999; background: #f4f6f8; border-radius: 3px; padding: 2px 6px; }
.spv-row { display: flex; align-items: center; margin-top: 10px; }
.spv-l { font-size: 12px; color: #333; width: 62px; }
.spv-v { font-size: 16px; font-weight: 700; color: #fa5151; flex: 1; }
.spv-btn { font-size: 12px; color: #fa5151; border: 1px solid #fa5151; border-radius: 16px; padding: 3px 18px; font-weight: 600; }
.spv-note { font-size: 11px; color: #999; line-height: 1.7; padding: 2px 4px; }
.spv-note em { color: #4a90d9; font-style: normal; }

/* 占位页 */
.ph { background: #fff; border-radius: 12px; padding: 50px 20px; text-align: center; color: #aaa; margin-top: 16px; }
.ph .ph-i { font-size: 40px; }

/* ===== 球场图册 ===== */
.album-box { margin-bottom: 12px; }
.album-empty { color: #999; font-size: 13px; padding: 18px; background: #f7f8f7; border-radius: 8px; text-align: center; }
.album-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 12px; }
.album-item { position: relative; border-radius: 10px; overflow: hidden; background: #f0f2f1; aspect-ratio: 4/3; }
.album-item img { width: 100%; height: 100%; object-fit: cover; display: block; cursor: pointer; }
.album-item.cover { box-shadow: 0 0 0 2px #1f9d55; }
.cover-badge { position: absolute; left: 6px; top: 6px; background: #1f9d55; color: #fff; font-size: 11px; padding: 2px 7px; border-radius: 10px; }
.album-btns { position: absolute; left: 0; right: 0; bottom: 0; display: flex; gap: 6px; padding: 8px; background: rgba(0,0,0,.45); }
.album-btns .btn { flex: 1; height: 26px; font-size: 11px; padding: 0; border-radius: 5px; }
.album-add { display: flex; gap: 8px; align-items: center; margin-top: 10px; }
.album-tip { color: #999; font-size: 12px; margin-top: 8px; }

/* ===== 地图搜索定位 ===== */
.map-container { width: 100%; height: 320px; border-radius: 10px; background: #eef1f0; margin-top: 10px; overflow: hidden; }
.map-results { margin-top: 8px; }
.map-loading, .map-empty { color: #888; font-size: 13px; padding: 14px; text-align: center; background: #f7f8f7; border-radius: 8px; }
.map-hits { max-height: 160px; overflow-y: auto; border: 1px solid #e6e8e7; border-radius: 8px; }
.map-hit { display: flex; flex-direction: column; gap: 3px; padding: 9px 12px; border-bottom: 1px solid #f2f2f2; cursor: pointer; }
.map-hit:last-child { border-bottom: none; }
.map-hit:hover { background: #f6faf8; }
.map-hit b { font-size: 13px; color: #333; }
.map-hit span { font-size: 12px; color: #777; }
.map-hit-coord { color: #1f9d55; font-size: 11px; }
.map-tip { color: #999; font-size: 12px; margin-top: 8px; line-height: 1.7; }
.ph .ph-t { margin-top: 12px; font-size: 15px; color: #666; }
.ph .ph-s { margin-top: 6px; font-size: 12px; }

/* ===== 客户管理 ===== */
.hide { display: none !important; }
.cust-filter { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px 28px; }
@media (max-width: 900px) { .cust-filter { grid-template-columns: 1fr; } }
.cf-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
.cf-label { flex-shrink: 0; width: 96px; text-align: right; font-size: 13px; color: #666; }
.cf-input { height: 34px; border: 1px solid #e3e5e4; border-radius: 8px; padding: 0 10px; background: #fff; outline: none; min-width: 0; flex: 1; max-width: 180px; }
.cf-input:focus { border-color: #1f9d55; }
input[type="date"].cf-input { max-width: 150px; }
.cf-range { display: flex; align-items: center; gap: 6px; min-width: 0; }
.cf-range em, .cf-num em { color: #bbb; font-style: normal; flex-shrink: 0; }
.cf-num { display: flex; align-items: center; gap: 4px; min-width: 0; }
.cf-num .cf-input { max-width: 90px; }
.cust-filter-acts { display: flex; align-items: center; gap: 14px; margin-top: 16px; padding-left: 104px; }
.cust-expand { display: inline-block; margin-top: 2px; }
.cust-count { font-size: 12px; font-weight: 400; color: #999; margin-left: 6px; }
.sort-th { cursor: pointer; user-select: none; white-space: nowrap; }
.sort-th:hover { color: #1f9d55; }
.sort-i { font-style: normal; color: #1f9d55; margin-left: 2px; }
.cust-av { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; display: block; background: #eef1f0; }
.cust-av.big { width: 52px; height: 52px; }
.ph-av { display: inline-flex; align-items: center; justify-content: center; font-size: 16px; color: #bbb; }
.cust-cell { display: flex; align-items: center; gap: 10px; min-width: 0; }
.cust-oid { font-size: 11px; color: #aaa; margin-top: 2px; word-break: break-all; }
.cust-pager { display: flex; align-items: center; justify-content: center; gap: 16px; padding: 16px 0 2px; font-size: 13px; }
.pg-cur { color: #666; }
/* 客户详情弹层 */
.modal-mask { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 60; }
.modal-mask.show { display: flex; align-items: flex-start; justify-content: center; padding: 6vh 16px; }
.modal { width: 100%; max-width: 620px; max-height: 84vh; overflow-y: auto; background: #fff; border-radius: 14px; padding: 20px; }
.modal-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.modal-t { font-size: 15px; font-weight: 600; }
.modal-b { font-size: 13px; }
.cd-head { display: flex; gap: 14px; align-items: center; padding-bottom: 14px; border-bottom: 1px solid #f0f2f1; }
.cd-facts { font-size: 12px; color: #777; margin-top: 4px; }
.cd-sec-t { font-size: 13px; font-weight: 600; margin: 16px 0 8px; }
.cd-order { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 0; border-bottom: 1px solid #f6f7f6; }
.cd-amt { font-size: 13px; font-weight: 600; color: #1a1a1a; margin-top: 3px; }
.cd-empty { color: #aaa; text-align: center; padding: 16px; background: #fafbfa; border-radius: 8px; }

/* Toast */
.toast { position: fixed; left: 50%; top: 18%; transform: translateX(-50%); background: rgba(0,0,0,.78); color: #fff; font-size: 13px; padding: 10px 20px; border-radius: 8px; opacity: 0; transition: opacity .25s; pointer-events: none; z-index: 99; }
.toast.show { opacity: 1; }

/* ===== 系统设置 ===== */
.set-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid #f2f2f2; font-size: 13px; }
.set-row:last-child { border-bottom: none; }
.set-k { color: #888; flex-shrink: 0; }
.set-v { color: #333; text-align: right; word-break: break-all; }
.set-tip { color: #999; font-size: 12px; margin-top: 10px; line-height: 1.7; }
.set-acts { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }

/* ===== 球场编辑 7 步向导（对齐设计稿《后台管理-添加新球场》） ===== */
.cw-stepinfo { font-size: 12px; color: #999; white-space: nowrap; }
.cw-banner { margin: 0 0 14px; padding: 10px 14px; border-radius: 8px; font-size: 13px; line-height: 1.6; background: #f4f6f5; border: 1px solid #e3e7e5; color: #666; }
.cw-banner.ok { background: #eaf6ec; border-color: #b7e0c0; color: #2f6b3d; }
.cw-banner.warn { background: #fff7e6; border-color: #ffe1a8; color: #8a6d3b; }
.cw-steps { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.cw-stepdot { font-size: 12px; padding: 6px 12px; border-radius: 999px; background: #f2f4f3; color: #888; cursor: pointer; white-space: nowrap; }
.cw-stepdot.on { background: #1f9d55; color: #fff; font-weight: 600; }
.cw-stepdot.done { background: #e3f3e9; color: #2f6b3d; }
.cw-part-t { font-size: 15px; font-weight: 600; margin: 4px 0 16px; padding-bottom: 10px; border-bottom: 1px solid #f0f2f1; }
.cw-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.cw-chip { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; padding: 6px 12px; border: 1px solid #e0e5e3; border-radius: 6px; background: #fafbfa; cursor: pointer; user-select: none; }
.cw-chip:has(input:checked) { border-color: #1f9d55; background: #eaf6ec; color: #2f6b3d; }
.cw-tip { color: #999; font-size: 12px; margin: 6px 0 0; }
.cw-card { border: 1px solid #e8ecea; border-radius: 10px; padding: 14px; margin: 12px 0; background: #fafbfa; }
.cw-card-t { font-size: 13px; font-weight: 600; margin-bottom: 10px; }
.cw-nav { display: flex; justify-content: center; gap: 12px; margin-top: 22px; padding-top: 16px; border-top: 1px solid #f0f2f1; }
.cw-agreement { max-height: 300px; overflow-y: auto; border: 1px solid #e8ecea; border-radius: 10px; padding: 16px; font-size: 13px; line-height: 1.9; color: #555; background: #fafbfa; }
.cw-tabs { display: flex; gap: 8px; margin: 2px 0 12px; }
.cw-tab { font-size: 13px; padding: 7px 18px; border-radius: 8px; background: #f2f4f3; color: #666; cursor: pointer; text-decoration: none; }
.cw-tab.on { background: #1f9d55; color: #fff; font-weight: 600; }
.f-3col { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 14px; }
@media (max-width: 720px) { .f-3col { grid-template-columns: 1fr; } }

/* ===== 套餐管理（列表 + 两步向导） ===== */
#pkCourses .f-row, #pkHotels .f-row { display: flex; gap: 8px; align-items: flex-end; flex-wrap: wrap; }
#pkCourses .f-row .f-input, #pkHotels .f-row .f-input { margin-bottom: 0; min-width: 90px; }
#pkCourses .album-empty, #pkHotels .album-empty, #pkDays .album-empty { margin-bottom: 0; }
.pk-daymeal { display: flex; flex-wrap: wrap; gap: 8px; }

/* ===== 订单管理（列表 + 详情 + 处理面板，对齐设计稿《后台管理-订单处理》） ===== */
.ord-filter { background: #fafbfa; border: 1px solid #eef1f0; border-radius: 10px; padding: 12px 14px; margin-bottom: 14px; }
.ord-frow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
.ord-frow:last-child { margin-bottom: 0; }
.ord-flabel { font-size: 13px; color: #666; white-space: nowrap; }
.ord-quick { font-size: 12px; color: #1f9d55; text-decoration: none; padding: 3px 8px; border: 1px solid #d7e8de; border-radius: 6px; background: #fff; }
.ord-quick:hover { background: #eef8f2; }
.ord-tabs { display: flex; gap: 4px; flex-wrap: wrap; border-bottom: 1px solid #eef1f0; margin-bottom: 12px; }
.ord-tab { font-size: 13px; padding: 9px 16px; color: #666; text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.ord-tab:hover { color: #1f9d55; }
.ord-tab.on { color: #1f9d55; font-weight: 600; border-bottom-color: #1f9d55; }
.ord-sub { font-size: 11px; color: #999; }
.ord-star { color: #f5a623; font-size: 14px; }
.ord-pager { display: flex; align-items: center; justify-content: center; gap: 16px; padding: 14px 0 2px; font-size: 13px; color: #666; }
.pg-link { color: #1f9d55; text-decoration: none; }
.pg-link.dis { color: #ccc; }

/* —— 订单详情 —— */
.od-crumb { font-size: 13px; color: #999; margin-bottom: 12px; }
.od-crumb b { color: #333; }
.od-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; padding-bottom: 12px; border-bottom: 1px solid #f0f2f1; margin-bottom: 16px; }
.od-head-l { font-size: 13px; color: #555; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.od-no { font-weight: 600; color: #222; }
.od-sep { color: #ddd; }
.od-banner { border-radius: 10px; padding: 14px 16px; margin-bottom: 14px; background: #f5f7f6; border: 1px solid #e8ecea; }
.od-banner.ok { background: #eef8f2; border-color: #c9e8d6; }
.od-banner.warn { background: #fff8ec; border-color: #ffe0b2; }
.od-banner-t { font-size: 16px; font-weight: 600; color: #222; }
.od-cd { font-size: 13px; color: #b8860b; margin-top: 8px; }
.od-cd b { color: #c0392b; }
.od-steps { display: flex; align-items: flex-start; justify-content: space-between; gap: 4px; padding: 6px 4px 20px; }
.od-step { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 5px; text-align: center; }
.od-dot { width: 26px; height: 26px; border-radius: 50%; border: 1px solid #d8dedb; color: #bbb; font-size: 12px; display: flex; align-items: center; justify-content: center; background: #fff; }
.od-step.done .od-dot { background: #1f9d55; border-color: #1f9d55; color: #fff; }
.od-step.cur .od-dot { background: #fff; border-color: #1f9d55; color: #1f9d55; font-weight: 700; }
.od-step-t { font-size: 12px; color: #666; white-space: nowrap; }
.od-step.cur .od-step-t { color: #1f9d55; font-weight: 600; }
.od-step-d { font-size: 11px; color: #aaa; white-space: nowrap; }
.od-line { flex: 0 0 auto; width: 60px; height: 2px; background: #e6ebe8; margin-top: 12px; }
.od-line.done { background: #1f9d55; }
.od-sec-t { font-size: 14px; font-weight: 600; margin: 6px 0 12px; }
.od-info { font-size: 13px; }
.od-info-t { font-weight: 600; color: #444; margin-bottom: 8px; }
.od-info-r { display: flex; gap: 8px; padding: 5px 0; color: #666; line-height: 1.7; }
.od-info-r > span { color: #999; flex: 0 0 88px; }
.od-info-r > b { color: #222; }
.od-panel { background: #f5f7f6; border: 1px solid #e8ecea; border-radius: 10px; padding: 16px; margin-top: 14px; }
.od-panel-t { font-size: 14px; font-weight: 600; margin-bottom: 12px; }
.od-panel-row { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; font-size: 13px; color: #666; }
.od-panel-row > span { color: #999; }
.od-panel-acts { display: flex; gap: 10px; justify-content: center; margin-top: 14px; }
.od-x { color: #e24b4a; margin-left: 4px; }
.od-alt-tip { font-size: 13px; color: #666; margin: 10px 0; }
.od-alt-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin-bottom: 10px; }
@media (max-width: 720px) { .od-alt-list { grid-template-columns: 1fr; } }
.od-alt-item { display: flex; align-items: center; gap: 6px; background: #fff; border: 1px solid #e8ecea; border-radius: 8px; padding: 6px 8px; }
.od-alt-del { width: 20px; height: 20px; border-radius: 50%; border: none; background: #fdecea; color: #e24b4a; font-size: 11px; cursor: pointer; flex: 0 0 auto; }
.od-warn { font-size: 12px; color: #b8860b; background: #fffaf0; border: 1px solid #ffe6b3; border-radius: 8px; padding: 10px 12px; line-height: 1.7; margin-top: 6px; }
.od-acts { display: flex; flex-direction: column; gap: 5px; }
.od-settle { margin-top: 16px; padding-left: 55%; }
.od-settle-r { display: flex; justify-content: space-between; gap: 16px; font-size: 13px; color: #888; padding: 5px 0; }
.od-settle-r > b { color: #222; font-weight: 600; }
.od-settle-r > b.red { color: #c0392b; }
.od-refund { margin-top: 12px; font-size: 12px; color: #b8860b; background: #fffaf0; border: 1px solid #ffe6b3; border-radius: 8px; padding: 10px 12px; line-height: 1.7; }
.od-other { background: #f7f9f8; border: 1px solid #eef1f0; border-radius: 8px; padding: 10px 12px; margin-bottom: 12px; font-size: 12px; color: #888; display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.od-other-a { color: #1f9d55; text-decoration: none; border: 1px solid #d7e8de; background: #fff; border-radius: 6px; padding: 3px 8px; }
.od-alt-date { font-size: 12px; color: #555; white-space: nowrap; flex: 0 0 auto; }

/* ================= 仪表盘（对齐设计稿《后台仪表盘》） ================= */
.dash { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 16px; align-items: start; }
.dash-main, .dash-side { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.dash-panel { margin-top: 0; }
.dash-hint { font-size: 12px; color: #9aa3ab; }

/* --- 指标卡 --- */
.dash-stats { margin-bottom: 0; }
.dstat { display: block; background: #fff; border-radius: 12px; padding: 16px; text-decoration: none; color: inherit; border: 1px solid transparent; transition: box-shadow .18s, transform .18s; }
.dstat:hover { box-shadow: 0 6px 18px rgba(20,53,43,.09); transform: translateY(-1px); }
.dstat-h { display: flex; align-items: center; gap: 11px; }
.dstat-ico { width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center; flex: 0 0 auto; background: #eef1f4; color: #8a939c; }
.dstat-ico svg { width: 22px; height: 22px; }
.dstat-ico.orange { background: #fba43b; color: #fff; }
.dstat-ico.green { background: #2ecc8f; color: #fff; }
.dstat-ico.blue { background: #4b9bf5; color: #fff; }
.dstat-ico.red { background: #f2544b; color: #fff; }
.dstat-tt { min-width: 0; }
.dstat-tt b { display: block; font-size: 14.5px; font-weight: 600; color: #1f2733; white-space: nowrap; }
.dstat-tt i { display: block; font-style: normal; font-size: 11px; color: #9aa3ab; margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dstat-b { display: flex; align-items: baseline; gap: 10px; margin-top: 14px; }
.dstat-n { font-size: 27px; font-weight: 700; color: #1a1a1a; letter-spacing: -.5px; }
.dstat-d { font-size: 12px; padding: 2px 8px; border-radius: 10px; white-space: nowrap; background: #f3f5f7; color: #8a939c; }
.dstat-d.up { color: #e24b4a; background: #feeceb; }   /* 涨 = 红 */
.dstat-d.down { color: #1f9d55; background: #e9f7ef; } /* 跌 = 绿 */
.dstat.skel { opacity: .55; }

/* --- 图表通用 --- */
.chart-box { position: relative; min-height: 90px; }
.chart-wrap { position: relative; width: 100%; }
.csvg { display: block; width: 100%; height: auto; overflow: visible; font-family: inherit; }
.csvg text { font-family: inherit; }
.cg { stroke: #eef1f4; stroke-width: 1; stroke-dasharray: 4 4; }
.cvg { stroke: #f1f4f6; stroke-width: 1; stroke-dasharray: 3 5; }
.cl-t { font-size: 11px; fill: #9aa3ab; }
.cv-t { font-size: 12px; fill: #2b333b; font-weight: 600; }
.cline-a { fill: none; stroke: #1f9d55; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
.cline-c { fill: none; stroke: #2f80ed; stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; }
.cguide { stroke: #ccd4db; stroke-width: 1; stroke-dasharray: 4 4; }
.cdot-a { fill: #fff; stroke: #1f9d55; stroke-width: 2.6; }
.cdot-c { fill: #fff; stroke: #2f80ed; stroke-width: 2.6; }
.ctip-bg { fill: #fff; stroke: #e5eaee; stroke-width: 1; filter: drop-shadow(0 3px 8px rgba(20,53,43,.12)); }
.ctip-d { font-size: 11px; fill: #8a939c; }
.ctip-v { font-size: 12.5px; fill: #1f2733; font-weight: 600; }
.c-legend { display: flex; justify-content: center; gap: 26px; font-size: 12px; color: #6b7480; margin-top: 2px; }
.c-legend span { display: inline-flex; align-items: center; gap: 7px; }
.c-legend i { display: inline-block; width: 16px; height: 3px; border-radius: 2px; }
.c-legend .lg-a { background: #1f9d55; }
.c-legend .lg-c { background: #2f80ed; }
.cbar { fill: #1f9d55; }
.carc { fill: none; stroke-linecap: butt; }
.cchip { fill: #fff; stroke-width: 1; }
.cchip-t { font-size: 11px; font-weight: 600; }
.donut { max-width: 250px; margin: 0 auto; }
.pay-box { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.pay-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; font-size: 12px; color: #6b7480; }
.pay-legend span { display: inline-flex; align-items: center; gap: 6px; }
.pay-legend i { display: inline-block; width: 9px; height: 9px; border-radius: 50%; }
.pay-legend b { color: #1f2733; }

/* --- 订单状态四宫格 --- */
.dash-grid2 { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 16px; }
.ost-row { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; }
.ost { display: flex; flex-direction: column; align-items: center; gap: 7px; padding: 6px 2px 2px; }
.ost-ico { width: 40px; height: 40px; border-radius: 12px; display: grid; place-items: center; background: #eef1f4; color: #8a939c; }
.ost-ico svg { width: 21px; height: 21px; }
.ost-ico.blue { background: #e8f2fe; color: #2f80ed; }
.ost-ico.orange { background: #fef1e3; color: #f2994a; }
.ost-ico.red { background: #feebea; color: #eb5757; }
.ost-ico.green { background: #e6f7ef; color: #1f9d55; }
.ost-lb { font-size: 12.5px; color: #6b7480; }
.ost-n { font-size: 23px; font-weight: 700; color: #1a1a1a; }
.ost-btn { font-size: 12px; padding: 4px 15px; border-radius: 14px; text-decoration: none; color: #1f9d55; background: #eef9f2; border: 1px solid #c9e8d7; }
.ost-btn:hover { background: #e2f4ea; }
.ost-btn.off { color: #9aa3ab; background: #f6f8f7; border-color: #e6ebe8; }

/* --- 时段分布页签 --- */
.dash-seg { display: flex; gap: 4px; background: #f2f4f5; border-radius: 10px; padding: 4px; margin-bottom: 14px; }
.dash-seg-i { flex: 1; text-align: center; font-size: 12.5px; color: #7d868f; padding: 6px 6px; border-radius: 8px; text-decoration: none; white-space: nowrap; }
.dash-seg-i.on { background: #1f9d55; color: #fff; font-weight: 600; }

/* --- 快速管理报价 --- */
.q-th { display: grid; grid-template-columns: 1fr auto; font-size: 12px; color: #9aa3ab; padding-bottom: 8px; border-bottom: 1px solid #eef1f0; }
.q-range { font-size: 11.5px; color: #7d868f; background: #f5f7f6; border-radius: 8px; padding: 6px 10px; margin: 10px 0; }
.q-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 9px 4px; border-bottom: 1px dashed #eef1f0; text-decoration: none; color: inherit; border-radius: 6px; }
.q-row:hover { background: #f8faf9; }
.q-name { font-size: 13px; color: #1f2733; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.q-name i { display: block; font-style: normal; font-size: 11px; color: #9aa3ab; margin-top: 2px; }
.q-val { font-size: 13px; font-weight: 600; color: #1f9d55; white-space: nowrap; }
.q-val small { font-weight: 400; color: #9aa3ab; font-size: 11px; }
.q-none { font-style: normal; font-weight: 500; color: #d08770; background: #fdf3ef; border-radius: 10px; padding: 2px 9px; font-size: 12px; }
.q-foot { font-size: 11px; color: #9aa3ab; text-align: center; margin-top: 9px; }

/* --- 空态/错误态 --- */
.dash-empty { text-align: center; color: #aaa; padding: 34px 10px; font-size: 13px; }
.dash-err { text-align: center; color: #e24b4a; padding: 26px 12px; font-size: 13px; line-height: 1.8; }

@media (max-width: 1180px) {
  .dash { grid-template-columns: minmax(0, 1fr); }
  .dash-grid2 { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 720px) {
  .stat-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ost-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .dstat-n { font-size: 23px; }
}

/* ================= 幻灯片管理 · 小程序首页 1:1 预览 ================= */
.sl-wrap { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 16px; align-items: start; }
.sl-main { min-width: 0; }
.sl-side { position: sticky; top: 72px; }
.sl-prev { margin-top: 0; }
.sl-prev-sub { font-size: 11.5px; color: #9aa3ab; margin: -6px 0 12px; }
.mpv-ctl { display: inline-flex; gap: 6px; }

/* --r = rpx→px 换算系数（750rpx = 手机屏宽），下方全部尺寸与小程序 home.wxss 一一对应 */
.mpv {
  --r: 0.4px;
  width: calc(750 * var(--r));
  margin: 0 auto;
  background: #1b1f22;
  border-radius: calc(56 * var(--r));
  padding: calc(9 * var(--r));
  box-shadow: 0 12px 32px rgba(20, 53, 43, .22);
}
.mpv-screen {
  position: relative; overflow: hidden;
  width: calc(750 * var(--r)); height: calc(1620 * var(--r));
  border-radius: calc(46 * var(--r));
  background: #f5f6f7;
}
/* 状态栏 */
.mpv-status {
  position: absolute; left: 0; right: 0; top: 0; height: calc(88 * var(--r));
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 calc(46 * var(--r)); z-index: 6; pointer-events: none;
  font-size: calc(24 * var(--r)); font-weight: 600; color: #fff;
  text-shadow: 0 calc(2 * var(--r)) calc(4 * var(--r)) rgba(0, 0, 0, .4);
}
.mpv-sb { display: flex; align-items: center; gap: calc(5 * var(--r)); }
.mpv-sb .s1, .mpv-sb .s2 { display: block; background: #fff; border-radius: calc(2 * var(--r)); }
.mpv-sb .s1 { width: calc(5 * var(--r)); height: calc(9 * var(--r)); box-shadow: calc(7 * var(--r)) 0 0 #fff, calc(14 * var(--r)) 0 0 #fff; margin-right: calc(18 * var(--r)); }
.mpv-sb .s2 { width: calc(22 * var(--r)); height: calc(11 * var(--r)); border-radius: calc(3 * var(--r)); position: relative; }
.mpv-sb .bat { display: block; width: calc(30 * var(--r)); height: calc(14 * var(--r)); border: calc(2 * var(--r)) solid rgba(255,255,255,.85); border-radius: calc(4 * var(--r)); position: relative; }
.mpv-sb .bat::after { content: ''; position: absolute; right: calc(-5 * var(--r)); top: calc(3 * var(--r)); width: calc(3 * var(--r)); height: calc(6 * var(--r)); background: rgba(255,255,255,.85); border-radius: 0 calc(2 * var(--r)) calc(2 * var(--r)) 0; }
/* 导航栏（透明占位 + 右上角胶囊） */
.mpv-nav { position: absolute; left: 0; right: 0; top: calc(88 * var(--r)); height: calc(88 * var(--r)); z-index: 6; pointer-events: none; }
.mpv-capsule {
  position: absolute; right: calc(14 * var(--r)); top: calc(16 * var(--r));
  width: calc(168 * var(--r)); height: calc(58 * var(--r));
  border-radius: calc(30 * var(--r));
  background: rgba(255, 255, 255, .32); border: calc(1 * var(--r)) solid rgba(255,255,255,.45);
  display: flex; align-items: center; justify-content: space-evenly;
}
.mpv-capsule em { width: calc(9 * var(--r)); height: calc(9 * var(--r)); border-radius: 50%; background: #fff; box-shadow: calc(-6 * var(--r)) 0 0 #fff; margin-right: calc(-8 * var(--r)); }
.mpv-capsule b { width: calc(2 * var(--r)); height: calc(30 * var(--r)); background: rgba(255,255,255,.65); }
/* Hero 轮播 */
.mpv-hero { position: relative; height: calc(920 * var(--r)); border-radius: 0 0 calc(28 * var(--r)) calc(28 * var(--r)); overflow: hidden; background: #2f6b4f; }
.mpv-hero-img { position: absolute; inset: 0; background: linear-gradient(160deg, #2f6b4f, #14352b); }
.mpv-hero-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mpv-hero-dim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,.18) 0%, rgba(0,0,0,.06) 50%, rgba(0,0,0,.28) 100%); }
.mpv-dots { position: absolute; left: 0; right: 0; bottom: calc(586 * var(--r)); display: flex; justify-content: center; gap: calc(9 * var(--r)); z-index: 5; }
.mpv-dots i { width: calc(12 * var(--r)); height: calc(12 * var(--r)); border-radius: 50%; background: rgba(255,255,255,.45); cursor: pointer; }
.mpv-dots i.on { background: #fff; }
/* 搜索卡 */
.mpv-card {
  position: absolute; left: calc(24 * var(--r)); right: calc(24 * var(--r)); bottom: calc(24 * var(--r));
  background: rgba(255, 255, 255, .82);
  -webkit-backdrop-filter: blur(calc(10 * var(--r)));
  backdrop-filter: blur(calc(10 * var(--r)));
  border-radius: calc(20 * var(--r));
  box-shadow: 0 calc(10 * var(--r)) calc(40 * var(--r)) rgba(0, 0, 0, .18);
  overflow: hidden; z-index: 5;
}
.mpv-tabs { display: flex; background: rgba(226, 227, 229, .55); height: calc(84 * var(--r)); }
.mpv-tab { flex: 1; display: flex; align-items: center; justify-content: center; font-size: calc(30 * var(--r)); color: #333; position: relative; }
.mpv-tab.on { background: rgba(255, 255, 255, .72); color: #111; font-size: calc(34 * var(--r)); font-weight: 700; }
.mpv-tab.on::after { content: ''; position: absolute; bottom: calc(14 * var(--r)); left: 50%; transform: translateX(-50%); width: calc(56 * var(--r)); height: calc(6 * var(--r)); border-radius: calc(3 * var(--r)); background: #fa5151; }
.mpv-row { display: flex; align-items: center; margin: 0 calc(32 * var(--r)); padding: calc(28 * var(--r)) 0; border-bottom: 1px solid rgba(238, 238, 238, .6); }
.mpv-loc { padding: calc(32 * var(--r)) 0; }
.mpv-loc-t { flex: 1; font-size: calc(34 * var(--r)); font-weight: 700; color: #222; }
.mpv-loc-b { display: flex; flex-direction: column; align-items: center; margin-left: calc(20 * var(--r)); }
.mpv-pin {
  width: calc(42 * var(--r)); height: calc(42 * var(--r));
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%233a7afe%22%20stroke-width%3D%222.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M21%2010c0%207-9%2013-9%2013S3%2017%203%2010a9%209%200%201%201%2018%200z%22/%3E%3Ccircle%20cx%3D%2212%22%20cy%3D%2210%22%20r%3D%223.2%22/%3E%3C/svg%3E");
  background-size: contain; background-repeat: no-repeat; background-position: center;
}
.mpv-loc-b em { font-style: normal; font-size: calc(22 * var(--r)); color: #3a7afe; margin-top: calc(6 * var(--r)); }
.mpv-dl { font-size: calc(34 * var(--r)); font-weight: 700; color: #111; margin-right: calc(56 * var(--r)); }
.mpv-dv { font-size: calc(34 * var(--r)); color: #222; }
.mpv-kw-ph { font-size: calc(34 * var(--r)); color: #b0b3b8; }
.mpv-query {
  display: block; margin: calc(16 * var(--r)) calc(120 * var(--r)) calc(38 * var(--r));
  height: calc(88 * var(--r)); line-height: calc(88 * var(--r));
  background: #fa5151; color: #fff; text-align: center;
  font-size: calc(34 * var(--r)); font-weight: 600; letter-spacing: calc(6 * var(--r));
  border-radius: calc(50 * var(--r));
}
/* Hero 下方内容（增强真实感） */
.mpv-below { padding: calc(24 * var(--r)); }
.mpv-menu { display: grid; grid-template-columns: repeat(4, 1fr); gap: calc(16 * var(--r)); }
.mpv-menu i { display: block; height: calc(120 * var(--r)); border-radius: calc(16 * var(--r)); background: #fff; }
.mpv-sec { height: calc(200 * var(--r)); border-radius: calc(16 * var(--r)); background: #fff; margin-top: calc(20 * var(--r)); }
.mpv-sec.short { height: calc(140 * var(--r)); }
.mpv-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 12px; font-size: 12px; color: #6b7480; }
.mpv-chk { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; user-select: none; }
.mpv-chk input { width: 14px; height: 14px; accent-color: #1f9d55; }
.mpv-note { margin-top: 8px; font-size: 11.5px; line-height: 1.7; color: #8a939c; }

@media (max-width: 1080px) {
  .sl-wrap { grid-template-columns: minmax(0, 1fr); }
  .sl-side { position: static; }
}


/* ===== 文件上传控件 =====
   ⚠️ 上传 input 一律用「屏外定位 + <label for> 关联」，不要用 display:none，
      也不要靠 JS 调 .click()：
        · display:none 的 input 在部分浏览器里点 label 也无反应；
        · JS .click() 在窗口失焦 / 用户手势未传递时会静默失败。
      两者最终表现都一样 —— 客服点「上传」毫无反应，且控制台无任何报错，最难排查。
      label 关联走浏览器原生表单机制，是唯一可靠写法。 */
.gf-file-hidden {
  position: absolute; left: -9999px; top: -9999px;
  width: 1px; height: 1px; opacity: 0;
}
.gf-file-btn { cursor: pointer; user-select: none; display: inline-block; }
.gf-file-btn:active { opacity: .7; }

/* ===== 套餐管理：顶部汇总小卡 + 表格增强 ===== */
.pstat-row {
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 10px; margin-bottom: 12px;
}
.pstat {
  border: 1px solid #e8eef6; border-radius: 12px; background: #fff;
  padding: 12px 10px; text-align: center; cursor: pointer;
  transition: box-shadow .15s, border-color .15s;
}
.pstat:hover { box-shadow: 0 3px 10px rgba(0,0,0,.08); border-color: #cfdced; }
.pstat-n { font-size: 22px; font-weight: 800; line-height: 1.2; }
.pstat-t { font-size: 12px; color: #8a939c; margin-top: 2px; }
.pstat-green .pstat-n { color: #21a45d; }
.pstat-orange .pstat-n { color: #e08a00; }
.pstat-gray .pstat-n { color: #98a2ad; }
.pstat-red .pstat-n { color: #e24b4a; }
.pstat-plain .pstat-n { color: #4a5568; }
.pstat-plain.warn { border-color: #f3c6c4; background: #fff8f7; }
.pstat-plain.warn .pstat-n { color: #e24b4a; }
/* 页签上的计数 */
.cw-tab-n {
  display: inline-block; margin-left: 5px; padding: 0 5px;
  border-radius: 8px; background: rgba(0,0,0,.06);
  font-size: 11px; color: #6b7683; vertical-align: 1px;
}
.cw-tab.on .cw-tab-n { background: rgba(255,255,255,.28); color: #fff; }
/* 行内排序输入 */
.pk-sort { text-align: center; }

@media (max-width: 900px) {
  .pstat-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ===== 套餐编辑：云端球场搜索选择器 ===== */
.pk-cs { width: 100%; }
.pk-cs-bar { display: flex; gap: 8px; align-items: center; }
.pk-cs-results {
  margin-top: 8px; max-height: 320px; overflow-y: auto;
  border: 1px solid #e3eaf5; border-radius: 10px; background: #fff;
}
.pk-cs-empty { padding: 14px; text-align: center; color: #98a2ad; font-size: 13px; }
.pk-cs-item {
  display: block; width: 100%; text-align: left; cursor: pointer;
  padding: 9px 12px; border: 0; border-bottom: 1px solid #f2f5fa; background: #fff;
  font-size: 13px; line-height: 1.5;
}
.pk-cs-item:last-child { border-bottom: 0; }
.pk-cs-item:hover { background: #f5f9ff; }
.pk-cs-item.on { background: #eaf7ef; }
.pk-cs-name { color: #222; font-weight: 600; }
.pk-cs-meta { color: #8a939c; font-size: 12px; margin-top: 2px; }
.pk-cs-picked {
  padding: 12px; color: #21a45d; font-size: 13px; background: #f2fbf5;
  border-radius: 8px; margin-top: 8px;
}
.pk-cs-picked .link { margin-left: 8px; }

/* ===== 行内「开通会员价」开关（2026-10-07 指定产品会员价）=====
   与三列价格输入框同排；勾选后小程序按 L2金卡95折/L3铂金92折/L4黑金88折 展示会员价，
   L0/L1 仍按嘉宾价（公司会员体系口径：不是全平台统一折扣）。 */
.pc-mp {
  display: inline-flex; align-items: center; gap: 4px;
  margin-left: 10px; padding: 3px 8px;
  border: 1px solid #ffd8cc; border-radius: 6px;
  background: #fff5f0; color: #d9483b;
  font-size: 12px; white-space: nowrap; cursor: pointer;
  user-select: none;
}
.pc-mp input { margin: 0; cursor: pointer; }
.pc-mp:hover { background: #ffece4; }
/* 行内「已自定义的会员价」金额胶囊：点它可以修改或清除 */
.pc-dp {
  display: inline-flex; align-items: center;
  margin-left: 6px; padding: 2px 8px;
  border: 1px solid #b7e0c4; border-radius: 999px;
  background: #f0fbf3; color: #1c7a45;
  font-size: 12px; font-weight: 600; white-space: nowrap;
  text-decoration: none;
}
.pc-dp:hover { background: #ddf3e4; border-color: #7cc494; }
/* 🔴 2026-10-09：电询球场的行内价格单元格。
   该球场 C 端不展示价格，这里用橙色「电询」徽标代替三个价格输入框，
   并保留「取消电询」快捷入口 —— 运营改错了要能就地改回来。 */
.pc-inquiry {
  display: inline-flex; align-items: center;
  padding: 3px 10px;
  border: 1px solid #f5c99b; border-radius: 6px;
  background: #fff4e8; color: #c2410c;
  font-size: 13px; font-weight: 600; white-space: nowrap;
}
.pc-off-inq {
  margin-left: 6px; padding: 2px 8px;
  border: 1px solid #d8dee6; border-radius: 999px;
  background: #f7f9fb; color: #5a6b7b;
  font-size: 12px; white-space: nowrap; text-decoration: none;
}
.pc-off-inq:hover { background: #eef2f6; border-color: #b8c4d0; color: #2b3a49; }
/* 🔴 2026-09：电询球场徽标（球场名列）+ 表头电询统计（平日/周末价列头，用户指定位置） */
.inq-badge {
  display: inline-flex; align-items: center;
  padding: 1px 7px; margin: 0 2px;
  border: 1px solid #f5c99b; border-radius: 999px;
  background: #fff4e8; color: #c2410c;
  font-size: 11px; font-weight: 600; white-space: nowrap;
  vertical-align: middle;
}
.th-inq {
  display: inline-block; margin-left: 4px;
  padding: 1px 7px;
  border: 1px solid #f5c99b; border-radius: 999px;
  background: #fff4e8; color: #c2410c;
  font-size: 11px; font-weight: 700; white-space: nowrap;
  vertical-align: middle;
}
/* 无图时（云端 courses 表无图片列，全库仅 1 家有 extra.photos）：
   占位图加个浅灰底，避免看起来像"加载中"而不是"暂无图片" */
.tbl .cimg, .tb .cimg, .ccard-img {
  background: #f4f6f8;
  box-sizing: border-box;
}
/* 设会员价面板：方式单选 + 数值输入 */
.mp-radio {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; color: #276749; cursor: pointer; user-select: none;
}
.mp-radio input { margin: 0; cursor: pointer; }

/* 优惠券管理弹层 */
.gf-mask {
  position: fixed; inset: 0; z-index: 60;
  display: flex; align-items: center; justify-content: center;
  background: rgba(15, 23, 42, 0.45);
}
.gf-modal {
  width: 420px; max-width: 92vw; background: #fff; border-radius: 12px;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25); overflow: hidden;
}
.gf-modal-h {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px; border-bottom: 1px solid #eef0f3; font-weight: 600; font-size: 15px;
}
.gf-modal-b { padding: 16px 18px; max-height: 70vh; overflow: auto; }
.gf-modal-f {
  display: flex; gap: 10px; justify-content: flex-end;
  padding: 12px 18px; border-top: 1px solid #eef0f3; background: #fafbfc;
}
.gf-row { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.gf-lab { width: 76px; color: #555; font-size: 13px; flex: none; }
.gf-in {
  flex: 1; height: 34px; padding: 0 10px; border: 1px solid #d6dae0; border-radius: 6px;
  font-size: 13px; outline: none;
}
.gf-in:focus { border-color: #2f80ed; }
.gf-radio { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; color: #555; }

/* ===== 球场管理：筛选/搜索工具栏吸顶 =====
   🔴 2026-10-09 用户澄清：主菜单保持左侧竖排不要动，要固定的是
      「产品管理 / 高尔夫球场」下面那几块操作区（截图红框）：
        ① .panel-h  标题 + 批量导入/导出/新增球场
        ② .cw-tabs  状态页签（全部/销售中/仓库中/后台新增）
        ③ .toolbar  搜索框 + 状态下拉 + 地区/国家/价格/榜单/电询筛选 + 搜索重置
        ④ 批量操作栏（.cw-tabs 之后由 renderCourseList 渲染的 #bpWrap）
      往下翻球场列表时，这几块始终留在视野顶部，不用每次滚回顶部才能改筛选条件。

   实现要点：
   · 只给球场管理页的 panel 加类名 .cw-panel（vCourses 里加），
     其它页面的 .panel 不受影响 —— 用祖先选择器限定作用域。
   · sticky 必须在**有明确滚动容器**里才生效。页面滚动的是 body，
     所以这里用 position:sticky + top 值即可，不要写 position:fixed
     （fixed 会脱离文档流，列表内容会上移被盖住，还得手动补 padding）。
   · top 值要减去 .topbar 的高度（56px），否则会被顶栏压住一截。
   · 背景必须给不透明色，否则下面表格会透出来叠字。
   · .toolbar 本身是 flex-wrap，吸顶块高度会随窗口变窄而变高，
     所以只给 top 不给 height，让它自然撑开。 */
.cw-panel .panel-h,
.cw-panel .cw-tabs,
.cw-panel .toolbar {
  position: sticky;
  z-index: 5;
}
/* ① 标题行：最先吸顶，贴住 topbar 下沿 */
.cw-panel .panel-h {
  top: 56px;
  background: #fff;
  margin: -18px -18px 0;         /* 抵消 .panel 的 padding，让背景铺满 */
  padding: 14px 18px 10px;
  box-shadow: 0 1px 0 #eef0ef;
}
/* ② 状态页签 */
.cw-panel .cw-tabs {
  top: 111px;
  background: #fff;
  margin: 0 -18px;
  padding: 0 18px 10px;
}
/* ③ 筛选工具栏 */
.cw-panel .toolbar {
  top: 158px;
  background: #fff;
  margin: 0 -18px;
  padding: 10px 18px 14px;
  border-bottom: 1px solid #f0f2f1;
  box-shadow: 0 6px 10px -8px rgba(20,40,30,.18);
}
/* ④ 批量操作栏：跟着工具栏一起吸顶（高度随内容变，用相邻兄弟选择器不好定位，
      这里靠它在 DOM 中紧随其后，用 sticky + 固定 top 会与工具栏重叠，
      所以改为让它正常跟随滚动，只固定上面三块 —— 批量栏只在勾选后出现，
      勾选时页面通常停在列表顶部，不需要吸顶）。 */

/* 手机端：吸顶块太高会吃掉大半屏幕，改为不吸顶，避免体验更差 */
@media (max-width: 768px) {
  .cw-panel .panel-h,
  .cw-panel .cw-tabs,
  .cw-panel .toolbar {
    position: static;
    margin-left: 0; margin-right: 0; padding-left: 0; padding-right: 0;
    box-shadow: none;
  }
  .cw-panel .panel-h { margin-top: 0; }
}

/* ===== 套餐管理：筛选/搜索工具栏吸顶（与球场管理一致） =====
   🔴 2026-10-09 用户要求：「套餐管理模块的顶部筛选和搜索栏也固定，跟球场管理一样」。

   与球场管理的差异（这是本段的关键）：
   球场管理的 panel-h / cw-tabs / toolbar 是**连续**的三块，高度固定 → top 值可写死（56/111/158）。
   而套餐页在 panel-h 与 cw-tabs 之间还夹着两个**动态块**：
     #pkgBanner  警告条（云端无数据时才出现，高度不定，出现/消失会跳变）
     #pkgStats   汇总卡（在售/已售罄/仓库/低库存/未关联球场，5 张卡 grid，窄屏会换行）
   写死 top 会让"警告条出现时工具栏错位/重叠"。
   → 方案：top 值交给 JS 用 --pk-tabs-top 变量动态算（见 js/app.js 的 syncPkgStickyTop）。

   结构（DOM 顺序）：panel-h → #pkgBanner → #pkgStats → .cw-tabs → .toolbar → 表格
   只有 panel-h / cw-tabs / toolbar 三块吸顶；banner 与 stats 正常随滚动，
   否则它们叠在上面会占掉大半屏幕。 */
.pk-panel .panel-h,
.pk-panel .cw-tabs,
.pk-panel .toolbar {
  position: sticky;
  z-index: 5;
  background: #fff;
}
/* ① 标题行：贴住 .topbar 下沿（topbar 高 56px） */
.pk-panel .panel-h {
  top: 56px;
  margin: -18px -18px 0;
  padding: 14px 18px 10px;
  box-shadow: 0 1px 0 #eef0ef;
}
/* ② 状态页签：top 由 JS 写入 --pk-tabs-top（= 56 + panel-h 实际高度） */
.pk-panel .cw-tabs {
  top: var(--pk-tabs-top, 111px);
  margin: 0 -18px;
  padding: 0 18px 10px;
}
/* ③ 筛选工具栏：top = 页签 top + 页签实际高度（由 JS 写入 --pk-toolbar-top） */
.pk-panel .toolbar {
  top: var(--pk-toolbar-top, 158px);
  margin: 0 -18px;
  padding: 10px 18px 14px;
  border-bottom: 1px solid #f0f2f1;
  box-shadow: 0 6px 10px -8px rgba(20,40,30,.18);
}

/* 手机端：三块吸顶会吃掉大半屏幕，改为不吸顶 */
@media (max-width: 768px) {
  .pk-panel .panel-h,
  .pk-panel .cw-tabs,
  .pk-panel .toolbar {
    position: static;
    margin-left: 0; margin-right: 0; padding-left: 0; padding-right: 0;
    box-shadow: none;
  }
  .pk-panel .panel-h { margin-top: 0; }
}
