
        /* ============================================================
           设计 token 真源（2026-09-24 统一）
           三层结构，改动只改这里：
             ① 调色板  —— 品牌蓝 / 语义色 / 中性色，每色另给 *-rgb 三元组
             ② 尺度    —— 圆角 / 阴影 / 面板底色，同类元素必须同级
             ③ 别名    —— 跨端别名（与小程序 app.wxss 同名同值），只能指向上面的真源
           硬规则：① 需要 alpha 变体一律写 rgba(var(--<色名>-rgb), α)，不再写死 rgba 字面量；
                   ② 同一个色相只允许出现一次 hex；③ 新增颜色先加 token 再用。
           ============================================================ */
        :root {
            /* ---- ① 调色板 ---- */
            --bg-primary: #f0f8ff; --bg-secondary: #e6f2ff;
            --bg-gradient: linear-gradient(135deg, #e6f2ff 0%, #f0f8ff 50%, #e6f7ff 100%);

            /* 品牌蓝 */
            --primary-blue: #1A8FBB;  --primary-rgb: 26,143,187;
            --secondary-blue: #42a5f5; --secondary-rgb: 66,165,245;
            --accent-blue: #64b5f6;   --accent-rgb: 100,181,246;
            --light-blue: #bbdefb;    --deep-blue: #1565c0;  --deep-rgb: 21,101,192;
            --aqua-main: #4facfe;     --aqua-rgb: 79,172,254;
            --aqua-glow: #00f2fe;     --aqua-glow-rgb: 0,242,254;
            --primary-light: #90caf9; /* 暗色模式下的品牌色替身（浅底/深底两种场景共用同一个值） */

            /* 语义色（成功 / 警告 / 危险 / 信息）——CSS 与 JS 共用同一组，勿再各写各的 */
            --success: #16a34a; --success-rgb: 22,163,74;
            --warning: #E67E22; --warning-rgb: 230,126,34;
            --danger:  #DC2626; --danger-rgb: 220,38,38; --danger-light: #EF4444;
            --info:    #2196f3; --info-rgb: 33,150,243;

            /* 中性色 */
            --mint: #2ECC71;    --mint-rgb: 46,204,113;
            --purple: #9b59b6;  --purple-rgb: 155,89,182;
            --orange: #ff7518;  --orange-rgb: 255,117,24;
            --teal: #35A7C4;    --teal-rgb: 53,167,196;
            --text-primary: #1A2332; --text-secondary: #546e7a; --text-muted: #78909c;
            --neutral-rgb: 128,128,128;

            /* ---- ② 尺度 ---- */
            /* 圆角分级（同类元素必须同级；勿再出现 8/10/12/16 混用） */
            --radius-xs: 6px;     /* 标签、输入框、小控件 */
            --radius-sm: 10px;    /* 次级面板、列表条目、普通按钮 */
            --radius-md: 14px;    /* 卡片 / 主面板 */
            --radius-xl: 24px;    /* 弹窗容器 */
            --radius-pill: 999px; /* 胶囊按钮、进度条、头像 */
            --accent-bar: 4px;    /* 卡片左侧强调条宽度（原本 3px/4px 混用，统一为一档） */
            /* 阴影分级（色相一律由 --primary-rgb 派生，不写死 rgba） */
            --shadow-sm: 0 2px 10px rgba(var(--primary-rgb),0.12);
            --shadow-md: 0 8px 26px rgba(var(--primary-rgb),0.17);
            --shadow-lg: 0 16px 48px rgba(var(--primary-rgb),0.24);
            --shadow-nav: 0 4px 30px rgba(var(--primary-rgb),0.15);
            --p-shadow: var(--shadow-md);   /* 兼容旧引用 */
            --t-shadow: var(--shadow-sm);   /* 兼容旧引用 */
            /* 浮层遮罩 */
            --overlay-bg: rgba(0,0,0,0.5); --overlay-blur: blur(5px);
            /* 内嵌面板底色（替代散落的 rgba(15,40,60,·) / rgba(10,30,50,·) / rgba(var(--neutral-rgb),·)） */
            --panel-bg: rgba(var(--neutral-rgb),0.07);
            --panel-bg-strong: rgba(var(--neutral-rgb),0.13);
            --panel-border: rgba(var(--neutral-rgb),0.18);

            /* 玻璃拟态 */
            --glass-bg: rgba(255,255,255,0.75); --glass-border: rgba(255,255,255,0.9);
            --glass-blur: blur(20px);

            /* 卡片强调色规则：不再另立色板，直接复用该卡片标题所用的语义 token，
               边色统一写成「半透明品牌色/RGB 三元组」形式 —— 保证每张卡片「字色与边色同色相」。
               （旧实现里标题是 --warning 橙、边色却是 #F1C40F 黄，两者不同色，已统一。） */

            /* 数据可视化分类色（仅用于图表序列，不表达语义，故与 --danger/--warning 分开）
               Chart.js 画在 canvas 上，读不到 CSS 变量，所以这里同时给出 hex 与 *-rgb：
               JS 侧统一用 cssVar() 取值后拼给 Chart.js，避免图表另写一套色值。 */
            --viz-1: #4facfe; --viz-1-rgb: 79,172,254;
            --viz-2: #ff4757; --viz-2-rgb: 255,71,87;
            --viz-3: #f1c40f; --viz-3-rgb: 241,196,15;
            --viz-4: #2ECC71; --viz-4-rgb: 46,204,113;
            --chart-grid: rgba(var(--neutral-rgb),0.2);  /* 亮色下白网格线等于没有，故用中性色 */

            /* ---- ③ 跨端别名（与小程序 app.wxss 同名同值，值只能指向上面的真源） ---- */
            --primary: var(--primary-blue);
            --primary-soft: #E8F4F9;        /* 与小程序 app.wxss 一致 */
            --bg: var(--bg-primary);
            --card: #ffffff;
            --text: var(--text-primary);
            --text-sub: var(--text-secondary);
            --radius: var(--radius-md);

            /* 动效 */
            --ease: cubic-bezier(0.25,0.46,0.45,0.94);
        }
        * { margin: 0; padding: 0; box-sizing: border-box; font-family: -apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Microsoft YaHei',sans-serif; }
        html { scroll-behavior: smooth; scroll-padding-top: 80px; font-size: 16px; }
        body { background: var(--bg-primary); background-image: var(--bg-gradient); color: var(--text-primary); overflow-x: hidden; line-height: 1.7; font-weight: 400; letter-spacing: 0; }
        h1, h2, h3, h4 { letter-spacing: 0; }
        ::-webkit-scrollbar { width: 10px; height: 10px; }
        ::-webkit-scrollbar-track { background: rgba(240,248,255,0.5); border-radius: var(--radius-sm); }
        ::-webkit-scrollbar-thumb { background: linear-gradient(180deg,var(--primary-blue),var(--secondary-blue)); border-radius: var(--radius-sm); border: 2px solid rgba(240,248,255,0.5); }
        ::-webkit-scrollbar-thumb:hover { background: linear-gradient(180deg,var(--secondary-blue),var(--accent-blue)); }
        ::selection { background: var(--primary-blue); color: white; }
        img { image-rendering: -webkit-optimize-contrast; }

        .section-tag { display: inline-block; padding: 4px 12px; border-radius: var(--radius-xs); font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0; margin-bottom: 8px; }
        .section-tag.tools { background: rgba(var(--aqua-rgb),0.1); color: var(--aqua-main); }
        .section-tag.knowledge { background: rgba(var(--mint-rgb),0.1); color: var(--mint); }
        .section-spacing { scroll-margin-top: 80px; }
        .section-divider { width: 100%; height: 1px; background: linear-gradient(90deg,transparent,var(--glass-border),transparent); margin: 0; border: none; }

        /* Navigation */
        nav { display: flex; justify-content: space-between; align-items: center; padding: 12px 4%; background: rgba(255,255,255,0.95); backdrop-filter: var(--glass-blur); position: fixed; width: 100%; top: 0; z-index: 100; border-bottom: 1px solid var(--glass-border); box-shadow: var(--shadow-nav); transition: box-shadow 0.3s; }
        nav.scrolled { box-shadow: var(--shadow-md); }
        .logo { font-weight: 800; font-size: 1.5rem; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-transform: uppercase; letter-spacing: 0; }
        .nav-links { display: flex; list-style: none; gap: 25px; align-items: center; flex-wrap: wrap; justify-content: flex-end; }
        .nav-links a { text-decoration: none; color: var(--text-secondary); font-size: 0.82rem; font-weight: 500; opacity: 0.85; transition: all 0.3s var(--ease); padding: 6px 12px; border-radius: var(--radius-pill); white-space: nowrap; position: relative; }
        .nav-links a::after { content: ''; position: absolute; width: 0; height: 2px; bottom: 2px; left: 50%; background: linear-gradient(90deg,var(--primary-blue),var(--secondary-blue)); transition: 0.3s var(--ease); transform: translateX(-50%); }
        .nav-links a:hover { opacity: 1; color: var(--primary-blue); background: linear-gradient(135deg,rgba(var(--primary-rgb),0.1),rgba(var(--secondary-rgb),0.05)); }
        .nav-links a:hover::after { width: 80%; }
        .nav-links a.active { color: var(--primary-blue) !important; opacity: 1 !important; background: linear-gradient(135deg,rgba(var(--primary-rgb),0.12),rgba(var(--secondary-rgb),0.06)); }
        .nav-links a.active::after { width: 80% !important; }
        .nav-group-label { font-size: 0.6rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0; color: var(--text-muted); padding: 4px 14px 2px; opacity: 0.6; list-style: none; pointer-events: none; white-space: nowrap; }
        .nav-divider { height: 1px; background: var(--glass-border); margin: 4px 14px; list-style: none; }
        .burger-menu { display: none; cursor: pointer; z-index: 101; position: relative; }
        .burger-menu div { width: 25px; height: 3px; background: linear-gradient(90deg,var(--primary-blue),var(--secondary-blue)); margin: 5px 0; transition: 0.3s; border-radius: 2px; }

        /* Hero */
        .hero { min-height: 82vh; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; background: linear-gradient(160deg,var(--bg-secondary) 0%,var(--bg-primary) 48%,#e3f4ec 100%); padding: 130px 24px 110px; position: relative; overflow: hidden; z-index: 1; }
        .hero-media { position: absolute; inset: 0; z-index: 0; }
        .hero-media img { width: 100%; height: 100%; object-fit: cover; object-position: center; }
        .hero-overlay { position: absolute; inset: 0; z-index: 0; background: linear-gradient(rgba(240,248,255,0.72),rgba(240,248,255,0.88)); }
        .hero::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(circle at 50% 50%,rgba(var(--primary-rgb),0.08) 0%,transparent 70%); pointer-events: none; z-index: 0; }
        .hero::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 90px; background: linear-gradient(to bottom, transparent, var(--bg-primary)); pointer-events: none; z-index: 2; }
        .hero-content { max-width: 860px; position: relative; z-index: 2; display: flex; flex-direction: column; align-items: center; }
        .hero h1 { font-size: 3.8rem; font-weight: 800; margin-bottom: 18px; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; position: relative; z-index: 2; filter: drop-shadow(0 2px 10px rgba(var(--primary-rgb),0.3)); text-wrap: balance; }
        .hero p { font-size: 1.15rem; font-weight: 400; max-width: 620px; color: var(--text-secondary); line-height: 1.8; position: relative; z-index: 2; margin-bottom: 28px; }
        .hero-actions { display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; margin-bottom: 38px; }
        .hero-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 13px 28px; border-radius: var(--radius-pill); font-size: 0.95rem; font-weight: 600; color: white; text-decoration: none; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); box-shadow: var(--shadow-md); transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease); }
        .hero-btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-lg); }
        .hero-btn.secondary { background: rgba(255,255,255,0.85); color: var(--primary-blue); border: 1.5px solid rgba(var(--primary-rgb),0.25); box-shadow: var(--shadow-sm); }
        .hero-stats { display: flex; gap: 42px; flex-wrap: wrap; justify-content: center; margin-bottom: 30px; }
        .hero-stat { text-align: center; }
        .hero-stat strong { display: block; font-size: 1.7rem; font-weight: 800; color: var(--primary-blue); line-height: 1.2; }
        .hero-stat span { font-size: 0.8rem; color: var(--text-muted); }
        .hero-scroll-hint { position: relative; z-index: 2; display: inline-flex; flex-direction: column; align-items: center; gap: 6px; color: var(--text-muted); font-size: 0.78rem; text-decoration: none; animation: titleFloat 2.2s ease-in-out infinite; }
        .hero-scroll-hint::after { content: '↓'; font-size: 1.1rem; line-height: 1; }

        /* Section headers */
        .container { max-width: 1400px; margin: 0 auto; padding: 80px 40px; }
        .section-header { text-align: center; margin-bottom: 48px; position: relative; }
        .section-header h2 { font-size: 2.2rem; font-weight: 700; margin-bottom: 12px; display: inline-block; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; position: relative; }
        .section-header h2::after { content: ''; position: absolute; width: 60px; height: 3px; background: linear-gradient(90deg,var(--primary-blue),var(--secondary-blue),var(--primary-blue)); bottom: -10px; left: 50%; transform: translateX(-50%); border-radius: 2px; box-shadow: var(--shadow-sm); }
        .section-header p { color: var(--text-secondary); font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0; margin-top: 16px; font-weight: 600; opacity: 0.9; }

        /* Cards */
        .glass-card { background: var(--glass-bg); padding: 32px; border-radius: var(--radius-md); border: 1px solid var(--glass-border); backdrop-filter: var(--glass-blur); box-shadow: var(--p-shadow); transition: all 0.4s var(--ease); height: 100%; display: flex; flex-direction: column; position: relative; overflow: hidden; z-index: 1; }
        .glass-card > * { position: relative; z-index: 2; }
        .fish-card h3 { font-size: 1.3rem; color: var(--text-primary); margin-bottom: 10px; }
        .fish-card p { font-size: 0.9rem; color: var(--text-muted); margin-bottom: 15px; }
        .glass-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }

        /* Grids */
        .grid-2 { display: grid; grid-template-columns: repeat(auto-fit,minmax(480px,1fr)); gap: 24px; }
        .grid-3 { display: grid; grid-template-columns: repeat(auto-fit,minmax(320px,1fr)); gap: 24px; }

        /* Tool section */
        .section-intro { text-align: center; margin-bottom: 24px; }
        .section-intro h3 { font-size: 1.15rem; font-weight: 700; margin-bottom: 8px; }
        .section-intro p { font-size: 0.85rem; color: var(--text-muted); margin-top: 4px; }
        .result-box { display: none; padding: 20px; border-radius: var(--radius-md); border: 1px solid var(--mint); background: rgba(var(--mint-rgb),0.04); margin-top: 16px; }
        .action-btn { padding: 10px 22px; border: none; border-radius: var(--radius-sm); font-size: 0.85rem; font-weight: 600; cursor: pointer; transition: all 0.25s var(--ease); background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); color: white; box-shadow: var(--shadow-sm); }
        .action-btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-md); }
        .action-btn.btn-danger { background: linear-gradient(135deg,var(--danger-light),var(--danger)); }
        .action-btn.btn-blue { background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); }
        .action-btn.btn-muted { background: var(--text-muted); }
        .tool-input { width: 100%; padding: 10px 14px; border: 1.5px solid var(--light-blue); border-radius: var(--radius-xs); font-size: 0.9rem; outline: none; transition: all 0.25s var(--ease); background: var(--glass-bg); color: var(--text-primary); }
        .tool-input:focus { border-color: var(--primary-blue); box-shadow: 0 0 0 3px rgba(var(--primary-rgb),0.12); }
        
        .task-list { display: flex; flex-direction: column; gap: 4px; }
        .tool-label { display: block; font-size: 0.85rem; font-weight: 600; margin-bottom: 6px; color: var(--text-secondary); }
        .result-card { padding: 20px; border-radius: var(--radius-md); border-left: var(--accent-bar) solid var(--mint); background: rgba(var(--mint-rgb),0.05); margin-top: 16px; }

        /* ============================================================
           强调色 / 排版角色 / 布局工具（2026-09-27 收口）
           ------------------------------------------------------------
           起因：index.html 累积了 224 处内联 style，其中大量是同一模式反复书写
           （「0.9rem + 次要色 + margin-bottom」写了 6 遍，只有 margin 差 5px），
           边色与字色各自为政 —— 同一个「警告」，标题是橙、边框是黄。
           收口三条规则：
             ① 重复出现 ≥2 次的模式 → 抽成类；真正一次性的才留极简内联。
             ② 字号只保留少数几档，不再就近取 0.82 / 0.95 / 1.1 / 1.4 之类散值。
             ③ 颜色一律走 accent-* 或语义 token，禁止再写死彩色字面量。
           ============================================================ */

        /* ---- 文字角色（收敛散落的 0.82/0.85/0.9/0.95rem 字号） ---- */
        .text-sub   { font-size: 0.9rem;  color: var(--text-muted); line-height: 1.5; }
        .text-lead  { font-size: 0.9rem;  color: var(--text-muted); line-height: 1.6; }
        .text-note  { font-size: 0.85rem; color: var(--text-muted); line-height: 1.5; }
        .text-tiny  { font-size: 0.8rem;  color: var(--text-muted); }
        .text-center { text-align: center; }
        .text-left   { text-align: left; }

        /* ---- 强调色：三层正交 ----（定义在文字角色之后，故 .accent-text 能盖掉 .text-* 的默认字色）
           .accent-<名> 只声明 --accent / --accent-rgb，自身不产生任何视觉；
           .accent-bar    左侧强调条（宽度取 --accent-bar）
           .accent-border 整卡描边      .accent-text  文字色
           三者读同一个 --accent —— 一个色类同时决定条、边、字，
           从机制上杜绝「字是橙、边是黄」再次出现。 */
        .accent-aqua    { --accent: var(--aqua-main);    --accent-rgb: var(--aqua-rgb); }
        .accent-glow    { --accent: var(--aqua-glow);    --accent-rgb: var(--aqua-glow-rgb); }
        .accent-mint    { --accent: var(--mint);         --accent-rgb: var(--mint-rgb); }
        .accent-warning { --accent: var(--warning);      --accent-rgb: var(--warning-rgb); }
        .accent-danger  { --accent: var(--danger);       --accent-rgb: var(--danger-rgb); }
        .accent-purple  { --accent: var(--purple);       --accent-rgb: var(--purple-rgb); }
        .accent-orange  { --accent: var(--orange);       --accent-rgb: var(--orange-rgb); }
        .accent-teal    { --accent: var(--teal);         --accent-rgb: var(--teal-rgb); }
        .accent-bar     { border-left: var(--accent-bar) solid var(--accent, var(--primary-blue)); }
        .accent-border  { border-color: rgba(var(--accent-rgb, var(--primary-rgb)), 0.3); }
        .accent-text    { color: var(--accent, var(--text-primary)); }
        /* 结果区：描边与底色同源，否则又会出现「红边配另一个红底」 */
        .result-box.accent-border { background: rgba(var(--accent-rgb, var(--primary-rgb)), 0.06); }
        /* 图表图例：只有顺序没有语义，故用 --viz-* 而非语义色 */
        .viz-1 { color: var(--viz-1); } .viz-2 { color: var(--viz-2); }
        .viz-3 { color: var(--viz-3); } .viz-4 { color: var(--viz-4); }

        /* ---- 卡片内子元素排版（原先逐个写在内联里） ---- */
        .card-head { text-align: center; margin-bottom: 20px; }
        .card-head h3 { font-size: 1.15rem; font-weight: 700; }
        .card-head-lg h3 { font-size: 1.3rem; }   /* 水质趋势图标题刻意大一档 */
        .card-head-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 6px; }
        .chart-legend  { font-size: 0.75rem; color: var(--text-muted); margin-top: 10px; }
        .card-narrow { max-width: 850px;  margin: 0 auto; }
        .card-wide   { max-width: 1000px; margin: 0 auto; }
        .card-flush  { padding: 0; overflow: hidden; }
        .card-watermark { position: absolute; top: 20px; right: 20px; font-size: 2rem; opacity: 0.1; line-height: 1; }
        .card-callout { margin-top: 16px; padding: 8px; border-radius: var(--radius-xs); text-align: center; font-size: 0.75rem; font-weight: 600; background: rgba(var(--accent-rgb, var(--primary-rgb)), 0.08); }
        .mini-divider { height: 1px; background: var(--glass-border); margin: 12px auto; width: 60px; }
        .nitro-card h3 { font-size: 1.3rem; margin-bottom: 12px; }
        .nitro-card p  { font-weight: 300; color: var(--text-secondary); font-size: 0.95rem; line-height: 1.7; }
        .blog-card h3 { font-size: 1.3rem; margin-bottom: 15px; }
        .blog-card p  { font-size: 0.9rem; color: var(--text-muted); margin-bottom: 20px; }
        .faq-item h4, .info-panel h4 { font-size: 1.1rem; font-weight: 700; margin-bottom: 10px; }
        .faq-item p  { font-size: 0.9rem; color: var(--text-muted); line-height: 1.5; }
        .info-panel ul { font-size: 0.9rem; color: var(--text-muted); line-height: 1.6; }
        .tool-item h4 { font-size: 1.1rem; margin-bottom: 10px; }
        .tool-item p  { font-size: 0.85rem; color: var(--text-muted); }
        .step-panel h4 { font-size: 1rem; margin-bottom: 8px; }
        .step-panel h5 { font-size: 1rem; margin-bottom: 10px; }
        .step-panel ul { font-size: 0.9rem; color: var(--text-muted); line-height: 1.6; }
        .equip-item h4 { font-size: 1rem; font-weight: 700; margin-bottom: 10px; color: var(--aqua-main); }
        .task-item.mint    input[type="checkbox"] { accent-color: var(--mint); }
        .task-item.warning input[type="checkbox"] { accent-color: var(--warning); }

        /* ---- 结果区元素 ---- */
        .result-title  { font-size: 1.4rem; font-weight: 600; margin-bottom: 15px; }
        .result-name   { font-size: 1.2rem; font-weight: 700; }
        .result-sub    { font-size: 1rem; font-weight: 700; margin-bottom: 10px; color: var(--aqua-main); }
        .result-icons  { font-size: 3rem; margin-bottom: 10px; line-height: 1; }
        .result-note   { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--panel-border); font-size: 0.95rem; font-weight: 600; }
        .volume-value  { font-size: 2.4rem; font-weight: 800; line-height: 1.2; color: var(--aqua-main); }
        .volume-unit   { font-size: 1.1rem; font-weight: 400; color: var(--text-muted); }
        .plan-tips     { margin: 6px 0 0 18px; color: var(--text-muted); }

        /* ---- 布局工具（只收敛反复出现的同一模式，不做原子化 CSS） ---- */
        .btn-row { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; }
        .cols-sm { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
        .cols-md { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }
        .cols-lg { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
        .cols-eq3 { display: grid; grid-template-columns: repeat(3, 1fr); }
        .grid-chips { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }
        .inline-half { display: inline-block; width: 48%; margin-right: 2%; }
        .ai-frame { width: 100%; height: 100%; min-height: 700px; border: 0; display: block; }
        .fish-check { display: flex; align-items: center; gap: 6px; font-size: 0.9rem; cursor: pointer; background: var(--glass-bg); padding: 8px 10px; border-radius: var(--radius-sm); }
        .chip { padding: 6px 14px; border-radius: var(--radius-pill); font-weight: 600; background: rgba(var(--primary-rgb), 0.12); color: var(--primary-blue); }
        .gap-10 { gap: 10px; }  .gap-12 { gap: 12px; }
        .gap-15 { gap: 15px; } .gap-16 { gap: 16px; } .gap-20 { gap: 20px; }  .gap-30 { gap: 30px; }
        .mt-8 { margin-top: 8px; }   .mt-10 { margin-top: 10px; }
        .mt-12 { margin-top: 12px; } .mt-14 { margin-top: 14px; } .mt-15 { margin-top: 15px; }
        .mt-16 { margin-top: 16px; } .mt-20 { margin-top: 20px; } .mt-30 { margin-top: 30px; }
        .mt-32 { margin-top: 32px; } .mt-40 { margin-top: 40px; }
        .mb-4 { margin-bottom: 4px; }   .mb-10 { margin-bottom: 10px; } .mb-14 { margin-bottom: 14px; }
        .mb-15 { margin-bottom: 15px; } .mb-16 { margin-bottom: 16px; } .mb-20 { margin-bottom: 20px; }
        .mb-80 { margin-bottom: 80px; }
        .mr-8 { margin-right: 8px; }
        .grow { flex: 1; }
        .nowrap { white-space: nowrap; }
        .fw-bold { font-weight: 700; }

        /* Reusable panels */
        .fish-meta { display: flex; flex-wrap: wrap; gap: 8px 14px; justify-content: space-between; font-size: 0.8rem; }
        /* 鱼卡元信息固定三槽位：难度 / 水温 / pH —— 颜色按槽位定，不再逐个写内联 */
        .fish-meta span:nth-child(1) { color: var(--warning); }
        .fish-meta span:nth-child(2) { color: var(--aqua-main); }
        .fish-meta span:nth-child(3) { color: var(--mint); }
        .info-panel { background: var(--panel-bg); border-radius: var(--radius-md); padding: 20px; }
        .info-panel.compact { padding: 12px 14px; }
        .deep-panel { background: var(--panel-bg-strong); border-radius: var(--radius-md); padding: 20px; }
        .deep-panel.compact { padding: 15px; }
        .step-panel { background: var(--panel-bg); border-radius: var(--radius-md); padding: 14px 16px; }
        /* 左侧强调条刻意不在这里写死：交给 .accent-bar + .accent-<色>，
           否则本规则位置更靠后、会反过来压住强调色，五张步骤卡就全成了同一个蓝。 */
        .faq-item { background: var(--panel-bg); border-radius: var(--radius-md); padding: 20px; }
        .tool-item { text-align: center; padding: 16px 12px; border-radius: var(--radius-sm); transition: background 0.25s var(--ease); }
        .tool-item:hover { background: rgba(var(--primary-rgb),0.05); }
        .tool-item .tool-emoji { font-size: 2.2rem; margin-bottom: 10px; line-height: 1; }
        .chart-panel { background: var(--panel-bg-strong); padding: 20px; border-radius: var(--radius-md); position: relative; height: 400px; }
        .equip-item { background: var(--panel-bg-strong); padding: 20px; border-radius: var(--radius-md); }
        body.dark-mode .info-panel, body.dark-mode .faq-item { background: rgba(255,255,255,0.06); }
        body.dark-mode .deep-panel, body.dark-mode .equip-item { background: rgba(255,255,255,0.08); }
        body.dark-mode .step-panel { background: rgba(255,255,255,0.05); }
        body.dark-mode .chart-panel { background: rgba(255,255,255,0.08); }

        /* Toast */
        .toast-container { position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%); z-index: 3000; display: flex; flex-direction: column; align-items: center; gap: 10px; pointer-events: none; }
        .toast { padding: 12px 22px; border-radius: var(--radius-sm); background: rgba(20,30,40,0.92); color: #fff; font-size: 0.9rem; font-weight: 500; box-shadow: 0 12px 32px rgba(0,0,0,0.25); animation: messageSlide 0.28s var(--ease); max-width: min(90vw, 480px); text-align: center; }
        .toast.success { background: rgba(var(--success-rgb),0.95); }
        .toast.warning { background: rgba(var(--warning-rgb),0.95); }
        .toast.error { background: rgba(var(--danger-rgb),0.95); }

        /* Lazy AI frame */
        .ai-frame-wrap { position: relative; min-height: 700px; background: var(--panel-bg); }
        .ai-frame-wrap::before { content: 'AI 助手加载中…'; position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 0.95rem; color: var(--text-muted); }
        .ai-frame-wrap.loaded::before { display: none; }
        body.dark-mode .ai-frame-wrap { background: rgba(255,255,255,0.04); }

        button:focus-visible, a:focus-visible { outline: 3px solid rgba(var(--primary-rgb),0.45); outline-offset: 2px; }
        @media (prefers-reduced-motion: reduce) {
            *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; }
        }

        /* Chat modal */
        .chat-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: var(--overlay-bg); backdrop-filter: var(--overlay-blur); z-index: 1000; justify-content: center; align-items: center; }
        .chat-modal.active { display: flex; }
        .chat-container { width: 90%; max-width: 600px; height: 70vh; background: var(--glass-bg); backdrop-filter: var(--glass-blur); border: 1px solid var(--glass-border); border-radius: var(--radius-xl); box-shadow: var(--shadow-lg); display: flex; flex-direction: column; overflow: hidden; }
        .chat-header { padding: 20px 25px; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); color: white; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(255,255,255,0.2); flex-shrink: 0; }
        .chat-header h3 { font-size: 1.3rem; font-weight: 700; margin: 0; }
        .chat-header-main { flex: 1; min-width: 0; }
        .chat-header-note { margin: 6px 0 0; font-size: 0.75rem; color: rgba(255,255,255,0.85); font-weight: 400; line-height: 1.4; }
        .chat-close { background: rgba(255,255,255,0.2); border: none; color: white; width: 32px; height: 32px; border-radius: 50%; cursor: pointer; font-size: 1.2rem; display: flex; align-items: center; justify-content: center; transition: all 0.3s; flex-shrink: 0; }
        .chat-close:hover { background: rgba(255,255,255,0.3); transform: rotate(90deg); }
        .chat-messages { flex: 1; padding: 20px; overflow-y: auto; display: flex; flex-direction: column; gap: 15px; }
        .chat-message { display: flex; align-items: flex-start; gap: 10px; }
        .chat-message.user { flex-direction: row-reverse; }
        .chat-avatar { width: 36px; height: 36px; border-radius: 50%; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); display: flex; align-items: center; justify-content: center; font-size: 1.2rem; flex-shrink: 0; }
        .chat-message.user .chat-avatar { background: linear-gradient(135deg,var(--secondary-blue),var(--accent-blue)); }
        .chat-bubble { max-width: 75%; padding: 12px 16px; border-radius: var(--radius-md); font-size: 0.95rem; line-height: 1.6; word-wrap: break-word; }
        .chat-message:not(.user) .chat-bubble { background: rgba(255,255,255,0.9); color: var(--text-primary); border-bottom-left-radius: var(--radius-xs); }
        .chat-message.user .chat-bubble { background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); color: white; border-bottom-right-radius: var(--radius-xs); }
        .chat-input-container { padding: 20px; background: rgba(255,255,255,0.5); border-top: 1px solid var(--glass-border); display: flex; gap: 10px; }
        .chat-input { flex: 1; padding: 12px 16px; border: 2px solid var(--light-blue); border-radius: var(--radius-pill); font-size: 0.95rem; outline: none; transition: all 0.3s var(--ease); background: rgba(255,255,255,0.9); }
        .chat-input:focus { border-color: var(--primary-blue); box-shadow: 0 0 15px rgba(var(--primary-rgb),0.2); }
        .chat-send { background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); color: white; border: none; padding: 12px 24px; border-radius: var(--radius-pill); font-weight: 600; cursor: pointer; transition: all 0.3s var(--ease); display: flex; align-items: center; gap: 8px; position: relative; overflow: hidden; flex-shrink: 0; }
        .chat-send:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
        .chat-send:disabled { opacity: 0.5; cursor: not-allowed; }
        .chat-btn { background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); color: white; border: none; padding: 10px 20px; border-radius: var(--radius-pill); font-weight: 600; font-size: 0.9rem; cursor: pointer; transition: all 0.3s var(--ease); box-shadow: var(--shadow-sm); position: relative; overflow: hidden; }
        .chat-btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); filter: brightness(1.1); }

        /* Q&A links in chat */
        
        .read-more { display: inline-block; color: var(--primary-blue); text-decoration: none; font-weight: 600; font-size: 0.9rem; transition: all 0.2s var(--ease); }
        .read-more:hover { color: var(--deep-blue); transform: translateX(4px); }
        .qa-link { display: inline-block; color: var(--primary-blue); cursor: pointer; padding: 6px 12px; margin: 3px 0; border-radius: var(--radius-xs); font-size: 0.9rem; transition: all 0.2s var(--ease); background: rgba(var(--primary-rgb),0.06); width: 100%; }
        .qa-link:hover { background: rgba(var(--primary-rgb),0.15); transform: translateX(4px); color: var(--deep-blue); }
        .qa-more { display: inline-block; color: var(--mint); text-decoration: none; font-weight: 600; font-size: 0.9rem; padding: 8px 16px; border-radius: var(--radius-xs); transition: all 0.2s var(--ease); background: rgba(var(--mint-rgb),0.08); margin-top: 4px; }
        .qa-more:hover { background: rgba(var(--mint-rgb),0.18); transform: translateX(4px); }

        /* Article modal */
        .article-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: var(--overlay-bg); backdrop-filter: var(--overlay-blur); z-index: 2000; justify-content: center; align-items: center; padding: 20px; }
        .article-modal.active { display: flex; }
        .article-modal-container { width: 100%; max-width: 780px; max-height: 85vh; background: var(--bg-primary); border-radius: var(--radius-xl); box-shadow: var(--shadow-lg); display: flex; flex-direction: column; overflow: hidden; }
        .article-modal-head { padding: 20px 28px; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); color: white; display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; }
        .article-modal-head h2 { font-size: 1.2rem; font-weight: 700; margin: 0; color: white; -webkit-text-fill-color: white; background: none; }
        .article-modal-head .am-category { font-size: 0.7rem; opacity: 0.8; display: block; margin-bottom: 2px; }
        .article-modal-close { background: rgba(255,255,255,0.2); border: none; color: white; width: 32px; height: 32px; border-radius: 50%; cursor: pointer; font-size: 1.3rem; display: flex; align-items: center; justify-content: center; transition: all 0.3s; flex-shrink: 0; }
        .article-modal-close:hover { background: rgba(255,255,255,0.35); transform: rotate(90deg); }
        .article-modal-body { padding: 28px 32px; overflow-y: auto; flex: 1; line-height: 1.8; color: var(--text-secondary); }
        .article-modal-body h2 { font-size: 1.3rem; font-weight: 700; margin: 32px 0 14px; padding-bottom: 8px; border-bottom: 2px solid rgba(var(--primary-rgb),0.15); color: var(--primary-blue); background: none; -webkit-text-fill-color: var(--primary-blue); }
        .article-modal-body h2:first-child { margin-top: 0; }
        .article-modal-body p { margin-bottom: 14px; color: var(--text-secondary); }
        .article-modal-body ul, .article-modal-body ol { margin: 10px 0 18px 22px; }
        .article-modal-body li { margin-bottom: 6px; line-height: 1.7; }
        .article-modal-body li strong { color: var(--text-primary); }

        /* Tank presets */
        .tank-presets { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; }
        .tank-preset { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 10px 16px; border: 1.5px solid var(--light-blue); border-radius: var(--radius-sm); cursor: pointer; transition: all 0.2s var(--ease); background: var(--glass-bg); min-width: 72px; line-height: 1.2; font-weight: 700; font-size: 1rem; color: var(--text-primary); }
        .tank-preset small { font-weight: 400; font-size: 0.7rem; color: var(--text-muted); margin-top: 2px; }
        .tank-preset:hover { border-color: var(--primary-blue); background: rgba(var(--primary-rgb),0.06); transform: translateY(-2px); box-shadow: var(--shadow-sm); }
        .tank-preset.active { border-color: var(--primary-blue); background: rgba(var(--primary-rgb),0.12); box-shadow: 0 0 0 2px rgba(var(--primary-rgb),0.2); }

        /* Footer */
        footer { background: rgba(255,255,255,0.9); backdrop-filter: var(--glass-blur); border-top: 1px solid var(--glass-border); padding: 56px 5% 24px; margin-top: 0; }
        .footer p { color: var(--text-muted); font-size: 0.85rem; }
        .footer a { color: var(--primary-blue); text-decoration: none; }

        
        .theme-toggle { background: none; border: none; cursor: pointer; font-size: 1.3rem; padding: 4px 8px; border-radius: 50%; transition: all 0.3s var(--ease); display: flex; align-items: center; justify-content: center; }
        .theme-toggle:hover { background: rgba(var(--primary-rgb),0.1); transform: rotate(15deg); }
        .input-group { margin-bottom: 16px; }
        .input-group label { display: block; font-size: 0.85rem; font-weight: 600; margin-bottom: 6px; color: var(--text-secondary); }
        .input-group input, .input-group select { width: 100%; padding: 10px 14px; border: 1.5px solid var(--light-blue); border-radius: var(--radius-xs); font-size: 0.9rem; outline: none; transition: all 0.25s var(--ease); background: var(--glass-bg); color: var(--text-primary); }
        .input-group input:focus, .input-group select:focus { border-color: var(--primary-blue); box-shadow: 0 0 0 3px rgba(var(--primary-rgb),0.12); }
        body.dark-mode .input-group input, body.dark-mode .input-group select { background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.1); color: var(--text-primary); }
        .task-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; margin-bottom: 4px; background: rgba(255,255,255,0.4); border-radius: var(--radius-sm); }
        .task-item input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--aqua-main); cursor: pointer; flex-shrink: 0; }
        .task-item label { font-size: 0.9rem; cursor: pointer; color: var(--text-secondary); }
        body.dark-mode .task-item { background: rgba(255,255,255,0.04); }
        .feeding-time-slot { margin-bottom: 12px; }
        .feeding-time-slot label { font-size: 0.85rem; font-weight: 600; color: var(--text-secondary); display: block; margin-bottom: 4px; }
        .feeding-time-slot input[type="time"] { padding: 8px 12px; border: 1.5px solid var(--light-blue); border-radius: var(--radius-xs); font-size: 0.9rem; background: var(--glass-bg); color: var(--text-primary); outline: none; }
        .feeding-time-slot input[type="time"]:focus { border-color: var(--primary-blue); box-shadow: 0 0 0 3px rgba(var(--primary-rgb),0.12); }
        .footer-content { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 30px; max-width: 1100px; margin: 0 auto; text-align: left; }
        .footer-section h4 { font-size: 1rem; font-weight: 700; margin-bottom: 15px; color: var(--text-primary); }
        .footer-links { list-style: none; padding: 0; }
        .footer-links li { margin-bottom: 8px; }
        .footer-links a { color: var(--text-secondary); text-decoration: none; font-size: 0.85rem; transition: color 0.2s; }
        .footer-links a:hover { color: var(--primary-blue); }
        .footer-logo { font-weight: 800; font-size: 1.3rem; background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue),var(--deep-blue)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 8px; }
        .footer-tagline { color: var(--text-muted); font-size: 0.85rem; margin-bottom: 8px; }
        .footer-description { color: var(--text-secondary); font-size: 0.85rem; margin-bottom: 15px; }
        .contact-info p { margin-bottom: 6px; font-size: 0.85rem; color: var(--text-secondary); }
        .footer-bottom { border-top: 1px solid var(--glass-border); margin-top: 30px; padding-top: 20px; text-align: center; }
        .footer-bottom-content p { color: var(--text-muted); font-size: 0.8rem; margin-bottom: 4px; }
        .icp-info { font-size: 0.75rem !important; opacity: 0.7; }
        body.dark-mode .footer-links a:hover { color: var(--aqua-main); }
        body.dark-mode .footer-section h4 { color: var(--text-secondary); }
        body.dark-mode footer { background: rgba(18,18,18,0.92); border-top-color: rgba(255,255,255,0.08); }
        
        /* Animations */
        @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
        @keyframes messageSlide { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
        @keyframes typing { 0%,60%,100% { transform: translateY(0); } 30% { transform: translateY(-8px); } }
        
        .bubble { position: absolute; bottom: -100px; background: radial-gradient(circle,rgba(var(--primary-rgb),0.12),rgba(var(--secondary-rgb),0.08)); border-radius: 50%; animation: rise 25s infinite ease-in-out; box-shadow: 0 0 20px rgba(var(--primary-rgb),0.25); }
        .bubbles { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; pointer-events: none; }
        @keyframes rise { 0% { transform: translateY(0) translateX(0) scale(0.6) rotate(0deg); opacity: 0; } 20% { opacity: 0.25; } 80% { opacity: 0.18; } 100% { transform: translateY(-150vh) translateX(150px) scale(1.4) rotate(360deg); opacity: 0; } }
        @keyframes titleFloat { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }
        @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
        @keyframes modalIn { from { opacity: 0; transform: translateY(20px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } }

        /* Dark mode
           注意：--bg / --text / --text-sub 等跨端别名指向下面的变量，var() 在使用时求值，
           所以别名无需重复覆盖；新增「会被别名或新 token 引用」的变量时才要补在下面。 */
        body.dark-mode { --bg-primary: #0a0a0a; --bg-secondary: #1a1a1a; --bg-gradient: linear-gradient(135deg,#0a0a0a 0%,#1a1a1a 50%,#0d0d0d 100%); --text-primary: #f5f5f5; --text-secondary: #b0bec5; --text-muted: #78909c; --deep-blue: #64b5f6; --light-blue: #37474f; --glass-bg: rgba(26,26,26,0.6); --glass-border: rgba(255,255,255,0.05);
            --primary-soft: rgba(255,255,255,0.06); --card: #141414;
            /* 亮色下阴影用品牌蓝着色，暗色下蓝影不可见，改为中性黑影保证层次 */
            --shadow-sm: 0 2px 10px rgba(0,0,0,0.35); --shadow-md: 0 8px 26px rgba(0,0,0,0.45);
            --shadow-lg: 0 16px 48px rgba(0,0,0,0.55); --shadow-nav: 0 4px 30px rgba(0,0,0,0.35);
            --chart-grid: rgba(255,255,255,0.12); }
        body.light-mode { --bg-primary: #f5f7fa; --bg-secondary: #ffffff; --text-primary: #2c3e50; --text-muted: #7f8c8d; --glass-bg: rgba(255,255,255,0.6); --glass-border: rgba(0,0,0,0.1); }
        body.dark-mode nav { background: rgba(18,18,18,0.92); border-bottom-color: rgba(255,255,255,0.08); }
        body.dark-mode .hero { background: linear-gradient(160deg,#0a0a0a 0%,#121a1c 48%,#0c1a13 100%); }
        body.dark-mode .hero-overlay { background: linear-gradient(rgba(8,10,12,0.72),rgba(8,10,12,0.86)); }
        body.dark-mode .hero p { color: var(--text-secondary); }
        body.dark-mode .hero-btn.secondary { background: rgba(30,30,30,0.85); color: var(--primary-light); border-color: rgba(255,255,255,0.12); }
        body.dark-mode .hero-stat strong { color: var(--primary-light); }
        body.dark-mode .hero-scroll-hint { color: var(--text-muted); }
        body.dark-mode .section-tag.tools { background: rgba(var(--aqua-rgb),0.15); }
        body.dark-mode .section-tag.knowledge { background: rgba(var(--mint-rgb),0.15); }
        body.dark-mode .chat-bubble { background: rgba(255,255,255,0.08) !important; }
        body.dark-mode .qa-link { background: rgba(var(--aqua-rgb),0.1); }
        body.dark-mode .qa-link:hover { background: rgba(var(--aqua-rgb),0.2); }
        body.dark-mode .qa-more { background: rgba(var(--mint-rgb),0.12); }
        body.dark-mode .qa-more:hover { background: rgba(var(--mint-rgb),0.22); }
        body.dark-mode .tank-preset { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.1); }
        body.dark-mode .tank-preset:hover, body.dark-mode .tank-preset.active { background: rgba(var(--aqua-rgb),0.15); border-color: var(--aqua-main); }
        body.dark-mode .article-modal-container { background: #1a1a1a; border: 1px solid rgba(255,255,255,0.08); }
        body.dark-mode .article-modal-body h2 { border-bottom-color: rgba(var(--aqua-rgb),0.2); }
        /* 同步码面板：纯白底在暗色下过于刺眼，改深底浅字。
           注意 .merge-qr-img 必须保持 #fff —— 二维码识别要求高对比白底，不可跟随主题。 */
        body.dark-mode .merge-code { background: rgba(255,255,255,0.08); color: var(--primary-light); }

        /* Responsive */
        @media (max-width: 1024px) {
            .nav-links { position: fixed; right: -100%; top: 60px; flex-direction: column; background: rgba(255,255,255,0.98); backdrop-filter: var(--glass-blur); width: 85%; max-width: 400px; height: calc(100vh - 60px); padding: 40px 30px; gap: 20px; transition: 0.4s var(--ease); box-shadow: -5px 0 20px rgba(0,0,0,0.1); }
            .nav-links.active { right: 0; }
            .burger-menu { display: block; }
            .nav-links a { font-size: 1.1rem; padding: 15px 20px; width: 100%; text-align: left; }
            .nav-group-label { padding: 10px 20px 4px; font-size: 0.65rem; }
            .nav-divider { margin: 8px 20px; }
            .chat-btn { width: 100%; text-align: center; margin: 10px 0; }
            body.dark-mode .nav-links { background: rgba(20,20,20,0.98); }
        }
        @media (max-width: 768px) {
            .nav-links { width: 100%; top: 55px; height: calc(100vh - 55px); }
            body { font-size: 15px; }
            .hero { min-height: 74vh; padding: 120px 18px 90px; }
            .hero h1 { font-size: 2.5rem; }
            .hero p { font-size: 1rem; }
            .hero-stats { gap: 24px; }
            .hero-stat strong { font-size: 1.4rem; }
            .container { padding: 60px 20px; }
            .section-header h2 { font-size: 1.8rem; }
            .grid-2 { grid-template-columns: 1fr; }
            .grid-3 { grid-template-columns: 1fr; }
            .chart-panel { height: 320px; padding: 14px; }
            .ai-frame-wrap { min-height: 560px; }
            .chat-container { height: 82vh; border-radius: var(--radius-md); }
            .article-modal { padding: 10px; }
            .article-modal-container { max-height: 90vh; border-radius: var(--radius-md); }
            .article-modal-head { padding: 16px 20px; }
            .article-modal-head h2 { font-size: 1rem; }
            .article-modal-body { padding: 20px; }
        }
        @media (max-width: 480px) {
            .hero { padding: 100px 16px 80px; }
            .hero h1 { font-size: 2.1rem; }
            .hero-btn { width: 100%; max-width: 340px; }
            .section-header h2 { font-size: 1.55rem; }
            .action-btn { width: 100%; }
            .tank-presets { justify-content: center; }
            .toast { width: 90vw; }
        }

        /* ---- 缸健康评分面板（水质区）----
           等级配色由 scripts/sync-tank-health.js 从小程序真源同步，仅在服务端下发后用 JS 填充。 */
        .health-panel {
            margin-top: 22px; padding: 20px 22px; border-radius: var(--radius-md);
            background: var(--panel-bg);
            border: 1px solid var(--panel-border);
        }
        .health-panel-title { font-size: 1.05rem; font-weight: 700; color: var(--text-primary); }
        .health-panel-sub { margin-top: 6px; font-size: 0.8rem; color: var(--text-muted); }
        .hs-head { margin-top: 18px; display: flex; align-items: center; gap: 18px; }
        .hs-score { font-size: 3rem; font-weight: 800; line-height: 1; }
        .hs-meta { min-width: 0; }
        .hs-label { font-size: 0.95rem; font-weight: 600; color: var(--text-primary); }
        .hs-level { display: inline-block; margin-top: 6px; padding: 3px 14px; border-radius: var(--radius-pill); font-size: 0.8rem; font-weight: 700; }
        .hs-bar { margin-top: 14px; height: 10px; border-radius: var(--radius-pill); background: var(--panel-border); overflow: hidden; }
        .hs-bar-fill { height: 100%; border-radius: var(--radius-pill); transition: width 0.35s var(--ease); }
        .hs-parts { margin-top: 18px; display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; }
        .hp-top { display: flex; justify-content: space-between; font-size: 0.85rem; font-weight: 600; color: var(--text-primary); }
        .hp-num { color: var(--text-muted); font-weight: 500; }
        .hp-bar { margin-top: 6px; height: 6px; border-radius: var(--radius-pill); background: var(--panel-border); overflow: hidden; }
        .hp-bar-fill { height: 100%; border-radius: var(--radius-pill); background: var(--primary-blue); }

        /* 跨端同步：生成同步码（官网匿名账号 → 微信账号） */
        .merge-panel {
            margin-top: 22px; padding: 20px 22px; border-radius: var(--radius-md);
            background: rgba(var(--primary-rgb), 0.06);
            border: 1px solid rgba(var(--primary-rgb), 0.22);
        }
        .merge-panel-title { font-size: 1.05rem; font-weight: 700; color: var(--text-primary); }
        .merge-panel-sub { margin-top: 6px; font-size: 0.8rem; color: var(--text-muted); line-height: 1.65; }
        .merge-btn {
            margin-top: 16px; padding: 11px 24px; border: none; border-radius: var(--radius-sm);
            background: linear-gradient(135deg, var(--primary-blue), var(--teal));
            color: #fff; font-size: 0.9rem; font-weight: 600; cursor: pointer;
            transition: transform 0.2s var(--ease), box-shadow 0.2s var(--ease);
            box-shadow: var(--shadow-sm);
        }
        .merge-btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
        .merge-btn-ghost {
            background: rgba(var(--neutral-rgb), 0.1);
            color: var(--text-secondary);
            border: 1px solid rgba(var(--neutral-rgb), 0.22);
            box-shadow: none;
        }
        .merge-btn-ghost:hover { background: rgba(var(--neutral-rgb), 0.16); transform: none; box-shadow: none; }
        .merge-code {
            margin-top: 16px; padding: 16px 0; border-radius: var(--radius-md);
            background: rgba(255, 255, 255, 0.85);
            border: 1px dashed rgba(var(--primary-rgb), 0.45);
            font-family: 'SF Mono', Menlo, Consolas, monospace;
            font-size: 2rem; font-weight: 700; letter-spacing: 8px;
            color: var(--primary-blue); text-align: center;
            user-select: all;
        }
        .merge-hint { margin-top: 12px; font-size: 0.8rem; color: var(--text-muted); line-height: 1.65; }
        .merge-actions { display: flex; gap: 12px; flex-wrap: wrap; }
        .merge-error { margin-top: 12px; font-size: 0.85rem; color: var(--danger); }
        /* 扫码登录：二维码与说明并排，窄屏自动堆叠 */
        .merge-qr { display: flex; gap: 20px; align-items: center; flex-wrap: wrap; margin-top: 16px; }
        .merge-qr-img {
            width: 168px; height: 168px; flex: 0 0 auto;
            padding: 8px; border-radius: var(--radius-md); background: #fff;
            border: 1px solid rgba(var(--primary-rgb), 0.22);
        }
        .merge-qr-side { flex: 1 1 240px; min-width: 200px; }
        .merge-qr-title { font-size: 0.95rem; font-weight: 700; color: var(--text-primary); }
        .merge-qr-timer { margin-top: 10px; font-size: 0.78rem; color: var(--text-muted); }
        .merge-qr-code { margin-top: 10px; font-size: 0.78rem; color: var(--text-muted); }
        .merge-qr-code b {
            margin-left: 4px; font-size: 0.9rem; letter-spacing: 1px;
            font-family: 'SF Mono', Menlo, Consolas, monospace;
            color: var(--primary-blue);
        }
        .hp-text { margin-top: 5px; font-size: 0.75rem; color: var(--text-muted); }
        .hs-advice { margin-top: 18px; padding: 14px 16px; border-radius: var(--radius-md); background: var(--panel-bg); }
        .hs-advice-title { font-size: 0.9rem; font-weight: 700; color: var(--text-primary); margin-bottom: 6px; }
        .hs-advice ul { margin: 0; padding-left: 18px; }
        .hs-advice li { font-size: 0.8rem; color: var(--text-secondary); margin-bottom: 3px; }

        /* ===== Step 7-B'：结果框显隐 / 状态配色 / 汉堡 / 弹窗锁滚 / 进度条 全部改为 class，
           配合 nginx CSP 去掉 style-src 'unsafe-inline'（运行期内联样式无法用 nonce 豁免） ===== */
        .result-box.is-shown { display: block; }
        .result-box.state-success { border-color: #16a34a; background-color: rgba(22, 163, 74, 0.07); }
        .result-box.state-warning { border-color: #E67E22; background-color: rgba(230, 126, 34, 0.07); }
        .result-box.state-danger  { border-color: #DC2626; background-color: rgba(220, 38, 38, 0.08); }
        .result-box.state-mint    { border-color: var(--mint); background-color: rgba(var(--mint-rgb), 0.05); }
        .result-title.text-success { color: #16a34a; }
        .result-title.text-warning { color: #E67E22; }
        .result-title.text-danger  { color: #DC2626; }

        /* 汉堡菜单开合：原 JS 直接写 bl[].style.transform，改为 .open 类驱动 */
        .burger-menu.open div:nth-child(1) { transform: rotate(45deg) translate(5px, 5px); }
        .burger-menu.open div:nth-child(2) { opacity: 0; }
        .burger-menu.open div:nth-child(3) { transform: rotate(-45deg) translate(7px, -6px); }

        /* toast 退出动画 */
        .toast { transition: opacity 0.26s ease, transform 0.26s ease; }
        .toast.toast-hide { opacity: 0; transform: translateY(8px); }

        /* 弹窗打开时锁定 body 滚动（替代 document.body.style.overflow） */
        body.no-scroll { overflow: hidden; }

        /* 剪贴板回退 textarea（替代内联 position/opacity） */
        .copy-fallback { position: fixed; opacity: 0; border: 0; padding: 0; }

        /* 鱼卡强调条：原为 per-fish 体色内联，改为固定强调色（避免运行期内联样式） */
        .fish-card { border-left: 4px solid var(--primary-blue); }

        /* 装饰气泡：原 12 个随机尺寸/位置由 JS 内联，改为 nth-child 固定变化 */
        .bubbles .bubble:nth-child(1)  { width: 14px; height: 14px; left: 6vw;  animation-delay: 0s;   animation-duration: 23s; }
        .bubbles .bubble:nth-child(2)  { width: 10px; height: 10px; left: 18vw; animation-delay: 3s;   animation-duration: 27s; }
        .bubbles .bubble:nth-child(3)  { width: 20px; height: 20px; left: 29vw; animation-delay: 6s;   animation-duration: 21s; }
        .bubbles .bubble:nth-child(4)  { width: 8px;  height: 8px;  left: 41vw; animation-delay: 1s;   animation-duration: 29s; }
        .bubbles .bubble:nth-child(5)  { width: 16px; height: 16px; left: 52vw; animation-delay: 8s;   animation-duration: 24s; }
        .bubbles .bubble:nth-child(6)  { width: 12px; height: 12px; left: 63vw; animation-delay: 4s;   animation-duration: 26s; }
        .bubbles .bubble:nth-child(7)  { width: 22px; height: 22px; left: 72vw; animation-delay: 2s;   animation-duration: 22s; }
        .bubbles .bubble:nth-child(8)  { width: 9px;  height: 9px;  left: 81vw; animation-delay: 7s;   animation-duration: 28s; }
        .bubbles .bubble:nth-child(9)  { width: 15px; height: 15px; left: 12vw; animation-delay: 9s;   animation-duration: 25s; }
        .bubbles .bubble:nth-child(10) { width: 11px; height: 11px; left: 36vw; animation-delay: 5s;   animation-duration: 30s; }
        .bubbles .bubble:nth-child(11) { width: 18px; height: 18px; left: 58vw; animation-delay: 0.5s; animation-duration: 23s; }
        .bubbles .bubble:nth-child(12) { width: 13px; height: 13px; left: 88vw; animation-delay: 6.5s; animation-duration: 27s; }

        /* 缸健康评分条：原 innerHTML 注入 style="width:..%" 属运行期内联，
           width 改用 SVG <rect> 表现属性（不受 CSP style-src 约束），配色改用等级 class */
        .hs-bar-svg, .hp-bar-svg { width: 100%; height: 100%; display: block; }
        .hs-score.hs-t-excellent { color: #16a34a; }
        .hs-score.hs-t-good      { color: #1A8FBB; }
        .hs-score.hs-t-fair      { color: #E67E22; }
        .hs-score.hs-t-poor      { color: #DC2626; }
        .hs-level.hs-l-excellent { background: #E8F6EE; color: #16a34a; }
        .hs-level.hs-l-good      { background: #E4F2F8; color: #1A8FBB; }
        .hs-level.hs-l-fair      { background: #FCF0E4; color: #E67E22; }
        .hs-level.hs-l-poor      { background: #FBE9E9; color: #DC2626; }
        .hs-bar-fill.hs-f-excellent { fill: #16a34a; }
        .hs-bar-fill.hs-f-good      { fill: #1A8FBB; }
        .hs-bar-fill.hs-f-fair      { fill: #E67E22; }
        .hs-bar-fill.hs-f-poor      { fill: #DC2626; }
        .hp-bar-fill { fill: var(--primary-blue); }

        /* ===== 鱼类图鉴：搜索 / 分类筛选 / 详情（2026-10-11） ===== */
        .fish-toolbar { display: flex; flex-wrap: wrap; gap: 14px; align-items: center; justify-content: space-between; }
        .fish-search { max-width: 360px; }
        .fish-cats { display: flex; flex-wrap: wrap; gap: 8px; }
        .fish-cat { border: 1.5px solid var(--light-blue); background: var(--glass-bg); color: var(--text-secondary);
            padding: 6px 14px; border-radius: var(--radius-pill); font-size: 0.82rem; font-weight: 600; cursor: pointer;
            transition: all 0.25s var(--ease); }
        .fish-cat:hover { border-color: var(--primary-blue); color: var(--primary-blue); }
        .fish-cat.active { background: linear-gradient(135deg,var(--primary-blue),var(--secondary-blue)); color: #fff; border-color: transparent; }
        .fish-card-hit { cursor: pointer; position: relative; }
        .fish-detail-hint { display: inline-block; margin-top: 10px; font-size: 0.78rem; font-weight: 600; color: var(--primary-blue); }
        .fish-empty { grid-column: 1 / -1; text-align: center; color: var(--text-muted); padding: 24px; }

        .fish-detail-grid { display: grid; grid-template-columns: repeat(auto-fit,minmax(180px,1fr)); gap: 8px 22px; margin: 14px 0; }
        .fish-detail-row { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px dashed var(--glass-border); }
        .fd-label { color: var(--text-muted); font-size: 0.88rem; }
        .fd-value { color: var(--text-primary); font-weight: 600; font-size: 0.9rem; text-align: right; }
        .fish-detail-note { margin-top: 12px; padding: 10px 14px; border-radius: var(--radius-sm); background: rgba(var(--aqua-rgb),0.08); color: var(--text-secondary); font-size: 0.88rem; }

        /* 水质指标参考区间表 */
        .water-std-wrap { overflow-x: auto; }
        .water-std-table { width: 100%; border-collapse: collapse; font-size: 0.88rem; }
        .water-std-table th, .water-std-table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--glass-border); }
        .water-std-table th { color: var(--text-secondary); font-weight: 600; background: rgba(var(--primary-rgb),0.05); }
        .water-std-table td { color: var(--text-primary); }

        .text-muted { color: var(--text-muted); }

        /* 云端能力不可用时的说明条 */
        .cloud-fallback { margin-top: 16px; padding: 12px 16px; border-radius: var(--radius-sm); border: 1px dashed var(--light-blue);
            background: rgba(var(--primary-rgb),0.05); color: var(--text-secondary); font-size: 0.85rem; line-height: 1.6; }

        /* 暗色补贴：聊天输入区此前未适配（暗色下为纯白底），鱼图鉴 chips / 参考表 / 降级条一并适配 */
        body.dark-mode .chat-input-container { background: rgba(255,255,255,0.06); border-top-color: rgba(255,255,255,0.08); }
        body.dark-mode .chat-input { background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.12); color: var(--text-primary); }
        body.dark-mode .fish-cat { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.12); color: var(--text-secondary); }
        body.dark-mode .water-std-table th { background: rgba(255,255,255,0.05); }
        body.dark-mode .water-std-table th, body.dark-mode .water-std-table td { border-bottom-color: rgba(255,255,255,0.08); }
        body.dark-mode .cloud-fallback { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.12); }
        
        
    

        /* ================= 养殖日历（只读 · 与小程序同一份云端数据） ================= */
        .cal-head { display: flex; flex-wrap: wrap; gap: 14px; align-items: flex-start; justify-content: space-between; }
        .cal-sub { margin-top: 6px; color: var(--text-secondary); font-size: 0.85rem; line-height: 1.6; max-width: 62ch; }
        .cal-nav { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
        .cal-nav-btn { width: 36px; height: 36px; border-radius: var(--radius-pill); border: 1px solid var(--panel-border);
            background: var(--card); color: var(--primary-blue); font-size: 1.1rem; line-height: 1; cursor: pointer; transition: all 0.2s ease; }
        .cal-nav-btn:hover { border-color: rgba(var(--primary-rgb),0.5); background: rgba(var(--primary-rgb),0.08); }
        .cal-month-label { min-width: 112px; text-align: center; font-weight: 700; font-size: 0.95rem; color: var(--text-primary); }

        .cal-summary { display: flex; flex-wrap: wrap; gap: 8px; margin: 16px 0 6px; }
        .cal-stat { padding: 4px 12px; border-radius: var(--radius-pill); background: var(--panel-bg); color: var(--text-secondary); font-size: 0.8rem; }
        .cal-stat b { color: var(--text-primary); }
        .cal-stat-done { background: rgba(var(--success-rgb),0.12); color: var(--success); }
        .cal-stat-pending { background: rgba(var(--warning-rgb),0.12); color: var(--warning); }
        .cal-stat-overdue { background: rgba(var(--danger-rgb),0.12); color: var(--danger); }

        .cal-weekdays, .cal-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; }
        .cal-weekdays { margin-top: 12px; }
        .cal-weekdays span { text-align: center; font-size: 0.75rem; color: var(--text-muted); padding-bottom: 4px; }

        .cal-cell { position: relative; aspect-ratio: 1 / 1; display: flex; align-items: center; justify-content: center;
            border-radius: var(--radius-sm); border: 1px solid transparent; background: var(--panel-bg);
            color: var(--text-secondary); font-size: 0.85rem; cursor: pointer; transition: all 0.18s ease; }
        .cal-cell:hover { border-color: rgba(var(--primary-rgb),0.45); color: var(--primary-blue); }
        .cal-cell-blank { background: transparent; cursor: default; pointer-events: none; }
        .cal-cell-has { background: rgba(var(--primary-rgb),0.1); color: var(--primary-blue); font-weight: 600; }
        .cal-cell-today { border-color: var(--primary-blue); }
        .cal-cell-selected { background: var(--primary-blue); color: #fff; border-color: var(--primary-blue); }
        .cal-num { line-height: 1; }
        .cal-badge { position: absolute; top: 4px; right: 5px; min-width: 15px; height: 15px; padding: 0 3px;
            border-radius: var(--radius-pill); background: var(--aqua-main); color: #fff; font-size: 0.62rem;
            font-weight: 700; display: flex; align-items: center; justify-content: center; }
        .cal-cell-selected .cal-badge { background: #fff; color: var(--primary-blue); }

        .cal-day { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--panel-border); }
        .cal-day-title { font-weight: 700; font-size: 0.92rem; color: var(--text-primary); margin-bottom: 10px; }
        .cal-list { list-style: none; display: flex; flex-direction: column; gap: 8px; }
        .cal-item { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 10px 12px;
            border-radius: var(--radius-sm); background: var(--panel-bg); border-left: var(--accent-bar) solid var(--primary-blue); }
        .cal-item-cat { padding: 1px 8px; border-radius: var(--radius-pill); background: rgba(var(--primary-rgb),0.14);
            color: var(--primary-blue); font-size: 0.7rem; font-weight: 700; }
        .cal-item-title { color: var(--text-primary); font-size: 0.88rem; font-weight: 600; }
        .cal-item-time { color: var(--text-secondary); font-size: 0.8rem; }
        .cal-item-note { color: var(--text-muted); font-size: 0.76rem; }
        .cal-item-done { padding: 1px 8px; border-radius: var(--radius-pill); background: rgba(var(--success-rgb),0.14);
            color: var(--success); font-size: 0.7rem; font-weight: 700; }
        .cal-item-overdue { padding: 1px 8px; border-radius: var(--radius-pill); background: rgba(var(--danger-rgb),0.14);
            color: var(--danger); font-size: 0.7rem; font-weight: 700; }
        .cal-cat-water { border-left-color: var(--primary-blue); }
        .cal-cat-feeding { border-left-color: var(--mint); }
        .cal-cat-cleaning { border-left-color: var(--teal); }
        .cal-cat-medication { border-left-color: var(--warning); }
        .cal-cat-other { border-left-color: var(--text-muted); }
        .cal-none { color: var(--text-muted); font-size: 0.85rem; }
        .cal-feeding { margin-top: 14px; }
        .cal-feeding-title { font-size: 0.85rem; font-weight: 700; color: var(--text-secondary); margin-bottom: 8px; }
        .cal-empty { margin-top: 16px; padding: 12px 16px; border-radius: var(--radius-sm); background: var(--panel-bg);
            color: var(--text-secondary); font-size: 0.85rem; text-align: center; }

        /* 暗色模式补贴 */
        body.dark-mode .cal-nav-btn { background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.14); color: var(--primary-light); }
        body.dark-mode .cal-cell-has { background: rgba(var(--aqua-rgb),0.16); color: var(--primary-light); }
        body.dark-mode .cal-cell-today { border-color: var(--primary-light); }
        body.dark-mode .cal-cell-selected { background: var(--primary-light); color: #10202c; border-color: var(--primary-light); }
        body.dark-mode .cal-cell-selected .cal-badge { background: #10202c; color: var(--primary-light); }
        body.dark-mode .cal-item { background: rgba(255,255,255,0.06); }
        body.dark-mode .cal-item-cat { background: rgba(var(--aqua-rgb),0.2); color: var(--primary-light); }
        body.dark-mode .cal-stat { background: rgba(255,255,255,0.06); }
        body.dark-mode .cal-empty { background: rgba(255,255,255,0.06); }

        @media (max-width: 768px) {
            .cal-head { flex-direction: column; }
            .cal-nav { align-self: flex-end; }
            .cal-weekdays, .cal-grid { gap: 4px; }
            .cal-cell { font-size: 0.78rem; }
            .cal-badge { top: 2px; right: 3px; min-width: 13px; height: 13px; font-size: 0.58rem; }
        }
