/* 安妮花·中国成都 · 官网门户
   视觉：品牌绿 #7fcc3f（采样自经典 logo）+ 暖白极简
   设计 token 与 ALL-SYSTEMS-UI-REDESIGN.md 保持一致
   2026-10：叠加「高级童趣 Premium Playfulness」——结构成熟、细节有趣 */

:root{
  /* 品牌绿（采样自经典 logo） */
  --brand-50:#f4fbeb; --brand-100:#edf9e6; --brand-200:#dcf3ca; --brand-300:#c4ed9f;
  --brand-400:#98e75c; --brand-500:#7fcc3f; --brand-600:#66a830; --brand-700:#4e8026; --brand-800:#1d5751; --brand-900:#143b37;
  --brand-grad:linear-gradient(135deg,#98e75c 0%,#7fcc3f 100%);
  /* 兼容别名：早期内联样式（franchise.js 等）直接写 var(--brand)，缺定义会让整条声明失效 */
  --brand:var(--brand-500); --brand-deep:var(--brand-700); --brand-soft:var(--brand-50); --brand-line:var(--brand-200);
  /* 语义色 */
  --ok:#34A853; --risk:#EF5350; --warn:#FFB020; --info:#29B6F6;
  /* 中性 / 表面：暖奶油底，不再纯白到底（高级童趣 · 柔和亲切） */
  --bg:#F7F5F1; --bg-soft:#FBF9F5; --card:#FFFFFF; --card-warm:#FFFDF9;
  --bg-cream:#FDFBF7; --bg-warm:#F4F0E9;
  --text:#17181C; --text-sub:#6E737C; --text-light:#A5AAB2;
  --border:#EBEDF0; --border-soft:#F2F3F5;
  /* 童趣支撑色系：低饱和 / 可共存；每页只用「1 主 + 1 辅 + 中性」，其余仅状态或小面积点缀。
     来源：奶油黄 / 鼠尾草绿 / 雾霾蓝 / 暖橘 / 柔和紫 / 品牌血缘珊瑚。 */
  --sf-cream:#EBD9A8;   --sf-cream-soft:#FBF5E4;
  --sf-sage:#93AE8B;    --sf-sage-soft:#EDF3EA;
  --sf-mist:#8AA6C0;    --sf-mist-soft:#EDF2F7;
  --sf-apricot:#E3A578; --sf-apricot-soft:#FAEFE6;
  --sf-lilac:#A79BC2;   --sf-lilac-soft:#F1EEF7;
  --sf-coral:#E0786C;   --sf-coral-soft:#FBEDEA;
  /* 阴影：暖调、更柔（不加重、不炫技） */
  --shadow-sm:0 1px 2px rgba(60,48,32,.05);
  --shadow:0 6px 20px rgba(60,48,32,.07),0 1px 3px rgba(60,48,32,.04);
  --shadow-lg:0 16px 44px rgba(127,204,63,.16),0 4px 14px rgba(60,48,32,.06);
  /* 圆角：比企业 SaaS 略圆润，但不做儿童 App（按钮/输入 10-12，卡片 14-18，模块 18-24） */
  --r-sm:11px; --r-md:14px; --r-lg:18px; --r-xl:22px; --r-pill:999px;
  /* 缓动：轻到用户意识不到它在炫技 */
  --ease:cubic-bezier(.22,.61,.36,1); --ease-soft:cubic-bezier(.33,.1,.2,1);
  /* 数字字体：等宽数字，保证 KPI / 金额 / 报表纵向对齐 */
  --font-num:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  /* 兼容旧变量 */
  --sky:var(--brand-500); --grass:var(--brand-500); --tomato:var(--brand-500); --sun:var(--warn); --green:var(--ok);
  --glass:#ffffff; --glass-2:rgba(255,255,255,.72); --r:var(--r-lg);
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  min-height:100vh;
  background:
    radial-gradient(ellipse 80% 50% at 12% -8%, rgba(127,204,63,.09), transparent 55%),
    radial-gradient(ellipse 60% 40% at 95% 0%, rgba(235,217,168,.16), transparent 55%),
    linear-gradient(180deg, #FDFBF7 0%, #F7F5F1 40%, #FBF9F5 100%);
  background-attachment:fixed;
  color:var(--text);
  font-family:"Source Han Sans SC","Source Han Sans CN","Noto Sans SC","Noto Sans CJK SC","PingFang SC","Microsoft YaHei",system-ui,-apple-system,sans-serif;
  font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none}
code{background:var(--brand-50);color:var(--brand-700);padding:1px 6px;border-radius:5px;font-size:12.5px;
  font-family:ui-monospace,Consolas,monospace}

/* ---------- 顶栏（移动优先：默认紧凑，桌面展开） ---------- */
.topbar{
  position:sticky;top:0;z-index:40;
  display:flex;align-items:center;gap:12px;
  padding:10px 16px;
  background:rgba(255,255,255,.78);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-bottom:1px solid var(--border-soft);
}
.brand{display:flex;align-items:center;gap:10px;min-width:0}
/* 品牌标记：品牌绿渐变底 + 安妮花小图形（af-flower），不使用 Emoji */
.brand-mark{position:relative;width:34px;height:34px;flex:none;border-radius:10px;
  background:var(--brand-grad);box-shadow:0 4px 12px rgba(127,204,63,.35);
  display:grid;place-items:center;font-size:18px;color:#15171A}
/* 品牌标（真实安妮花 logo · 纯图形 mark）：白底圆角徽标，比纯色渐变底更易辨认 */
.brand-emblem{width:34px;height:34px;flex:none;border-radius:10px;background:#fff;
  border:1px solid var(--border-soft);object-fit:contain;padding:2px;
  box-shadow:0 4px 12px rgba(127,204,63,.18);display:block}
/* 系统外壳内嵌真实 logo：容器内 img 统一铺满并白底圆角，保证各系统品牌一致 */
.brand-mark>img,.mark>img,.mt-mark>img,.brand-logo>img,.logo-icon>img,.fr-brand>img{
  width:100%;height:100%;object-fit:contain;display:block;border-radius:8px;background:#fff;padding:2px;box-sizing:border-box}
/* 容器自带装饰字符（如 .mt-mark:after）时，内嵌真实 logo 后隐藏装饰 */
.mt-mark:has(>img)::after{content:none}
/* 完整 logo（长 logo / 口号 logo / 前台 logo / 经典 logo / 头像）展示位 */
.hero-brand{display:block;width:min(360px,78%);height:auto;margin:0 auto 14px}
.about-brand{display:block;width:min(300px,72%);height:auto;margin:0 0 16px}
.foot-brand{display:block;width:min(300px,80%);height:auto;margin:0 auto 12px}
.login-card .lc-logo{display:block;width:190px;max-width:72%;height:auto;margin:0 auto 16px}
.auth-avatar{width:24px;height:24px;border-radius:50%;object-fit:contain;background:#fff;
  border:1px solid var(--border-soft);padding:1px;box-sizing:border-box;vertical-align:-6px;margin-right:6px}
.brand-text b{display:block;font-size:14.5px;font-weight:800;line-height:1.2;white-space:nowrap}
.brand-text em{display:none;font-style:normal;font-size:11px;letter-spacing:.05em;
  color:var(--brand-600);font-weight:600}
.menu-btn{display:flex;width:40px;height:40px;border-radius:10px;border:1px solid var(--border);background:#fff;
  font-size:20px;align-items:center;justify-content:center;cursor:pointer;color:var(--text-sub);flex:none}
.topnav{display:none;gap:4px;margin-left:auto}
.topnav a{
  font-size:13.5px;color:var(--text-sub);padding:8px 15px;border-radius:var(--r-pill);
  border:1px solid transparent;transition:.18s;
}
.topnav a:hover{background:var(--brand-50);color:var(--brand-700)}
.topnav a.on{
  background:var(--brand-500);color:#15171A;font-weight:600;
  box-shadow:0 4px 12px rgba(127,204,63,.28);
}
.auth-box{display:flex;align-items:center;gap:8px;margin-left:auto}

/* ---------- Hero ---------- */
.hero-landing{position:relative;overflow:hidden;padding:44px 20px 40px;text-align:center;
  background:
    radial-gradient(ellipse 70% 60% at 15% 0%, rgba(127,204,63,.14), transparent 55%),
    radial-gradient(ellipse 60% 50% at 90% 10%, rgba(227,165,120,.16), transparent 55%),
    linear-gradient(180deg,#FFFDF8 0%, var(--bg) 80%);
}
.hero-landing-inner{position:relative;z-index:2;max-width:760px;margin:0 auto}
.hero-label{
  display:inline-block;font-size:12px;letter-spacing:.05em;color:#15171A;
  background:linear-gradient(90deg,var(--brand-600),var(--brand-500));border:none;
  border-radius:var(--r-pill);padding:6px 16px;font-weight:600;box-shadow:0 2px 8px rgba(127,204,63,.25);
}
.hero-landing h1{margin:18px 0 10px;font-size:34px;font-weight:800;letter-spacing:-.5px;line-height:1.18}
.hero-landing h1 .c1{color:var(--brand-700)} .hero-landing h1 .c2{color:var(--brand-800)}
.hero-tagline{margin:0 0 22px;font-size:15px;color:var(--text-sub);line-height:1.75}
.hero-actions{display:flex;justify-content:center;gap:12px;flex-wrap:wrap;margin-bottom:18px}
.btn-lg{padding:12px 26px;font-size:15px}
.btn-ghost{background:rgba(255,255,255,.8);border-color:var(--border);color:var(--text)}
.btn-ghost:hover{background:#fff;border-color:var(--brand-500);color:var(--brand-700)}
.hero-meta{font-size:12.5px;color:var(--text-light)}
.hero-meta b{color:var(--brand-600);font-size:15px;font-weight:800;font-family:var(--font-num);margin:0 2px}

.wrap{max-width:1120px;margin:0 auto;padding:0 20px}

/* ---------- 区块标题 ---------- */
.sec-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin:32px 0 14px}
.sec-head h2{
  margin:0;font-size:18px;font-weight:800;letter-spacing:.3px;
  display:flex;align-items:center;gap:9px;
}
.sec-head h2::before{content:"";width:4px;height:17px;background:var(--brand-grad);border-radius:var(--r-pill)}
.sec-desc{font-size:12px;color:var(--text-light);text-align:right}
/* 页面标题（升级版）：主标题 + 一句有温度的副文案。
   一句即可，不写鸡汤；副文案负责「教育感 / 品牌感」，不负责装饰。 */
.ph{margin:4px 0 18px}
.ph h2{margin:0;font-size:20px;font-weight:800;letter-spacing:.2px;display:flex;align-items:center;gap:9px}
.ph h2::before{content:"";width:4px;height:18px;background:var(--brand-grad);border-radius:var(--r-pill);flex:none}
.ph-sub{margin:7px 0 0 13px;font-size:13px;color:var(--text-sub);line-height:1.6}
.tip{font-size:13px;color:var(--text-sub);background:var(--brand-50);
  border-left:3px solid var(--brand-500);border-radius:0 var(--r-sm) var(--r-sm) 0;padding:11px 15px;margin:0 0 16px}

/* ---------- 区域经营总览 dashboard ---------- */
.ov-kpis{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:14px 0}
.kpi{position:relative;background:var(--card);border:1px solid var(--border-soft);border-radius:var(--r-md);
  padding:14px 16px;box-shadow:var(--shadow);border-top:3px solid var(--brand-500)}
.kpi .k-label{font-size:12px;color:var(--text-sub);font-weight:600}
.kpi .k-val{font-family:var(--font-num);font-size:26px;font-weight:800;color:var(--text);line-height:1.1;margin-top:4px}
.kpi .k-delta{font-size:11.5px;font-weight:700;margin-top:5px;display:flex;align-items:center;gap:3px}
.k-delta.up{color:var(--ok)} .k-delta.down{color:var(--risk)}
/* 关键数据卡：只允许「核心数据」拥有一点品牌表现，其余数据保持安静 */
.kpi--hero{background:linear-gradient(180deg,var(--brand-50),var(--card) 64%);border-top-color:var(--brand-600)}
.kpi--hero .k-val{color:var(--brand-700)}
.kpi .k-af{position:absolute;right:14px;top:13px;font-size:16px;color:var(--brand-500);opacity:.85}
/* 柔和圆环（替代普通进度条，用于比率型核心指标） */
.kpi-ring{--p:0;width:60px;height:60px;border-radius:50%;flex:none;position:relative;display:grid;place-items:center;
  background:conic-gradient(var(--brand-500) calc(var(--p,0)*1%),var(--border-soft) 0);
  transition:background .4s var(--ease)}
.kpi-ring::before{content:"";position:absolute;inset:6px;border-radius:50%;background:var(--card)}
.kpi-ring b{position:relative;font-size:13px;font-weight:800;color:var(--brand-700)}
.ov-grid{display:grid;grid-template-columns:1fr;gap:14px}
.chart-card{background:var(--card);border:1px solid var(--border-soft);border-radius:var(--r-lg);padding:16px;box-shadow:var(--shadow)}
.chart-card .ch-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.chart-card .ch-title{font-size:14px;font-weight:700}
.chart-card .ch-sub{font-size:11.5px;color:var(--text-light)}
.chart{width:100%;height:240px}
.chart.tall{height:260px}

/* ---------- 系统卡片 ---------- */
.grid{display:grid;grid-template-columns:1fr;gap:14px}
.card{
  position:relative;display:block;overflow:hidden;
  background:var(--card);
  border:1px solid var(--border-soft);
  border-radius:var(--r-lg);box-shadow:var(--shadow);
  padding:18px 18px 16px;transition:transform .2s var(--ease),box-shadow .2s var(--ease),border-color .2s var(--ease);
}
/* 左上角的柔和折角：一个「不完全对称」的构图提示，不是贴纸 */
.card::before{
  content:"";position:absolute;left:-30px;top:-30px;width:80px;height:80px;
  background:var(--brand-50);
  transform:rotate(35deg);border-radius:16px;z-index:0;opacity:.9;
}
.card > *{position:relative;z-index:1}
.card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg);border-color:var(--brand-200)}
.card:hover .card-go{transform:translateX(2px)}
.card-go{transition:transform .2s var(--ease)}
.card.clickable{cursor:pointer}
.card.disabled{opacity:.6;cursor:not-allowed}
.card.disabled:hover{transform:none;box-shadow:var(--shadow);border-color:var(--border-soft)}
.card-top{display:flex;align-items:center;gap:12px;margin-bottom:8px}
.card-icon{
  width:44px;height:44px;flex:none;border-radius:var(--r-md);display:grid;place-items:center;font-size:22px;
  background:var(--brand-50);color:var(--brand-600);
}
.card-name{font-size:15.5px;font-weight:700;line-height:1.3}
.card-path{font-size:11px;color:var(--text-light);font-family:ui-monospace,Consolas,monospace;
  margin-top:2px;word-break:break-all}
.card-desc{font-size:13px;color:var(--text-sub);margin:0;min-height:36px}
.card-foot{display:flex;align-items:center;gap:6px;margin-top:12px;padding-top:10px;
  border-top:1px dashed var(--border);font-size:11.5px;color:var(--text-light)}
.chip{display:inline-block;padding:3px 11px;border-radius:var(--r-pill);font-size:11px;font-weight:600;
  background:var(--bg);color:var(--text-sub)}
.chip.campus{background:var(--brand-50);color:var(--brand-700)}
.chip.warn{background:rgba(239,83,80,.12);color:var(--risk)}
.chip.hide{background:var(--bg);color:var(--text-light)}
.card-go{margin-left:auto;color:var(--brand-600);font-weight:700;font-size:12px}

/* ---------- 分类分组 ---------- */
.group{margin:22px 0 26px}
.group-head{display:flex;align-items:center;gap:9px;margin-bottom:12px}
.group-head i{width:9px;height:9px;border-radius:50%;background:var(--brand-500);flex:none}
.group-head h3{margin:0;font-size:14.5px;font-weight:800;letter-spacing:.3px}
.group-head span{font-size:11.5px;color:var(--text-light)}

/* 空状态：轻、小、有情绪 —— 一本打开的书里冒出一颗小嫩芽，不用巨大卡通人物 */
.empty{padding:38px 24px;text-align:center;color:var(--text-light);font-size:13.5px;
  border:1px dashed var(--border);border-radius:var(--r-lg);background:var(--card)}
.empty-art{position:relative;width:78px;height:58px;margin:0 auto 12px}
.empty-art .af-book{position:absolute;left:0;bottom:0;font-size:46px;color:var(--brand-600);opacity:.5}
.empty-art .af-sprout{position:absolute;right:6px;bottom:4px;font-size:26px;color:var(--sf-sage)}
.empty strong{display:block;color:var(--text);font-weight:600;font-size:14px;margin-bottom:4px}
.empty p{margin:0 0 14px;line-height:1.7;font-size:13px}

/* ---------- 表格 ---------- */
.table-card{
  background:var(--card);border:1px solid var(--border-soft);border-radius:var(--r-lg);
  box-shadow:var(--shadow);overflow:auto;
}
.tbl{width:100%;border-collapse:collapse;font-size:13px;min-width:940px}
.tbl th{
  text-align:left;padding:12px 14px;background:var(--bg);
  font-weight:700;color:var(--text-sub);white-space:nowrap;border-bottom:1px solid var(--border-soft);
  font-size:12px;letter-spacing:.4px;
}
.tbl td{padding:11px 14px;border-bottom:1px solid var(--border-soft);vertical-align:middle}
.tbl tr:last-child td{border-bottom:none}
.tbl tbody tr:hover{background:var(--brand-50)}
.tbl .ico{font-size:18px}
.tbl .nm{font-weight:600}
.tbl .ds{font-size:11.5px;color:var(--text-light);margin-top:1px}
.tbl .mono{font-family:ui-monospace,Consolas,monospace;font-size:12px;color:var(--text-sub)}
.muted{color:var(--text-light)}

.mv{display:flex;gap:4px}
.mv button{
  width:26px;height:26px;border-radius:var(--r-pill);border:1px solid var(--border);background:#fff;
  cursor:pointer;font-size:11px;color:var(--text-sub);line-height:1;transition:.15s
}
.mv button:hover:not(:disabled){background:var(--brand-500);color:#15171A;border-color:var(--brand-500)}
.mv button:disabled{opacity:.3;cursor:not-allowed}

/* ---------- 按钮 ---------- */
/* 按钮：专业为主，童趣只在「略圆润轮廓 + 轻微上浮 + 图标位移」三个细节里（禁止弹跳/缩放/果冻） */
.btn{
  border:1px solid var(--border);background:#fff;color:var(--text);
  padding:9px 18px;border-radius:var(--r-sm);font-size:13.5px;cursor:pointer;
  transition:border-color .16s var(--ease),color .16s var(--ease),background .16s var(--ease),box-shadow .16s var(--ease),transform .16s var(--ease);
  font-family:inherit;display:inline-flex;align-items:center;gap:6px;font-weight:600;
}
.btn .af{transition:transform .16s var(--ease)}
.btn:hover{border-color:var(--brand-300);color:var(--brand-700);background:var(--brand-50);transform:translateY(-1px)}
.btn:hover .af{transform:translateX(2px)}
.btn:active{transform:translateY(0)}
.btn-primary{background:var(--brand-grad);color:#15171A;border-color:transparent;font-weight:600;box-shadow:0 6px 18px rgba(127,204,63,.28)}
.btn-primary:hover{color:#15171A;background:var(--brand-grad);border-color:transparent;box-shadow:0 9px 24px rgba(127,204,63,.36);transform:translateY(-1px)}
.btn-sm{padding:6px 14px;font-size:12.5px}
.btn-danger{color:var(--risk);border-color:#f0c4c0}
.btn-danger:hover{background:var(--risk);color:#fff;border-color:var(--risk)}

/* ---------- 开关 ---------- */
.switch{position:relative;display:inline-block;width:42px;height:24px;margin-top:4px}
.switch input{opacity:0;width:0;height:0}
.switch i{position:absolute;inset:0;background:var(--border);border-radius:var(--r-pill);transition:.2s}
.switch i::before{
  content:"";position:absolute;width:18px;height:18px;left:3px;top:3px;background:#fff;
  border-radius:50%;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.2)
}
.switch input:checked + i{background:var(--brand-500)}
.switch input:checked + i::before{transform:translateX(18px)}

/* 用户编辑：appKey 多选行 */
.chk-row{display:flex;flex-wrap:wrap;gap:10px 20px;margin-top:8px}
.chk{display:inline-flex;align-items:center;gap:6px;font-size:14px;color:var(--text);cursor:pointer}
.chk input{width:auto;height:auto;margin:0}

/* ---------- 弹窗 ---------- */
.modal{position:fixed;inset:0;z-index:80;display:grid;place-items:center;padding:20px}
.modal[hidden]{display:none}
.modal-mask{position:absolute;inset:0;background:rgba(20,28,45,.45);backdrop-filter:blur(4px)}
.modal-box{
  position:relative;width:100%;max-width:620px;max-height:88vh;display:flex;flex-direction:column;
  background:#fff;border-radius:var(--r-lg);box-shadow:var(--shadow-lg);
  animation:pop .18s ease
}
@keyframes pop{from{opacity:0;transform:translateY(10px) scale(.985)}to{opacity:1;transform:none}}
.modal-head{display:flex;align-items:center;justify-content:space-between;
  padding:18px 22px;border-bottom:1px solid var(--border-soft)}
.modal-head h3{margin:0;font-size:17px;font-weight:800;letter-spacing:.3px}
.x{border:none;background:none;font-size:24px;line-height:1;color:var(--text-light);cursor:pointer;padding:0 4px}
.x:hover{color:var(--text)}
.modal-body{padding:20px 22px;overflow:auto;flex:1 1 auto;min-height:0}
.modal-foot{flex:none}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;padding:14px 22px;border-top:1px solid var(--border-soft)}

.frow{display:flex;gap:12px}
.fld{display:block;margin-bottom:14px;flex:1;min-width:0}
.fld > span{display:block;font-size:12.5px;color:var(--text-sub);margin-bottom:6px;font-weight:600}
.fld input,.fld select{
  width:100%;padding:10px 13px;font-size:13.5px;font-family:inherit;color:var(--text);
  border:1px solid var(--border);border-radius:var(--r-sm);background:#fff;outline:none;transition:.16s
}
.fld input:focus,.fld select:focus{border-color:var(--brand-500);box-shadow:0 0 0 3px rgba(127,204,63,.14)}
.req{color:var(--risk)}
.hint{display:block;font-size:11px;color:var(--text-light);margin-top:5px;line-height:1.5}
.f-2{flex:2} .f-1{flex:1}
.switch-fld{display:flex;flex-direction:column}
.err{margin-top:4px;padding:10px 13px;border-radius:var(--r-sm);background:rgba(239,83,80,.1);
  color:#B43326;font-size:12.5px;border-left:3px solid var(--risk)}

/* ---------- Toast ---------- */
.toast{
  position:fixed;left:50%;bottom:34px;transform:translateX(-50%);
  background:var(--text);color:#fff;padding:11px 22px;border-radius:var(--r-pill);font-size:13.5px;
  box-shadow:var(--shadow-lg);z-index:120;animation:up .2s ease
}
@keyframes up{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}

.foot{margin:40px 0 0;padding:22px 20px 30px;text-align:center;font-size:12px;
  color:var(--text-light);border-top:1px solid var(--border-soft)}

/* ---------- 登录（SSO 中心） ---------- */
.login-card{background:var(--card);border:1px solid var(--border-soft);border-radius:var(--r-lg);
  box-shadow:var(--shadow);padding:26px 24px;margin-top:6px}
.login-card .fld{display:block;margin-bottom:14px}
.login-card .fld > span{display:block;font-size:12.5px;color:var(--text-sub);margin-bottom:6px;font-weight:600}
.login-card .fld input{width:100%;padding:11px 13px;font-size:14px;font-family:inherit;color:var(--text);
  border:1px solid var(--border);border-radius:var(--r-sm);background:#fff;outline:none;transition:.16s}
.login-card .fld input:focus{border-color:var(--brand-500);box-shadow:0 0 0 3px rgba(127,204,63,.14)}

/* ---------- 抽屉（移动端导航） ---------- */
.drawer-mask{position:fixed;inset:0;background:rgba(20,22,30,.42);backdrop-filter:blur(3px);z-index:300;display:none}
.drawer{position:fixed;top:0;left:0;height:100%;width:80%;max-width:320px;background:#fff;z-index:301;
  transform:translateX(-100%);transition:transform .26s ease;box-shadow:var(--shadow-lg);display:flex;flex-direction:column}
.drawer.open{transform:translateX(0)}
.drawer-head{position:relative;padding:22px 20px;background:var(--brand-grad);color:#15171A}
.drawer-head .dh-brand{font-size:17px;font-weight:800}
.drawer-head .dh-sub{font-size:11px;opacity:.9;margin-top:2px}
.drawer-head .dh-close{position:absolute;right:16px;top:18px;background:rgba(255,255,255,.25);border:none;color:#fff;width:32px;height:32px;border-radius:8px;font-size:20px;cursor:pointer}
.drawer-nav{padding:14px;display:flex;flex-direction:column;gap:4px;overflow:auto}
.drawer-nav a{padding:13px 14px;border-radius:var(--r-md);font-size:15px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:10px}
.drawer-nav a .di{font-size:18px}
.drawer-nav a.on{background:var(--brand-50);color:var(--brand-700)}
.drawer-nav a:hover{background:var(--brand-50)}
.drawer-foot{padding:16px 20px;border-top:1px solid var(--border-soft);margin-top:auto}

/* ---------- 桌面增强 ---------- */
@media (min-width:768px){
  .topbar{padding:12px 28px;gap:16px}
  .brand-text em{display:block}
  .menu-btn{display:none}
  .topnav{display:flex;margin-left:auto}
  .auth-box{margin-left:0}
  .hero-landing{padding:64px 28px 56px}
  .hero-landing h1{font-size:46px}
  .hero-tagline{font-size:16.5px}
  .ov-kpis{grid-template-columns:repeat(4,1fr)}
  .ov-grid{grid-template-columns:1.4fr 1fr}
  .intro-section{display:grid;grid-template-columns:1.1fr .9fr;gap:44px;margin:46px 0 32px}
  .intro-main .sec-head{margin-top:0}
  .intro-body p{margin:0 0 14px;font-size:15px;color:var(--text-sub);line-height:1.85}
  .stat-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
  .stat-card{background:var(--card);border:1px solid var(--border-soft);border-radius:var(--r-lg);
    padding:20px 16px;text-align:center;box-shadow:var(--shadow)}
  .stat-card b{display:block;font-family:var(--font-num);font-size:34px;font-weight:800;color:var(--brand-600);line-height:1}
  .stat-card span{display:block;font-size:13px;font-weight:700;color:var(--text);margin-top:7px}
  .stat-card em{display:block;font-size:11.5px;color:var(--text-light);font-style:normal;margin-top:4px}
  /* 时间线：年份落在轨道左侧的独立栏内（在 .wrap 内部留白，不再向视口外溢出）。
     旧写法 timeline 只留 22px、日期却 left:-96px，窄视口下年份会被裁掉。 */
  .timeline{position:relative;padding-left:96px;margin:10px 0 42px}
  .timeline::before{content:"";position:absolute;left:84px;top:8px;bottom:8px;width:2px;background:var(--border)}
  .timeline-item{position:relative;padding:0 0 26px 30px}
  .timeline-item:last-child{padding-bottom:0}
  .timeline-dot{position:absolute;left:-18px;top:3px;width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid var(--border)}
  .timeline-item.on .timeline-dot{border-color:var(--brand-500);background:var(--brand-500)}
  .timeline-date{position:absolute;left:-96px;top:0;width:74px;text-align:right;font-size:12.5px;font-weight:700;color:var(--text-sub)}
  .timeline-text h4{margin:0 0 5px;font-size:15.5px;font-weight:800;color:var(--text)}
  .timeline-text p{margin:0;font-size:13.5px;color:var(--text-sub);line-height:1.65}
  .gallery{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin:10px 0 44px}
  .gallery-card{background:var(--card);border:1px solid var(--border-soft);border-radius:var(--r-lg);
    overflow:hidden;box-shadow:var(--shadow);transition:.2s}
  .gallery-card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)}
  .gallery-img{height:160px;display:grid;place-items:center;
    background:linear-gradient(135deg,var(--brand-50) 0%,rgba(255,255,255,.55) 100%);
    position:relative;overflow:hidden}
  .gallery-img::before{content:"";position:absolute;inset:0;
    background:radial-gradient(circle at 30% 30%,rgba(255,255,255,.7),transparent 60%)}
  .gallery-icon{position:relative;z-index:1;font-size:46px;color:var(--brand-500);opacity:.9}
  .gallery-cap{padding:14px 16px}
  .gallery-cap b{display:block;font-size:14px;font-weight:700;color:var(--text)}
  .gallery-cap span{display:block;font-size:12px;color:var(--text-light);margin-top:3px}
  .systems-wrap{padding-top:22px;padding-bottom:22px;margin-top:34px;border-top:1px solid var(--border-soft)}
  .grid{grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:16px}
  .sec-head{margin:34px 0 16px}
  .sec-head h2{font-size:20px}
}
@media (min-width:1024px){
  .ov-grid{grid-template-columns:1.5fr 1fr}
  .chart.tall{height:280px}
}

/* ---------------- 区域经营总览：登录锁定 ---------------- */
.ov-locked-hint{grid-column:1/-1;padding:32px 16px;text-align:center;color:var(--text-light);font-size:13px;background:var(--bg-soft,var(--card));border:1px dashed var(--border-soft);border-radius:var(--r-lg)}
.ov-lock{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px 16px;text-align:center;color:var(--text-light);font-size:13px;background:var(--bg-soft,var(--card));border:1px dashed var(--border-soft);border-radius:var(--r-lg);margin:14px 0}
.ov-lock .lock-ico{font-size:26px;color:var(--brand-500);opacity:.8}
.ov-lock a{color:var(--brand-700);font-weight:700;text-decoration:none}

/* ---------------- 账号管理 ---------------- */
/* Tab：比普通后台稍微活泼——当前态用品牌色文字 + 一根短圆角线，
   不做「所有导航都变成胶囊」；hover 只做颜色过渡。 */
.acct-tabs{display:flex;gap:24px;margin-bottom:16px;border-bottom:1px solid var(--border-soft)}
.acct-tab{position:relative;padding:9px 2px;border:0;background:none;color:var(--text-light);
  font-size:13.5px;font-weight:600;font-family:inherit;cursor:pointer;transition:color .16s var(--ease)}
.acct-tab:hover{color:var(--text-sub)}
.acct-tab.on{color:var(--brand-700)}
.acct-tab::after{content:"";position:absolute;left:50%;bottom:-1px;width:0;height:3px;border-radius:var(--r-pill);
  background:var(--brand-grad);transform:translateX(-50%);transition:width .2s var(--ease)}
.acct-tab.on::after{width:22px}
.modal-wide{max-width:640px}

/* ---------------- 权限树 ---------------- */
.perm-tree{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.perm-group{border:1px solid var(--border-soft);border-radius:var(--r-md);overflow:hidden}
.perm-group-head{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:9px 12px;background:var(--bg-soft,var(--card));font-size:13px;font-weight:700;color:var(--text);
  cursor:pointer;user-select:none
}
.perm-group-head:hover{background:var(--brand-50,rgba(127,204,63,.08))}
.perm-group-head .pg-name{display:flex;align-items:center;gap:6px;flex:1}
.perm-group-head .pg-all{
  display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;
  color:var(--brand-600,var(--text));cursor:pointer;white-space:nowrap
}
.perm-group-head .pg-all input{width:auto;height:auto;margin:0;cursor:pointer}
.perm-group-head .pg-count{
  font-size:11px;font-weight:600;color:var(--text-light);
  background:rgba(31,39,51,.06);border-radius:var(--r-pill);padding:1px 8px
}
.perm-group-head .pg-arrow{font-size:11px;color:var(--text-light);transition:transform .2s}
.perm-group-head.open .pg-arrow{transform:rotate(180deg)}
.perm-group-body{display:flex;flex-wrap:wrap;gap:8px 16px;padding:12px 14px;border-top:1px solid var(--border-soft)}
.perm-group-body.collapsed{display:none}
.perm-item{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text);cursor:pointer}
.perm-item input{width:auto;height:auto;margin:0}
.perm-item .pm-desc{font-size:11px;color:var(--text-light)}

/* ============================================================
   安妮花小图形系统 · Annie Flower Shape System（2026-10）
   「高级童趣」的图形底座：线条简单 / 几何化 / 抽象化 / 轻手绘感 / 现代 / 克制。
   —— 只作点缀、状态反馈、空状态、页面装饰、引导元素，不做主角，也不做卡通人物 IP。
   实现：CSS mask + 内联 SVG（currentColor 跟随文字色，零额外请求、可任意缩放）。
   用法：<i class="af af-sprout"></i>，尺寸用 font-size 控制，颜色用 color 控制。
   ============================================================ */
.af{
  display:inline-block;width:1em;height:1em;flex:none;vertical-align:-.12em;
  background-color:currentColor;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:contain;mask-size:contain;
}
.af-sprout{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21v-8'/%3E%3Cpath d='M12 13c0-3 2.2-5 5.5-5 0 3.4-2.2 5.5-5.5 5.5z'/%3E%3Cpath d='M12 15.5c0-2.6-1.9-4.3-4.6-4.3 0 2.9 1.9 4.6 4.6 4.6z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21v-8'/%3E%3Cpath d='M12 13c0-3 2.2-5 5.5-5 0 3.4-2.2 5.5-5.5 5.5z'/%3E%3Cpath d='M12 15.5c0-2.6-1.9-4.3-4.6-4.3 0 2.9 1.9 4.6 4.6 4.6z'/%3E%3C/svg%3E")}
.af-seed{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5c2.8 2.2 4.3 4.8 4.3 7.4a4.3 4.3 0 1 1-8.6 0c0-2.6 1.5-5.2 4.3-7.4z'/%3E%3Cpath d='M12 11.5v6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5c2.8 2.2 4.3 4.8 4.3 7.4a4.3 4.3 0 1 1-8.6 0c0-2.6 1.5-5.2 4.3-7.4z'/%3E%3Cpath d='M12 11.5v6'/%3E%3C/svg%3E")}
.af-petal{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3c2.4 3 3.6 5.6 3.6 7.8A3.6 3.6 0 0 1 12 14.4a3.6 3.6 0 0 1-3.6-3.6C8.4 8.6 9.6 6 12 3z'/%3E%3Cpath d='M12 14.4V21'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3c2.4 3 3.6 5.6 3.6 7.8A3.6 3.6 0 0 1 12 14.4a3.6 3.6 0 0 1-3.6-3.6C8.4 8.6 9.6 6 12 3z'/%3E%3Cpath d='M12 14.4V21'/%3E%3C/svg%3E")}
.af-leaf{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 19.5C4.5 11 10.5 6 19 6c0 8.5-6 13.5-14.5 13.5z'/%3E%3Cpath d='M4.5 19.5C8 15.5 12 12.5 16.5 11'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 19.5C4.5 11 10.5 6 19 6c0 8.5-6 13.5-14.5 13.5z'/%3E%3Cpath d='M4.5 19.5C8 15.5 12 12.5 16.5 11'/%3E%3C/svg%3E")}
.af-book{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5.5A2.5 2.5 0 0 1 6.5 3H11v15.5H6.5A2.5 2.5 0 0 0 4 21z'/%3E%3Cpath d='M20 5.5A2.5 2.5 0 0 0 17.5 3H13v15.5h4.5A2.5 2.5 0 0 1 20 21z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5.5A2.5 2.5 0 0 1 6.5 3H11v15.5H6.5A2.5 2.5 0 0 0 4 21z'/%3E%3Cpath d='M20 5.5A2.5 2.5 0 0 0 17.5 3H13v15.5h4.5A2.5 2.5 0 0 1 20 21z'/%3E%3C/svg%3E")}
.af-star{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.6l2.5 5.2 5.7.8-4.1 4 1 5.7-5.1-2.7-5.1 2.7 1-5.7-4.1-4 5.7-.8z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.6l2.5 5.2 5.7.8-4.1 4 1 5.7-5.1-2.7-5.1 2.7 1-5.7-4.1-4 5.7-.8z'/%3E%3C/svg%3E")}
.af-sun{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2.5v2M12 19.5v2M2.5 12h2M19.5 12h2M5.2 5.2l1.4 1.4M17.4 17.4l1.4 1.4M18.8 5.2l-1.4 1.4M6.6 17.4l-1.4 1.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2.5v2M12 19.5v2M2.5 12h2M19.5 12h2M5.2 5.2l1.4 1.4M17.4 17.4l1.4 1.4M18.8 5.2l-1.4 1.4M6.6 17.4l-1.4 1.4'/%3E%3C/svg%3E")}
.af-cloud{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7.5 18.5a4 4 0 0 1-.6-8A5.5 5.5 0 0 1 17.6 12a3.3 3.3 0 0 1-.6 6.5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7.5 18.5a4 4 0 0 1-.6-8A5.5 5.5 0 0 1 17.6 12a3.3 3.3 0 0 1-.6 6.5z'/%3E%3C/svg%3E")}
.af-lamp{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 20h8'/%3E%3Cpath d='M12 20v-3.5'/%3E%3Cpath d='M7.2 10.5a4.8 4.8 0 0 1 9.6 0z'/%3E%3Cpath d='M12 3.2v1.6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 20h8'/%3E%3Cpath d='M12 20v-3.5'/%3E%3Cpath d='M7.2 10.5a4.8 4.8 0 0 1 9.6 0z'/%3E%3Cpath d='M12 3.2v1.6'/%3E%3C/svg%3E")}
.af-flower{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='2.5'/%3E%3Ccircle cx='15.6' cy='10.9' r='2.5'/%3E%3Ccircle cx='14.2' cy='15.1' r='2.5'/%3E%3Ccircle cx='9.8' cy='15.1' r='2.5'/%3E%3Ccircle cx='8.4' cy='10.9' r='2.5'/%3E%3Ccircle cx='12' cy='11.9' r='1.3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='8' r='2.5'/%3E%3Ccircle cx='15.6' cy='10.9' r='2.5'/%3E%3Ccircle cx='14.2' cy='15.1' r='2.5'/%3E%3Ccircle cx='9.8' cy='15.1' r='2.5'/%3E%3Ccircle cx='8.4' cy='10.9' r='2.5'/%3E%3Ccircle cx='12' cy='11.9' r='1.3'/%3E%3C/svg%3E")}
.af-path{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 21c0-4.5 6-4.5 6-9s-6-4.5-6-9' stroke-dasharray='2.4 3'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 21c0-4.5 6-4.5 6-9s-6-4.5-6-9' stroke-dasharray='2.4 3'/%3E%3C/svg%3E")}
.af-home{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 10.6 12 4.4l7.5 6.2'/%3E%3Cpath d='M6.5 9.6v9.8h11V9.6'/%3E%3Cpath d='M10.4 19.4v-4.2h3.2v4.2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 10.6 12 4.4l7.5 6.2'/%3E%3Cpath d='M6.5 9.6v9.8h11V9.6'/%3E%3Cpath d='M10.4 19.4v-4.2h3.2v4.2'/%3E%3C/svg%3E")}
.af-chart{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 20.5V14'/%3E%3Cpath d='M12 20.5V9.5'/%3E%3Cpath d='M19 20.5V5'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 20.5V14'/%3E%3Cpath d='M12 20.5V9.5'/%3E%3Cpath d='M19 20.5V5'/%3E%3C/svg%3E")}
.af-compass{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.6'/%3E%3Cpath d='M15.4 8.6l-2.2 5-5 2.2 2.2-5z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.6'/%3E%3Cpath d='M15.4 8.6l-2.2 5-5 2.2 2.2-5z'/%3E%3C/svg%3E")}
.af-route{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='6' cy='18' r='2.1'/%3E%3Ccircle cx='18' cy='6' r='2.1'/%3E%3Cpath d='M8.1 18h6.4a3.5 3.5 0 0 0 3.5-3.5V8.1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='6' cy='18' r='2.1'/%3E%3Ccircle cx='18' cy='6' r='2.1'/%3E%3Cpath d='M8.1 18h6.4a3.5 3.5 0 0 0 3.5-3.5V8.1'/%3E%3C/svg%3E")}
.af-lock{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='10.5' width='14' height='9.5' rx='2.4'/%3E%3Cpath d='M8.2 10.5V8a3.8 3.8 0 0 1 7.6 0v2.5'/%3E%3Cpath d='M12 14.4v2'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='5' y='10.5' width='14' height='9.5' rx='2.4'/%3E%3Cpath d='M8.2 10.5V8a3.8 3.8 0 0 1 7.6 0v2.5'/%3E%3Cpath d='M12 14.4v2'/%3E%3C/svg%3E")}
.af-building{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 9.8 12 4.6l8.5 5.2'/%3E%3Cpath d='M7 10v9M12 10v9M17 10v9'/%3E%3Cpath d='M3.5 20.4h17'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 9.8 12 4.6l8.5 5.2'/%3E%3Cpath d='M7 10v9M12 10v9M17 10v9'/%3E%3Cpath d='M3.5 20.4h17'/%3E%3C/svg%3E")}
.af-trend{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 16.8l4.3-4.5 3.2 2.7 6.1-6.4'/%3E%3Cpath d='M14.8 8.6h3.6v3.6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 16.8l4.3-4.5 3.2 2.7 6.1-6.4'/%3E%3Cpath d='M14.8 8.6h3.6v3.6'/%3E%3C/svg%3E")}
.af-cap{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.2 9.6 12 5l8.8 4.6L12 14.2z'/%3E%3Cpath d='M7 11.7v4.1c0 1.4 2.2 2.4 5 2.4s5-1 5-2.4v-4.1'/%3E%3Cpath d='M20.2 10.4v4.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.2 9.6 12 5l8.8 4.6L12 14.2z'/%3E%3Cpath d='M7 11.7v4.1c0 1.4 2.2 2.4 5 2.4s5-1 5-2.4v-4.1'/%3E%3Cpath d='M20.2 10.4v4.4'/%3E%3C/svg%3E")}
.af-partner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.2' cy='12' r='5.4'/%3E%3Ccircle cx='14.8' cy='12' r='5.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.2' cy='12' r='5.4'/%3E%3Ccircle cx='14.8' cy='12' r='5.4'/%3E%3C/svg%3E")}
.af-doc{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 3.8h7.2L18 8.1v12.1H6.5z'/%3E%3Cpath d='M13.5 3.8v4.4H18'/%3E%3Cpath d='M9.2 12.6h5.6M9.2 15.8h3.6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 3.8h7.2L18 8.1v12.1H6.5z'/%3E%3Cpath d='M13.5 3.8v4.4H18'/%3E%3Cpath d='M9.2 12.6h5.6M9.2 15.8h3.6'/%3E%3C/svg%3E")}
.af-coin{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.2'/%3E%3Cpath d='M12 7.6v8.8'/%3E%3Cpath d='M14.6 9.7c-.5-.8-1.5-1.3-2.6-1.3-1.4 0-2.5.8-2.5 1.9 0 2.7 5.4 1.3 5.4 4 0 1.2-1.2 2-2.7 2-1.2 0-2.2-.5-2.7-1.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='8.2'/%3E%3Cpath d='M12 7.6v8.8'/%3E%3Cpath d='M14.6 9.7c-.5-.8-1.5-1.3-2.6-1.3-1.4 0-2.5.8-2.5 1.9 0 2.7 5.4 1.3 5.4 4 0 1.2-1.2 2-2.7 2-1.2 0-2.2-.5-2.7-1.4'/%3E%3C/svg%3E")}
.af-users{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.2' cy='8.4' r='3.3'/%3E%3Cpath d='M3.6 19.2c0-3.1 2.5-5 5.6-5s5.6 1.9 5.6 5'/%3E%3Cpath d='M15.6 6.6a3 3 0 0 1 0 5.6'/%3E%3Cpath d='M17 14.8c2 .6 3.2 2.1 3.2 4.4'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.2' cy='8.4' r='3.3'/%3E%3Cpath d='M3.6 19.2c0-3.1 2.5-5 5.6-5s5.6 1.9 5.6 5'/%3E%3Cpath d='M15.6 6.6a3 3 0 0 1 0 5.6'/%3E%3Cpath d='M17 14.8c2 .6 3.2 2.1 3.2 4.4'/%3E%3C/svg%3E")}

/* 微交互：轻到用户意识不到它在炫技 */
@keyframes af-bloom{0%{transform:scale(.86);opacity:.55}60%{transform:scale(1.05)}100%{transform:scale(1);opacity:1}}
@keyframes af-sway{0%,100%{transform:rotate(-3deg)}50%{transform:rotate(3deg)}}
@keyframes af-rise{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.af-bloom{animation:af-bloom .5s var(--ease) both}
.af-sway{animation:af-sway 3.6s var(--ease-soft) infinite;transform-origin:50% 92%}
.af-rise{animation:af-rise .34s var(--ease) both}
@media (prefers-reduced-motion:reduce){.af-bloom,.af-sway,.af-rise{animation:none!important}}

/* 成长轨迹 · Seed → Grow → Bloom（视觉语言，不替换业务字段） */
.growth-path{display:inline-flex;align-items:center;gap:10px;font-size:12.5px;color:var(--text-sub);font-weight:600}
.growth-path i{font-size:15px;color:var(--brand-600)}
.growth-path .gp-arrow{color:var(--text-light);font-size:12px;font-weight:400}
.growth-path .gp-on{color:var(--brand-700)}
.growth-path .gp-on i{color:var(--brand-600)}

/* ============================================================
   高级童趣 · 页面级（2026-10）
   童趣浓度：登录页 80% → 欢迎区 70% → 首页 40%；
   越接近财务 / 数据 / 管理，越专业（财务 5% · 数据分析 10% · 设置 5%）。
   ============================================================ */

/* ---------- 登录页（浓度 80%）：左品牌绘本插画 + 右极简表单 ----------
   目标是「儿童教育品牌的温度」，不是普通 SaaS 后台登录页。 */
.login-split{
  max-width:1120px;margin:30px auto 60px;padding:0 20px;
  display:grid;grid-template-columns:1.05fr .95fr;gap:22px;align-items:stretch;
}
.login-visual{
  position:relative;overflow:hidden;border-radius:var(--r-xl);
  background:linear-gradient(152deg,var(--brand-50) 0%,#FDF9EE 48%,var(--sf-cream-soft) 100%);
  border:1px solid var(--brand-200);
  padding:34px 32px;display:flex;flex-direction:column;min-height:470px;
}
.login-visual::before{content:"";position:absolute;right:-70px;top:-70px;width:220px;height:220px;border-radius:50%;background:rgba(127,204,63,.12)}
.login-visual::after{content:"";position:absolute;left:-56px;bottom:-64px;width:190px;height:190px;border-radius:50%;background:rgba(235,217,168,.30)}
.lv-inner{position:relative;z-index:2;display:flex;flex-direction:column;gap:16px;flex:1}
.lv-brand{display:flex;align-items:center;gap:10px}
.lv-logo{width:46px;height:46px;border-radius:var(--r-sm);background:#fff;border:1px solid var(--border-soft);display:grid;place-items:center;box-shadow:0 4px 14px rgba(127,204,63,.2);flex:none;overflow:hidden;padding:4px}
.lv-logo img{width:100%;height:100%;object-fit:contain;display:block}
.lv-brand b{display:block;font-size:15px;font-weight:800;line-height:1.2}
.lv-brand em{display:block;font-style:normal;font-size:10.5px;letter-spacing:.14em;color:var(--brand-700);margin-top:2px}
.lv-title{margin:8px 0 0;font-size:26px;font-weight:800;line-height:1.34;letter-spacing:.2px;color:var(--text)}
.lv-title .c{color:var(--brand-700)}
.lv-sub{margin:0;font-size:13.5px;color:var(--text-sub);line-height:1.7;max-width:340px}
.lv-art{position:relative;z-index:2;width:100%;max-width:340px;height:auto;display:block;margin:2px auto 0}
.lv-step{position:relative;z-index:2;margin-top:auto;padding-top:14px;border-top:1px dashed var(--brand-200)}
.login-panel{display:flex;align-items:center;justify-content:center}
.login-panel .login-card{margin:0;width:100%;max-width:400px;border-radius:var(--r-xl);padding:30px 28px;border-color:var(--border-soft)}
.login-panel .login-card .ph{margin:0 0 20px}
@media (max-width:900px){
  .login-split{grid-template-columns:1fr;gap:16px;margin:18px auto 40px}
  .login-visual{min-height:0;padding:26px 22px}
  .lv-art{max-width:260px;max-height:180px}
  .lv-title{font-size:21px}
}

/* ---------- 首页欢迎区（浓度 40%）：童趣集中在顶部，数据区逐渐回归专业 ---------- */
.home-welcome{
  position:relative;overflow:hidden;display:flex;align-items:center;gap:18px;
  padding:20px 26px;border-radius:var(--r-xl);
  background:linear-gradient(118deg,var(--bg-cream) 0%,var(--card-warm) 58%,var(--brand-50) 132%);
  border:1px solid var(--border-soft);box-shadow:var(--shadow-sm);
}
.pw-text{flex:1;min-width:0}
.pw-hi{margin:0;font-size:19px;font-weight:800;letter-spacing:.2px;color:var(--text);display:flex;align-items:center;gap:9px}
.pw-hi .af{color:var(--brand-500)}
.pw-sub{margin:6px 0 0;font-size:13px;color:var(--text-sub)}
.pw-art{position:relative;width:136px;height:74px;flex:none}
.pw-shape{position:absolute}
.pw-sun{right:4px;top:0;font-size:30px;color:var(--sf-cream)}
.pw-flower{right:44px;top:18px;font-size:22px;color:var(--sf-coral)}
.pw-book{right:76px;top:36px;font-size:30px;color:var(--brand-400)}
.pw-sprout{right:16px;top:44px;font-size:24px;color:var(--sf-sage)}
.home-welcome{order:0}
@media (max-width:700px){.pw-art{display:none}.home-welcome{padding:16px 18px}.pw-hi{font-size:17px}}

/* ============================================================
   ⚠ hidden 属性兜底（2026-09-10）
   下面这些类自带 display:flex，会以更高特异性盖掉 HTML [hidden] 的 UA 样式
   （[hidden]{display:none} 特异性低于类选择器）→ 必须显式补回，
   否则 JS 里 `el.hidden = true` 无效。
   实例：门户首页已登录仍显示「区域经营数据仅登录后可见 · 立即登录」（.ov-lock）。
   ============================================================ */
.ov-lock[hidden]{display:none}
.ops-plates[hidden], .fr-plates[hidden], .ol-plates[hidden]{display:none}
