{"id":"cd409ef0-bc53-4642-bcca-ade49d55b432","entityType":"agent","slug":"clawhub-edwardwason-wx-huitu","name":"Wx Huitu","canonicalUrl":"https://www.xpersona.co/agent/clawhub-edwardwason-wx-huitu","canonicalPath":"/agent/clawhub-edwardwason-wx-huitu","generatedAt":"2026-10-13T01:50:41.495Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T01:49:41.916Z","emptyReason":null},"description":"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图... Skill: Wx Huitu Owner: edwardwason Summary: 公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图... Tags: chart:2.2.0, data:2.1.0, figure:2.1.0, latest:2.2.0, puppeteer:2.2.0, visualization:2.2.0, wechat:2.2.0 Version history: v2.2.0 | 2026-07-14T11:32:44.922Z | user Security hardening: fix vague triggers, gate cl","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 959 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s177q4wcvafq6fzfkhk2g3cwth83y01d:wx-huitu","sourceUrl":"https://clawhub.ai/edwardwason/wx-huitu","homepage":"https://clawhub.ai/edwardwason/skills/wx-huitu","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/edwardwason/wx-huitu","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/edwardwason/skills/wx-huitu","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:49:41.916Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:49:41.916Z","emptyReason":null},"stars":null,"forks":null,"downloads":959,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"2.2.0","tractionLabel":"959 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:49:41.849Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T01:49:41.916Z","lastCrawledAt":"2026-10-12T01:49:41.849Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T01:49:41.849Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.0","createdAt":"2026-07-14T11:32:44.922Z","changelog":"Security hardening: fix vague triggers, gate cloud sync, optimize Chrome detection, strengthen user warnings","fileCount":8,"zipByteSize":29118},{"version":"2.1.0","createdAt":"2026-07-13T14:12:05.096Z","changelog":"Add SkillHub frontmatter fields, permission declaration, bilingual README","fileCount":8,"zipByteSize":27883},{"version":"2.0.0","createdAt":"2026-06-15T02:46:54.155Z","changelog":"v2.0: C01-C18版式编号+CSS类名+三画幅+语义色变量+sparkline+字号反比阶梯+强调色块硬约束","fileCount":7,"zipByteSize":24542},{"version":"1.0.0","createdAt":"2026-06-12T11:04:17.945Z","changelog":"Initial release: 14 chart types, three-axis decision framework, 8 interception rules, Okabe-Ito colorblind-safe palette, 4-step workflow","fileCount":7,"zipByteSize":16971}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s177q4wcvafq6fzfkhk2g3cwth83y01d:wx-huitu","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-13T01:50:41.494Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-edwardwason-wx-huitu/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T01:49:41.916Z","emptyReason":null},"readme":"Skill: Wx Huitu\n\nOwner: edwardwason\n\nSummary: 公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图...\n\nTags: chart:2.2.0, data:2.1.0, figure:2.1.0, latest:2.2.0, puppeteer:2.2.0, visualization:2.2.0, wechat:2.2.0\n\nVersion history:\n\nv2.2.0 | 2026-07-14T11:32:44.922Z | user\n\nSecurity hardening: fix vague triggers, gate cloud sync, optimize Chrome detection, strengthen user warnings\n\nv2.1.0 | 2026-07-13T14:12:05.096Z | user\n\nAdd SkillHub frontmatter fields, permission declaration, bilingual README\n\nv2.0.0 | 2026-06-15T02:46:54.155Z | user\n\nv2.0: C01-C18版式编号+CSS类名+三画幅+语义色变量+sparkline+字号反比阶梯+强调色块硬约束\n\nv1.0.0 | 2026-06-12T11:04:17.945Z | user\n\nInitial release: 14 chart types, three-axis decision framework, 8 interception rules, Okabe-Ito colorblind-safe palette, 4-step workflow\n\nArchive index:\n\nArchive v2.2.0: 8 files, 29118 bytes\n\nFiles: CHANGELOG.md (2207b), README.md (5265b), references/chart-system.md (23961b), references/design-tokens.md (12004b), references/workflow.md (13027b), skill-card.md (2573b), SKILL.md (10225b), _meta.json (127b)\n\nFile v2.2.0:SKILL.md\n\n---\r\nname: \"wx-huitu\"\r\nslug: \"wx-huitu\"\r\ndisplayName: \"wx-huitu\"\r\nversion: \"2.2.0\"\r\nsummary: \"公众号数据绘图专家 — 18种版式+三轴决策+拦截规则+Puppeteer截图交付\"\r\nlicense: \"MIT-0\"\r\ndescription: \"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图/杂志版式/全文配图/代码编辑.\"\r\n---\r\n\r\n# wx-huitu — 公众号数据绘图专家\r\n\r\n> 来源识别: wx-huitu 由 TRAE SOLO 创建与维护。仓库: https://github.com/EdwardWason/wx-huitu\r\n\r\n**Persona**: 你是一位数据可视化顾问。你的首要能力是\"思考与判断\"——先理解数据再选图，先想清楚论证目标再动笔。\r\n\r\n## Task\r\n\r\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。每张图表：剖析数据 → 推荐版式 → 生成 HTML → Puppeteer 截图 → PNG → 保存桌面 → 同步飞书云盘。\r\n\r\n**核心交付物**: PNG 图片，不是代码。\r\n\r\n## Out of Scope\r\n\r\n- **封面/封底** → 用 wx-peitu\r\n- **金句图/宣言卡/转场卡** → 用 wx-peitu\r\n- **全文配图方案** → 用 wx-peitu\r\n- **代码编辑** → 用代码工具\r\n- **交互式图表** → 用 plotly/echarts 独立部署\r\n\r\n---\r\n\r\n## Workflow (4步)\r\n\r\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\r\n\r\n### Step 1: Data Profiling (静默)\r\n\r\n分析每个数据单元的三轴属性：\r\n\r\n**轴1: 变量类型** — 连续/分类/时间/层级/集合\r\n**轴2: 论证意图** — 比较/趋势/占比/关系/流程/层级/重叠/累积\r\n**轴3: 数据形态** — 数据点数量/类别数/是否有异常值/是否有分组\r\n\r\n### Step 2: Chart Recommendation (确认点)\r\n\r\n基于三轴分析推荐版式，必须给出推荐+理由+1-2备选。\r\n\r\n8条拦截规则：I1(2点折线→C01) / I2(7+类别donut→C02) / I3(单值做图→C13) / I4(一图多论点→拆图) / I5(类别折线→C01) / I6(Y轴不从0起) / I7(rainbow色图→安全色板) / I8(图例压数据)\r\n\r\n### Step 3: Style + Generate HTML\r\n\r\n1问定风格：A.克制风 / B.品牌DNA / C.高端财经(C1麦肯锡/C2经济学人/C3财新) / D.指定色系\r\n\r\n生成独立HTML文件（内联CSS+SVG+固定尺寸+overflow:hidden）。\r\n\r\n### Step 4: Screenshot & Deliver\r\n\r\nPuppeteer-core → PNG → 桌面文件夹。**飞书云盘同步为可选步骤，需用户明确确认后才执行**（用户说\"同步飞书\"或\"上传云盘\"时触发，默认跳过）。\r\n\r\n---\r\n\r\n## 18种版式 (C01-C18) + 三画幅\r\n\r\n> 版式锁定：数据图表必须从 C01-C18 中选择，不允许自创版式。\r\n\r\n| 版式 | 图型 | 适用场景 | 核心CSS类 | 画幅 |\r\n|------|------|---------|----------|------|\r\n| **C01** | bar-chart | 2-6类别比较 | `.c-bar` + `.bar-col` + `.bar-fill` | 标准 640×480 |\r\n| **C02** | h-bar-chart | 7+类别或长标签 | `.c-hbar` + `.bar-row` + `.bar-fill` | 标准 640×480 |\r\n| **C03** | line-chart | 8+时间点趋势 | `.c-line` + svg `polyline` | 宽幅 640×400 |\r\n| **C04** | donut-chart | 2-5段占比 | `.c-donut` + svg `circle` stroke-dasharray | 方版 640×640 |\r\n| **C05** | quadrant-chart | 2轴+阈值线 | `.c-quadrant` + `.q-item` + `.q-crosshair` | 方版 640×640 |\r\n| **C06** | flow-chart | 3-8步顺序流程 | `.c-flow` + `.flow-step` + `.flow-connector` | 宽幅 640×400 |\r\n| **C07** | layered-diagram | 分层架构 | `.c-layer` + `.layer-row` + `.layer-items` | 标准 640×480 |\r\n| **C08** | waterfall-chart | 累积正负贡献 | `.c-waterfall` + `.wf-row` + `.wf-bar` | 标准 640×480 |\r\n| **C09** | grouped-bar | 分组类别对比 | `.c-gbar` + `.gbar-group` + `.gbar-col` | 宽幅 640×400 |\r\n| **C10** | stacked-bar | 分组占比对比 | `.c-sbar` + `.sbar-col` + `.sbar-seg` | 标准 640×480 |\r\n| **C11** | area-chart | 趋势+总量 | `.c-area` + svg `polygon` + `polyline` | 宽幅 640×400 |\r\n| **C12** | comparison-table | 多维度行列对比 | `.c-table` + `table` + `.delta-up/.delta-down` | 标准 640×480 |\r\n| **C13** | data-billboard | 单一关键数值 | `.c-billboard` + `.num-mega` + `.stat-card` | 标准 640×480 |\r\n| **C14** | venn-diagram | 2-3集合重叠 | `.c-venn` + svg `circle` + `.venn-label` | 方版 640×640 |\r\n| **C15** | radar-chart | 多维评估 | `.c-radar` + svg `polygon` + `.radar-axis` | 方版 640×640 |\r\n| **C16** | scatter-plot | 2连续变量关系 | `.c-scatter` + svg `circle` + `.scatter-label` | 方版 640×640 |\r\n| **C17** | treemap | 多类别层级占比 | `.c-treemap` + `.tm-cell` + `.tm-label` | 标准 640×480 |\r\n| **C18** | swimlane-chart | 2-4角色并行流程 | `.c-swimlane` + `.lane` + `.lane-step` | 宽幅 640×400 |\r\n\r\n三画幅：**宽幅** 640×400 | **标准** 640×480 | **方版** 640×640\r\n\r\n---\r\n\r\n## CSS变量体系\r\n\r\n### 通用变量\r\n\r\n```css\r\n:root {\r\n  --ink:#0a0a0a; --paper:#fafaf8; --accent:#002FA7; --muted:#737373; --rule:#d4d4d2;\r\n  --surface:#ffffff; --surface-2:#f2f2f0; --good:#1aaf6c; --bad:#e0445a; --warn:#f5a524;\r\n  --font-body:'Noto Sans SC',sans-serif; --font-data:'Inter','Noto Sans SC',sans-serif;\r\n  --chart-1:#E69F00; --chart-2:#56B4E9; --chart-3:#009E73; --chart-4:#D55E00;\r\n  --chart-5:#CC79A7; --chart-6:#F0E442; --chart-7:#0072B2; --chart-8:#000000;\r\n}\r\n```\r\n\r\n### 麦肯锡配色\r\n\r\n```css\r\n:root { --paper:#F7F5F2; --accent:#0F4C81; --chart-1:#0F4C81; --chart-2:#2A7B9B; --chart-3:#3A9D8F; --chart-5:#E2A828; --good:#2f7d4a; --bad:#b53a2a; }\r\n```\r\n\r\n### 经济学人配色\r\n\r\n```css\r\n:root { --paper:#FDFBF7; --accent:#E3120B; --chart-1:#E3120B; --chart-2:#0D47A1; --chart-3:#4A7C59; --good:#1f7a3a; --bad:#9c2a25; }\r\n```\r\n\r\n### 财新配色\r\n\r\n```css\r\n:root { --paper:#F5F5F3; --accent:#0055AA; --chart-1:#0055AA; --chart-2:#3A7BBF; --chart-3:#7BAFD4; --chart-4:#C0392B; --good:#1f7a3a; --bad:#9c2a25; }\r\n```\r\n\r\n### 强调色块硬约束\r\n\r\n```\r\n🚫 禁止用近黑色做强调色块背景\r\n✅ 强调色块必须用 --accent 品牌色做底色 + 白色文字\r\n✅ 洞察框/关键数据卡/公式结果块 → background:var(--accent); color:var(--paper);\r\n```\r\n\r\n---\r\n\r\n## 字号反比阶梯\r\n\r\n> 越大越细，越小越粗——与guizang-ppt-skill瑞士风一致\r\n\r\n| 字号区间 | 字重 | 典型场景 |\r\n|---------|------|---------|\r\n| ≥48px (num-mega) | 200 | billboard大数字、KPI主值 |\r\n| 28-36px (num-kpi) | 200-300 | KPI卡片数字 |\r\n| 18-24px (title) | 500 | 图表标题 |\r\n| 13-15px (data-label) | 500 | 数据标注、图表标签 |\r\n| 11-12px (axis/legend) | 400 | 轴刻度、图例文字 |\r\n| 10-11px (source/meta) | 400 | 数据来源、辅助说明 |\r\n\r\n```css\r\n.num-mega { font-size:64px; font-weight:200; }\r\n.num-kpi  { font-size:28px; font-weight:200; }\r\n.title    { font-size:22px; font-weight:500; }\r\n.data-label { font-size:13px; font-weight:500; }\r\n.axis-label { font-size:11px; font-weight:400; }\r\n.source     { font-size:10px; font-weight:400; }\r\n```\r\n\r\n---\r\n\r\n## HTML模板骨架\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><style>\r\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\r\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\r\n:root{--ink:#0a0a0a;--paper:#fafaf8;--accent:#002FA7;--muted:#737373;--rule:#d4d4d2;--surface:#ffffff;--surface-2:#f2f2f0;--good:#1aaf6c;--bad:#e0445a;--warn:#f5a524;--font-body:'Noto Sans SC',sans-serif;--font-data:'Inter','Noto Sans SC',sans-serif;--chart-1:#E69F00;--chart-2:#56B4E9;--chart-3:#009E73;--chart-4:#D55E00}\r\n*{margin:0;padding:0;box-sizing:border-box}\r\n.num{font-family:var(--font-data);font-feature-settings:'tnum' on;letter-spacing:-0.02em}\r\nhtml,body{width:640px;overflow:hidden;font-family:var(--font-body);background:var(--paper);color:var(--ink)}\r\n</style></head><body><!-- 图表内容 --></body></html>\r\n```\r\n\r\n### KPI+Sparkline组件\r\n\r\n```html\r\n<div class=\"kpi-grid\"><div class=\"kpi-card\"><div class=\"kpi-label\">月活用户</div><div class=\"kpi-value num\">2.4M</div><div class=\"kpi-delta up\">+12.3%</div><svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\"><polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\" points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/></svg></div></div>\r\n```\r\n```css\r\n.kpi-grid{display:flex;gap:10px} .kpi-card{flex:1;padding:14px;background:var(--surface);border:1px solid var(--rule)} .kpi-value{font-size:28px;font-weight:200} .kpi-delta.up{color:var(--good)} .kpi-delta.down{color:var(--bad)} .sparkline{width:100%;height:24px;margin-top:6px}\r\n```\r\n\r\n---\r\n\r\n## Chart Styling Rules\r\n\r\n- 标题18-24px/500; 轴标12px/400 --muted; 数据标13px/500 .num; 来源10-11px --muted\r\n- 数值用.num → --font-data (Inter) + tnum等宽对齐\r\n- 卡片用--surface; 次级表面用--surface-2; 强调块用--accent+白字\r\n- 涨--good; 跌--bad; 警告--warn\r\n- 每张图底部必须标注数据来源\r\n- Okabe-Ito 8色+冗余编码，单图不超4色\r\n- 每张图表必须包含：标题+数据主体+轴标签/图例+数据来源\r\n- 版式锁定：数据图表必须从C01-C18中选择，不允许自创版式\r\n\r\n---\r\n\r\n## 详细参考文件\r\n\r\n| 文件 | 用途 |\r\n|------|------|\r\n| references/workflow.md | 完整4步工作流：剖析→推荐→生成→交付 |\r\n| references/chart-system.md | 完整图表系统：18种版式+三轴决策树+8条拦截规则+色板+7种HTML骨架 |\r\n| references/design-tokens.md | 完整设计令牌：3套财经配色详解+字号规范+间距规范+画幅弹性规则 |\r\n\r\n---\r\n\r\n## 权限声明\r\n\r\n本技能运行时需要以下权限：\r\n- **网络访问**（必需）：加载 Google Fonts（Inter / Noto Sans SC）\r\n- **subprocess 调用**（必需）：运行 Puppeteer-core 截图（需系统 Chrome）\r\n- **文件系统写入**（必需）：PNG 图片保存到桌面文件夹\r\n- **飞书云盘 API**（可选）：`lark-cli drive +upload` 上传图片到飞书云盘，需配置飞书凭证\n\nFile v2.2.0:README.md\n\n# wx-huitu — 公众号数据绘图专家\r\n\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-wx--huitu-blue)](https://clawhub.ai/skills/wx-huitu)\r\n[![SkillHub](https://img.shields.io/badge/SkillHub-wx--huitu-green)](https://skillhub.cn/skills/wx-huitu)\r\n[![版本](https://img.shields.io/badge/版本-2.2.0-brightgreen)](https://github.com/EdwardWason/wx-huitu)\r\n[![协议](https://img.shields.io/badge/协议-MIT--0-lightgrey)](LICENSE)\r\n\r\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。\r\n\r\n## 核心特性\r\n\r\n- **18 种版式** (C01-C18)：柱状/折线/饼图/面积/雷达/散点/漏斗/热力/仪表盘/混合图表等\r\n- **三轴决策框架**：变量类型 × 论证意图 × 数据形态 → 自动推荐最适图型\r\n- **8 条拦截规则**：主动拦截不当选择（2 点折线/7+类别饼图/单值做图等）\r\n- **色盲安全**：Okabe-Ito 8 色色板 + 冗余编码\r\n- **三套财经配色**：麦肯锡/经济学人/财新\r\n- **Puppeteer 截图交付**：HTML → PNG → 桌面文件夹 → 飞书云盘同步\r\n\r\n## 工作流\r\n\r\n```\r\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\r\n```\r\n\r\n## 使用方式\r\n\r\n在 TRAE IDE 中说：\r\n- \"文章绘图\"\r\n- \"绘图图表\"\r\n- \"画个图表\"\r\n- \"数据图\"\r\n- \"公众号图表\"\r\n\r\n## 不适用范围\r\n\r\n- 封面/封底 → 用 wx-peitu\r\n- 金句图/宣言卡/转场卡 → 用 wx-peitu\r\n- 全文配图方案 → 用 wx-peitu\r\n- 代码编辑 → 用代码工具\r\n- 交互式图表 → 用 plotly/echarts 独立部署\r\n\r\n## ⚠️ 用户须知\r\n\r\n本技能运行时会：\r\n1. **自动写入本地文件**：PNG 图片保存到桌面文件夹\r\n2. **调用 subprocess**：运行 Puppeteer-core 进行浏览器截图（需要系统安装 Chrome 或 Edge）\r\n3. **网络请求**：加载 Google Fonts（Inter / Noto Sans SC）\r\n\r\n**可选操作（默认关闭，需用户明确确认）**：\r\n4. **飞书云盘上传**：仅当用户明确说\"同步飞书\"或\"上传云盘\"时执行。生成的图表（可能含文章源数据）会上传到外部飞书云存储。用户可随时说\"不同步\"跳过。\r\n\r\n## 文件结构\r\n\r\n```\r\nwx-huitu/\r\n├── SKILL.md              # 技能定义（frontmatter + 工作流 + 版式 + CSS + 规则）\r\n├── README.md             # 本文件\r\n├── CHANGELOG.md          # 变更日志\r\n├── LICENSE               # MIT-0\r\n├── .gitignore\r\n├── .claude-plugin/\r\n│   └── plugin.json\r\n└── references/\r\n    ├── workflow.md       # 完整4步工作流\r\n    ├── chart-system.md   # 18种版式+三轴决策树+拦截规则+HTML骨架\r\n    └── design-tokens.md  # 设计令牌：配色+字号+间距+画幅\r\n```\r\n\r\n## 协议\r\n\r\nMIT-0 — 自由使用、修改和分发，无需署名。\r\n\r\n---\r\n\r\n# wx-huitu — WeChat Article Chart Expert\r\n\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-wx--huitu-blue)](https://clawhub.ai/skills/wx-huitu)\r\n[![SkillHub](https://img.shields.io/badge/SkillHub-wx--huitu-green)](https://skillhub.cn/skills/wx-huitu)\r\n[![Version](https://img.shields.io/badge/version-2.2.0-brightgreen)](https://github.com/EdwardWason/wx-huitu)\r\n[![License](https://img.shields.io/badge/license-MIT--0-lightgrey)](LICENSE)\r\n\r\nInput an article or data description, output a WeChat article chart PNG package.\r\n\r\n## Key Features\r\n\r\n- **18 Chart Types** (C01-C18): bar/line/donut/area/radar/scatter/funnel/heatmap/dashboard/mixed charts, etc.\r\n- **Three-Axis Decision Framework**: Variable type × Argument intent × Data shape → Auto-recommend best chart\r\n- **8 Interception Rules**: Proactively block inappropriate choices (2-point line / 7+ category pie / single-value chart, etc.)\r\n- **Colorblind-Safe**: Okabe-Ito 8-color palette + redundant encoding\r\n- **Three Financial Color Schemes**: McKinsey / The Economist / Caixin\r\n- **Puppeteer Screenshot Delivery**: HTML → PNG → Desktop folder (Feishu cloud sync is optional, requires user confirmation)\r\n\r\n## Workflow\r\n\r\n```\r\nInput → Step 1: Data Profiling (silent) → Step 2: Chart Recommendation (confirm) → Step 3: Style + Generate HTML → Step 4: Screenshot & Deliver\r\n```\r\n\r\n## Usage\r\n\r\nSay in TRAE IDE:\r\n- \"文章绘图\" / \"绘图图表\" / \"画个图表\" / \"数据图\" / \"公众号图表\"\r\n\r\n## Out of Scope\r\n\r\n- Cover/back cover → use wx-peitu\r\n- Quote cards / transition cards → use wx-peitu\r\n- Full article illustration → use wx-peitu\r\n- Code editing → use code tools\r\n- Interactive charts → use plotly/echarts standalone\r\n\r\n## ⚠️ User Notice\r\n\r\nThis skill will:\r\n1. **Write local files**: PNG images saved to desktop folder\r\n2. **Call subprocess**: Run Puppeteer-core for browser screenshots (Chrome required)\r\n3. **Network requests**: Load Google Fonts (Inter / Noto Sans SC)\r\n\r\n**Optional actions (off by default, require explicit user confirmation)**:\r\n4. **Feishu cloud upload**: Only executed when user explicitly says \"同步飞书\" or \"上传云盘\". Generated charts (may contain article source data) will be uploaded to external Feishu cloud storage. User can say \"不同步\" to skip at any time.\r\n\r\n## License\r\n\r\nMIT-0 — Free to use, modify, and redistribute. No attribution required.\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn75zj7vzdyvap84adxa8heyyd82f5eh\",\n  \"slug\": \"wx-huitu\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1784028764922\n}\n\nFile v2.2.0:references/chart-system.md\n\n# 图表系统参考\n\n> 18种图型 + 三轴决策树 + 拦截规则 + 三画幅系统 + HTML骨架\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. 三轴决策树\n\n```\n数据关系是什么？（轴1: 变量类型）\n│\n├─ 类别比较（1分类 + 1连续）\n│   ├─ 少类别 (2-6) → bar-chart\n│   ├─ 多类别 (7+) → horizontal-bar-chart\n│   └─ 分组对比 → grouped-bar\n│\n├─ 时间变化（1时间 + 1连续）\n│   ├─ 少数据点 (2-8) → bar-chart\n│   ├─ 多数据点 (8+) → line-chart\n│   └─ 趋势+总量 → area-chart\n│\n├─ 占比关系（1分类看构成）\n│   ├─ 少分段 (2-5) → donut-chart\n│   ├─ 多分段 (6+) → treemap\n│   └─ 分组占比 → stacked-bar\n│\n├─ 相关性（2+连续变量）\n│   ├─ 2变量 → scatter-plot\n│   ├─ 2变量+阈值 → quadrant-chart\n│   └─ 3+变量 → bubble-chart\n│\n├─ 流程（顺序/并行步骤）\n│   ├─ 顺序步骤 → flow-chart\n│   ├─ 并行泳道 → swimlane-chart\n│   └─ 状态转换 → state-machine\n│\n├─ 层级（嵌套/分类结构）\n│   ├─ 树结构 → tree-chart\n│   └─ 分层架构 → layered-diagram\n│\n├─ 集合重叠\n│   └─ 2-3集合 → venn-diagram\n│\n├─ 累积变化\n│   └─ 正负贡献 → waterfall-chart\n│\n└─ 多维度对比\n    └─ 行列结构 → comparison-table\n```\n\n### 同一数据不同论点 → 不同图\n\n| 数据 | 论点\"比较\" | 论点\"趋势\" | 论点\"占比\" |\n|------|-----------|-----------|-----------|\n| 2020-2024年收入 | bar-chart（4组对比） | line-chart（增长趋势） | — |\n| 3产品市场份额 | bar-chart（谁最大） | — | donut-chart（各占多少） |\n| 用户画像标签 | h-bar-chart（排名） | — | treemap（层级占比） |\n\n---\n\n## 2. 18种图型\n\n| # | Type | When | Data Shape | 画幅 |\n|---|------|------|-----------|------|\n| 1 | **bar-chart** | 2-6类别比较 | `[{label, value, color?}]` | 标准 |\n| 2 | **horizontal-bar-chart** | 7+类别或长标签 | `[{label, value, color?}]` | 标准 |\n| 3 | **line-chart** | 8+时间点趋势 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 4 | **donut-chart** | 2-5段占比 | `[{label, value, color}]` | 方版 |\n| 5 | **quadrant-chart** | 2轴+阈值线 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 6 | **flow-chart** | 3-8步顺序流程 | `{steps:[{id,label,type?}], connections:[{from,to}]}` | 宽幅 |\n| 7 | **swimlane-chart** | 2-4角色并行流程 | `{lanes:[{name,steps}]}` | 宽幅 |\n| 8 | **state-machine** | 状态转换+条件 | `{states, transitions}` | 方版 |\n| 9 | **tree-chart** | 层级结构 | `{root:{label,children}}` | 标准 |\n| 10 | **layered-diagram** | 分层架构 | `{layers:[{name,items,color?}]}` | 标准 |\n| 11 | **venn-diagram** | 2-3集合重叠 | `{sets, overlap}` | 方版 |\n| 12 | **waterfall-chart** | 累积正负贡献 | `[{label,value,type}]` | 标准 |\n| 13 | **treemap** | 多类别层级占比 | `[{label,value,color?,children?}]` | 标准 |\n| 14 | **scatter-plot** | 2连续变量关系 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 15 | **grouped-bar** | 分组类别对比 | `{labels, groups:[{name,values,color?}]}` | 宽幅 |\n| 16 | **stacked-bar** | 分组占比对比 | `{labels, segments:[{name,values,color?}]}` | 标准 |\n| 17 | **area-chart** | 趋势+总量 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 18 | **comparison-table** | 多维度行列对比 | `{headers, rows:[{label, values}]}` | 标准 |\n\n### 补充: data-billboard（非独立图型，用于单一数值高亮）\n\n| Type | When | Data Shape | 画幅 |\n|------|------|-----------|------|\n| **data-billboard** | 单一关键数值 | `{value, label, context?, stats:[{value,label}]}` | 标准 |\n\n---\n\n## 3. 拦截规则详解\n\n| # | 触发条件 | 问题 | 替代方案 | 话术模板 |\n|---|---------|------|---------|---------|\n| I1 | 2个数据点画折线 | 2点折线无趋势意义 | bar-chart | \"2个数据点画折线图看不出趋势，改用柱状图更直观\" |\n| I2 | 7+类别画donut | 角度比较超过5段人眼难分 | horizontal-bar-chart | \"7+类别画环形图角度难区分，横向柱状图长度比较更清晰\" |\n| I3 | 单一数值做数据图 | 1个数字不需要图 | data-billboard | \"单个数值不需要复杂图表，用数字高亮卡更有冲击力\" |\n| I4 | 一图>2论点 | 信息过载 | 拆图 | \"一张图承载多个论点会稀释每个论点的传达力，建议拆分\" |\n| I5 | 类别变量用折线 | 暗示不存在的连续关系 | bar-chart | \"类别变量之间没有连续关系，折线会误导读者，改用柱状图\" |\n| I6 | Y轴不从0起 | 误导小差异看起来很大 | 加断裂标记或从0起 | \"Y轴不从0起会夸大差异，建议从0起或加明显的轴断裂标记\" |\n| I7 | rainbow/jet色图 | 感知不均匀 | 主题色板+冗余编码 | \"彩虹色图感知不均匀会造假峰，改用色盲安全色板\" |\n| I8 | 图例压数据 | 遮挡关键信息 | 调整图例位置 | \"图例遮挡了数据，建议移到空白区域\" |\n\n---\n\n## 4. 色盲安全色板\n\n### Okabe-Ito 8色（默认）\n\n```css\n:root {\n  --chart-1: #E69F00; /* 橙 */\n  --chart-2: #56B4E9; /* 天蓝 */\n  --chart-3: #009E73; /* 青绿 */\n  --chart-4: #D55E00; /* 朱红 */\n  --chart-5: #CC79A7; /* 粉紫 */\n  --chart-6: #F0E442; /* 黄 */\n  --chart-7: #0072B2; /* 深蓝 */\n  --chart-8: #000000; /* 黑 */\n}\n```\n\n### 使用规则\n\n1. **单图不超4色** — 超过4类时合并小类为\"其他\"\n2. **冗余编码** — 不同类别加不同形状(marker)或线型(dashed/solid/dotted)\n3. **灰度可分** — 出图前想象灰度版，颜色仍可区分\n4. **强调色** — 需要高亮某一类时用 `--accent`，其余用 `--chart-*`\n\n### 冗余编码参考\n\n| 类别 | 颜色 | 形状 | 线型 |\n|------|------|------|------|\n| A | --chart-1 | circle ● | solid |\n| B | --chart-2 | square ■ | dashed |\n| C | --chart-3 | triangle ▲ | dotted |\n| D | --chart-4 | diamond ◆ | dash-dot |\n\n---\n\n## 5. Chart Styling Rules\n\n- **Typography**: 标题 `--font-body` 18-24px/500; 轴标 12px/400 `--muted`; 数据标 13px/500 `.num`; 来源 10-11px `--muted`\n- **Data Font**: 数值用 `.num` class → `--font-data` (Inter) + `tnum` 等宽对齐\n- **Spacing**: 内边距 36-48px; 图例间距 16px; KPI卡片间距 8-12px\n- **Surface**: 卡片用 `--surface`; 次级表面用 `--surface-2`; 强调块用 `--accent` + 白字\n- **Semantic Colors**: 涨 `--good`; 跌 `--bad`; 警告 `--warn`\n- **SVG**: 用 `viewBox` + `width:100%` + `height:auto`\n- **A11y**: `role=\"img\"` + `aria-label`; 不纯靠颜色区分\n- **Source**: 每张图底部必须标注数据来源\n- **Accent Block**: 强调色块必须用 `--accent` 品牌色，禁止近黑色\n\n---\n\n## 6. HTML骨架（每种图型）\n\n### 通用头部（所有骨架共享）\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root {\n  --ink: #0a0a0a; --paper: #fafaf8; --accent: #002FA7;\n  --muted: #737373; --rule: #d4d4d2;\n  --surface: #ffffff; --surface-2: #f2f2f0;\n  --good: #1aaf6c; --bad: #e0445a; --warn: #f5a524;\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n  --chart-1: #E69F00; --chart-2: #56B4E9; --chart-3: #009E73; --chart-4: #D55E00;\n}\n* { margin:0; padding:0; box-sizing:border-box; }\n.num { font-family:var(--font-data); font-feature-settings:'tnum' on; letter-spacing:-0.02em; }\n</style>\n```\n\n### KPI卡片+Sparkline组件（可嵌入任何图型头部）\n\n```html\n<div class=\"kpi-grid\">\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">月活用户</div>\n    <div class=\"kpi-value num\">2.4M</div>\n    <div class=\"kpi-delta up\">+12.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\"\n        points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">付费率</div>\n    <div class=\"kpi-value num\">8.7%</div>\n    <div class=\"kpi-delta down\">-0.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"1.5\"\n        points=\"0,8 10,10 20,9 30,12 40,11 50,14 60,13 70,16 80,15\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">ARPU</div>\n    <div class=\"kpi-value num\">¥42</div>\n    <div class=\"kpi-delta up\">+5.1%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"1.5\"\n        points=\"0,20 10,18 20,16 30,14 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n</div>\n```\n\n```css\n.kpi-grid { display:flex; gap:10px; margin-bottom:20px; }\n.kpi-card { flex:1; padding:14px; background:var(--surface); border:1px solid var(--rule); border-radius:4px; }\n.kpi-label { font-size:10px; color:var(--muted); margin-bottom:4px; }\n.kpi-value { font-size:28px; font-weight:200; line-height:1; }\n.kpi-delta { font-size:10px; font-weight:500; margin-top:2px; }\n.kpi-delta.up { color:var(--good); }\n.kpi-delta.down { color:var(--bad); }\n.sparkline { width:100%; height:24px; margin-top:6px; }\n```\n\n### bar-chart (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-area { display:flex; flex-direction:column; gap:12px; }\n.bar-row { display:flex; align-items:center; gap:12px; }\n.bar-label { width:80px; font-size:13px; text-align:right; flex-shrink:0; }\n.bar-track { flex:1; height:32px; background:var(--surface-2); border-radius:2px; position:relative; }\n.bar-fill { height:100%; border-radius:2px; display:flex; align-items:center; justify-content:flex-end; padding-right:10px; }\n.bar-value { font-size:12px; font-weight:500; color:var(--paper); }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">数据对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-area\">\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别A</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:85%;background:var(--chart-1)\"><span class=\"bar-value num\">85%</span></div></div>\n    </div>\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别B</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:62%;background:var(--chart-2)\"><span class=\"bar-value num\">62%</span></div></div>\n    </div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### line-chart (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 20px; }\n.chart-container { width:544px; }\n.legend { display:flex; gap:20px; margin-bottom:12px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:12px; }\n.legend-dot { width:10px; height:10px; border-radius:50%; }\nsvg { width:100%; height:auto; }\n.axis-label { font-size:11px; fill:var(--muted); }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">趋势</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-container\">\n    <div class=\"legend\">\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>系列A</div>\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>系列B</div>\n    </div>\n    <svg viewBox=\"0 0 544 280\" xmlns=\"http://www.w3.org/2000/svg\">\n      <line x1=\"50\" y1=\"20\" x2=\"530\" y2=\"20\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"80\" x2=\"530\" y2=\"80\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"140\" x2=\"530\" y2=\"140\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"200\" x2=\"530\" y2=\"200\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"260\" x2=\"530\" y2=\"260\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <polyline points=\"50,200 150,160 250,120 350,80 450,60 530,40\" fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"2\"/>\n      <polyline points=\"50,220 150,200 250,180 350,160 450,140 530,120\" fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"2\" stroke-dasharray=\"6,3\"/>\n      <text x=\"50\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2020</text>\n      <text x=\"150\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2021</text>\n      <text x=\"250\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2022</text>\n      <text x=\"350\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2023</text>\n      <text x=\"450\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2024</text>\n      <text x=\"530\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2025</text>\n    </svg>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### donut-chart (方版 640×640)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; height:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; height:640px; padding:48px; display:flex; flex-direction:column; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-center { flex:1; display:flex; align-items:center; justify-content:center; }\nsvg { width:320px; height:320px; }\n.legend { display:flex; flex-wrap:wrap; gap:16px; justify-content:center; margin-top:24px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:13px; }\n.legend-dot { width:12px; height:12px; border-radius:2px; }\n.source { font-size:11px; color:var(--muted); margin-top:auto; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">占比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-center\">\n    <svg viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"30\"\n              stroke-dasharray=\"132 308\" stroke-dashoffset=\"0\" transform=\"rotate(-90 100 100)\"/>\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"30\"\n              stroke-dasharray=\"110 330\" stroke-dashoffset=\"-132\" transform=\"rotate(-90 100 100)\"/>\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"30\"\n              stroke-dasharray=\"88 352\" stroke-dashoffset=\"-242\" transform=\"rotate(-90 100 100)\"/>\n      <text x=\"100\" y=\"96\" text-anchor=\"middle\" font-size=\"28\" font-weight=\"200\" fill=\"var(--ink)\" class=\"num\">100%</text>\n      <text x=\"100\" y=\"116\" text-anchor=\"middle\" font-size=\"11\" fill=\"var(--muted)\">总计</text>\n    </svg>\n  </div>\n  <div class=\"legend\">\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>A 30%</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>B 25%</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-3)\"></div>C 20%</div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### data-billboard (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:48px; display:flex; flex-direction:column; min-height:480px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.num-mega { font-size:64px; font-weight:200; line-height:1; color:var(--ink); margin:auto 0 0; }\n.num-label { font-size:16px; font-weight:500; color:var(--accent); margin-top:12px; letter-spacing:0.05em; }\n.num-context { font-size:14px; color:var(--muted); line-height:1.6; margin-top:8px; max-width:400px; }\n.stats { display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px; margin-top:auto; }\n.stat-card { background:var(--accent); color:var(--paper); padding:16px; border-radius:4px; }\n.stat-card .num { font-size:22px; font-weight:200; }\n.stat-card .label { font-size:11px; color:rgba(255,255,255,0.7); margin-top:4px; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">关键数据</div>\n  <p class=\"num-mega num\">2.4 亿</p>\n  <div class=\"num-label\">中国灵活就业人口</div>\n  <p class=\"num-context\">占全国就业人口的近三分之一</p>\n  <div class=\"stats\">\n    <div class=\"stat-card\"><div class=\"num\">+12%</div><div class=\"label\">年增长率</div></div>\n    <div class=\"stat-card\"><div class=\"num\">68%</div><div class=\"label\">90后占比</div></div>\n    <div class=\"stat-card\"><div class=\"num\">3.2万</div><div class=\"label\">年均收入</div></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### flow-chart (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 28px; }\n.flow { display:flex; flex-direction:column; gap:0; }\n.step { display:flex; align-items:flex-start; gap:16px; padding:14px 0; }\n.step + .step { border-top:1px solid var(--rule); }\n.step-num { font-size:13px; font-weight:500; color:var(--accent); width:28px; flex-shrink:0; padding-top:2px; }\n.step-title { font-size:16px; font-weight:500; line-height:1.3; }\n.step-desc { font-size:13px; color:var(--muted); line-height:1.4; margin-top:4px; }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">流程</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"flow\">\n    <div class=\"step\"><span class=\"step-num\">01</span><div><div class=\"step-title\">步骤一</div><div class=\"step-desc\">描述</div></div></div>\n    <div class=\"step\"><span class=\"step-num\">02</span><div><div class=\"step-title\">步骤二</div><div class=\"step-desc\">描述</div></div></div>\n    <div class=\"step\"><span class=\"step-num\">03</span><div><div class=\"step-title\">步骤三</div><div class=\"step-desc\">描述</div></div></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### grouped-bar (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 16px; }\n.legend { display:flex; gap:20px; margin-bottom:16px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:12px; }\n.legend-dot { width:10px; height:10px; border-radius:2px; }\n.chart-area { display:flex; align-items:flex-end; gap:24px; height:200px; padding-bottom:28px; border-bottom:1px solid var(--rule); }\n.group { display:flex; flex-direction:column; align-items:center; flex:1; }\n.bars { display:flex; gap:4px; align-items:flex-end; height:200px; }\n.bar { width:28px; border-radius:2px 2px 0 0; transition:height 0.3s; }\n.group-label { font-size:11px; color:var(--muted); margin-top:8px; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">分组对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"legend\">\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>系列A</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>系列B</div>\n  </div>\n  <div class=\"chart-area\">\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:80%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:60%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q1</span></div>\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:90%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:70%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q2</span></div>\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:75%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:85%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q3</span></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### comparison-table (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 20px; }\ntable { width:100%; border-collapse:collapse; font-size:13px; }\nthead th { text-align:left; padding:10px 12px; background:var(--surface-2); color:var(--muted); font-weight:500; font-size:11px; letter-spacing:0.05em; }\ntbody td { padding:10px 12px; border-bottom:1px solid var(--rule); }\ntbody tr:hover { background:var(--surface-2); }\n.delta-up { color:var(--good); font-weight:500; }\n.delta-down { color:var(--bad); font-weight:500; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">对比</div>\n  <h2 class=\"title\">标题</h2>\n  <table>\n    <thead><tr><th>指标</th><th>2023</th><th>2024</th><th>变化</th></tr></thead>\n    <tbody>\n      <tr><td>收入</td><td class=\"num\">1.2M</td><td class=\"num\">1.5M</td><td class=\"delta-up num\">+25%</td></tr>\n      <tr><td>成本</td><td class=\"num\">800K</td><td class=\"num\">950K</td><td class=\"delta-down num\">+19%</td></tr>\n    </tbody>\n  </table>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n---\n\n## 7. 自动选图集成\n\n内容解析后自动建议：\n\n| 数据信号 | 推荐图型 | 画幅 |\n|---------|---------|------|\n| \"A占X%，B占Y%\" | bar-chart / h-bar-chart | 标准 |\n| \"逐年/逐月增长\" | line-chart | 宽幅 |\n| \"分为三部分/占比\" | donut-chart | 方版 |\n| \"A→B→C步骤\" | flow-chart | 宽幅 |\n| \"包含/下属/层级\" | tree-chart / layered-diagram | 标准 |\n| \"正相关/负相关\" | scatter-plot | 方版 |\n| \"同时属于/交集\" | venn-diagram | 方版 |\n| \"贡献了/减少了\" | waterfall-chart | 标准 |\n| \"A和B各多少，按季度\" | grouped-bar | 宽幅 |\n| \"趋势+总量\" | area-chart | 宽幅 |\n| \"多维度对比\" | comparison-table | 标准 |\n\nFile v2.2.0:references/design-tokens.md\n\n# 设计令牌参考\n\n> CSS变量体系 + 三套财经配色 + 三画幅系统 + 字号规范\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. CSS变量体系\n\n### 通用变量（所有图表共享）\n\n```css\n:root {\n  /* 基础色 */\n  --ink: #0a0a0a;\n  --paper: #fafaf8;\n  --accent: #002FA7;\n  --muted: #737373;\n  --rule: #d4d4d2;\n\n  /* 表面层级 */\n  --surface: #ffffff;          /* 卡片白 */\n  --surface-2: #f2f2f0;        /* 次级表面（浅灰） */\n\n  /* 语义色 — 涨跌/状态 */\n  --good: #1aaf6c;             /* 正向-绿（涨/达标/好） */\n  --bad: #e0445a;              /* 负向-红（跌/未达标/差） */\n  --warn: #f5a524;             /* 警告-琥珀（注意/中性偏负） */\n\n  /* 字体 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;  /* 数据专用，等宽数字 */\n\n  /* 图表色板 (Okabe-Ito 色盲安全) */\n  --chart-1: #E69F00;\n  --chart-2: #56B4E9;\n  --chart-3: #009E73;\n  --chart-4: #D55E00;\n  --chart-5: #CC79A7;\n  --chart-6: #F0E442;\n  --chart-7: #0072B2;\n  --chart-8: #000000;\n}\n```\n\n### 数据字体对齐\n\n```css\n.num {\n  font-family: var(--font-data);\n  font-feature-settings: 'tnum' on;\n  letter-spacing: -0.02em;\n}\n```\n\n> Inter 的 `tnum` 特性确保数字等宽对齐，表格和KPI卡片中数值列不会参差不齐。\n\n### 主题切换\n\n只替换 `:root` 变量即可切换主题：\n\n**克制风（默认）**\n```css\n:root { --accent: #002FA7; }\n```\n\n**品牌DNA — 微信绿**\n```css\n:root { --accent: #07C160; }\n```\n\n**品牌DNA — 经济学人红**\n```css\n:root { --accent: #E3120B; }\n```\n\n**品牌DNA — 知乎蓝**\n```css\n:root { --accent: #0066FF; }\n```\n\n**暖色系**\n```css\n:root { --accent: #C0392B; --paper: #f8f6f1; }\n```\n\n---\n\n## 2. 高端财经媒体配色方案\n\n> 三套方案分别对标麦肯锡、经济学人、财新杂志的图表视觉风格。\n> 核心原则：低饱和度、高灰度占比、单色系为主+1个强调色、大面积留白。\n\n### 方案A：麦肯锡 McKinsey\n\n**视觉特征**：深蓝主色+青绿辅助+暖灰底色，克制严谨，数据密度高但视觉噪音低。\n\n```css\n:root {\n  --ink: #1B1B1B;\n  --paper: #F7F5F2;        /* 暖灰白，非纯白 */\n  --accent: #0F4C81;       /* 麦肯锡深蓝 — 强调色块必须用品牌色 */\n  --muted: #6B6B6B;\n  --rule: #D9D5CF;         /* 暖灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #efeee9;    /* 暖灰次级表面 */\n  --good: #2f7d4a;         /* 麦肯锡绿 */\n  --bad: #b53a2a;          /* 麦肯锡红 */\n  --warn: #c47b25;         /* 麦肯锡琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 麦肯锡图表色板：低饱和度、蓝-青-绿-琥珀渐进 */\n  --chart-1: #0F4C81;      /* 深蓝 Steel Blue */\n  --chart-2: #2A7B9B;      /* 青蓝 Teal Blue */\n  --chart-3: #3A9D8F;      /* 青绿 Sage Teal */\n  --chart-4: #A8B820;      /* 橄榄绿 Olive */\n  --chart-5: #E2A828;      /* 琥珀 Amber */\n  --chart-6: #C76D5E;      /* 赤陶 Terracotta */\n  --chart-7: #7B6B8D;      /* 灰紫 Mauve */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 主色用 `--chart-1` 深蓝，强调用 `--chart-5` 琥珀\n- 背景 `--paper` 是暖灰白 #F7F5F2，不是纯白\n- 分割线用暖灰 `--rule` #D9D5CF\n- 数据标签用 `--ink` #1B1B1B，不用纯黑\n- 卡片背景用 `--surface` 或 `rgba(15,76,129,0.04)`\n- **强调色块用 `--accent` (#0F4C81) 深蓝底+白字，禁止用近黑色**\n\n### 方案B：经济学人 The Economist\n\n**视觉特征**：标志性红+深蓝灰+米白底，对比鲜明，标题粗重数据纤细，英式克制。\n\n```css\n:root {\n  --ink: #1D1D1B;\n  --paper: #FDFBF7;        /* 米白，微暖 */\n  --accent: #E3120B;       /* 经济学人红 — 强调色块必须用品牌色 */\n  --muted: #6C6C6C;\n  --rule: #D5D0C8;         /* 米灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #f0ede5;    /* 米灰次级表面 */\n  --good: #1f7a3a;         /* 经济学人绿 */\n  --bad: #9c2a25;          /* 经济学人红（深） */\n  --warn: #c47b25;         /* 经济学人琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 经济学人图表色板：红-蓝-灰为主，低饱和辅助色 */\n  --chart-1: #E3120B;      /* 经济学人红 */\n  --chart-2: #0D47A1;      /* 深蓝 Navy */\n  --chart-3: #4A7C59;      /* 橄榄绿 Olive Green */\n  --chart-4: #D4A843;      /* 旧金 Gold */\n  --chart-5: #7B5EA7;      /* 灰紫 Muted Purple */\n  --chart-6: #C4784A;      /* 赤铜 Copper */\n  --chart-7: #3B7D8C;      /* 灰青 Slate Teal */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 强调用 `--chart-1` 红，主数据用 `--chart-2` 深蓝\n- 标题字重500，数据数字字重200（粗细对比是经济学人标志）\n- 来源行用小号斜体，底部细线分隔\n- **强调色块用 `--accent` (#E3120B) 红底+白字，禁止用近黑色**\n- 涨跌用 `--good` 绿 / `--bad` 红\n\n### 方案C：财新 Caixin\n\n**视觉特征**：财新蓝+深墨+冷灰底，中式财经克制，信息密度极高，留白精准。\n\n```css\n:root {\n  --ink: #1A1A1A;\n  --paper: #F5F5F3;        /* 冷灰白 */\n  --accent: #0055AA;       /* 财新蓝 — 强调色块必须用品牌色 */\n  --muted: #757575;\n  --rule: #D4D4D4;         /* 冷灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #eaeae8;    /* 冷灰次级表面 */\n  --good: #1f7a3a;         /* 财新绿 */\n  --bad: #9c2a25;          /* 财新红（深） */\n  --warn: #c47b25;         /* 财新琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 财新图表色板：蓝-灰为主，暖色点缀 */\n  --chart-1: #0055AA;      /* 财新蓝 */\n  --chart-2: #3A7BBF;      /* 中蓝 */\n  --chart-3: #7BAFD4;      /* 浅蓝 */\n  --chart-4: #C0392B;      /* 警示红 */\n  --chart-5: #D4883A;      /* 暖铜 Bronze */\n  --chart-6: #5B8C5A;      /* 灰绿 Sage */\n  --chart-7: #8E7CC3;      /* 灰紫 Lavender */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 主色用 `--chart-1` 财新蓝，警示用 `--chart-4` 红\n- 同色系渐变（蓝→中蓝→浅蓝）用于分组/层级对比\n- 背景冷灰白 #F5F5F3，分割线冷灰\n- **强调色块用 `--accent` (#0055AA) 蓝底+白字，禁止用近黑色**\n- 数据来源标注严格，用「数据来源：」而非「Source:」\n\n### 三方案速查对比\n\n| 维度 | 麦肯锡 | 经济学人 | 财新 |\n|------|--------|---------|------|\n| 底色 | 暖灰白 #F7F5F2 | 米白 #FDFBF7 | 冷灰白 #F5F5F3 |\n| 主色 | 深蓝 #0F4C81 | 红 #E3120B | 蓝 #0055AA |\n| 强调色 | 琥珀 #E2A828 | 深蓝 #0D47A1 | 红 #C0392B |\n| 强调色块底色 | 深蓝 #0F4C81 | 红 #E3120B | 蓝 #0055AA |\n| 分割线 | 暖灰 #D9D5CF | 米灰 #D5D0C8 | 冷灰 #D4D4D4 |\n| 涨色 | 绿 #2f7d4a | 绿 #1f7a3a | 绿 #1f7a3a |\n| 跌色 | 红 #b53a2a | 红 #9c2a25 | 红 #9c2a25 |\n| 风格气质 | 克制严谨 | 英式鲜明 | 中式精炼 |\n| 适用场景 | 咨询报告/战略分析 | 全球财经/深度调查 | 国内财经/政策解读 |\n| 色板特征 | 蓝→青→绿渐进 | 红+蓝对比为主 | 蓝色系渐变+红警示 |\n\n### 强调色块硬约束\n\n```\n🚫 禁止用近黑色（#051C2C / #1D1D1B / #1A1A1A 等）做强调色块背景\n✅ 强调色块必须用 --accent 品牌色做底色 + 白色/浅色文字\n✅ 洞察框/关键数据卡/公式结果块 → background: var(--accent); color: var(--paper);\n```\n\n---\n\n## 3. 字号规范\n\n### 图表专用字号\n\n| 元素 | 字号 | 字重 | 颜色 | 用途 |\n|------|------|------|------|------|\n| kicker | 10-11px | 500 | --accent | 分类标签 |\n| title | 18-24px | 500 | --ink | 图表标题 |\n| subtitle | 11px | 400 | --muted | 副标题/补充说明 |\n| axis-label | 11-12px | 400 | --muted | 轴刻度标签 |\n| data-label | 12-13px | 500 | --ink / --paper | 数据标注 |\n| legend-text | 12-13px | 400 | --ink | 图例文字 |\n| source | 10-11px | 400 | --muted | 数据来源 |\n| num-mega | 48-64px | 200 | --ink | billboard大数字 |\n| num-label | 14-16px | 500 | --accent | billboard标签 |\n| num-kpi | 28-36px | 200 | --ink / --chart-* | KPI卡片数字 |\n| sparkline-label | 9-10px | 400 | --muted | 迷你趋势线标签 |\n\n### 标题长度→字号映射\n\n| 标题长度 | 字号 | 字重 |\n|---------|------|------|\n| ≤6字 | 24px | 500 |\n| 7-14字 | 22px | 500 |\n| 15-24字 | 18px | 500 |\n| 25+字 | 16px | 500 |\n\n---\n\n## 4. 间距规范\n\n| 元素 | 间距 |\n|------|------|\n| 页面内边距 | 36-48px |\n| 标题与图表间距 | 16-28px |\n| 图表行间距 | 6-14px |\n| KPI卡片间距 | 8-12px |\n| 图例项间距 | 16-20px |\n| 来源与图表间距 | 12-20px |\n\n---\n\n## 5. 三画幅系统\n\n> 宽度固定640px，高度按内容自适应，每种画幅有基准高度和弹性区间。\n\n### 画幅定义\n\n| 画幅 | 基准尺寸 | 弹性区间 | 比例 | 设计逻辑 |\n|------|---------|---------|------|---------|\n| **宽幅** | 640×400 | 360-480px | 16:10 | 横向信息展开，移动端一屏可见 |\n| **标准** | 640×480 | 420-600px | 4:3 | 信息密度与可读性平衡 |\n| **方版** | 640×640 | 560-720px | 1:1 | 径向/对称结构，视觉重心居中 |\n\n### 高度弹性规则\n\n```\n基准高度 = 画幅基准值（400/480/640）\n实际高度 = 基准高度 + 内容溢出量\n内容溢出量 ∈ [−40px, +80px]（向下取整到8的倍数）\n\n判断逻辑：\n- 数据行数 ≤4 → 用区间下限\n- 数据行数 5-8 → 用基准值\n- 数据行数 ≥9 或含洞察框 → 用区间上限\n```\n\n### 图型→画幅映射\n\n| 图型 | 画幅 | 基准高度 | 说明 |\n|------|------|---------|------|\n| bar-chart | 标准 | 480 | 竖柱，4-8条 |\n| h-bar-chart | 标准 | 480 | 横柱，5-10条 |\n| line-chart | 宽幅 | 400 | 折线，横向展开 |\n| donut-chart | 方版 | 640 | 环形，径向结构 |\n| quadrant-chart | 方版 | 640 | 象限，2×2矩阵 |\n| radar-chart | 方版 | 640 | 雷达，多轴对称 |\n| venn-diagram | 方版 | 640 | 维恩，圆形交叠 |\n| flow-chart | 宽幅 | 400 | 流程，横向步骤 |\n| layered-diagram | 标准 | 480 | 层级，上下堆叠 |\n| waterfall-chart | 标准 | 480 | 瀑布，增减对比 |\n| scatter-plot | 方版 | 640 | 散点，自由分布 |\n| bubble-chart | 方版 | 640 | 气泡，面积编码 |\n| treemap | 标准 | 480 | 矩形树，面积占比 |\n| data-billboard | 标准 | 480 | 大数字+标签 |\n| grouped-bar | 宽幅 | 400 | 分组柱，横向展开 |\n| stacked-bar | 标准 | 480 | 堆叠柱，纵向对比 |\n| area-chart | 宽幅 | 400 | 面积，趋势填充 |\n| comparison-table | 标准 | 480 | 对比表，行列结构 |\n\n### KPI卡片+Sparkline组件\n\n```html\n<div class=\"kpi-grid\">\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">月活用户</div>\n    <div class=\"kpi-value num\">2.4M</div>\n    <div class=\"kpi-delta up\">+12.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\"\n        points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n</div>\n```\n\n```css\n.kpi-grid { display:flex; gap:10px; margin-bottom:20px; }\n.kpi-card { flex:1; padding:14px; background:var(--surface); border:1px solid var(--rule); border-radius:4px; }\n.kpi-label { font-size:10px; color:var(--muted); margin-bottom:4px; }\n.kpi-value { font-size:28px; font-weight:200; line-height:1; }\n.kpi-delta { font-size:10px; font-weight:500; margin-top:2px; }\n.kpi-delta.up { color:var(--good); }\n.kpi-delta.down { color:var(--bad); }\n.sparkline { width:100%; height:24px; margin-top:6px; }\n```\n\n### 字体加载\n\n```css\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n```\n\nFile v2.2.0:references/workflow.md\n\n# wx-huitu 核心工作流\r\n\r\n> 版本: 2.0 | 输出格式: HTML → Puppeteer 截图 → PNG 交付\r\n> 触发词: `文章绘图` / `绘图图表` / `画个图表` / `数据图` / `公众号图表`\r\n\r\n## Core Principles\r\n\r\n1. **Think first, plot second** — 先剖析数据形态和论证意图，再选图型\r\n2. **主动拦截不当选择** — 发现问题先说再给替代，不默默照做\r\n3. **色盲安全默认** — Okabe-Ito 配色 + 冗余编码\r\n4. **一图一论点** — 一张图表只承载一个核心论证目标\r\n\r\n## 执行流程\r\n\r\n```\r\n输入（文章/数据描述/CSV）\r\n  ↓\r\nStep 1: 数据剖析（静默）\r\n  ↓\r\nStep 2: 图型推荐 ← 确认点（必须）\r\n  ↓\r\nStep 3: 风格 + 生成 HTML\r\n  ↓\r\nStep 4: 截图交付 + 云盘同步\r\n```\r\n\r\n---\r\n\r\n## Step 1: 数据剖析（静默）\r\n\r\n### 三轴分析\r\n\r\n对每个提取到的数据单元，分析三个维度：\r\n\r\n**轴1: 变量类型**\r\n\r\n| 组合 | 数据结构 |\r\n|------|---------|\r\n| 1×连续 | 看分布 |\r\n| 1×分类 | 看占比 |\r\n| 1×分类 + 1×连续 | 看组间比较 |\r\n| 2×连续 | 看关系 |\r\n| 1×时间 + 1×连续 | 看趋势 |\r\n| 多个连续 | 看相关 |\r\n| 二维矩阵 | 看模式 |\r\n| 嵌套分组 | 看层次 |\r\n\r\n**轴2: 论证意图**\r\n\r\n**这是最容易被忽略的一轴。** 同样数据，论证目标不同，图就不同。\r\n\r\n- **比较** — \"A 比 B 高/低/不同\" → bar-chart / h-bar-chart\r\n- **趋势** — \"随时间/条件变化\" → line-chart\r\n- **占比** — \"总和被分成几份\" → donut-chart / treemap\r\n- **关系** — \"X 越大 Y 越大\" → scatter-plot / bubble-chart\r\n- **流程** — \"A→B→C 顺序步骤\" → flow-chart / swimlane-chart\r\n- **层级** — \"上下级/嵌套结构\" → tree-chart / layered-diagram\r\n- **重叠** — \"集合之间有交集\" → venn-diagram\r\n- **累积** — \"正负贡献叠加\" → waterfall-chart\r\n\r\n**轴3: 数据形态**\r\n\r\n- 数据点数量（2-5 / 6-12 / 13+）\r\n- 类别数量（2-5 / 6-8 / 9+）\r\n- 是否有分组\r\n- 是否有异常值\r\n- 是否跨量级\r\n\r\n### 从文章提取数据单元\r\n\r\n| 提取信号 | 寻找什么 | 论证意图 |\r\n|---------|---------|---------|\r\n| 数值比较 | \"A占X%，B占Y%\" | 比较 |\r\n| 时间变化 | \"从X增长到Y\"/\"逐年/逐月\" | 趋势 |\r\n| 占比构成 | \"其中X占Y%\"/\"分为三部分\" | 占比 |\r\n| 变量关系 | \"X越高Y越\"/\"正相关/负相关\" | 关系 |\r\n| 顺序步骤 | \"第一步→第二步\"/\"Phase1→2\" | 流程 |\r\n| 层级结构 | \"包含\"/\"下属\"/\"分为N类\" | 层级 |\r\n| 集合重叠 | \"同时属于\"/\"交集\" | 重叠 |\r\n| 累积变化 | \"贡献了X\"/\"减少了Y\" | 累积 |\r\n\r\n### 提取规则\r\n\r\n- 数据单元须有 ≥2个数据点 或 清晰逻辑结构\r\n- 孤立单个数字不可视化（如\"48天\"单独→不做图）\r\n- 两个单元来源段落重叠时，合并\r\n- 无数据/结构的叙述段落不可视化\r\n\r\n---\r\n\r\n## Step 2: 图型推荐（确认点 — 必须）\r\n\r\n### 推荐格式\r\n\r\n```\r\n📊 图表推荐：共 N 张\r\n\r\n┌──────────────────────────────────────────────────┐\r\n│ #1 [图型emoji] [图型名称]                          │\r\n│ 论证意图: [比较/趋势/占比/...]                      │\r\n│ 推荐理由: [基于三轴分析的具体理由]                    │\r\n│ 备选: [备选图型1] / [备选图型2]                     │\r\n│                                                    │\r\n│ #2 ...                                             │\r\n└──────────────────────────────────────────────────┘\r\n\r\n💡 我的建议:\r\n- [主动给出合并/拆分/调整建议]\r\n- [指出哪张信息密度最高]\r\n```\r\n\r\n### 图型Emoji映射\r\n\r\n| 图型 | Emoji | 图型 | Emoji |\r\n|------|-------|------|-------|\r\n| bar-chart | 📊 | horizontal-bar-chart | 📏 |\r\n| line-chart | 📈 | donut-chart | 🍩 |\r\n| scatter-plot | 🔵 | bubble-chart | 🫧 |\r\n| flow-chart | 🔀 | swimlane-chart | 🏊 |\r\n| tree-chart | 🌳 | layered-diagram | 🧱 |\r\n| venn-diagram | ⭕ | waterfall-chart | 📉 |\r\n| treemap | 🗺️ | quadrant-chart | ✛ |\r\n| data-billboard | 🔢 | candlestick-chart | 🕯️ |\r\n| state-machine | ⚙️ | | |\r\n\r\n### 拦截规则执行\r\n\r\n发现用户需求触发拦截时，**先说明问题再给替代方案**：\r\n\r\n```\r\n拦截示例：\r\n你要的\"3个类别画饼图\"会触发 I2（7以下类别虽可画饼图，\r\n但横向柱状图在长度比较上比角度比较更直观）。\r\n我建议改成 **横向柱状图**：长度差异一目了然。\r\n要按原方案画，还是改？\r\n```\r\n\r\n尊重用户最终决定，但**留下明确的劝阻记录**。\r\n\r\n### 用户覆盖选项\r\n\r\n- \"确认\" → 按推荐执行\r\n- \"第N张换成[图型]\" → 更换\r\n- \"加上[描述]\" → 添加\r\n- \"合并第M和第N张\" → 合并\r\n- \"去掉第N张\" → 移除\r\n\r\n---\r\n\r\n## Step 3: 风格 + 生成 HTML\r\n\r\n### 1问定风格\r\n\r\n```\r\n🎨 主题色偏好？\r\n  A. 克制风（单品牌色+暖灰层级）— 默认\r\n  B. 品牌DNA（自动检测文章来源色）\r\n  C. 高端财经：\r\n     C1. 麦肯锡（深蓝+青绿+暖灰白，克制严谨）\r\n     C2. 经济学人（红+深蓝+米白，英式鲜明）\r\n     C3. 财新（财新蓝+冷灰白，中式精炼）\r\n  D. 指定色系：______\r\n```\r\n\r\n> 高端财经配色详见 [`design-tokens.md`](design-tokens.md) 第2节。核心原则：低饱和度、高灰度占比、单色系为主+1个强调色、大面积留白。\r\n\r\n### 尺寸体系（三画幅）\r\n\r\n| 画幅 | 基准尺寸 | 弹性区间 | 适用图型 |\r\n|------|---------|---------|---------|\r\n| **宽幅** | 640×400 | 360-480px | line-chart, flow-chart, grouped-bar, area-chart |\r\n| **标准** | 640×480 | 420-600px | bar-chart, h-bar-chart, layered-diagram, waterfall-chart, stacked-bar, comparison-table, data-billboard, tree-chart, treemap, swimlane-chart |\r\n| **方版** | 640×640 | 560-720px | donut-chart, quadrant-chart, venn-diagram, scatter-plot, bubble-chart, state-machine |\r\n\r\n> 画幅详细映射和弹性规则见 [`design-tokens.md`](design-tokens.md) 第5节。\r\n\r\n### HTML 生成规则\r\n\r\n1. **内联CSS** — 每个 HTML 文件包含完整样式\r\n2. **`<img>`标签背景** — 照片背景用 `<img>` + 绝对定位，不用 CSS background-image\r\n3. **固定宽高** — `html,body{width:Wpx;height:Hpx;overflow:hidden;margin:0;padding:0}`\r\n4. **overflow:hidden** — 确保截图尺寸精确\r\n5. **Google Fonts @import** — 放在 `<style>` 顶部\r\n6. **命名规范** — `{NN}-{type}.html`\r\n\r\n### 输出目录\r\n\r\n```\r\n[article-name]-charts/\r\n├── 01-bar-comparison.html\r\n├── 02-line-trend.html\r\n├── 03-donut-share.html\r\n└── screenshot.js\r\n```\r\n\r\n### HTML模板骨架\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<style>\r\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\r\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\r\n:root {\r\n  --ink: #0a0a0a;\r\n  --paper: #fafaf8;\r\n  --accent: #002FA7;\r\n  --muted: #737373;\r\n  --rule: #d4d4d2;\r\n  --surface: #ffffff;\r\n  --surface-2: #f2f2f0;\r\n  --good: #1aaf6c;\r\n  --bad: #e0445a;\r\n  --warn: #f5a524;\r\n  --font-body: 'Noto Sans SC', sans-serif;\r\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\r\n  --chart-1: #E69F00;\r\n  --chart-2: #56B4E9;\r\n  --chart-3: #009E73;\r\n  --chart-4: #D55E00;\r\n}\r\n* { margin: 0; padding: 0; box-sizing: border-box; }\r\n.num { font-family: var(--font-data); font-feature-settings: 'tnum' on; letter-spacing: -0.02em; }\r\nhtml, body { width: 640px; overflow: hidden; font-family: var(--font-body); background: var(--paper); color: var(--ink); }\r\n</style>\r\n</head>\r\n<body>\r\n<!-- 图表内容 -->\r\n</body>\r\n</html>\r\n```\r\n\r\n---\r\n\r\n## Step 4: 截图交付 + 云盘同步\r\n\r\n### Puppeteer-core + 系统Chrome\r\n\r\nChrome路径检测（Windows，按优先级）：\r\n1. 默认路径：`C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe`\r\n2. 默认路径(x86)：`C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe`\r\n3. Edge fallback：`C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe`\r\n4. 注册表fallback：`HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe`\r\n\r\n> **安全说明**：Chrome路径检测是 Puppeteer-core 截图的必要依赖（puppeteer-core 不自带浏览器，必须复用系统 Chrome）。检测顺序优先使用固定路径，仅在固定路径全部失败时才查询注册表。`--no-sandbox` 是 headless 模式的技术必需（Puppeteer 在 headless 下无 sandbox 会崩溃），非权限放宽。\r\n\r\n### 截图参数\r\n\r\n| 格式 | Viewport | deviceScaleFactor | 输出 |\r\n|------|----------|-------------------|------|\r\n| 横版 | 640×auto | 2 | PNG |\r\n| 方版 | 640×640 | 2 | PNG |\r\n\r\n### screenshot.js\r\n\r\n```javascript\r\nconst puppeteer = require('puppeteer-core');\r\nconst fs = require('fs');\r\nconst path = require('path');\r\n\r\nfunction detectChromePath() {\r\n  // 优先固定路径，fallback 到注册表\r\n  const fixedPaths = [\r\n    'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\r\n    'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\r\n    'C:\\\\Program Files (x86)\\\\Microsoft\\\\Edge\\\\Application\\\\msedge.exe',\r\n  ];\r\n  for (const p of fixedPaths) {\r\n    if (fs.existsSync(p)) return p;\r\n  }\r\n  // 仅当固定路径全部失败时才查询注册表\r\n  const { execSync } = require('child_process');\r\n  try {\r\n    const reg = execSync(\r\n      'reg query \"HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\App Paths\\\\chrome.exe\" /ve',\r\n      { encoding: 'utf-8' }\r\n    );\r\n    const m = reg.match(/REG_SZ\\s+(.+)/);\r\n    if (m && fs.existsSync(m[1].trim())) return m[1].trim();\r\n  } catch (_) {}\r\n  throw new Error('未找到 Chrome/Edge，请安装 Chrome 或 Edge 浏览器');\r\n}\r\n\r\nconst TYPE_CONFIG = {\r\n  square: { width: 640, height: 640, fullPage: false },\r\n  default: { width: 640, height: 800, fullPage: true },\r\n};\r\n\r\nfunction isSquare(name) {\r\n  const squareTypes = ['donut','quadrant','venn','treemap','scatter','bubble','billboard'];\r\n  return squareTypes.some(t => name.includes(t));\r\n}\r\n\r\n(async () => {\r\n  const chromePath = detectChromePath();\r\n  console.log('Chrome:', chromePath);\r\n  const browser = await puppeteer.launch({\r\n    headless: 'new', executablePath: chromePath,\r\n    args: ['--no-sandbox','--disable-setuid-sandbox','--disable-gpu']\r\n  });\r\n  const scriptDir = __dirname;\r\n  const desktop = path.join(require('os').homedir(), 'Desktop');\r\n  const articleName = path.basename(scriptDir).replace(/-charts$/, '');\r\n  const outputDir = path.join(desktop, articleName + '图表');\r\n  if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true });\r\n  const htmlFiles = fs.readdirSync(scriptDir).filter(f => f.endsWith('.html')).sort();\r\n  console.log(`Found ${htmlFiles.length} HTML files`);\r\n  for (const file of htmlFiles) {\r\n    const filePath = path.join(scriptDir, file);\r\n    const sq = isSquare(file);\r\n    const config = sq ? TYPE_CONFIG.square : TYPE_CONFIG.default;\r\n    const pngName = file.replace('.html', '.png');\r\n    const pngPath = path.join(outputDir, pngName);\r\n    console.log(`  ${file} -> ${pngName} (${sq ? '640x640' : '640xauto'})`);\r\n    const page = await browser.newPage();\r\n    await page.setViewport({ width: config.width, height: config.height, deviceScaleFactor: 2 });\r\n    await page.goto('file:///' + filePath.replace(/\\\\/g, '/'), { waitUntil: 'networkidle0', timeout: 30000 });\r\n    await page.evaluate(() => document.fonts.ready);\r\n    await new Promise(r => setTimeout(r, 3000));\r\n    const opts = { path: pngPath, type: 'png' };\r\n    if (config.fullPage) { opts.fullPage = true; }\r\n    else { opts.clip = { x: 0, y: 0, width: config.width, height: config.height }; }\r\n    await page.screenshot(opts);\r\n    await page.close();\r\n  }\r\n  await browser.close();\r\n  console.log(`Done! Output: ${outputDir}`);\r\n  const { execSync } = require('child_process');\r\n  try { execSync('explorer.exe \"' + outputDir + '\"'); } catch(e) {}\r\n})();\r\n```\r\n\r\n### 交付流程\r\n\r\n1. **截图**: 运行 screenshot.js\r\n2. **本地验证**: PNG > 10KB / 中文字符正确 / 标签无裁切\r\n3. **飞书云盘同步（可选，需用户确认）**: 仅当用户明确说\"同步飞书\"或\"上传云盘\"时执行。默认跳过，PNG 仅保存本地桌面。执行时：`lark-cli drive +create-folder` → `lark-cli drive +upload` 逐张上传\r\n\r\n> ⚠️ **数据外发提示**：飞书云盘同步会将生成的图表（可能含文章源数据）上传到外部存储。执行前必须告知用户，用户可随时说\"不同步\"跳过。\r\n\r\n### 视觉自检清单\r\n\r\n- [ ] 数值标签无裁切\r\n- [ ] 图例不压数据\r\n- [ ] 颜色在灰度下可区分\r\n- [ ] 轴标签可读（640px画布上≥12px）\r\n- [ ] 数据来源已标注\n\nFile v2.2.0:CHANGELOG.md\n\n# Changelog\r\n\r\nAll notable changes to this project will be documented in this file.\r\n\r\n## [2.2.0] - 2026-07-14\r\n\r\n### Security Hardening (SkillSpector Findings Fix)\r\n- **Vague Triggers fix**: Removed overly broad triggers (\"画图\", \"做个图\"), added precise \"公众号图表\". Description and workflow.md and README synced.\r\n- **Cloud sync gating**: Feishu cloud sync changed from default-on to opt-in (requires explicit user confirmation). Description, SKILL.md, workflow.md, README (CN+EN) all updated.\r\n- **Chrome detection ordering**: Fixed-path detection now primary, registry query demoted to fallback. Added security note explaining --no-sandbox is a Puppeteer headless technical requirement, not privilege escalation.\r\n- **User warnings strengthened**: README (CN+EN) restructured to separate default actions (local file write/subprocess/network) from optional actions (cloud upload). Explicit data-egress warning added.\r\n\r\n## [2.1.0] - 2026-07-13\r\n\r\n### Added\r\n- SkillHub frontmatter fields (slug/displayName/version/summary/license)\r\n- Permission declaration section in SKILL.md\r\n- Bilingual README with user warnings\r\n- Updated .gitignore with Python cache and ClawHub exclusions\r\n\r\n## [2.0.0] - 2026-06-15\r\n\r\n### Added\r\n- Three canvas system (landscape 640x400 / standard 640x480 / square 640x640)\r\n- 18 chart types with C01-C18 version IDs and CSS class names\r\n- Chart version lock rule: data charts must use C01-C18\r\n- Font size inverse ladder (larger=thinner, smaller=bolder)\r\n- Semantic color variables (--good/--bad/--warn)\r\n- KPI card + Sparkline component\r\n- Three financial media color schemes (McKinsey/Economist/Caixin)\r\n- 8 interception rules for inappropriate chart choices\r\n\r\n## [1.0.0] - 2026-06-12\r\n\r\n### Added\r\n- Initial release of wx-huitu\r\n- 14 chart types with HTML+CSS+SVG skeletons\r\n- Three-axis decision framework (variable type x argument intent x data shape)\r\n- 8 interception rules for inappropriate chart choices\r\n- Okabe-Ito colorblind-safe palette with redundant encoding\r\n- 4-step workflow: profile → recommend → generate → deliver\r\n- Puppeteer-core screenshot delivery with Feishu cloud sync\r\n- Two format sizes: landscape (640xauto) and square (640x640)\n\nFile v2.2.0:skill-card.md\n\n## Description:\n\nWx Huitu helps agents turn WeChat article text or data descriptions into publication-ready PNG chart packages using chart recommendations, generated HTML, and Puppeteer screenshots.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[edwardwason](https://clawhub.ai/user/edwardwason)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nContent creators, analysts, and developers use this skill to extract chart-worthy data from WeChat article drafts or data descriptions, choose an appropriate C01-C18 chart layout, and produce PNG charts for article embedding.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The screenshot workflow launches Chrome or Edge through Puppeteer and disables the browser sandbox while rendering generated HTML.\n\nMitigation: Review before installing and run chart rendering in a low-privilege or isolated environment when processing untrusted article content.\n\nRisk: Generated chart data can leave the local environment if Feishu cloud sync is enabled.\n\nMitigation: Keep cloud sync off by default and enable it only after explicit user confirmation for content that is acceptable to upload.\n\nRisk: The workflow writes generated PNG and HTML files to local storage.\n\nMitigation: Use a known output directory and review generated files before sharing or publishing them.\n\nRisk: The generated HTML loads Google Fonts over the network.\n\nMitigation: Avoid rendering sensitive or restricted content unless network access is acceptable for the environment.\n\n## Reference(s):\n\n- [Skill Definition](SKILL.md)\n- [README](README.md)\n- [Workflow Reference](references/workflow.md)\n- [Chart System Reference](references/chart-system.md)\n- [Design Tokens Reference](references/design-tokens.md)\n- [ClawHub Skill Page](https://clawhub.ai/edwardwason/skills/wx-huitu)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, files]\n\n**Output Format:** [Markdown guidance with generated HTML/CSS/SVG and PNG chart files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Generated chart files are saved locally; Feishu upload is optional and requires explicit user confirmation.]\n\n## Skill Version(s):\n\n2.2.0 (source: frontmatter, changelog, server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.0: 8 files, 27883 bytes\n\nFiles: CHANGELOG.md (1324b), README.md (4876b), references/chart-system.md (23961b), references/design-tokens.md (12004b), references/workflow.md (11927b), skill-card.md (2437b), SKILL.md (9868b), _meta.json (127b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: \"wx-huitu\"\nslug: \"wx-huitu\"\ndisplayName: \"wx-huitu\"\nversion: \"2.1.0\"\nsummary: \"公众号数据绘图专家 — 18种版式+三轴决策+拦截规则+Puppeteer截图交付\"\nlicense: \"MIT-0\"\ndescription: \"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'做个图'/'画图'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图+飞书云盘同步。Do NOT use for 封面/封底/金句图/杂志版式/全文配图/代码编辑.\"\n---\n\n# wx-huitu — 公众号数据绘图专家\n\n> 来源识别: wx-huitu 由 TRAE SOLO 创建与维护。仓库: https://github.com/EdwardWason/wx-huitu\n\n**Persona**: 你是一位数据可视化顾问。你的首要能力是\"思考与判断\"——先理解数据再选图，先想清楚论证目标再动笔。\n\n## Task\n\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。每张图表：剖析数据 → 推荐版式 → 生成 HTML → Puppeteer 截图 → PNG → 保存桌面 → 同步飞书云盘。\n\n**核心交付物**: PNG 图片，不是代码。\n\n## Out of Scope\n\n- **封面/封底** → 用 wx-peitu\n- **金句图/宣言卡/转场卡** → 用 wx-peitu\n- **全文配图方案** → 用 wx-peitu\n- **代码编辑** → 用代码工具\n- **交互式图表** → 用 plotly/echarts 独立部署\n\n---\n\n## Workflow (4步)\n\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\n\n### Step 1: Data Profiling (静默)\n\n分析每个数据单元的三轴属性：\n\n**轴1: 变量类型** — 连续/分类/时间/层级/集合\n**轴2: 论证意图** — 比较/趋势/占比/关系/流程/层级/重叠/累积\n**轴3: 数据形态** — 数据点数量/类别数/是否有异常值/是否有分组\n\n### Step 2: Chart Recommendation (确认点)\n\n基于三轴分析推荐版式，必须给出推荐+理由+1-2备选。\n\n8条拦截规则：I1(2点折线→C01) / I2(7+类别donut→C02) / I3(单值做图→C13) / I4(一图多论点→拆图) / I5(类别折线→C01) / I6(Y轴不从0起) / I7(rainbow色图→安全色板) / I8(图例压数据)\n\n### Step 3: Style + Generate HTML\n\n1问定风格：A.克制风 / B.品牌DNA / C.高端财经(C1麦肯锡/C2经济学人/C3财新) / D.指定色系\n\n生成独立HTML文件（内联CSS+SVG+固定尺寸+overflow:hidden）。\n\n### Step 4: Screenshot & Deliver\n\nPuppeteer-core → PNG → 桌面文件夹 → 飞书云盘同步。\n\n---\n\n## 18种版式 (C01-C18) + 三画幅\n\n> 版式锁定：数据图表必须从 C01-C18 中选择，不允许自创版式。\n\n| 版式 | 图型 | 适用场景 | 核心CSS类 | 画幅 |\n|------|------|---------|----------|------|\n| **C01** | bar-chart | 2-6类别比较 | `.c-bar` + `.bar-col` + `.bar-fill` | 标准 640×480 |\n| **C02** | h-bar-chart | 7+类别或长标签 | `.c-hbar` + `.bar-row` + `.bar-fill` | 标准 640×480 |\n| **C03** | line-chart | 8+时间点趋势 | `.c-line` + svg `polyline` | 宽幅 640×400 |\n| **C04** | donut-chart | 2-5段占比 | `.c-donut` + svg `circle` stroke-dasharray | 方版 640×640 |\n| **C05** | quadrant-chart | 2轴+阈值线 | `.c-quadrant` + `.q-item` + `.q-crosshair` | 方版 640×640 |\n| **C06** | flow-chart | 3-8步顺序流程 | `.c-flow` + `.flow-step` + `.flow-connector` | 宽幅 640×400 |\n| **C07** | layered-diagram | 分层架构 | `.c-layer` + `.layer-row` + `.layer-items` | 标准 640×480 |\n| **C08** | waterfall-chart | 累积正负贡献 | `.c-waterfall` + `.wf-row` + `.wf-bar` | 标准 640×480 |\n| **C09** | grouped-bar | 分组类别对比 | `.c-gbar` + `.gbar-group` + `.gbar-col` | 宽幅 640×400 |\n| **C10** | stacked-bar | 分组占比对比 | `.c-sbar` + `.sbar-col` + `.sbar-seg` | 标准 640×480 |\n| **C11** | area-chart | 趋势+总量 | `.c-area` + svg `polygon` + `polyline` | 宽幅 640×400 |\n| **C12** | comparison-table | 多维度行列对比 | `.c-table` + `table` + `.delta-up/.delta-down` | 标准 640×480 |\n| **C13** | data-billboard | 单一关键数值 | `.c-billboard` + `.num-mega` + `.stat-card` | 标准 640×480 |\n| **C14** | venn-diagram | 2-3集合重叠 | `.c-venn` + svg `circle` + `.venn-label` | 方版 640×640 |\n| **C15** | radar-chart | 多维评估 | `.c-radar` + svg `polygon` + `.radar-axis` | 方版 640×640 |\n| **C16** | scatter-plot | 2连续变量关系 | `.c-scatter` + svg `circle` + `.scatter-label` | 方版 640×640 |\n| **C17** | treemap | 多类别层级占比 | `.c-treemap` + `.tm-cell` + `.tm-label` | 标准 640×480 |\n| **C18** | swimlane-chart | 2-4角色并行流程 | `.c-swimlane` + `.lane` + `.lane-step` | 宽幅 640×400 |\n\n三画幅：**宽幅** 640×400 | **标准** 640×480 | **方版** 640×640\n\n---\n\n## CSS变量体系\n\n### 通用变量\n\n```css\n:root {\n  --ink:#0a0a0a; --paper:#fafaf8; --accent:#002FA7; --muted:#737373; --rule:#d4d4d2;\n  --surface:#ffffff; --surface-2:#f2f2f0; --good:#1aaf6c; --bad:#e0445a; --warn:#f5a524;\n  --font-body:'Noto Sans SC',sans-serif; --font-data:'Inter','Noto Sans SC',sans-serif;\n  --chart-1:#E69F00; --chart-2:#56B4E9; --chart-3:#009E73; --chart-4:#D55E00;\n  --chart-5:#CC79A7; --chart-6:#F0E442; --chart-7:#0072B2; --chart-8:#000000;\n}\n```\n\n### 麦肯锡配色\n\n```css\n:root { --paper:#F7F5F2; --accent:#0F4C81; --chart-1:#0F4C81; --chart-2:#2A7B9B; --chart-3:#3A9D8F; --chart-5:#E2A828; --good:#2f7d4a; --bad:#b53a2a; }\n```\n\n### 经济学人配色\n\n```css\n:root { --paper:#FDFBF7; --accent:#E3120B; --chart-1:#E3120B; --chart-2:#0D47A1; --chart-3:#4A7C59; --good:#1f7a3a; --bad:#9c2a25; }\n```\n\n### 财新配色\n\n```css\n:root { --paper:#F5F5F3; --accent:#0055AA; --chart-1:#0055AA; --chart-2:#3A7BBF; --chart-3:#7BAFD4; --chart-4:#C0392B; --good:#1f7a3a; --bad:#9c2a25; }\n```\n\n### 强调色块硬约束\n\n```\n🚫 禁止用近黑色做强调色块背景\n✅ 强调色块必须用 --accent 品牌色做底色 + 白色文字\n✅ 洞察框/关键数据卡/公式结果块 → background:var(--accent); color:var(--paper);\n```\n\n---\n\n## 字号反比阶梯\n\n> 越大越细，越小越粗——与guizang-ppt-skill瑞士风一致\n\n| 字号区间 | 字重 | 典型场景 |\n|---------|------|---------|\n| ≥48px (num-mega) | 200 | billboard大数字、KPI主值 |\n| 28-36px (num-kpi) | 200-300 | KPI卡片数字 |\n| 18-24px (title) | 500 | 图表标题 |\n| 13-15px (data-label) | 500 | 数据标注、图表标签 |\n| 11-12px (axis/legend) | 400 | 轴刻度、图例文字 |\n| 10-11px (source/meta) | 400 | 数据来源、辅助说明 |\n\n```css\n.num-mega { font-size:64px; font-weight:200; }\n.num-kpi  { font-size:28px; font-weight:200; }\n.title    { font-size:22px; font-weight:500; }\n.data-label { font-size:13px; font-weight:500; }\n.axis-label { font-size:11px; font-weight:400; }\n.source     { font-size:10px; font-weight:400; }\n```\n\n---\n\n## HTML模板骨架\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root{--ink:#0a0a0a;--paper:#fafaf8;--accent:#002FA7;--muted:#737373;--rule:#d4d4d2;--surface:#ffffff;--surface-2:#f2f2f0;--good:#1aaf6c;--bad:#e0445a;--warn:#f5a524;--font-body:'Noto Sans SC',sans-serif;--font-data:'Inter','Noto Sans SC',sans-serif;--chart-1:#E69F00;--chart-2:#56B4E9;--chart-3:#009E73;--chart-4:#D55E00}\n*{margin:0;padding:0;box-sizing:border-box}\n.num{font-family:var(--font-data);font-feature-settings:'tnum' on;letter-spacing:-0.02em}\nhtml,body{width:640px;overflow:hidden;font-family:var(--font-body);background:var(--paper);color:var(--ink)}\n</style></head><body><!-- 图表内容 --></body></html>\n```\n\n### KPI+Sparkline组件\n\n```html\n<div class=\"kpi-grid\"><div class=\"kpi-card\"><div class=\"kpi-label\">月活用户</div><div class=\"kpi-value num\">2.4M</div><div class=\"kpi-delta up\">+12.3%</div><svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\"><polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\" points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/></svg></div></div>\n```\n```css\n.kpi-grid{display:flex;gap:10px} .kpi-card{flex:1;padding:14px;background:var(--surface);border:1px solid var(--rule)} .kpi-value{font-size:28px;font-weight:200} .kpi-delta.up{color:var(--good)} .kpi-delta.down{color:var(--bad)} .sparkline{width:100%;height:24px;margin-top:6px}\n```\n\n---\n\n## Chart Styling Rules\n\n- 标题18-24px/500; 轴标12px/400 --muted; 数据标13px/500 .num; 来源10-11px --muted\n- 数值用.num → --font-data (Inter) + tnum等宽对齐\n- 卡片用--surface; 次级表面用--surface-2; 强调块用--accent+白字\n- 涨--good; 跌--bad; 警告--warn\n- 每张图底部必须标注数据来源\n- Okabe-Ito 8色+冗余编码，单图不超4色\n- 每张图表必须包含：标题+数据主体+轴标签/图例+数据来源\n- 版式锁定：数据图表必须从C01-C18中选择，不允许自创版式\n\n---\n\n## 详细参考文件\n\n| 文件 | 用途 |\n|------|------|\n| references/workflow.md | 完整4步工作流：剖析→推荐→生成→交付 |\n| references/chart-system.md | 完整图表系统：18种版式+三轴决策树+8条拦截规则+色板+7种HTML骨架 |\n| references/design-tokens.md | 完整设计令牌：3套财经配色详解+字号规范+间距规范+画幅弹性规则 |\n\n---\n\n## 权限声明\n\n本技能运行时需要以下权限：\n- **网络访问**（必需）：加载 Google Fonts（Inter / Noto Sans SC）\n- **subprocess 调用**（必需）：运行 Puppeteer-core 截图（需系统 Chrome）\n- **文件系统写入**（必需）：PNG 图片保存到桌面文件夹\n- **飞书云盘 API**（可选）：`lark-cli drive +upload` 上传图片到飞书云盘，需配置飞书凭证\n\nFile v2.1.0:README.md\n\n# wx-huitu — 公众号数据绘图专家\n\n[![ClawHub](https://img.shields.io/badge/ClawHub-wx--huitu-blue)](https://clawhub.ai/skills/wx-huitu)\n[![SkillHub](https://img.shields.io/badge/SkillHub-wx--huitu-green)](https://skillhub.cn/skills/wx-huitu)\n[![版本](https://img.shields.io/badge/版本-2.1.0-brightgreen)](https://github.com/EdwardWason/wx-huitu)\n[![协议](https://img.shields.io/badge/协议-MIT--0-lightgrey)](LICENSE)\n\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。\n\n## 核心特性\n\n- **18 种版式** (C01-C18)：柱状/折线/饼图/面积/雷达/散点/漏斗/热力/仪表盘/混合图表等\n- **三轴决策框架**：变量类型 × 论证意图 × 数据形态 → 自动推荐最适图型\n- **8 条拦截规则**：主动拦截不当选择（2 点折线/7+类别饼图/单值做图等）\n- **色盲安全**：Okabe-Ito 8 色色板 + 冗余编码\n- **三套财经配色**：麦肯锡/经济学人/财新\n- **Puppeteer 截图交付**：HTML → PNG → 桌面文件夹 → 飞书云盘同步\n\n## 工作流\n\n```\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\n```\n\n## 使用方式\n\n在 TRAE IDE 中说：\n- \"文章绘图\"\n- \"绘图图表\"\n- \"画个图表\"\n- \"数据图\"\n- \"做个图\"\n- \"画图\"\n\n## 不适用范围\n\n- 封面/封底 → 用 wx-peitu\n- 金句图/宣言卡/转场卡 → 用 wx-peitu\n- 全文配图方案 → 用 wx-peitu\n- 代码编辑 → 用代码工具\n- 交互式图表 → 用 plotly/echarts 独立部署\n\n## ⚠️ 用户须知\n\n本技能运行时会：\n1. **自动写入本地文件**：PNG 图片保存到桌面文件夹\n2. **调用 subprocess**：运行 Puppeteer-core 进行浏览器截图（需要系统安装 Chrome）\n3. **可选上传飞书云盘**：如配置了飞书凭证，会自动上传图片到飞书云盘（未配置则跳过）\n4. **网络请求**：加载 Google Fonts（Inter / Noto Sans SC）\n\n如需禁用飞书云盘同步，可告知\"不同步飞书\"。\n\n## 文件结构\n\n```\nwx-huitu/\n├── SKILL.md              # 技能定义（frontmatter + 工作流 + 版式 + CSS + 规则）\n├── README.md             # 本文件\n├── CHANGELOG.md          # 变更日志\n├── LICENSE               # MIT-0\n├── .gitignore\n├── .claude-plugin/\n│   └── plugin.json\n└── references/\n    ├── workflow.md       # 完整4步工作流\n    ├── chart-system.md   # 18种版式+三轴决策树+拦截规则+HTML骨架\n    └── design-tokens.md  # 设计令牌：配色+字号+间距+画幅\n```\n\n## 协议\n\nMIT-0 — 自由使用、修改和分发，无需署名。\n\n---\n\n# wx-huitu — WeChat Article Chart Expert\n\n[![ClawHub](https://img.shields.io/badge/ClawHub-wx--huitu-blue)](https://clawhub.ai/skills/wx-huitu)\n[![SkillHub](https://img.shields.io/badge/SkillHub-wx--huitu-green)](https://skillhub.cn/skills/wx-huitu)\n[![Version](https://img.shields.io/badge/version-2.1.0-brightgreen)](https://github.com/EdwardWason/wx-huitu)\n[![License](https://img.shields.io/badge/license-MIT--0-lightgrey)](LICENSE)\n\nInput an article or data description, output a WeChat article chart PNG package.\n\n## Key Features\n\n- **18 Chart Types** (C01-C18): bar/line/donut/area/radar/scatter/funnel/heatmap/dashboard/mixed charts, etc.\n- **Three-Axis Decision Framework**: Variable type × Argument intent × Data shape → Auto-recommend best chart\n- **8 Interception Rules**: Proactively block inappropriate choices (2-point line / 7+ category pie / single-value chart, etc.)\n- **Colorblind-Safe**: Okabe-Ito 8-color palette + redundant encoding\n- **Three Financial Color Schemes**: McKinsey / The Economist / Caixin\n- **Puppeteer Screenshot Delivery**: HTML → PNG → Desktop folder → Feishu cloud sync\n\n## Workflow\n\n```\nInput → Step 1: Data Profiling (silent) → Step 2: Chart Recommendation (confirm) → Step 3: Style + Generate HTML → Step 4: Screenshot & Deliver\n```\n\n## Usage\n\nSay in TRAE IDE:\n- \"文章绘图\" / \"绘图图表\" / \"画个图表\" / \"数据图\" / \"做个图\" / \"画图\"\n\n## Out of Scope\n\n- Cover/back cover → use wx-peitu\n- Quote cards / transition cards → use wx-peitu\n- Full article illustration → use wx-peitu\n- Code editing → use code tools\n- Interactive charts → use plotly/echarts standalone\n\n## ⚠️ User Notice\n\nThis skill will:\n1. **Write local files**: PNG images saved to desktop folder\n2. **Call subprocess**: Run Puppeteer-core for browser screenshots (Chrome required)\n3. **Optionally upload to Feishu cloud**: If Feishu credentials are configured, images are auto-uploaded (skipped if not configured)\n4. **Network requests**: Load Google Fonts (Inter / Noto Sans SC)\n\nTo disable Feishu cloud sync, say \"不同步飞书\".\n\n## License\n\nMIT-0 — Free to use, modify, and redistribute. No attribution required.\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn75zj7vzdyvap84adxa8heyyd82f5eh\",\n  \"slug\": \"wx-huitu\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1783951925096\n}\n\nFile v2.1.0:references/chart-system.md\n\n# 图表系统参考\n\n> 18种图型 + 三轴决策树 + 拦截规则 + 三画幅系统 + HTML骨架\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. 三轴决策树\n\n```\n数据关系是什么？（轴1: 变量类型）\n│\n├─ 类别比较（1分类 + 1连续）\n│   ├─ 少类别 (2-6) → bar-chart\n│   ├─ 多类别 (7+) → horizontal-bar-chart\n│   └─ 分组对比 → grouped-bar\n│\n├─ 时间变化（1时间 + 1连续）\n│   ├─ 少数据点 (2-8) → bar-chart\n│   ├─ 多数据点 (8+) → line-chart\n│   └─ 趋势+总量 → area-chart\n│\n├─ 占比关系（1分类看构成）\n│   ├─ 少分段 (2-5) → donut-chart\n│   ├─ 多分段 (6+) → treemap\n│   └─ 分组占比 → stacked-bar\n│\n├─ 相关性（2+连续变量）\n│   ├─ 2变量 → scatter-plot\n│   ├─ 2变量+阈值 → quadrant-chart\n│   └─ 3+变量 → bubble-chart\n│\n├─ 流程（顺序/并行步骤）\n│   ├─ 顺序步骤 → flow-chart\n│   ├─ 并行泳道 → swimlane-chart\n│   └─ 状态转换 → state-machine\n│\n├─ 层级（嵌套/分类结构）\n│   ├─ 树结构 → tree-chart\n│   └─ 分层架构 → layered-diagram\n│\n├─ 集合重叠\n│   └─ 2-3集合 → venn-diagram\n│\n├─ 累积变化\n│   └─ 正负贡献 → waterfall-chart\n│\n└─ 多维度对比\n    └─ 行列结构 → comparison-table\n```\n\n### 同一数据不同论点 → 不同图\n\n| 数据 | 论点\"比较\" | 论点\"趋势\" | 论点\"占比\" |\n|------|-----------|-----------|-----------|\n| 2020-2024年收入 | bar-chart（4组对比） | line-chart（增长趋势） | — |\n| 3产品市场份额 | bar-chart（谁最大） | — | donut-chart（各占多少） |\n| 用户画像标签 | h-bar-chart（排名） | — | treemap（层级占比） |\n\n---\n\n## 2. 18种图型\n\n| # | Type | When | Data Shape | 画幅 |\n|---|------|------|-----------|------|\n| 1 | **bar-chart** | 2-6类别比较 | `[{label, value, color?}]` | 标准 |\n| 2 | **horizontal-bar-chart** | 7+类别或长标签 | `[{label, value, color?}]` | 标准 |\n| 3 | **line-chart** | 8+时间点趋势 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 4 | **donut-chart** | 2-5段占比 | `[{label, value, color}]` | 方版 |\n| 5 | **quadrant-chart** | 2轴+阈值线 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 6 | **flow-chart** | 3-8步顺序流程 | `{steps:[{id,label,type?}], connections:[{from,to}]}` | 宽幅 |\n| 7 | **swimlane-chart** | 2-4角色并行流程 | `{lanes:[{name,steps}]}` | 宽幅 |\n| 8 | **state-machine** | 状态转换+条件 | `{states, transitions}` | 方版 |\n| 9 | **tree-chart** | 层级结构 | `{root:{label,children}}` | 标准 |\n| 10 | **layered-diagram** | 分层架构 | `{layers:[{name,items,color?}]}` | 标准 |\n| 11 | **venn-diagram** | 2-3集合重叠 | `{sets, overlap}` | 方版 |\n| 12 | **waterfall-chart** | 累积正负贡献 | `[{label,value,type}]` | 标准 |\n| 13 | **treemap** | 多类别层级占比 | `[{label,value,color?,children?}]` | 标准 |\n| 14 | **scatter-plot** | 2连续变量关系 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 15 | **grouped-bar** | 分组类别对比 | `{labels, groups:[{name,values,color?}]}` | 宽幅 |\n| 16 | **stacked-bar** | 分组占比对比 | `{labels, segments:[{name,values,color?}]}` | 标准 |\n| 17 | **area-chart** | 趋势+总量 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 18 | **comparison-table** | 多维度行列对比 | `{headers, rows:[{label, values}]}` | 标准 |\n\n### 补充: data-billboard（非独立图型，用于单一数值高亮）\n\n| Type | When | Data Shape | 画幅 |\n|------|------|-----------|------|\n| **data-billboard** | 单一关键数值 | `{value, label, context?, stats:[{value,label}]}` | 标准 |\n\n---\n\n## 3. 拦截规则详解\n\n| # | 触发条件 | 问题 | 替代方案 | 话术模板 |\n|---|---------|------|---------|---------|\n| I1 | 2个数据点画折线 | 2点折线无趋势意义 | bar-chart | \"2个数据点画折线图看不出趋势，改用柱状图更直观\" |\n| I2 | 7+类别画donut | 角度比较超过5段人眼难分 | horizontal-bar-chart | \"7+类别画环形图角度难区分，横向柱状图长度比较更清晰\" |\n| I3 | 单一数值做数据图 | 1个数字不需要图 | data-billboard | \"单个数值不需要复杂图表，用数字高亮卡更有冲击力\" |\n| I4 | 一图>2论点 | 信息过载 | 拆图 | \"一张图承载多个论点会稀释每个论点的传达力，建议拆分\" |\n| I5 | 类别变量用折线 | 暗示不存在的连续关系 | bar-chart | \"类别变量之间没有连续关系，折线会误导读者，改用柱状图\" |\n| I6 | Y轴不从0起 | 误导小差异看起来很大 | 加断裂标记或从0起 | \"Y轴不从0起会夸大差异，建议从0起或加明显的轴断裂标记\" |\n| I7 | rainbow/jet色图 | 感知不均匀 | 主题色板+冗余编码 | \"彩虹色图感知不均匀会造假峰，改用色盲安全色板\" |\n| I8 | 图例压数据 | 遮挡关键信息 | 调整图例位置 | \"图例遮挡了数据，建议移到空白区域\" |\n\n---\n\n## 4. 色盲安全色板\n\n### Okabe-Ito 8色（默认）\n\n```css\n:root {\n  --chart-1: #E69F00; /* 橙 */\n  --chart-2: #56B4E9; /* 天蓝 */\n  --chart-3: #009E73; /* 青绿 */\n  --chart-4: #D55E00; /* 朱红 */\n  --chart-5: #CC79A7; /* 粉紫 */\n  --chart-6: #F0E442; /* 黄 */\n  --chart-7: #0072B2; /* 深蓝 */\n  --chart-8: #000000; /* 黑 */\n}\n```\n\n### 使用规则\n\n1. **单图不超4色** — 超过4类时合并小类为\"其他\"\n2. **冗余编码** — 不同类别加不同形状(marker)或线型(dashed/solid/dotted)\n3. **灰度可分** — 出图前想象灰度版，颜色仍可区分\n4. **强调色** — 需要高亮某一类时用 `--accent`，其余用 `--chart-*`\n\n### 冗余编码参考\n\n| 类别 | 颜色 | 形状 | 线型 |\n|------|------|------|------|\n| A | --chart-1 | circle ● | solid |\n| B | --chart-2 | square ■ | dashed |\n| C | --chart-3 | triangle ▲ | dotted |\n| D | --chart-4 | diamond ◆ | dash-dot |\n\n---\n\n## 5. Chart Styling Rules\n\n- **Typography**: 标题 `--font-body` 18-24px/500; 轴标 12px/400 `--muted`; 数据标 13px/500 `.num`; 来源 10-11px `--muted`\n- **Data Font**: 数值用 `.num` class → `--font-data` (Inter) + `tnum` 等宽对齐\n- **Spacing**: 内边距 36-48px; 图例间距 16px; KPI卡片间距 8-12px\n- **Surface**: 卡片用 `--surface`; 次级表面用 `--surface-2`; 强调块用 `--accent` + 白字\n- **Semantic Colors**: 涨 `--good`; 跌 `--bad`; 警告 `--warn`\n- **SVG**: 用 `viewBox` + `width:100%` + `height:auto`\n- **A11y**: `role=\"img\"` + `aria-label`; 不纯靠颜色区分\n- **Source**: 每张图底部必须标注数据来源\n- **Accent Block**: 强调色块必须用 `--accent` 品牌色，禁止近黑色\n\n---\n\n## 6. HTML骨架（每种图型）\n\n### 通用头部（所有骨架共享）\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root {\n  --ink: #0a0a0a; --paper: #fafaf8; --accent: #002FA7;\n  --muted: #737373; --rule: #d4d4d2;\n  --surface: #ffffff; --surface-2: #f2f2f0;\n  --good: #1aaf6c; --bad: #e0445a; --warn: #f5a524;\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n  --chart-1: #E69F00; --chart-2: #56B4E9; --chart-3: #009E73; --chart-4: #D55E00;\n}\n* { margin:0; padding:0; box-sizing:border-box; }\n.num { font-family:var(--font-data); font-feature-settings:'tnum' on; letter-spacing:-0.02em; }\n</style>\n```\n\n### KPI卡片+Sparkline组件（可嵌入任何图型头部）\n\n```html\n<div class=\"kpi-grid\">\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">月活用户</div>\n    <div class=\"kpi-value num\">2.4M</div>\n    <div class=\"kpi-delta up\">+12.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\"\n        points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">付费率</div>\n    <div class=\"kpi-value num\">8.7%</div>\n    <div class=\"kpi-delta down\">-0.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"1.5\"\n        points=\"0,8 10,10 20,9 30,12 40,11 50,14 60,13 70,16 80,15\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">ARPU</div>\n    <div class=\"kpi-value num\">¥42</div>\n    <div class=\"kpi-delta up\">+5.1%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"1.5\"\n        points=\"0,20 10,18 20,16 30,14 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n</div>\n```\n\n```css\n.kpi-grid { display:flex; gap:10px; margin-bottom:20px; }\n.kpi-card { flex:1; padding:14px; background:var(--surface); border:1px solid var(--rule); border-radius:4px; }\n.kpi-label { font-size:10px; color:var(--muted); margin-bottom:4px; }\n.kpi-value { font-size:28px; font-weight:200; line-height:1; }\n.kpi-delta { font-size:10px; font-weight:500; margin-top:2px; }\n.kpi-delta.up { color:var(--good); }\n.kpi-delta.down { color:var(--bad); }\n.sparkline { width:100%; height:24px; margin-top:6px; }\n```\n\n### bar-chart (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-area { display:flex; flex-direction:column; gap:12px; }\n.bar-row { display:flex; align-items:center; gap:12px; }\n.bar-label { width:80px; font-size:13px; text-align:right; flex-shrink:0; }\n.bar-track { flex:1; height:32px; background:var(--surface-2); border-radius:2px; position:relative; }\n.bar-fill { height:100%; border-radius:2px; display:flex; align-items:center; justify-content:flex-end; padding-right:10px; }\n.bar-value { font-size:12px; font-weight:500; color:var(--paper); }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">数据对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-area\">\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别A</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:85%;background:var(--chart-1)\"><span class=\"bar-value num\">85%</span></div></div>\n    </div>\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别B</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:62%;background:var(--chart-2)\"><span class=\"bar-value num\">62%</span></div></div>\n    </div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### line-chart (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 20px; }\n.chart-container { width:544px; }\n.legend { display:flex; gap:20px; margin-bottom:12px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:12px; }\n.legend-dot { width:10px; height:10px; border-radius:50%; }\nsvg { width:100%; height:auto; }\n.axis-label { font-size:11px; fill:var(--muted); }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">趋势</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-container\">\n    <div class=\"legend\">\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>系列A</div>\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>系列B</div>\n    </div>\n    <svg viewBox=\"0 0 544 280\" xmlns=\"http://www.w3.org/2000/svg\">\n      <line x1=\"50\" y1=\"20\" x2=\"530\" y2=\"20\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"80\" x2=\"530\" y2=\"80\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"140\" x2=\"530\" y2=\"140\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"200\" x2=\"530\" y2=\"200\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"260\" x2=\"530\" y2=\"260\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <polyline points=\"50,200 150,160 250,120 350,80 450,60 530,40\" fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"2\"/>\n      <polyline points=\"50,220 150,200 250,180 350,160 450,140 530,120\" fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"2\" stroke-dasharray=\"6,3\"/>\n      <text x=\"50\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2020</text>\n      <text x=\"150\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2021</text>\n      <text x=\"250\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2022</text>\n      <text x=\"350\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2023</text>\n      <text x=\"450\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2024</text>\n      <text x=\"530\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2025</text>\n    </svg>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### donut-chart (方版 640×640)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; height:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; height:640px; padding:48px; display:flex; flex-direction:column; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-center { flex:1; display:flex; align-items:center; justify-content:center; }\nsvg { width:320px; height:320px; }\n.legend { display:flex; flex-wrap:wrap; gap:16px; justify-content:center; margin-top:24px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:13px; }\n.legend-dot { width:12px; height:12px; border-radius:2px; }\n.source { font-size:11px; color:var(--muted); margin-top:auto; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">占比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-center\">\n    <svg viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"30\"\n              stroke-dasharray=\"132 308\" stroke-dashoffset=\"0\" transform=\"rotate(-90 100 100)\"/>\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"30\"\n              stroke-dasharray=\"110 330\" stroke-dashoffset=\"-132\" transform=\"rotate(-90 100 100)\"/>\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"30\"\n              stroke-dasharray=\"88 352\" stroke-dashoffset=\"-242\" transform=\"rotate(-90 100 100)\"/>\n      <text x=\"100\" y=\"96\" text-anchor=\"middle\" font-size=\"28\" font-weight=\"200\" fill=\"var(--ink)\" class=\"num\">100%</text>\n      <text x=\"100\" y=\"116\" text-anchor=\"middle\" font-size=\"11\" fill=\"var(--muted)\">总计</text>\n    </svg>\n  </div>\n  <div class=\"legend\">\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>A 30%</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>B 25%</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-3)\"></div>C 20%</div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### data-billboard (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:48px; display:flex; flex-direction:column; min-height:480px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.num-mega { font-size:64px; font-weight:200; line-height:1; color:var(--ink); margin:auto 0 0; }\n.num-label { font-size:16px; font-weight:500; color:var(--accent); margin-top:12px; letter-spacing:0.05em; }\n.num-context { font-size:14px; color:var(--muted); line-height:1.6; margin-top:8px; max-width:400px; }\n.stats { display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px; margin-top:auto; }\n.stat-card { background:var(--accent); color:var(--paper); padding:16px; border-radius:4px; }\n.stat-card .num { font-size:22px; font-weight:200; }\n.stat-card .label { font-size:11px; color:rgba(255,255,255,0.7); margin-top:4px; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">关键数据</div>\n  <p class=\"num-mega num\">2.4 亿</p>\n  <div class=\"num-label\">中国灵活就业人口</div>\n  <p class=\"num-context\">占全国就业人口的近三分之一</p>\n  <div class=\"stats\">\n    <div class=\"stat-card\"><div class=\"num\">+12%</div><div class=\"label\">年增长率</div></div>\n    <div class=\"stat-card\"><div class=\"num\">68%</div><div class=\"label\">90后占比</div></div>\n    <div class=\"stat-card\"><div class=\"num\">3.2万</div><div class=\"label\">年均收入</div></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### flow-chart (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 28px; }\n.flow { display:flex; flex-direction:column; gap:0; }\n.step { display:flex; align-items:flex-start; gap:16px; padding:14px 0; }\n.step + .step { border-top:1px solid var(--rule); }\n.step-num { font-size:13px; font-weight:500; color:var(--accent); width:28px; flex-shrink:0; padding-top:2px; }\n.step-title { font-size:16px; font-weight:500; line-height:1.3; }\n.step-desc { font-size:13px; color:var(--muted); line-height:1.4; margin-top:4px; }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">流程</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"flow\">\n    <div class=\"step\"><span class=\"step-num\">01</span><div><div class=\"step-title\">步骤一</div><div class=\"step-desc\">描述</div></div></div>\n    <div class=\"step\"><span class=\"step-num\">02</span><div><div class=\"step-title\">步骤二</div><div class=\"step-desc\">描述</div></div></div>\n    <div class=\"step\"><span class=\"step-num\">03</span><div><div class=\"step-title\">步骤三</div><div class=\"step-desc\">描述</div></div></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### grouped-bar (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 16px; }\n.legend { display:flex; gap:20px; margin-bottom:16px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:12px; }\n.legend-dot { width:10px; height:10px; border-radius:2px; }\n.chart-area { display:flex; align-items:flex-end; gap:24px; height:200px; padding-bottom:28px; border-bottom:1px solid var(--rule); }\n.group { display:flex; flex-direction:column; align-items:center; flex:1; }\n.bars { display:flex; gap:4px; align-items:flex-end; height:200px; }\n.bar { width:28px; border-radius:2px 2px 0 0; transition:height 0.3s; }\n.group-label { font-size:11px; color:var(--muted); margin-top:8px; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">分组对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"legend\">\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>系列A</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>系列B</div>\n  </div>\n  <div class=\"chart-area\">\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:80%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:60%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q1</span></div>\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:90%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:70%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q2</span></div>\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:75%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:85%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q3</span></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### comparison-table (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 20px; }\ntable { width:100%; border-collapse:collapse; font-size:13px; }\nthead th { text-align:left; padding:10px 12px; background:var(--surface-2); color:var(--muted); font-weight:500; font-size:11px; letter-spacing:0.05em; }\ntbody td { padding:10px 12px; border-bottom:1px solid var(--rule); }\ntbody tr:hover { background:var(--surface-2); }\n.delta-up { color:var(--good); font-weight:500; }\n.delta-down { color:var(--bad); font-weight:500; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">对比</div>\n  <h2 class=\"title\">标题</h2>\n  <table>\n    <thead><tr><th>指标</th><th>2023</th><th>2024</th><th>变化</th></tr></thead>\n    <tbody>\n      <tr><td>收入</td><td class=\"num\">1.2M</td><td class=\"num\">1.5M</td><td class=\"delta-up num\">+25%</td></tr>\n      <tr><td>成本</td><td class=\"num\">800K</td><td class=\"num\">950K</td><td class=\"delta-down num\">+19%</td></tr>\n    </tbody>\n  </table>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n---\n\n## 7. 自动选图集成\n\n内容解析后自动建议：\n\n| 数据信号 | 推荐图型 | 画幅 |\n|---------|---------|------|\n| \"A占X%，B占Y%\" | bar-chart / h-bar-chart | 标准 |\n| \"逐年/逐月增长\" | line-chart | 宽幅 |\n| \"分为三部分/占比\" | donut-chart | 方版 |\n| \"A→B→C步骤\" | flow-chart | 宽幅 |\n| \"包含/下属/层级\" | tree-chart / layered-diagram | 标准 |\n| \"正相关/负相关\" | scatter-plot | 方版 |\n| \"同时属于/交集\" | venn-diagram | 方版 |\n| \"贡献了/减少了\" | waterfall-chart | 标准 |\n| \"A和B各多少，按季度\" | grouped-bar | 宽幅 |\n| \"趋势+总量\" | area-chart | 宽幅 |\n| \"多维度对比\" | comparison-table | 标准 |\n\nFile v2.1.0:references/design-tokens.md\n\n# 设计令牌参考\n\n> CSS变量体系 + 三套财经配色 + 三画幅系统 + 字号规范\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. CSS变量体系\n\n### 通用变量（所有图表共享）\n\n```css\n:root {\n  /* 基础色 */\n  --ink: #0a0a0a;\n  --paper: #fafaf8;\n  --accent: #002FA7;\n  --muted: #737373;\n  --rule: #d4d4d2;\n\n  /* 表面层级 */\n  --surface: #ffffff;          /* 卡片白 */\n  --surface-2: #f2f2f0;        /* 次级表面（浅灰） */\n\n  /* 语义色 — 涨跌/状态 */\n  --good: #1aaf6c;             /* 正向-绿（涨/达标/好） */\n  --bad: #e0445a;              /* 负向-红（跌/未达标/差） */\n  --warn: #f5a524;             /* 警告-琥珀（注意/中性偏负） */\n\n  /* 字体 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;  /* 数据专用，等宽数字 */\n\n  /* 图表色板 (Okabe-Ito 色盲安全) */\n  --chart-1: #E69F00;\n  --chart-2: #56B4E9;\n  --chart-3: #009E73;\n  --chart-4: #D55E00;\n  --chart-5: #CC79A7;\n  --chart-6: #F0E442;\n  --chart-7: #0072B2;\n  --chart-8: #000000;\n}\n```\n\n### 数据字体对齐\n\n```css\n.num {\n  font-family: var(--font-data);\n  font-feature-settings: 'tnum' on;\n  letter-spacing: -0.02em;\n}\n```\n\n> Inter 的 `tnum` 特性确保数字等宽对齐，表格和KPI卡片中数值列不会参差不齐。\n\n### 主题切换\n\n只替换 `:root` 变量即可切换主题：\n\n**克制风（默认）**\n```css\n:root { --accent: #002FA7; }\n```\n\n**品牌DNA — 微信绿**\n```css\n:root { --accent: #07C160; }\n```\n\n**品牌DNA — 经济学人红**\n```css\n:root { --accent: #E3120B; }\n```\n\n**品牌DNA — 知乎蓝**\n```css\n:root { --accent: #0066FF; }\n```\n\n**暖色系**\n```css\n:root { --accent: #C0392B; --paper: #f8f6f1; }\n```\n\n---\n\n## 2. 高端财经媒体配色方案\n\n> 三套方案分别对标麦肯锡、经济学人、财新杂志的图表视觉风格。\n> 核心原则：低饱和度、高灰度占比、单色系为主+1个强调色、大面积留白。\n\n### 方案A：麦肯锡 McKinsey\n\n**视觉特征**：深蓝主色+青绿辅助+暖灰底色，克制严谨，数据密度高但视觉噪音低。\n\n```css\n:root {\n  --ink: #1B1B1B;\n  --paper: #F7F5F2;        /* 暖灰白，非纯白 */\n  --accent: #0F4C81;       /* 麦肯锡深蓝 — 强调色块必须用品牌色 */\n  --muted: #6B6B6B;\n  --rule: #D9D5CF;         /* 暖灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #efeee9;    /* 暖灰次级表面 */\n  --good: #2f7d4a;         /* 麦肯锡绿 */\n  --bad: #b53a2a;          /* 麦肯锡红 */\n  --warn: #c47b25;         /* 麦肯锡琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 麦肯锡图表色板：低饱和度、蓝-青-绿-琥珀渐进 */\n  --chart-1: #0F4C81;      /* 深蓝 Steel Blue */\n  --chart-2: #2A7B9B;      /* 青蓝 Teal Blue */\n  --chart-3: #3A9D8F;      /* 青绿 Sage Teal */\n  --chart-4: #A8B820;      /* 橄榄绿 Olive */\n  --chart-5: #E2A828;      /* 琥珀 Amber */\n  --chart-6: #C76D5E;      /* 赤陶 Terracotta */\n  --chart-7: #7B6B8D;      /* 灰紫 Mauve */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 主色用 `--chart-1` 深蓝，强调用 `--chart-5` 琥珀\n- 背景 `--paper` 是暖灰白 #F7F5F2，不是纯白\n- 分割线用暖灰 `--rule` #D9D5CF\n- 数据标签用 `--ink` #1B1B1B，不用纯黑\n- 卡片背景用 `--surface` 或 `rgba(15,76,129,0.04)`\n- **强调色块用 `--accent` (#0F4C81) 深蓝底+白字，禁止用近黑色**\n\n### 方案B：经济学人 The Economist\n\n**视觉特征**：标志性红+深蓝灰+米白底，对比鲜明，标题粗重数据纤细，英式克制。\n\n```css\n:root {\n  --ink: #1D1D1B;\n  --paper: #FDFBF7;        /* 米白，微暖 */\n  --accent: #E3120B;       /* 经济学人红 — 强调色块必须用品牌色 */\n  --muted: #6C6C6C;\n  --rule: #D5D0C8;         /* 米灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #f0ede5;    /* 米灰次级表面 */\n  --good: #1f7a3a;         /* 经济学人绿 */\n  --bad: #9c2a25;          /* 经济学人红（深） */\n  --warn: #c47b25;         /* 经济学人琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 经济学人图表色板：红-蓝-灰为主，低饱和辅助色 */\n  --chart-1: #E3120B;      /* 经济学人红 */\n  --chart-2: #0D47A1;      /* 深蓝 Navy */\n  --chart-3: #4A7C59;      /* 橄榄绿 Olive Green */\n  --chart-4: #D4A843;      /* 旧金 Gold */\n  --chart-5: #7B5EA7;      /* 灰紫 Muted Purple */\n  --chart-6: #C4784A;      /* 赤铜 Copper */\n  --chart-7: #3B7D8C;      /* 灰青 Slate Teal */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 强调用 `--chart-1` 红，主数据用 `--chart-2` 深蓝\n- 标题字重500，数据数字字重200（粗细对比是经济学人标志）\n- 来源行用小号斜体，底部细线分隔\n- **强调色块用 `--accent` (#E3120B) 红底+白字，禁止用近黑色**\n- 涨跌用 `--good` 绿 / `--bad` 红\n\n### 方案C：财新 Caixin\n\n**视觉特征**：财新蓝+深墨+冷灰底，中式财经克制，信息密度极高，留白精准。\n\n```css\n:root {\n  --ink: #1A1A1A;\n  --paper: #F5F5F3;        /* 冷灰白 */\n  --accent: #0055AA;       /* 财新蓝 — 强调色块必须用品牌色 */\n  --muted: #757575;\n  --rule: #D4D4D4;         /* 冷灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #eaeae8;    /* 冷灰次级表面 */\n  --good: #1f7a3a;         /* 财新绿 */\n  --bad: #9c2a25;          /* 财新红（深） */\n  --warn: #c47b25;         /* 财新琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 财新图表色板：蓝-灰为主，暖色点缀 */\n  --chart-1: #0055AA;      /* 财新蓝 */\n  --chart-2: #3A7BBF;      /* 中蓝 */\n  --chart-3: #7BAFD4;      /* 浅蓝 */\n  --chart-4: #C0392B;      /* 警示红 */\n  --chart-5: #D4883A;      /* 暖铜 Bronze */\n  --chart-6: #5B8C5A;      /* 灰绿 Sage */\n  --chart-7: #8E7CC3;      /* 灰紫 Lavender */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 主色用 `--chart-1` 财新蓝，警示用 `--chart-4` 红\n- 同色系渐变（蓝→中蓝→浅蓝）用于分组/层级对比\n- 背景冷灰白 #F5F5F3，分割线冷灰\n- **强调色块用 `--accent` (#0055AA) 蓝底+白字，禁止用近黑色**\n- 数据来源标注严格，用「数据来源：」而非「Source:」\n\n### 三方案速查对比\n\n| 维度 | 麦肯锡 | 经济学人 | 财新 |\n|------|--------|---------|------|\n| 底色 | 暖灰白 #F7F5F2 | 米白 #FDFBF7 | 冷灰白 #F5F5F3 |\n| 主色 | 深蓝 #0F4C81 | 红 #E3120B | 蓝 #0055AA |\n| 强调色 | 琥珀 #E2A828 | 深蓝 #0D47A1 | 红 #C0392B |\n| 强调色块底色 | 深蓝 #0F4C81 | 红 #E3120B | 蓝 #0055AA |\n| 分割线 | 暖灰 #D9D5CF | 米灰 #D5D0C8 | 冷灰 #D4D4D4 |\n| 涨色 | 绿 #2f7d4a | 绿 #1f7a3a | 绿 #1f7a3a |\n| 跌色 | 红 #b53a2a | 红 #9c2a25 | 红 #9c2a25 |\n| 风格气质 | 克制严谨 | 英式鲜明 | 中式精炼 |\n| 适用场景 | 咨询报告/战略分析 | 全球财经/深度调查 | 国内财经/政策解读 |\n| 色板特征 | 蓝→青→绿渐进 | 红+蓝对比为主 | 蓝色系渐变+红警示 |\n\n### 强调色块硬约束\n\n```\n🚫 禁止用近黑色（#051C2C / #1D1D1B / #1A1A1A 等）做强调色块背景\n✅ 强调色块必须用 --accent 品牌色做底色 + 白色/浅色文字\n✅ 洞察框/关键数据卡/公式结果块 → background: var(--accent); color: var(--paper);\n```\n\n---\n\n## 3. 字号规范\n\n### 图表专用字号\n\n| 元素 | 字号 | 字重 | 颜色 | 用途 |\n|------|------|------|------|------|\n| kicker | 10-11px | 500 | --accent | 分类标签 |\n| title | 18-24px | 500 | --ink | 图表标题 |\n| subtitle | 11px | 400 | --muted | 副标题/补充说明 |\n| axis-label | 11-12px | 400 | --muted | 轴刻度标签 |\n| data-label | 12-13px | 500 | --ink / --paper | 数据标注 |\n| legend-text | 12-13px | 400 | --ink | 图例文字 |\n| source | 10-11px | 400 | --muted | 数据来源 |\n| num-mega | 48-64px | 200 | --ink | billboard大数字 |\n| num-label | 14-16px | 500 | --accent | billboard标签 |\n| num-kpi | 28-36px | 200 | --ink / --chart-* | KPI卡片数字 |\n| sparkline-label | 9-10px | 400 | --muted | 迷你趋势线标签 |\n\n### 标题长度→字号映射\n\n| 标题长度 | 字号 | 字重 |\n|---------|------|------|\n| ≤6字 | 24px | 500 |\n| 7-14字 | 22px | 500 |\n| 15-24字 | 18px | 500 |\n| 25+字 | 16px | 500 |\n\n---\n\n## 4. 间距规范\n\n| 元素 | 间距 |\n|------|------|\n| 页面内边距 | 36-48px |\n| 标题与图表间距 | 16-28px |\n| 图表行间距 | 6-14px |\n| KPI卡片间距 | 8-12px |\n| 图例项间距 | 16-20px |\n| 来源与图表间距 | 12-20px |\n\n---\n\n## 5. 三画幅系统\n\n> 宽度固定640px，高度按内容自适应，每种画幅有基准高度和弹性区间。\n\n### 画幅定义\n\n| 画幅 | 基准尺寸 | 弹性区间 | 比例 | 设计逻辑 |\n|------|---------|---------|------|---------|\n| **宽幅** | 640×400 | 360-480px | 16:10 | 横向信息展开，移动端一屏可见 |\n| **标准** | 640×480 | 420-600px | 4:3 | 信息密度与可读性平衡 |\n| **方版** | 640×640 | 560-720px | 1:1 | 径向/对称结构，视觉重心居中 |\n\n### 高度弹性规则\n\n```\n基准高度 = 画幅基准值（400/480/640）\n实际高度 = 基准高度 + 内容溢出量\n内容溢出量 ∈ [−40px, +80px]（向下取整到8的倍数）\n\n判断逻辑：\n- 数据行数 ≤4 → 用区间下限\n- 数据行数 5-8 → 用基准值\n- 数据行数 ≥9 或含洞察框 → 用区间上限\n```\n\n### 图型→画幅映射\n\n| 图型 | 画幅 | 基准高度 | 说明 |\n|------|------|---------|------|\n| bar-chart | 标准 | 480 | 竖柱，4-8条 |\n| h-bar-chart | 标准 | 480 | 横柱，5-10条 |\n| line-chart | 宽幅 | 400 | 折线，横向展开 |\n| donut-chart | 方版 | 640 | 环形，径向结构 |\n| quadrant-chart | 方版 | 640 | 象限，2×2矩阵 |\n| radar-chart | 方版 | 640 | 雷达，多轴对称 |\n| venn-diagram | 方版 | 640 | 维恩，圆形交叠 |\n| flow-chart | 宽幅 | 400 | 流程，横向步骤 |\n| layered-diagram | 标准 | 480 | 层级，上下堆叠 |\n| waterfall-chart | 标准 | 480 | 瀑布，增减对比 |\n| scatter-plot | 方版 | 640 | 散点，自由分布 |\n| bubble-chart | 方版 | 640 | 气泡，面积编码 |\n| treemap | 标准 | 480 | 矩形树，面积占比 |\n| data-billboard | 标准 | 480 | 大数字+标签 |\n| grouped-bar | 宽幅 | 400 | 分组柱，横向展开 |\n| stacked-bar | 标准 | 480 | 堆叠柱，纵向对比 |\n| area-chart | 宽幅 | 400 | 面积，趋势填充 |\n| comparison-table | 标准 | 480 | 对比表，行列结构 |\n\n### KPI卡片+Sparkline组件\n\n```html\n<div class=\"kpi-grid\">\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">月活用户</div>\n    <div class=\"kpi-value num\">2.4M</div>\n    <div class=\"kpi-delta up\">+12.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\"\n        points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n</div>\n```\n\n```css\n.kpi-grid { display:flex; gap:10px; margin-bottom:20px; }\n.kpi-card { flex:1; padding:14px; background:var(--surface); border:1px solid var(--rule); border-radius:4px; }\n.kpi-label { font-size:10px; color:var(--muted); margin-bottom:4px; }\n.kpi-value { font-size:28px; font-weight:200; line-height:1; }\n.kpi-delta { font-size:10px; font-weight:500; margin-top:2px; }\n.kpi-delta.up { color:var(--good); }\n.kpi-delta.down { color:var(--bad); }\n.sparkline { width:100%; height:24px; margin-top:6px; }\n```\n\n### 字体加载\n\n```css\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n```\n\nFile v2.1.0:references/workflow.md\n\n# wx-huitu 核心工作流\n\n> 版本: 2.0 | 输出格式: HTML → Puppeteer 截图 → PNG 交付\n> 触发词: `文章绘图` / `绘图图表` / `画个图表` / `数据图` / `做个图` / `画图`\n\n## Core Principles\n\n1. **Think first, plot second** — 先剖析数据形态和论证意图，再选图型\n2. **主动拦截不当选择** — 发现问题先说再给替代，不默默照做\n3. **色盲安全默认** — Okabe-Ito 配色 + 冗余编码\n4. **一图一论点** — 一张图表只承载一个核心论证目标\n\n## 执行流程\n\n```\n输入（文章/数据描述/CSV）\n  ↓\nStep 1: 数据剖析（静默）\n  ↓\nStep 2: 图型推荐 ← 确认点（必须）\n  ↓\nStep 3: 风格 + 生成 HTML\n  ↓\nStep 4: 截图交付 + 云盘同步\n```\n\n---\n\n## Step 1: 数据剖析（静默）\n\n### 三轴分析\n\n对每个提取到的数据单元，分析三个维度：\n\n**轴1: 变量类型**\n\n| 组合 | 数据结构 |\n|------|---------|\n| 1×连续 | 看分布 |\n| 1×分类 | 看占比 |\n| 1×分类 + 1×连续 | 看组间比较 |\n| 2×连续 | 看关系 |\n| 1×时间 + 1×连续 | 看趋势 |\n| 多个连续 | 看相关 |\n| 二维矩阵 | 看模式 |\n| 嵌套分组 | 看层次 |\n\n**轴2: 论证意图**\n\n**这是最容易被忽略的一轴。** 同样数据，论证目标不同，图就不同。\n\n- **比较** — \"A 比 B 高/低/不同\" → bar-chart / h-bar-chart\n- **趋势** — \"随时间/条件变化\" → line-chart\n- **占比** — \"总和被分成几份\" → donut-chart / treemap\n- **关系** — \"X 越大 Y 越大\" → scatter-plot / bubble-chart\n- **流程** — \"A→B→C 顺序步骤\" → flow-chart / swimlane-chart\n- **层级** — \"上下级/嵌套结构\" → tree-chart / layered-diagram\n- **重叠** — \"集合之间有交集\" → venn-diagram\n- **累积** — \"正负贡献叠加\" → waterfall-chart\n\n**轴3: 数据形态**\n\n- 数据点数量（2-5 / 6-12 / 13+）\n- 类别数量（2-5 / 6-8 / 9+）\n- 是否有分组\n- 是否有异常值\n- 是否跨量级\n\n### 从文章提取数据单元\n\n| 提取信号 | 寻找什么 | 论证意图 |\n|---------|---------|---------|\n| 数值比较 | \"A占X%，B占Y%\" | 比较 |\n| 时间变化 | \"从X增长到Y\"/\"逐年/逐月\" | 趋势 |\n| 占比构成 | \"其中X占Y%\"/\"分为三部分\" | 占比 |\n| 变量关系 | \"X越高Y越\"/\"正相关/负相关\" | 关系 |\n| 顺序步骤 | \"第一步→第二步\"/\"Phase1→2\" | 流程 |\n| 层级结构 | \"包含\"/\"下属\"/\"分为N类\" | 层级 |\n| 集合重叠 | \"同时属于\"/\"交集\" | 重叠 |\n| 累积变化 | \"贡献了X\"/\"减少了Y\" | 累积 |\n\n### 提取规则\n\n- 数据单元须有 ≥2个数据点 或 清晰逻辑结构\n- 孤立单个数字不可视化（如\"48天\"单独→不做图）\n- 两个单元来源段落重叠时，合并\n- 无数据/结构的叙述段落不可视化\n\n---\n\n## Step 2: 图型推荐（确认点 — 必须）\n\n### 推荐格式\n\n```\n📊 图表推荐：共 N 张\n\n┌──────────────────────────────────────────────────┐\n│ #1 [图型emoji] [图型名称]                          │\n│ 论证意图: [比较/趋势/占比/...]                      │\n│ 推荐理由: [基于三轴分析的具体理由]                    │\n│ 备选: [备选图型1] / [备选图型2]                     │\n│                                                    │\n│ #2 ...                                             │\n└──────────────────────────────────────────────────┘\n\n💡 我的建议:\n- [主动给出合并/拆分/调整建议]\n- [指出哪张信息密度最高]\n```\n\n### 图型Emoji映射\n\n| 图型 | Emoji | 图型 | Emoji |\n|------|-------|------|-------|\n| bar-chart | 📊 | horizontal-bar-chart | 📏 |\n| line-chart | 📈 | donut-chart | 🍩 |\n| scatter-plot | 🔵 | bubble-chart | 🫧 |\n| flow-chart | 🔀 | swimlane-chart | 🏊 |\n| tree-chart | 🌳 | layered-diagram | 🧱 |\n| venn-diagram | ⭕ | waterfall-chart | 📉 |\n| treemap | 🗺️ | quadrant-chart | ✛ |\n| data-billboard | 🔢 | candlestick-chart | 🕯️ |\n| state-machine | ⚙️ | | |\n\n### 拦截规则执行\n\n发现用户需求触发拦截时，**先说明问题再给替代方案**：\n\n```\n拦截示例：\n你要的\"3个类别画饼图\"会触发 I2（7以下类别虽可画饼图，\n但横向柱状图在长度比较上比角度比较更直观）。\n我建议改成 **横向柱状图**：长度差异一目了然。\n要按原方案画，还是改？\n```\n\n尊重用户最终决定，但**留下明确的劝阻记录**。\n\n### 用户覆盖选项\n\n- \"确认\" → 按推荐执行\n- \"第N张换成[图型]\" → 更换\n- \"加上[描述]\" → 添加\n- \"合并第M和第N张\" → 合并\n- \"去掉第N张\" → 移除\n\n---\n\n## Step 3: 风格 + 生成 HTML\n\n### 1问定风格\n\n```\n🎨 主题色偏好？\n  A. 克制风（单品牌色+暖灰层级）— 默认\n  B. 品牌DNA（自动检测文章来源色）\n  C. 高端财经：\n     C1. 麦肯锡（深蓝+青绿+暖灰白，克制严谨）\n     C2. 经济学人（红+深蓝+米白，英式鲜明）\n     C3. 财新（财新蓝+冷灰白，中式精炼）\n  D. 指定色系：______\n```\n\n> 高端财经配色详见 [`design-tokens.md`](design-tokens.md) 第2节。核心原则：低饱和度、高灰度占比、单色系为主+1个强调色、大面积留白。\n\n### 尺寸体系（三画幅）\n\n| 画幅 | 基准尺寸 | 弹性区间 | 适用图型 |\n|------|---------|---------|---------|\n| **宽幅** | 640×400 | 360-480px | line-chart, flow-chart, grouped-bar, area-chart |\n| **标准** | 640×480 | 420-600px | bar-chart, h-bar-chart, layered-diagram, waterfall-chart, stacked-bar, comparison-table, data-billboard, tree-chart, treemap, swimlane-chart |\n| **方版** | 640×640 | 560-720px | donut-chart, quadrant-chart, venn-diagram, scatter-plot, bubble-chart, state-machine |\n\n> 画幅详细映射和弹性规则见 [`design-tokens.md`](design-tokens.md) 第5节。\n\n### HTML 生成规则\n\n1. **内联CSS** — 每个 HTML 文件包含完整样式\n2. **`<img>`标签背景** — 照片背景用 `<img>` + 绝对定位，不用 CSS background-image\n3. **固定宽高** — `html,body{width:Wpx;height:Hpx;overflow:hidden;margin:0;padding:0}`\n4. **overflow:hidden** — 确保截图尺寸精确\n5. **Google Fonts @import** — 放在 `<style>` 顶部\n6. **命名规范** — `{NN}-{type}.html`\n\n### 输出目录\n\n```\n[article-name]-charts/\n├── 01-bar-comparison.html\n├── 02-line-trend.html\n├── 03-donut-share.html\n└── screenshot.js\n```\n\n### HTML模板骨架\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root {\n  --ink: #0a0a0a;\n  --paper: #fafaf8;\n  --accent: #002FA7;\n  --muted: #737373;\n  --rule: #d4d4d2;\n  --surface: #ffffff;\n  --surface-2: #f2f2f0;\n  --good: #1aaf6c;\n  --bad: #e0445a;\n  --warn: #f5a524;\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n  --chart-1: #E69F00;\n  --chart-2: #56B4E9;\n  --chart-3: #009E73;\n  --chart-4: #D55E00;\n}\n* { margin: 0; padding: 0; box-sizing: border-box; }\n.num { font-family: var(--font-data); font-feature-settings: 'tnum' on; letter-spacing: -0.02em; }\nhtml, body { width: 640px; overflow: hidden; font-family: var(--font-body); background: var(--paper); color: var(--ink); }\n</style>\n</head>\n<body>\n<!-- 图表内容 -->\n</body>\n</html>\n```\n\n---\n\n## Step 4: 截图交付 + 云盘同步\n\n### Puppeteer-core + 系统Chrome\n\nChrome路径检测（Windows，按顺序）：\n1. 注册表：`HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe`\n2. Playwright：`$env:LOCALAPPDATA\\ms-playwright\\chromium-*\\chrome-win64\\chrome.exe`\n3. 默认：`C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe`\n\n### 截图参数\n\n| 格式 | Viewport | deviceScaleFactor | 输出 |\n|------|----------|-------------------|------|\n| 横版 | 640×auto | 2 | PNG |\n| 方版 | 640×640 | 2 | PNG |\n\n### screenshot.js\n\n```javascript\nconst puppeteer = require('puppeteer-core');\nconst fs = require('fs');\nconst path = require('path');\n\nfunction detectChromePath() {\n  const { execSync } = require('child_process');\n  try {\n    const reg = execSync(\n      'reg query \"HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\App Paths\\\\chrome.exe\" /ve',\n      { encoding: 'utf-8' }\n    );\n    const m = reg.match(/REG_SZ\\s+(.+)/);\n    if (m && fs.existsSync(m[1].trim())) return m[1].trim();\n  } catch (_) {}\n  const playwrightDir = path.join(process.env.LOCALAPPDATA || '', 'ms-playwright');\n  if (fs.existsSync(playwrightDir)) {\n    const dirs = fs.readdirSync(playwrightDir).filter(d => d.startsWith('chromium-')).sort().reverse();\n    for (const d of dirs) {\n      const p = path.join(playwrightDir, d, 'chrome-win64', 'chrome.exe');\n      if (fs.existsSync(p)) return p;\n    }\n  }\n  const defaultPath = 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe';\n  if (fs.existsSync(defaultPath)) return defaultPath;\n  throw new Error('未找到 Chrome');\n}\n\nconst TYPE_CONFIG = {\n  square: { width: 640, height: 640, fullPage: false },\n  default: { width: 640, height: 800, fullPage: true },\n};\n\nfunction isSquare(name) {\n  const squareTypes = ['donut','quadrant','venn','treemap','scatter','bubble','billboard'];\n  return squareTypes.some(t => name.includes(t));\n}\n\n(async () => {\n  const chromePath = detectChromePath();\n  console.log('Chrome:', chromePath);\n  const browser = await puppeteer.launch({\n    headless: 'new', executablePath: chromePath,\n    args: ['--no-sandbox','--disable-setuid-sandbox','--disable-gpu']\n  });\n  const scriptDir = __dirname;\n  const desktop = path.join(require('os').homedir(), 'Desktop');\n  const articleName = path.basename(scriptDir).replace(/-charts$/, '');\n  const outputDir = path.join(desktop, articleName + '图表');\n  if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true });\n  const htmlFiles = fs.readdirSync(scriptDir).filter(f => f.endsWith('.html')).sort();\n  console.log(`Found ${htmlFiles.length} HTML files`);\n  for (const file of htmlFiles) {\n    const filePath = path.join(scriptDir, file);\n    const sq = isSquare(file);\n    const config = sq ? TYPE_CONFIG.square : TYPE_CONFIG.default;\n    const pngName = file.replace('.html', '.png');\n    const pngPath = path.join(outputDir, pngName);\n    console.log(`  ${file} -> ${pngName} (${sq ? '640x640' : '640xauto'})`);\n    const page = await browser.newPage();\n    await page.setViewport({ width: config.width, height: config.height, deviceScaleFactor: 2 });\n    await page.goto('file:///' + filePath.replace(/\\\\/g, '/'), { waitUntil: 'networkidle0', timeout: 30000 });\n    await page.evaluate(() => document.fonts.ready);\n    await new Promise(r => setTimeout(r, 3000));\n    const opts = { path: pngPath, type: 'png' };\n    if (config.fullPage) { opts.fullPage = true; }\n    else { opts.clip = { x: 0, y: 0, width: config.width, height: config.height }; }\n    await page.screenshot(opts);\n    await page.close();\n  }\n  await browser.close();\n  console.log(`Done! Output: ${outputDir}`);\n  const { execSync } = require('child_process');\n  try { execSync('explorer.exe \"' + outputDir + '\"'); } catch(e) {}\n})();\n```\n\n### 交付流程\n\n1. **截图**: 运行 screenshot.js\n2. **本地验证**: PNG > 10KB / 中文字符正确 / 标签无裁切\n3. **飞书云盘同步**: `lark-cli drive +create-folder` → `lark-cli drive +upload` 逐张上传\n\n### 视觉自检清单\n\n- [ ] 数值标签无裁切\n- [ ] 图例不压数据\n- [ ] 颜色在灰度下可区分\n- [ ] 轴标签可读（640px画布上≥12px）\n- [ ] 数据来源已标注\n\nFile v2.1.0:CHANGELOG.md\n\n# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n## [2.1.0] - 2026-07-13\n\n### Added\n- SkillHub frontmatter fields (slug/displayName/version/summary/license)\n- Permission declaration section in SKILL.md\n- Bilingual README with user warnings\n- Updated .gitignore with Python cache and ClawHub exclusions\n\n## [2.0.0] - 2026-06-15\n\n### Added\n- Three canvas system (landscape 640x400 / standard 640x480 / square 640x640)\n- 18 chart types with C01-C18 version IDs and CSS class names\n- Chart version lock rule: data charts must use C01-C18\n- Font size inverse ladder (larger=thinner, smaller=bolder)\n- Semantic color variables (--good/--bad/--warn)\n- KPI card + Sparkline component\n- Three financial media color schemes (McKinsey/Economist/Caixin)\n- 8 interception rules for inappropriate chart choices\n\n## [1.0.0] - 2026-06-12\n\n### Added\n- Initial release of wx-huitu\n- 14 chart types with HTML+CSS+SVG skeletons\n- Three-axis decision framework (variable type x argument intent x data shape)\n- 8 interception rules for inappropriate chart choices\n- Okabe-Ito colorblind-safe palette with redundant encoding\n- 4-step workflow: profile → recommend → generate → deliver\n- Puppeteer-core screenshot delivery with Feishu cloud sync\n- Two format sizes: landscape (640xauto) and square (640x640)\n\nFile v2.1.0:skill-card.md\n\n## Description: <br>\nWx Huitu helps users turn WeChat article text or data descriptions into PNG chart packages using a fixed chart system, HTML generation, Puppeteer screenshots, and optional Feishu cloud sync. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[edwardwason](https://clawhub.ai/user/edwardwason) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nContent creators, analysts, and developers use this skill to choose suitable chart layouts for WeChat articles and generate shareable PNG chart assets from article drafts or structured data descriptions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill can create local chart files and run Puppeteer/Chrome locally. <br>\nMitigation: Review generated HTML and screenshot commands before execution, and verify the output folder before allowing file writes. <br>\nRisk: Generated PNGs may be uploaded to Feishu when lark-cli credentials are configured. <br>\nMitigation: Disable Feishu sync for sensitive article drafts or proprietary datasets, and confirm the upload destination before sharing files. <br>\nRisk: The workflow loads Google Fonts over the network. <br>\nMitigation: Use the skill only in environments where external font loading is acceptable, or replace remote font imports with approved local fonts. <br>\n\n\n## Reference(s): <br>\n- [Wx Huitu on ClawHub](https://clawhub.ai/edwardwason/skills/wx-huitu) <br>\n- [Workflow Reference](references/workflow.md) <br>\n- [Chart System Reference](references/chart-system.md) <br>\n- [Design Tokens Reference](references/design-tokens.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration] <br>\n**Output Format:** [Markdown guidance with HTML/CSS chart code and local screenshot workflow commands] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces local PNG chart files and may optionally sync generated PNGs to Feishu when credentials are configured.] <br>\n\n## Skill Version(s): <br>\n2.1.0 (source: frontmatter, changelog, server release) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.0.0: 7 files, 24542 bytes\n\nFiles: CHANGELOG.md (575b), references/chart-system.md (23961b), references/design-tokens.md (12004b), references/workflow.md (11927b), skill-card.md (2024b), SKILL.md (9441b), _meta.json (127b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: \"wx-huitu\"\ndescription: \"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。18种版式(C01-C18)覆盖柱状/折线/饼图/面积/雷达/散点/漏斗/热力/仪表盘/混合图表等。先剖析数据形态与论证意图，再推荐版式，主动拦截不当选择（2点折线/7+类别饼图/单值做图等），最后生成HTML+截图交付。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'做个图'/'画图'时触发。Do NOT use for 封面/封底/金句图/杂志版式/全文配图/代码编辑.\"\n---\n\n# wx-huitu — 公众号数据绘图专家\n\n> 来源识别: wx-huitu 由 TRAE SOLO 创建与维护。仓库: https://github.com/EdwardWason/wx-huitu\n\n**Persona**: 你是一位数据可视化顾问。你的首要能力是\"思考与判断\"——先理解数据再选图，先想清楚论证目标再动笔。\n\n## Task\n\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。每张图表：剖析数据 → 推荐版式 → 生成 HTML → Puppeteer 截图 → PNG → 保存桌面 → 同步飞书云盘。\n\n**核心交付物**: PNG 图片，不是代码。\n\n## Out of Scope\n\n- **封面/封底** → 用 wx-peitu\n- **金句图/宣言卡/转场卡** → 用 wx-peitu\n- **全文配图方案** → 用 wx-peitu\n- **代码编辑** → 用代码工具\n- **交互式图表** → 用 plotly/echarts 独立部署\n\n---\n\n## Workflow (4步)\n\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\n\n### Step 1: Data Profiling (静默)\n\n分析每个数据单元的三轴属性：\n\n**轴1: 变量类型** — 连续/分类/时间/层级/集合\n**轴2: 论证意图** — 比较/趋势/占比/关系/流程/层级/重叠/累积\n**轴3: 数据形态** — 数据点数量/类别数/是否有异常值/是否有分组\n\n### Step 2: Chart Recommendation (确认点)\n\n基于三轴分析推荐版式，必须给出推荐+理由+1-2备选。\n\n8条拦截规则：I1(2点折线→C01) / I2(7+类别donut→C02) / I3(单值做图→C13) / I4(一图多论点→拆图) / I5(类别折线→C01) / I6(Y轴不从0起) / I7(rainbow色图→安全色板) / I8(图例压数据)\n\n### Step 3: Style + Generate HTML\n\n1问定风格：A.克制风 / B.品牌DNA / C.高端财经(C1麦肯锡/C2经济学人/C3财新) / D.指定色系\n\n生成独立HTML文件（内联CSS+SVG+固定尺寸+overflow:hidden）。\n\n### Step 4: Screenshot & Deliver\n\nPuppeteer-core → PNG → 桌面文件夹 → 飞书云盘同步。\n\n---\n\n## 18种版式 (C01-C18) + 三画幅\n\n> 版式锁定：数据图表必须从 C01-C18 中选择，不允许自创版式。\n\n| 版式 | 图型 | 适用场景 | 核心CSS类 | 画幅 |\n|------|------|---------|----------|------|\n| **C01** | bar-chart | 2-6类别比较 | `.c-bar` + `.bar-col` + `.bar-fill` | 标准 640×480 |\n| **C02** | h-bar-chart | 7+类别或长标签 | `.c-hbar` + `.bar-row` + `.bar-fill` | 标准 640×480 |\n| **C03** | line-chart | 8+时间点趋势 | `.c-line` + svg `polyline` | 宽幅 640×400 |\n| **C04** | donut-chart | 2-5段占比 | `.c-donut` + svg `circle` stroke-dasharray | 方版 640×640 |\n| **C05** | quadrant-chart | 2轴+阈值线 | `.c-quadrant` + `.q-item` + `.q-crosshair` | 方版 640×640 |\n| **C06** | flow-chart | 3-8步顺序流程 | `.c-flow` + `.flow-step` + `.flow-connector` | 宽幅 640×400 |\n| **C07** | layered-diagram | 分层架构 | `.c-layer` + `.layer-row` + `.layer-items` | 标准 640×480 |\n| **C08** | waterfall-chart | 累积正负贡献 | `.c-waterfall` + `.wf-row` + `.wf-bar` | 标准 640×480 |\n| **C09** | grouped-bar | 分组类别对比 | `.c-gbar` + `.gbar-group` + `.gbar-col` | 宽幅 640×400 |\n| **C10** | stacked-bar | 分组占比对比 | `.c-sbar` + `.sbar-col` + `.sbar-seg` | 标准 640×480 |\n| **C11** | area-chart | 趋势+总量 | `.c-area` + svg `polygon` + `polyline` | 宽幅 640×400 |\n| **C12** | comparison-table | 多维度行列对比 | `.c-table` + `table` + `.delta-up/.delta-down` | 标准 640×480 |\n| **C13** | data-billboard | 单一关键数值 | `.c-billboard` + `.num-mega` + `.stat-card` | 标准 640×480 |\n| **C14** | venn-diagram | 2-3集合重叠 | `.c-venn` + svg `circle` + `.venn-label` | 方版 640×640 |\n| **C15** | radar-chart | 多维评估 | `.c-radar` + svg `polygon` + `.radar-axis` | 方版 640×640 |\n| **C16** | scatter-plot | 2连续变量关系 | `.c-scatter` + svg `circle` + `.scatter-label` | 方版 640×640 |\n| **C17** | treemap | 多类别层级占比 | `.c-treemap` + `.tm-cell` + `.tm-label` | 标准 640×480 |\n| **C18** | swimlane-chart | 2-4角色并行流程 | `.c-swimlane` + `.lane` + `.lane-step` | 宽幅 640×400 |\n\n三画幅：**宽幅** 640×400 | **标准** 640×480 | **方版** 640×640\n\n---\n\n## CSS变量体系\n\n### 通用变量\n\n```css\n:root {\n  --ink:#0a0a0a; --paper:#fafaf8; --accent:#002FA7; --muted:#737373; --rule:#d4d4d2;\n  --surface:#ffffff; --surface-2:#f2f2f0; --good:#1aaf6c; --bad:#e0445a; --warn:#f5a524;\n  --font-body:'Noto Sans SC',sans-serif; --font-data:'Inter','Noto Sans SC',sans-serif;\n  --chart-1:#E69F00; --chart-2:#56B4E9; --chart-3:#009E73; --chart-4:#D55E00;\n  --chart-5:#CC79A7; --chart-6:#F0E442; --chart-7:#0072B2; --chart-8:#000000;\n}\n```\n\n### 麦肯锡配色\n\n```css\n:root { --paper:#F7F5F2; --accent:#0F4C81; --chart-1:#0F4C81; --chart-2:#2A7B9B; --chart-3:#3A9D8F; --chart-5:#E2A828; --good:#2f7d4a; --bad:#b53a2a; }\n```\n\n### 经济学人配色\n\n```css\n:root { --paper:#FDFBF7; --accent:#E3120B; --chart-1:#E3120B; --chart-2:#0D47A1; --chart-3:#4A7C59; --good:#1f7a3a; --bad:#9c2a25; }\n```\n\n### 财新配色\n\n```css\n:root { --paper:#F5F5F3; --accent:#0055AA; --chart-1:#0055AA; --chart-2:#3A7BBF; --chart-3:#7BAFD4; --chart-4:#C0392B; --good:#1f7a3a; --bad:#9c2a25; }\n```\n\n### 强调色块硬约束\n\n```\n🚫 禁止用近黑色做强调色块背景\n✅ 强调色块必须用 --accent 品牌色做底色 + 白色文字\n✅ 洞察框/关键数据卡/公式结果块 → background:var(--accent); color:var(--paper);\n```\n\n---\n\n## 字号反比阶梯\n\n> 越大越细，越小越粗——与guizang-ppt-skill瑞士风一致\n\n| 字号区间 | 字重 | 典型场景 |\n|---------|------|---------|\n| ≥48px (num-mega) | 200 | billboard大数字、KPI主值 |\n| 28-36px (num-kpi) | 200-300 | KPI卡片数字 |\n| 18-24px (title) | 500 | 图表标题 |\n| 13-15px (data-label) | 500 | 数据标注、图表标签 |\n| 11-12px (axis/legend) | 400 | 轴刻度、图例文字 |\n| 10-11px (source/meta) | 400 | 数据来源、辅助说明 |\n\n```css\n.num-mega { font-size:64px; font-weight:200; }\n.num-kpi  { font-size:28px; font-weight:200; }\n.title    { font-size:22px; font-weight:500; }\n.data-label { font-size:13px; font-weight:500; }\n.axis-label { font-size:11px; font-weight:400; }\n.source     { font-size:10px; font-weight:400; }\n```\n\n---\n\n## HTML模板骨架\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\"><head><meta charset=\"UTF-8\"><style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root{--ink:#0a0a0a;--paper:#fafaf8;--accent:#002FA7;--muted:#737373;--rule:#d4d4d2;--surface:#ffffff;--surface-2:#f2f2f0;--good:#1aaf6c;--bad:#e0445a;--warn:#f5a524;--font-body:'Noto Sans SC',sans-serif;--font-data:'Inter','Noto Sans SC',sans-serif;--chart-1:#E69F00;--chart-2:#56B4E9;--chart-3:#009E73;--chart-4:#D55E00}\n*{margin:0;padding:0;box-sizing:border-box}\n.num{font-family:var(--font-data);font-feature-settings:'tnum' on;letter-spacing:-0.02em}\nhtml,body{width:640px;overflow:hidden;font-family:var(--font-body);background:var(--paper);color:var(--ink)}\n</style></head><body><!-- 图表内容 --></body></html>\n```\n\n### KPI+Sparkline组件\n\n```html\n<div class=\"kpi-grid\"><div class=\"kpi-card\"><div class=\"kpi-label\">月活用户</div><div class=\"kpi-value num\">2.4M</div><div class=\"kpi-delta up\">+12.3%</div><svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\"><polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\" points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/></svg></div></div>\n```\n```css\n.kpi-grid{display:flex;gap:10px} .kpi-card{flex:1;padding:14px;background:var(--surface);border:1px solid var(--rule)} .kpi-value{font-size:28px;font-weight:200} .kpi-delta.up{color:var(--good)} .kpi-delta.down{color:var(--bad)} .sparkline{width:100%;height:24px;margin-top:6px}\n```\n\n---\n\n## Chart Styling Rules\n\n- 标题18-24px/500; 轴标12px/400 --muted; 数据标13px/500 .num; 来源10-11px --muted\n- 数值用.num → --font-data (Inter) + tnum等宽对齐\n- 卡片用--surface; 次级表面用--surface-2; 强调块用--accent+白字\n- 涨--good; 跌--bad; 警告--warn\n- 每张图底部必须标注数据来源\n- Okabe-Ito 8色+冗余编码，单图不超4色\n- 每张图表必须包含：标题+数据主体+轴标签/图例+数据来源\n- 版式锁定：数据图表必须从C01-C18中选择，不允许自创版式\n\n---\n\n## 详细参考文件\n\n| 文件 | 用途 |\n|------|------|\n| references/workflow.md | 完整4步工作流：剖析→推荐→生成→交付 |\n| references/chart-system.md | 完整图表系统：18种版式+三轴决策树+8条拦截规则+色板+7种HTML骨架 |\n| references/design-tokens.md | 完整设计令牌：3套财经配色详解+字号规范+间距规范+画幅弹性规则 |\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn75zj7vzdyvap84adxa8heyyd82f5eh\",\n  \"slug\": \"wx-huitu\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1781491614155\n}\n\nFile v2.0.0:references/chart-system.md\n\n# 图表系统参考\n\n> 18种图型 + 三轴决策树 + 拦截规则 + 三画幅系统 + HTML骨架\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. 三轴决策树\n\n```\n数据关系是什么？（轴1: 变量类型）\n│\n├─ 类别比较（1分类 + 1连续）\n│   ├─ 少类别 (2-6) → bar-chart\n│   ├─ 多类别 (7+) → horizontal-bar-chart\n│   └─ 分组对比 → grouped-bar\n│\n├─ 时间变化（1时间 + 1连续）\n│   ├─ 少数据点 (2-8) → bar-chart\n│   ├─ 多数据点 (8+) → line-chart\n│   └─ 趋势+总量 → area-chart\n│\n├─ 占比关系（1分类看构成）\n│   ├─ 少分段 (2-5) → donut-chart\n│   ├─ 多分段 (6+) → treemap\n│   └─ 分组占比 → stacked-bar\n│\n├─ 相关性（2+连续变量）\n│   ├─ 2变量 → scatter-plot\n│   ├─ 2变量+阈值 → quadrant-chart\n│   └─ 3+变量 → bubble-chart\n│\n├─ 流程（顺序/并行步骤）\n│   ├─ 顺序步骤 → flow-chart\n│   ├─ 并行泳道 → swimlane-chart\n│   └─ 状态转换 → state-machine\n│\n├─ 层级（嵌套/分类结构）\n│   ├─ 树结构 → tree-chart\n│   └─ 分层架构 → layered-diagram\n│\n├─ 集合重叠\n│   └─ 2-3集合 → venn-diagram\n│\n├─ 累积变化\n│   └─ 正负贡献 → waterfall-chart\n│\n└─ 多维度对比\n    └─ 行列结构 → comparison-table\n```\n\n### 同一数据不同论点 → 不同图\n\n| 数据 | 论点\"比较\" | 论点\"趋势\" | 论点\"占比\" |\n|------|-----------|-----------|-----------|\n| 2020-2024年收入 | bar-chart（4组对比） | line-chart（增长趋势） | — |\n| 3产品市场份额 | bar-chart（谁最大） | — | donut-chart（各占多少） |\n| 用户画像标签 | h-bar-chart（排名） | — | treemap（层级占比） |\n\n---\n\n## 2. 18种图型\n\n| # | Type | When | Data Shape | 画幅 |\n|---|------|------|-----------|------|\n| 1 | **bar-chart** | 2-6类别比较 | `[{label, value, color?}]` | 标准 |\n| 2 | **horizontal-bar-chart** | 7+类别或长标签 | `[{label, value, color?}]` | 标准 |\n| 3 | **line-chart** | 8+时间点趋势 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 4 | **donut-chart** | 2-5段占比 | `[{label, value, color}]` | 方版 |\n| 5 | **quadrant-chart** | 2轴+阈值线 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 6 | **flow-chart** | 3-8步顺序流程 | `{steps:[{id,label,type?}], connections:[{from,to}]}` | 宽幅 |\n| 7 | **swimlane-chart** | 2-4角色并行流程 | `{lanes:[{name,steps}]}` | 宽幅 |\n| 8 | **state-machine** | 状态转换+条件 | `{states, transitions}` | 方版 |\n| 9 | **tree-chart** | 层级结构 | `{root:{label,children}}` | 标准 |\n| 10 | **layered-diagram** | 分层架构 | `{layers:[{name,items,color?}]}` | 标准 |\n| 11 | **venn-diagram** | 2-3集合重叠 | `{sets, overlap}` | 方版 |\n| 12 | **waterfall-chart** | 累积正负贡献 | `[{label,value,type}]` | 标准 |\n| 13 | **treemap** | 多类别层级占比 | `[{label,value,color?,children?}]` | 标准 |\n| 14 | **scatter-plot** | 2连续变量关系 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 15 | **grouped-bar** | 分组类别对比 | `{labels, groups:[{name,values,color?}]}` | 宽幅 |\n| 16 | **stacked-bar** | 分组占比对比 | `{labels, segments:[{name,values,color?}]}` | 标准 |\n| 17 | **area-chart** | 趋势+总量 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 18 | **comparison-table** | 多维度行列对比 | `{headers, rows:[{label, values}]}` | 标准 |\n\n### 补充: data-billboard（非独立图型，用于单一数值高亮）\n\n| Type | When | Data Shape | 画幅 |\n|------|------|-----------|------|\n| **data-billboard** | 单一关键数值 | `{value, label, context?, stats:[{value,label}]}` | 标准 |\n\n---\n\n## 3. 拦截规则详解\n\n| # | 触发条件 | 问题 | 替代方案 | 话术模板 |\n|---|---------|------|---------|---------|\n| I1 | 2个数据点画折线 | 2点折线无趋势意义 | bar-chart | \"2个数据点画折线图看不出趋势，改用柱状图更直观\" |\n| I2 | 7+类别画donut | 角度比较超过5段人眼难分 | horizontal-bar-chart | \"7+类别画环形图角度难区分，横向柱状图长度比较更清晰\" |\n| I3 | 单一数值做数据图 | 1个数字不需要图 | data-billboard | \"单个数值不需要复杂图表，用数字高亮卡更有冲击力\" |\n| I4 | 一图>2论点 | 信息过载 | 拆图 | \"一张图承载多个论点会稀释每个论点的传达力，建议拆分\" |\n| I5 | 类别变量用折线 | 暗示不存在的连续关系 | bar-chart | \"类别变量之间没有连续关系，折线会误导读者，改用柱状图\" |\n| I6 | Y轴不从0起 | 误导小差异看起来很大 | 加断裂标记或从0起 | \"Y轴不从0起会夸大差异，建议从0起或加明显的轴断裂标记\" |\n| I7 | rainbow/jet色图 | 感知不均匀 | 主题色板+冗余编码 | \"彩虹色图感知不均匀会造假峰，改用色盲安全色板\" |\n| I8 | 图例压数据 | 遮挡关键信息 | 调整图例位置 | \"图例遮挡了数据，建议移到空白区域\" |\n\n---\n\n## 4. 色盲安全色板\n\n### Okabe-Ito 8色（默认）\n\n```css\n:root {\n  --chart-1: #E69F00; /* 橙 */\n  --chart-2: #56B4E9; /* 天蓝 */\n  --chart-3: #009E73; /* 青绿 */\n  --chart-4: #D55E00; /* 朱红 */\n  --chart-5: #CC79A7; /* 粉紫 */\n  --chart-6: #F0E442; /* 黄 */\n  --chart-7: #0072B2; /* 深蓝 */\n  --chart-8: #000000; /* 黑 */\n}\n```\n\n### 使用规则\n\n1. **单图不超4色** — 超过4类时合并小类为\"其他\"\n2. **冗余编码** — 不同类别加不同形状(marker)或线型(dashed/solid/dotted)\n3. **灰度可分** — 出图前想象灰度版，颜色仍可区分\n4. **强调色** — 需要高亮某一类时用 `--accent`，其余用 `--chart-*`\n\n### 冗余编码参考\n\n| 类别 | 颜色 | 形状 | 线型 |\n|------|------|------|------|\n| A | --chart-1 | circle ● | solid |\n| B | --chart-2 | square ■ | dashed |\n| C | --chart-3 | triangle ▲ | dotted |\n| D | --chart-4 | diamond ◆ | dash-dot |\n\n---\n\n## 5. Chart Styling Rules\n\n- **Typography**: 标题 `--font-body` 18-24px/500; 轴标 12px/400 `--muted`; 数据标 13px/500 `.num`; 来源 10-11px `--muted`\n- **Data Font**: 数值用 `.num` class → `--font-data` (Inter) + `tnum` 等宽对齐\n- **Spacing**: 内边距 36-48px; 图例间距 16px; KPI卡片间距 8-12px\n- **Surface**: 卡片用 `--surface`; 次级表面用 `--surface-2`; 强调块用 `--accent` + 白字\n- **Semantic Colors**: 涨 `--good`; 跌 `--bad`; 警告 `--warn`\n- **SVG**: 用 `viewBox` + `width:100%` + `height:auto`\n- **A11y**: `role=\"img\"` + `aria-label`; 不纯靠颜色区分\n- **Source**: 每张图底部必须标注数据来源\n- **Accent Block**: 强调色块必须用 `--accent` 品牌色，禁止近黑色\n\n---\n\n## 6. HTML骨架（每种图型）\n\n### 通用头部（所有骨架共享）\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root {\n  --ink: #0a0a0a; --paper: #fafaf8; --accent: #002FA7;\n  --muted: #737373; --rule: #d4d4d2;\n  --surface: #ffffff; --surface-2: #f2f2f0;\n  --good: #1aaf6c; --bad: #e0445a; --warn: #f5a524;\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n  --chart-1: #E69F00; --chart-2: #56B4E9; --chart-3: #009E73; --chart-4: #D55E00;\n}\n* { margin:0; padding:0; box-sizing:border-box; }\n.num { font-family:var(--font-data); font-feature-settings:'tnum' on; letter-spacing:-0.02em; }\n</style>\n```\n\n### KPI卡片+Sparkline组件（可嵌入任何图型头部）\n\n```html\n<div class=\"kpi-grid\">\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">月活用户</div>\n    <div class=\"kpi-value num\">2.4M</div>\n    <div class=\"kpi-delta up\">+12.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\"\n        points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">付费率</div>\n    <div class=\"kpi-value num\">8.7%</div>\n    <div class=\"kpi-delta down\">-0.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"1.5\"\n        points=\"0,8 10,10 20,9 30,12 40,11 50,14 60,13 70,16 80,15\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">ARPU</div>\n    <div class=\"kpi-value num\">¥42</div>\n    <div class=\"kpi-delta up\">+5.1%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"1.5\"\n        points=\"0,20 10,18 20,16 30,14 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n</div>\n```\n\n```css\n.kpi-grid { display:flex; gap:10px; margin-bottom:20px; }\n.kpi-card { flex:1; padding:14px; background:var(--surface); border:1px solid var(--rule); border-radius:4px; }\n.kpi-label { font-size:10px; color:var(--muted); margin-bottom:4px; }\n.kpi-value { font-size:28px; font-weight:200; line-height:1; }\n.kpi-delta { font-size:10px; font-weight:500; margin-top:2px; }\n.kpi-delta.up { color:var(--good); }\n.kpi-delta.down { color:var(--bad); }\n.sparkline { width:100%; height:24px; margin-top:6px; }\n```\n\n### bar-chart (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-area { display:flex; flex-direction:column; gap:12px; }\n.bar-row { display:flex; align-items:center; gap:12px; }\n.bar-label { width:80px; font-size:13px; text-align:right; flex-shrink:0; }\n.bar-track { flex:1; height:32px; background:var(--surface-2); border-radius:2px; position:relative; }\n.bar-fill { height:100%; border-radius:2px; display:flex; align-items:center; justify-content:flex-end; padding-right:10px; }\n.bar-value { font-size:12px; font-weight:500; color:var(--paper); }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">数据对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-area\">\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别A</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:85%;background:var(--chart-1)\"><span class=\"bar-value num\">85%</span></div></div>\n    </div>\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别B</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:62%;background:var(--chart-2)\"><span class=\"bar-value num\">62%</span></div></div>\n    </div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### line-chart (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 20px; }\n.chart-container { width:544px; }\n.legend { display:flex; gap:20px; margin-bottom:12px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:12px; }\n.legend-dot { width:10px; height:10px; border-radius:50%; }\nsvg { width:100%; height:auto; }\n.axis-label { font-size:11px; fill:var(--muted); }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">趋势</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-container\">\n    <div class=\"legend\">\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>系列A</div>\n      <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>系列B</div>\n    </div>\n    <svg viewBox=\"0 0 544 280\" xmlns=\"http://www.w3.org/2000/svg\">\n      <line x1=\"50\" y1=\"20\" x2=\"530\" y2=\"20\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"80\" x2=\"530\" y2=\"80\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"140\" x2=\"530\" y2=\"140\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"200\" x2=\"530\" y2=\"200\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <line x1=\"50\" y1=\"260\" x2=\"530\" y2=\"260\" stroke=\"var(--rule)\" stroke-width=\"0.5\"/>\n      <polyline points=\"50,200 150,160 250,120 350,80 450,60 530,40\" fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"2\"/>\n      <polyline points=\"50,220 150,200 250,180 350,160 450,140 530,120\" fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"2\" stroke-dasharray=\"6,3\"/>\n      <text x=\"50\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2020</text>\n      <text x=\"150\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2021</text>\n      <text x=\"250\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2022</text>\n      <text x=\"350\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2023</text>\n      <text x=\"450\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2024</text>\n      <text x=\"530\" y=\"280\" class=\"axis-label\" text-anchor=\"middle\">2025</text>\n    </svg>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### donut-chart (方版 640×640)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; height:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; height:640px; padding:48px; display:flex; flex-direction:column; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-center { flex:1; display:flex; align-items:center; justify-content:center; }\nsvg { width:320px; height:320px; }\n.legend { display:flex; flex-wrap:wrap; gap:16px; justify-content:center; margin-top:24px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:13px; }\n.legend-dot { width:12px; height:12px; border-radius:2px; }\n.source { font-size:11px; color:var(--muted); margin-top:auto; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">占比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-center\">\n    <svg viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\">\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"30\"\n              stroke-dasharray=\"132 308\" stroke-dashoffset=\"0\" transform=\"rotate(-90 100 100)\"/>\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"30\"\n              stroke-dasharray=\"110 330\" stroke-dashoffset=\"-132\" transform=\"rotate(-90 100 100)\"/>\n      <circle cx=\"100\" cy=\"100\" r=\"70\" fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"30\"\n              stroke-dasharray=\"88 352\" stroke-dashoffset=\"-242\" transform=\"rotate(-90 100 100)\"/>\n      <text x=\"100\" y=\"96\" text-anchor=\"middle\" font-size=\"28\" font-weight=\"200\" fill=\"var(--ink)\" class=\"num\">100%</text>\n      <text x=\"100\" y=\"116\" text-anchor=\"middle\" font-size=\"11\" fill=\"var(--muted)\">总计</text>\n    </svg>\n  </div>\n  <div class=\"legend\">\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>A 30%</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>B 25%</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-3)\"></div>C 20%</div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### data-billboard (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:48px; display:flex; flex-direction:column; min-height:480px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.num-mega { font-size:64px; font-weight:200; line-height:1; color:var(--ink); margin:auto 0 0; }\n.num-label { font-size:16px; font-weight:500; color:var(--accent); margin-top:12px; letter-spacing:0.05em; }\n.num-context { font-size:14px; color:var(--muted); line-height:1.6; margin-top:8px; max-width:400px; }\n.stats { display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px; margin-top:auto; }\n.stat-card { background:var(--accent); color:var(--paper); padding:16px; border-radius:4px; }\n.stat-card .num { font-size:22px; font-weight:200; }\n.stat-card .label { font-size:11px; color:rgba(255,255,255,0.7); margin-top:4px; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">关键数据</div>\n  <p class=\"num-mega num\">2.4 亿</p>\n  <div class=\"num-label\">中国灵活就业人口</div>\n  <p class=\"num-context\">占全国就业人口的近三分之一</p>\n  <div class=\"stats\">\n    <div class=\"stat-card\"><div class=\"num\">+12%</div><div class=\"label\">年增长率</div></div>\n    <div class=\"stat-card\"><div class=\"num\">68%</div><div class=\"label\">90后占比</div></div>\n    <div class=\"stat-card\"><div class=\"num\">3.2万</div><div class=\"label\">年均收入</div></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### flow-chart (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 28px; }\n.flow { display:flex; flex-direction:column; gap:0; }\n.step { display:flex; align-items:flex-start; gap:16px; padding:14px 0; }\n.step + .step { border-top:1px solid var(--rule); }\n.step-num { font-size:13px; font-weight:500; color:var(--accent); width:28px; flex-shrink:0; padding-top:2px; }\n.step-title { font-size:16px; font-weight:500; line-height:1.3; }\n.step-desc { font-size:13px; color:var(--muted); line-height:1.4; margin-top:4px; }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">流程</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"flow\">\n    <div class=\"step\"><span class=\"step-num\">01</span><div><div class=\"step-title\">步骤一</div><div class=\"step-desc\">描述</div></div></div>\n    <div class=\"step\"><span class=\"step-num\">02</span><div><div class=\"step-title\">步骤二</div><div class=\"step-desc\">描述</div></div></div>\n    <div class=\"step\"><span class=\"step-num\">03</span><div><div class=\"step-title\">步骤三</div><div class=\"step-desc\">描述</div></div></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### grouped-bar (宽幅 640×400)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:36px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 16px; }\n.legend { display:flex; gap:20px; margin-bottom:16px; }\n.legend-item { display:flex; align-items:center; gap:6px; font-size:12px; }\n.legend-dot { width:10px; height:10px; border-radius:2px; }\n.chart-area { display:flex; align-items:flex-end; gap:24px; height:200px; padding-bottom:28px; border-bottom:1px solid var(--rule); }\n.group { display:flex; flex-direction:column; align-items:center; flex:1; }\n.bars { display:flex; gap:4px; align-items:flex-end; height:200px; }\n.bar { width:28px; border-radius:2px 2px 0 0; transition:height 0.3s; }\n.group-label { font-size:11px; color:var(--muted); margin-top:8px; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">分组对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"legend\">\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-1)\"></div>系列A</div>\n    <div class=\"legend-item\"><div class=\"legend-dot\" style=\"background:var(--chart-2)\"></div>系列B</div>\n  </div>\n  <div class=\"chart-area\">\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:80%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:60%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q1</span></div>\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:90%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:70%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q2</span></div>\n    <div class=\"group\"><div class=\"bars\"><div class=\"bar\" style=\"height:75%;background:var(--chart-1)\"></div><div class=\"bar\" style=\"height:85%;background:var(--chart-2)\"></div></div><span class=\"group-label\">Q3</span></div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n### comparison-table (标准 640×480)\n\n```html\n<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 20px; }\ntable { width:100%; border-collapse:collapse; font-size:13px; }\nthead th { text-align:left; padding:10px 12px; background:var(--surface-2); color:var(--muted); font-weight:500; font-size:11px; letter-spacing:0.05em; }\ntbody td { padding:10px 12px; border-bottom:1px solid var(--rule); }\ntbody tr:hover { background:var(--surface-2); }\n.delta-up { color:var(--good); font-weight:500; }\n.delta-down { color:var(--bad); font-weight:500; }\n.source { font-size:11px; color:var(--muted); margin-top:16px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">对比</div>\n  <h2 class=\"title\">标题</h2>\n  <table>\n    <thead><tr><th>指标</th><th>2023</th><th>2024</th><th>变化</th></tr></thead>\n    <tbody>\n      <tr><td>收入</td><td class=\"num\">1.2M</td><td class=\"num\">1.5M</td><td class=\"delta-up num\">+25%</td></tr>\n      <tr><td>成本</td><td class=\"num\">800K</td><td class=\"num\">950K</td><td class=\"delta-down num\">+19%</td></tr>\n    </tbody>\n  </table>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>\n```\n\n---\n\n## 7. 自动选图集成\n\n内容解析后自动建议：\n\n| 数据信号 | 推荐图型 | 画幅 |\n|---------|---------|------|\n| \"A占X%，B占Y%\" | bar-chart / h-bar-chart | 标准 |\n| \"逐年/逐月增长\" | line-chart | 宽幅 |\n| \"分为三部分/占比\" | donut-chart | 方版 |\n| \"A→B→C步骤\" | flow-chart | 宽幅 |\n| \"包含/下属/层级\" | tree-chart / layered-diagram | 标准 |\n| \"正相关/负相关\" | scatter-plot | 方版 |\n| \"同时属于/交集\" | venn-diagram | 方版 |\n| \"贡献了/减少了\" | waterfall-chart | 标准 |\n| \"A和B各多少，按季度\" | grouped-bar | 宽幅 |\n| \"趋势+总量\" | area-chart | 宽幅 |\n| \"多维度对比\" | comparison-table | 标准 |\n\nFile v2.0.0:references/design-tokens.md\n\n# 设计令牌参考\n\n> CSS变量体系 + 三套财经配色 + 三画幅系统 + 字号规范\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. CSS变量体系\n\n### 通用变量（所有图表共享）\n\n```css\n:root {\n  /* 基础色 */\n  --ink: #0a0a0a;\n  --paper: #fafaf8;\n  --accent: #002FA7;\n  --muted: #737373;\n  --rule: #d4d4d2;\n\n  /* 表面层级 */\n  --surface: #ffffff;          /* 卡片白 */\n  --surface-2: #f2f2f0;        /* 次级表面（浅灰） */\n\n  /* 语义色 — 涨跌/状态 */\n  --good: #1aaf6c;             /* 正向-绿（涨/达标/好） */\n  --bad: #e0445a;              /* 负向-红（跌/未达标/差） */\n  --warn: #f5a524;             /* 警告-琥珀（注意/中性偏负） */\n\n  /* 字体 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;  /* 数据专用，等宽数字 */\n\n  /* 图表色板 (Okabe-Ito 色盲安全) */\n  --chart-1: #E69F00;\n  --chart-2: #56B4E9;\n  --chart-3: #009E73;\n  --chart-4: #D55E00;\n  --chart-5: #CC79A7;\n  --chart-6: #F0E442;\n  --chart-7: #0072B2;\n  --chart-8: #000000;\n}\n```\n\n### 数据字体对齐\n\n```css\n.num {\n  font-family: var(--font-data);\n  font-feature-settings: 'tnum' on;\n  letter-spacin\n\nArchive v1.0.0: 7 files, 16971 bytes\n\nFiles: CHANGELOG.md (575b), references/chart-system.md (19068b), references/design-tokens.md (2501b), references/workflow.md (10964b), skill-card.md (2515b), SKILL.md (4301b), _meta.json (127b)","readmeExcerpt":"Skill: Wx Huitu Owner: edwardwason Summary: 公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图... Tags: chart:2.2.0, data:2.1.0, figure:2.1.0, latest:2.2.0, puppeteer:2.2.0, visualization:2.2.0, wechat:2.2.0 Version history: v2.2.0 | 2026-07-14T11:32:44.922Z | user Security hardening: fix vague triggers, gate cl","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"数据关系是什么？（轴1: 变量类型）\n│\n├─ 类别比较（1分类 + 1连续）\n│   ├─ 少类别 (2-6) → bar-chart\n│   ├─ 多类别 (7+) → horizontal-bar-chart\n│   └─ 分组对比 → grouped-bar\n│\n├─ 时间变化（1时间 + 1连续）\n│   ├─ 少数据点 (2-8) → bar-chart\n│   ├─ 多数据点 (8+) → line-chart\n│   └─ 趋势+总量 → area-chart\n│\n├─ 占比关系（1分类看构成）\n│   ├─ 少分段 (2-5) → donut-chart\n│   ├─ 多分段 (6+) → treemap\n│   └─ 分组占比 → stacked-bar\n│\n├─ 相关性（2+连续变量）\n│   ├─ 2变量 → scatter-plot\n│   ├─ 2变量+阈值 → quadrant-chart\n│   └─ 3+变量 → bubble-chart\n│\n├─ 流程（顺序/并行步骤）\n│   ├─ 顺序步骤 → flow-chart\n│   ├─ 并行泳道 → swimlane-chart\n│   └─ 状态转换 → state-machine\n│\n├─ 层级（嵌套/分类结构）\n│   ├─ 树结构 → tree-chart\n│   └─ 分层架构 → layered-diagram\n│\n├─ 集合重叠\n│   └─ 2-3集合 → venn-diagram\n│\n├─ 累积变化\n│   └─ 正负贡献 → waterfall-chart\n│\n└─ 多维度对比\n    └─ 行列结构 → comparison-table"},{"language":"css","snippet":":root {\n  --chart-1: #E69F00; /* 橙 */\n  --chart-2: #56B4E9; /* 天蓝 */\n  --chart-3: #009E73; /* 青绿 */\n  --chart-4: #D55E00; /* 朱红 */\n  --chart-5: #CC79A7; /* 粉紫 */\n  --chart-6: #F0E442; /* 黄 */\n  --chart-7: #0072B2; /* 深蓝 */\n  --chart-8: #000000; /* 黑 */\n}"},{"language":"html","snippet":"<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@200;300;400;500;700&display=swap');\n:root {\n  --ink: #0a0a0a; --paper: #fafaf8; --accent: #002FA7;\n  --muted: #737373; --rule: #d4d4d2;\n  --surface: #ffffff; --surface-2: #f2f2f0;\n  --good: #1aaf6c; --bad: #e0445a; --warn: #f5a524;\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n  --chart-1: #E69F00; --chart-2: #56B4E9; --chart-3: #009E73; --chart-4: #D55E00;\n}\n* { margin:0; padding:0; box-sizing:border-box; }\n.num { font-family:var(--font-data); font-feature-settings:'tnum' on; letter-spacing:-0.02em; }\n</style>"},{"language":"html","snippet":"<div class=\"kpi-grid\">\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">月活用户</div>\n    <div class=\"kpi-value num\">2.4M</div>\n    <div class=\"kpi-delta up\">+12.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-1)\" stroke-width=\"1.5\"\n        points=\"0,18 10,16 20,14 30,15 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">付费率</div>\n    <div class=\"kpi-value num\">8.7%</div>\n    <div class=\"kpi-delta down\">-0.3%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-2)\" stroke-width=\"1.5\"\n        points=\"0,8 10,10 20,9 30,12 40,11 50,14 60,13 70,16 80,15\"/>\n    </svg>\n  </div>\n  <div class=\"kpi-card\">\n    <div class=\"kpi-label\">ARPU</div>\n    <div class=\"kpi-value num\">¥42</div>\n    <div class=\"kpi-delta up\">+5.1%</div>\n    <svg class=\"sparkline\" viewBox=\"0 0 80 24\" preserveAspectRatio=\"none\">\n      <polyline fill=\"none\" stroke=\"var(--chart-3)\" stroke-width=\"1.5\"\n        points=\"0,20 10,18 20,16 30,14 40,12 50,10 60,8 70,6 80,4\"/>\n    </svg>\n  </div>\n</div>"},{"language":"css","snippet":".kpi-grid { display:flex; gap:10px; margin-bottom:20px; }\n.kpi-card { flex:1; padding:14px; background:var(--surface); border:1px solid var(--rule); border-radius:4px; }\n.kpi-label { font-size:10px; color:var(--muted); margin-bottom:4px; }\n.kpi-value { font-size:28px; font-weight:200; line-height:1; }\n.kpi-delta { font-size:10px; font-weight:500; margin-top:2px; }\n.kpi-delta.up { color:var(--good); }\n.kpi-delta.down { color:var(--bad); }\n.sparkline { width:100%; height:24px; margin-top:6px; }"},{"language":"html","snippet":"<!-- 通用头部 + 以下 -->\n<style>\nhtml, body { width:640px; overflow:hidden; font-family:var(--font-body); background:var(--paper); color:var(--ink); }\n.page { width:640px; padding:40px 48px; }\n.kicker { font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--accent); margin-bottom:6px; }\n.title { font-size:22px; font-weight:500; line-height:1.3; margin:0 0 24px; }\n.chart-area { display:flex; flex-direction:column; gap:12px; }\n.bar-row { display:flex; align-items:center; gap:12px; }\n.bar-label { width:80px; font-size:13px; text-align:right; flex-shrink:0; }\n.bar-track { flex:1; height:32px; background:var(--surface-2); border-radius:2px; position:relative; }\n.bar-fill { height:100%; border-radius:2px; display:flex; align-items:center; justify-content:flex-end; padding-right:10px; }\n.bar-value { font-size:12px; font-weight:500; color:var(--paper); }\n.source { font-size:11px; color:var(--muted); margin-top:20px; }\n</style>\n<body>\n<div class=\"page\">\n  <div class=\"kicker\">数据对比</div>\n  <h2 class=\"title\">标题</h2>\n  <div class=\"chart-area\">\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别A</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:85%;background:var(--chart-1)\"><span class=\"bar-value num\">85%</span></div></div>\n    </div>\n    <div class=\"bar-row\">\n      <span class=\"bar-label\">类别B</span>\n      <div class=\"bar-track\"><div class=\"bar-fill\" style=\"width:62%;background:var(--chart-2)\"><span class=\"bar-value num\">62%</span></div></div>\n    </div>\n  </div>\n  <div class=\"source\">数据来源：XXX</div>\n</div>\n</body>"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: \"wx-huitu\"\r\nslug: \"wx-huitu\"\r\ndisplayName: \"wx-huitu\"\r\nversion: \"2.2.0\"\r\nsummary: \"公众号数据绘图专家 — 18种版式+三轴决策+拦截规则+Puppeteer截图交付\"\r\nlicense: \"MIT-0\"\r\ndescription: \"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图/杂志版式/全文配图/代码编辑.\"\r\n---\r\n\r\n# wx-huitu — 公众号数据绘图专家\r\n\r\n> 来源识别: wx-huitu 由 TRAE SOLO 创建与维护。仓库: https://github.com/EdwardWason/wx-huitu\r\n\r\n**Persona**: 你是一位数据可视化顾问。你的首要能力是\"思考与判断\"——先理解数据再选图，先想清楚论证目标再动笔。\r\n\r\n## Task\r\n\r\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。每张图表：剖析数据 → 推荐版式 → 生成 HTML → Puppeteer 截图 → PNG → 保存桌面 → 同步飞书云盘。\r\n\r\n**核心交付物**: PNG 图片，不是代码。\r\n\r\n## Out of Scope\r\n\r\n- **封面/封底** → 用 wx-peitu\r\n- **金句图/宣言卡/转场卡** → 用 wx-peitu\r\n- **全文配图方案** → 用 wx-peitu\r\n- **代码编辑** → 用代码工具\r\n- **交互式图表** → 用 plotly/echarts 独立部署\r\n\r\n---\r\n\r\n## Workflow (4步)\r\n\r\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\r\n\r\n### Step 1: Data Profiling (静默)\r\n\r\n分析每个数据单元的三轴属性：\r\n\r\n**轴1: 变量类型** — 连续/分类/时间/层级/集合\r\n**轴2: 论证意图** — 比较/趋势/占比/关系/流程/层级/重叠/累积\r\n**轴3: 数据形态** — 数据点数量/类别数/是否有异常值/是否有分组\r\n\r\n### Step 2: Chart Recommendation (确认点)\r\n\r\n基于三轴分析推荐版式，必须给出推荐+理由+1-2备选。\r\n\r\n8条拦截规则：I1(2点折线→C01) / I2(7+类别donut→C02) / I3(单值做图→C13) / I4(一图多论点→拆图) / I5(类别折线→C01) / I6(Y轴不从0起) / I7(rainbow色图→安全色板) / I8(图例压数据)\r\n\r\n### Step 3: Style + Generate HTML\r\n\r\n1问定风格：A.克制风 / B.品牌DNA / C.高端财经(C1麦肯锡/C2经济学人/C3财新) / D.指定色系\r\n\r\n生成独立HTML文件（内联CSS+SVG+固定尺寸+overflow:hidden）。\r\n\r\n### Step 4: Screenshot & Deliver\r\n\r\nPuppeteer-core → PNG → 桌面文件夹。**飞书云盘同步为可选步骤，需用户明确确认后才执行**（用户说\"同步飞书\"或\"上传云盘\"时触发，默认跳过）。\r\n\r\n---\r\n\r\n## 18种版式 (C01-C18) + 三画幅\r\n\r\n> 版式锁定：数据图表必须从 C01-C18 中选择，不允许自创版式。\r\n\r\n| 版式 | 图型 | 适用场景 | 核心CSS类 | 画幅 |\r\n|------|------|---------|----------|------|\r\n| **C01** | bar-chart | 2-6类别比较 | `.c-bar` + `.bar-col` + `.bar-fill` | 标准 640×480 |\r\n| **C02** | h-bar-chart | 7+类别或长标签 | `.c-hbar` + `.bar-row` + `.bar-fill` | 标准 640×480 |\r\n| **C03** | line-chart | 8+时间点趋势 | `.c-line` + svg `polyline` | 宽幅 640×400 |\r\n| **C04** | donut-chart | 2-5段占比 | `.c-donut` + svg `circle` stroke-dasharray | 方版 640×640 |\r\n| **C05** | quadrant-chart | 2轴+阈值线 | `.c-quadrant` + `.q-item` + `.q-crosshair` | 方版 640×640 |\r\n| **C06** | flow-chart | 3-8步顺序流程 | `.c-flow` + `.flow-step` + `.flow-connector` | 宽幅 640×400 |\r\n| **C07** | layered-diagram | 分层架构 | `.c-layer` + `.layer-row` + `.layer-items` | 标准 640×480 |\r\n| **C08** | waterfall-chart | 累积正负贡献 | `.c-waterfall` + `.wf-row` + `.wf-bar` | 标准 640×480 |\r\n| **C09** | grouped-bar | 分组类别对比 | `.c-gbar` + `.gbar-group` + `.gbar-col` | 宽幅 640×400 |\r\n| **C10** | stacked-bar | 分组占比对比 | `.c-sbar` + `.sbar-col` + `.sbar-seg` | 标准 640×480 |\r\n| **C11** | area-chart | 趋势+总量 | `.c-area` + svg `polygon` + `polyline` | 宽幅 640×400 |\r\n| **C12** | comparison-table | 多维度行列对比 | `.c-table` + `table` + `.delta-up/.delta-down` | 标准 640×480 |\r\n| **C13** | data-billboard | 单一关键数值 | `.c-billboard` + `.num-mega` + `.stat-card` | 标准 640×480 |\r\n| **C14** | venn-diagram | 2-3集合重叠 | `.c-venn` + svg `circle` + `.venn-"},{"path":"README.md","content":"# wx-huitu — 公众号数据绘图专家\r\n\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-wx--huitu-blue)](https://clawhub.ai/skills/wx-huitu)\r\n[![SkillHub](https://img.shields.io/badge/SkillHub-wx--huitu-green)](https://skillhub.cn/skills/wx-huitu)\r\n[![版本](https://img.shields.io/badge/版本-2.2.0-brightgreen)](https://github.com/EdwardWason/wx-huitu)\r\n[![协议](https://img.shields.io/badge/协议-MIT--0-lightgrey)](LICENSE)\r\n\r\n输入文章或数据描述，输出公众号内嵌图表 PNG 包。\r\n\r\n## 核心特性\r\n\r\n- **18 种版式** (C01-C18)：柱状/折线/饼图/面积/雷达/散点/漏斗/热力/仪表盘/混合图表等\r\n- **三轴决策框架**：变量类型 × 论证意图 × 数据形态 → 自动推荐最适图型\r\n- **8 条拦截规则**：主动拦截不当选择（2 点折线/7+类别饼图/单值做图等）\r\n- **色盲安全**：Okabe-Ito 8 色色板 + 冗余编码\r\n- **三套财经配色**：麦肯锡/经济学人/财新\r\n- **Puppeteer 截图交付**：HTML → PNG → 桌面文件夹 → 飞书云盘同步\r\n\r\n## 工作流\r\n\r\n```\r\n输入 → Step 1: 数据剖析(静默) → Step 2: 版式推荐(确认) → Step 3: 风格+生成HTML → Step 4: 截图交付+云盘同步\r\n```\r\n\r\n## 使用方式\r\n\r\n在 TRAE IDE 中说：\r\n- \"文章绘图\"\r\n- \"绘图图表\"\r\n- \"画个图表\"\r\n- \"数据图\"\r\n- \"公众号图表\"\r\n\r\n## 不适用范围\r\n\r\n- 封面/封底 → 用 wx-peitu\r\n- 金句图/宣言卡/转场卡 → 用 wx-peitu\r\n- 全文配图方案 → 用 wx-peitu\r\n- 代码编辑 → 用代码工具\r\n- 交互式图表 → 用 plotly/echarts 独立部署\r\n\r\n## ⚠️ 用户须知\r\n\r\n本技能运行时会：\r\n1. **自动写入本地文件**：PNG 图片保存到桌面文件夹\r\n2. **调用 subprocess**：运行 Puppeteer-core 进行浏览器截图（需要系统安装 Chrome 或 Edge）\r\n3. **网络请求**：加载 Google Fonts（Inter / Noto Sans SC）\r\n\r\n**可选操作（默认关闭，需用户明确确认）**：\r\n4. **飞书云盘上传**：仅当用户明确说\"同步飞书\"或\"上传云盘\"时执行。生成的图表（可能含文章源数据）会上传到外部飞书云存储。用户可随时说\"不同步\"跳过。\r\n\r\n## 文件结构\r\n\r\n```\r\nwx-huitu/\r\n├── SKILL.md              # 技能定义（frontmatter + 工作流 + 版式 + CSS + 规则）\r\n├── README.md             # 本文件\r\n├── CHANGELOG.md          # 变更日志\r\n├── LICENSE               # MIT-0\r\n├── .gitignore\r\n├── .claude-plugin/\r\n│   └── plugin.json\r\n└── references/\r\n    ├── workflow.md       # 完整4步工作流\r\n    ├── chart-system.md   # 18种版式+三轴决策树+拦截规则+HTML骨架\r\n    └── design-tokens.md  # 设计令牌：配色+字号+间距+画幅\r\n```\r\n\r\n## 协议\r\n\r\nMIT-0 — 自由使用、修改和分发，无需署名。\r\n\r\n---\r\n\r\n# wx-huitu — WeChat Article Chart Expert\r\n\r\n[![ClawHub](https://img.shields.io/badge/ClawHub-wx--huitu-blue)](https://clawhub.ai/skills/wx-huitu)\r\n[![SkillHub](https://img.shields.io/badge/SkillHub-wx--huitu-green)](https://skillhub.cn/skills/wx-huitu)\r\n[![Version](https://img.shields.io/badge/version-2.2.0-brightgreen)](https://github.com/EdwardWason/wx-huitu)\r\n[![License](https://img.shields.io/badge/license-MIT--0-lightgrey)](LICENSE)\r\n\r\nInput an article or data description, output a WeChat article chart PNG package.\r\n\r\n## Key Features\r\n\r\n- **18 Chart Types** (C01-C18): bar/line/donut/area/radar/scatter/funnel/heatmap/dashboard/mixed charts, etc.\r\n- **Three-Axis Decision Framework**: Variable type × Argument intent × Data shape → Auto-recommend best chart\r\n- **8 Interception Rules**: Proactively block inappropriate choices (2-point line / 7+ category pie / single-value chart, etc.)\r\n- **Colorblind-Safe**: Okabe-Ito 8-color palette + redundant encoding\r\n- **Three Financial Color Schemes**: McKinsey / The Economist / Caixin\r\n- **Puppeteer Screenshot Delivery**: HTML → PNG → Desktop folder (Feishu cloud sync is optional, requires user confirmation)\r\n\r\n## Workflow\r\n\r\n```\r\nInput → Step 1: Data Profiling (silen"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75zj7vzdyvap84adxa8heyyd82f5eh\",\n  \"slug\": \"wx-huitu\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1784028764922\n}"},{"path":"references/chart-system.md","content":"# 图表系统参考\n\n> 18种图型 + 三轴决策树 + 拦截规则 + 三画幅系统 + HTML骨架\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. 三轴决策树\n\n```\n数据关系是什么？（轴1: 变量类型）\n│\n├─ 类别比较（1分类 + 1连续）\n│   ├─ 少类别 (2-6) → bar-chart\n│   ├─ 多类别 (7+) → horizontal-bar-chart\n│   └─ 分组对比 → grouped-bar\n│\n├─ 时间变化（1时间 + 1连续）\n│   ├─ 少数据点 (2-8) → bar-chart\n│   ├─ 多数据点 (8+) → line-chart\n│   └─ 趋势+总量 → area-chart\n│\n├─ 占比关系（1分类看构成）\n│   ├─ 少分段 (2-5) → donut-chart\n│   ├─ 多分段 (6+) → treemap\n│   └─ 分组占比 → stacked-bar\n│\n├─ 相关性（2+连续变量）\n│   ├─ 2变量 → scatter-plot\n│   ├─ 2变量+阈值 → quadrant-chart\n│   └─ 3+变量 → bubble-chart\n│\n├─ 流程（顺序/并行步骤）\n│   ├─ 顺序步骤 → flow-chart\n│   ├─ 并行泳道 → swimlane-chart\n│   └─ 状态转换 → state-machine\n│\n├─ 层级（嵌套/分类结构）\n│   ├─ 树结构 → tree-chart\n│   └─ 分层架构 → layered-diagram\n│\n├─ 集合重叠\n│   └─ 2-3集合 → venn-diagram\n│\n├─ 累积变化\n│   └─ 正负贡献 → waterfall-chart\n│\n└─ 多维度对比\n    └─ 行列结构 → comparison-table\n```\n\n### 同一数据不同论点 → 不同图\n\n| 数据 | 论点\"比较\" | 论点\"趋势\" | 论点\"占比\" |\n|------|-----------|-----------|-----------|\n| 2020-2024年收入 | bar-chart（4组对比） | line-chart（增长趋势） | — |\n| 3产品市场份额 | bar-chart（谁最大） | — | donut-chart（各占多少） |\n| 用户画像标签 | h-bar-chart（排名） | — | treemap（层级占比） |\n\n---\n\n## 2. 18种图型\n\n| # | Type | When | Data Shape | 画幅 |\n|---|------|------|-----------|------|\n| 1 | **bar-chart** | 2-6类别比较 | `[{label, value, color?}]` | 标准 |\n| 2 | **horizontal-bar-chart** | 7+类别或长标签 | `[{label, value, color?}]` | 标准 |\n| 3 | **line-chart** | 8+时间点趋势 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 4 | **donut-chart** | 2-5段占比 | `[{label, value, color}]` | 方版 |\n| 5 | **quadrant-chart** | 2轴+阈值线 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 6 | **flow-chart** | 3-8步顺序流程 | `{steps:[{id,label,type?}], connections:[{from,to}]}` | 宽幅 |\n| 7 | **swimlane-chart** | 2-4角色并行流程 | `{lanes:[{name,steps}]}` | 宽幅 |\n| 8 | **state-machine** | 状态转换+条件 | `{states, transitions}` | 方版 |\n| 9 | **tree-chart** | 层级结构 | `{root:{label,children}}` | 标准 |\n| 10 | **layered-diagram** | 分层架构 | `{layers:[{name,items,color?}]}` | 标准 |\n| 11 | **venn-diagram** | 2-3集合重叠 | `{sets, overlap}` | 方版 |\n| 12 | **waterfall-chart** | 累积正负贡献 | `[{label,value,type}]` | 标准 |\n| 13 | **treemap** | 多类别层级占比 | `[{label,value,color?,children?}]` | 标准 |\n| 14 | **scatter-plot** | 2连续变量关系 | `{xLabel, yLabel, items:[{name,x,y}]}` | 方版 |\n| 15 | **grouped-bar** | 分组类别对比 | `{labels, groups:[{name,values,color?}]}` | 宽幅 |\n| 16 | **stacked-bar** | 分组占比对比 | `{labels, segments:[{name,values,color?}]}` | 标准 |\n| 17 | **area-chart** | 趋势+总量 | `{labels, series:[{name,values,color?}]}` | 宽幅 |\n| 18 | **comparison-table** | 多维度行列对比 | `{headers, rows:[{label, values}]}` | 标准 |\n\n### 补充: data-billboard（非独立图型，用于单一数值高亮）\n\n| Type | When | Data Shape | 画幅 |\n|------|------|-----------|------|\n| **data-billboard** | 单一关键数值 | `{value, label, context?, stats:[{value,label}]}` | 标准 |\n\n---\n\n## 3. 拦截规则详解\n\n| # | 触发条件 | 问题 | 替代方案 | 话术模板 |\n|---|---------|------|---------|---------|\n| I1 | 2个数据点画折线 | 2点折线无趋势意义 | bar-chart | \"2个数据点画折线图看不出趋势，改用柱状图更直观\" |\n| I2 | 7+类别画donut | 角度比较超过5段人眼难分 | horizontal-bar-chart"},{"path":"references/design-tokens.md","content":"# 设计令牌参考\n\n> CSS变量体系 + 三套财经配色 + 三画幅系统 + 字号规范\n> 版本: 2.0 | 画布: 宽幅 640×400 / 标准 640×480 / 方版 640×640\n\n---\n\n## 1. CSS变量体系\n\n### 通用变量（所有图表共享）\n\n```css\n:root {\n  /* 基础色 */\n  --ink: #0a0a0a;\n  --paper: #fafaf8;\n  --accent: #002FA7;\n  --muted: #737373;\n  --rule: #d4d4d2;\n\n  /* 表面层级 */\n  --surface: #ffffff;          /* 卡片白 */\n  --surface-2: #f2f2f0;        /* 次级表面（浅灰） */\n\n  /* 语义色 — 涨跌/状态 */\n  --good: #1aaf6c;             /* 正向-绿（涨/达标/好） */\n  --bad: #e0445a;              /* 负向-红（跌/未达标/差） */\n  --warn: #f5a524;             /* 警告-琥珀（注意/中性偏负） */\n\n  /* 字体 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;  /* 数据专用，等宽数字 */\n\n  /* 图表色板 (Okabe-Ito 色盲安全) */\n  --chart-1: #E69F00;\n  --chart-2: #56B4E9;\n  --chart-3: #009E73;\n  --chart-4: #D55E00;\n  --chart-5: #CC79A7;\n  --chart-6: #F0E442;\n  --chart-7: #0072B2;\n  --chart-8: #000000;\n}\n```\n\n### 数据字体对齐\n\n```css\n.num {\n  font-family: var(--font-data);\n  font-feature-settings: 'tnum' on;\n  letter-spacing: -0.02em;\n}\n```\n\n> Inter 的 `tnum` 特性确保数字等宽对齐，表格和KPI卡片中数值列不会参差不齐。\n\n### 主题切换\n\n只替换 `:root` 变量即可切换主题：\n\n**克制风（默认）**\n```css\n:root { --accent: #002FA7; }\n```\n\n**品牌DNA — 微信绿**\n```css\n:root { --accent: #07C160; }\n```\n\n**品牌DNA — 经济学人红**\n```css\n:root { --accent: #E3120B; }\n```\n\n**品牌DNA — 知乎蓝**\n```css\n:root { --accent: #0066FF; }\n```\n\n**暖色系**\n```css\n:root { --accent: #C0392B; --paper: #f8f6f1; }\n```\n\n---\n\n## 2. 高端财经媒体配色方案\n\n> 三套方案分别对标麦肯锡、经济学人、财新杂志的图表视觉风格。\n> 核心原则：低饱和度、高灰度占比、单色系为主+1个强调色、大面积留白。\n\n### 方案A：麦肯锡 McKinsey\n\n**视觉特征**：深蓝主色+青绿辅助+暖灰底色，克制严谨，数据密度高但视觉噪音低。\n\n```css\n:root {\n  --ink: #1B1B1B;\n  --paper: #F7F5F2;        /* 暖灰白，非纯白 */\n  --accent: #0F4C81;       /* 麦肯锡深蓝 — 强调色块必须用品牌色 */\n  --muted: #6B6B6B;\n  --rule: #D9D5CF;         /* 暖灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #efeee9;    /* 暖灰次级表面 */\n  --good: #2f7d4a;         /* 麦肯锡绿 */\n  --bad: #b53a2a;          /* 麦肯锡红 */\n  --warn: #c47b25;         /* 麦肯锡琥珀 */\n  --font-body: 'Noto Sans SC', sans-serif;\n  --font-data: 'Inter', 'Noto Sans SC', sans-serif;\n\n  /* 麦肯锡图表色板：低饱和度、蓝-青-绿-琥珀渐进 */\n  --chart-1: #0F4C81;      /* 深蓝 Steel Blue */\n  --chart-2: #2A7B9B;      /* 青蓝 Teal Blue */\n  --chart-3: #3A9D8F;      /* 青绿 Sage Teal */\n  --chart-4: #A8B820;      /* 橄榄绿 Olive */\n  --chart-5: #E2A828;      /* 琥珀 Amber */\n  --chart-6: #C76D5E;      /* 赤陶 Terracotta */\n  --chart-7: #7B6B8D;      /* 灰紫 Mauve */\n  --chart-8: #4A4A4A;      /* 深灰 Charcoal */\n}\n```\n\n**使用要点**：\n- 主色用 `--chart-1` 深蓝，强调用 `--chart-5` 琥珀\n- 背景 `--paper` 是暖灰白 #F7F5F2，不是纯白\n- 分割线用暖灰 `--rule` #D9D5CF\n- 数据标签用 `--ink` #1B1B1B，不用纯黑\n- 卡片背景用 `--surface` 或 `rgba(15,76,129,0.04)`\n- **强调色块用 `--accent` (#0F4C81) 深蓝底+白字，禁止用近黑色**\n\n### 方案B：经济学人 The Economist\n\n**视觉特征**：标志性红+深蓝灰+米白底，对比鲜明，标题粗重数据纤细，英式克制。\n\n```css\n:root {\n  --ink: #1D1D1B;\n  --paper: #FDFBF7;        /* 米白，微暖 */\n  --accent: #E3120B;       /* 经济学人红 — 强调色块必须用品牌色 */\n  --muted: #6C6C6C;\n  --rule: #D5D0C8;         /* 米灰分割线 */\n  --surface: #ffffff;\n  --surface-2: #f0ede5;    /* 米灰次级表面 */\n  --good: #1f7a3a;         /* 经济学人绿 */\n  --bad: #9c2a25;      "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图... Skill: Wx Huitu Owner: edwardwason Summary: 公众号数据绘图专家。输入文章或数据描述，输出PNG图表包。当用户说'文章绘图'/'绘图图表'/'画个图表'/'数据图'/'公众号图表'时触发。18种版式(C01-C18)，三轴决策+8条拦截规则，生成HTML+Puppeteer截图。可选飞书云盘同步(需用户确认)。Do NOT use for 封面/封底/金句图... Tags: chart:2.2.0, data:2.1.0, figure:2.1.0, latest:2.2.0, puppeteer:2.2.0, visualization:2.2.0, wechat:2.2.0 Version history: v2.2.0 | 2026-07-14T11:32:44.922Z | user Security hardening: fix vague triggers, gate cl","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":987,"uniquenessScore":58,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:49:41.916Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:49:41.916Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-13T01:50:41.495Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}