larashero3-dotcom/lieflat-charts
一套模板驱动的单色数据可视化 skill,严格从 Lupi、Basics、Glance 与 Interactive gallery 的真实实现生成 HTML 图表;默认优先 Lupi Editorial 与 Lupi Basics,无合适模板时才使用 Glance。
npx skills add https://github.com/larashero3-dotcom/lieflat-charts --skill lieflat-charts
Lieflat Charts 是一套遵循 Agent Skills 格式的单色数据可视化 skill,专注于把数据图表做成有编辑感、能阅读、能组成完整页面的视觉内容。它由 moxt 与 Codex 协同制作,支持 Lupi 编辑叙事型、Glance 快速判断型、Basics 基础编辑型和 Interactive 交互大图。用户给你数据和场合,你产出一个无需构建、双击可打开的单文件 HTML,改数据只需要动顶部一个数组。纯 SVG 图可离线运行;使用 Chart.js、ECharts 或在线字体的图,在未内联依赖时需要联网。默认必须先从 Lupi Editorial 和 Lupi Basics 中选型;只有两者都没有合适模板,或用户明确要求 Glance / dashboard / 三秒快读时,才允许使用 Glance。
怎么查一张图的参考代码:catalog 查到图型 → 打开对应 gallery 文件 → 按卡内标题找到 <div class="card"> 块看结构 → 在 <script> 里搜同名 // ════ 注释块拿渲染代码。不要整页照抄——gallery 是多卡合页,交付给用户的永远是按第九节骨架组装的单图文件。
目标用户是非程序员(写作者、运营、做 PPT 的人)。他们说人话("帮我把这季度转化画一下,发公众号用"),不说图型名。你的职责是把人话翻译成正确的图,而且好看到能直接发出去。
以下规则不是建议,违反任意一条都必须返工:
catalog.md 锁定图型编号,再打开对应 gallery 的真实实现:Lupi 使用 templates/lupi-gallery.html,基础型使用 templates/basics-gallery.html,Glance 使用 templates/glance-gallery.html,交互大图使用 templates/big-*.html。<div class="card"> 和同名 // ════ 图型名 ════ 注释块出发,保留其核心 SVG / Canvas / ECharts 结构、数据编码方式、比例关系和动画节奏。允许替换数据、标题、旁注、来源与必要布局;禁止脱离模板另画一张“看起来差不多”的图,禁止拼接多个模板造混合图型,禁止退回图表库默认样式。图的数量由独立结论数决定,不由“有多少数据列”决定,也不固定要求 5 张或 6 张:
| 请求类型 | 默认成品数量 | 规则 |
|---|---:|---|
| 单个问题 / 单张表 / 一个指标 | 1 | 只交付最强的一张,不为了展示模板而扩展 |
| 两到三个明确结论 | 2–3 | 每张图承担一个不同结论,可共享同一数据源 |
| 一篇文章、论文或完整案例 | 4–6 | 覆盖总览、构成、比较、关系或变化等不同数据形状 |
| 用户明确要求数量 | 按用户要求 | 仍然删除重复图;不足以支撑时说明并少做 |
引用 mono-tokens.js(开源分发时把内容内联进 HTML)。与 token 冲突的取值一律以 token 为准。
颜色
#F0EFEB 和炭黑 #1C1C1A 两极,中间 7 级灰阶 ladder。没有彩色。.card.dark)只给两种图:必须暗底衬托的形(花瓣、发光感丝线/网络)。默认浅卡;每屏(4 卡)最多 1 张暗卡。排版
· 分隔)+ 图 + 来源行(全大写、加字距)。形状
动画
quarticOut 快进快停,不弹跳(波浪入场可用 elasticOut)。点阵 stagger 8–15ms/个,条形 80–130ms/根。obsReveal,带 timer 清理)。prefers-reduced-motion 降级(token 的 CSS 已含)。数据
rnd(i,k) 确定性伪随机,禁用 Math.random()——刷新必须长一样。Math.sqrt(v) 换算半径,不许拿数值直接当半径。同一份 mono 色板下有两种世界观,选哪个看场合和读者愿意花几秒:
| | Glance 系(18 张) | Lupi 系(细读,15 张) |
|---|---|---|
| 基本单元 | 形状(粗柱、大弧、色块) | 记录(一个点 = 一条数据) |
| 线条 | 2px+,理直气壮 | 0.5–0.7px 发丝 |
| 聚合 | 提前聚合好,给结论 | 拒绝聚合,摊开原材料 |
| 读法 | 扫一眼(<10s) | 凑近读(30s+) |
| 场合 | 周报、dashboard、随手贴 | 年报、对外故事页、海报 |
| 引擎 | Chart.js / ECharts | 手写 SVG |
默认策略:Lupi Editorial → Lupi Basics → Glance。 没有明确场合时,禁止默认 Glance。放年报、公众号长文、海报、开源 README、作品集时先选 Lupi Editorial;数据较少或适合熟悉图型时再选 Lupi Basics。只有前两组都没有合适模板,或用户明确要 dashboard、监控、周报、三秒快读时,才进入 Glance 候选池。
全量候选审计不是“把所有图都做一遍”。 先用数据形状筛出能编码同一本体的候选,再把候选分成:
最终选择是三项的交集,不是“哪个模板文件最容易复制”。默认审计先在 Lupi Editorial 与 Lupi Basics 内完成;只有两组都失败才扩展到 Glance。若同一批要做多张图,再对候选做一次全局分配:模板不重复,形状轮换,最多一张暗卡,避免整页变成六张相似的环或横条。
数据少(只有几个百分比)不等于只能 Glance。 Lupi 化的正道是单位分解:把聚合数摊回可数单位(1 点 = 1 人 / 1 百分点),密度来自单位而不是记录数。单位含义写进副标题,只摊诚实单位(占比加总 100 → 100 个点),不编造不存在的个体记录。取整时如果加总不足 100(如 49.0+27.4+13.9+5.0+3.2 → 98),在底注写明「另外 N 人被四舍五入吃掉了」,不凑假单位。
小数据走 Lupi 的路径优先级(经多轮案例验证):
templates/basics-gallery.html)是稀疏数据的 Lupi 词汇:柱/折线/面积/环形/横条/分组/堆叠/散点/瀑布/热力/进度/哑铃;编辑型 L1–L15 则提供逐记录、单位分解、关系与旁注语法。不要因为 basics-gallery.html 里有现成代码就直接选 F 图。同一批产出(一页多图)里模板不重复。 15 张 Lupi 系够轮换;同一数据能被多个模板承接时,选这一批里还没用过的。
编号对应 catalog.md。这些只是候选召回表,箭头和书写顺序不代表优先级。实际选择必须遵守:先检查全部 Lupi Editorial 与 Lupi Basics 候选,确认无合适模板后,才允许采用 Glance 候选。
按顺序问:
templates/big-threads.html:可见线下垫 9px 透明孪生线当热区,hover 单线亮整条路径、hover 标签拉整束、点击钉住。用户要的图不在 48 张里(或发来一张参考图)时,不是做不了,是现场造句。流程四步,第一步不许跳:
mono-tokens.js 拿,不许发明新颜色新字号。产出必须和库里的图"一眼一家人"。参考图翻译的附加规则:识别参考图属于哪个流派(Glance or 编辑部),编辑部风格的密度、旁注、手绘感(blob)是本体的一部分,别做收敛了——almanac 曾因"不敢挤"返工。
敢拒绝比什么都接更可信。以下情况不做,并给替代:
rnd 确定性的?刷新两次长得一样?node --check 过语法(把 <script> 内容抽出来查)。10. 是否完成全量候选审计?至少写下 3 个候选和淘汰理由,而不是只记录“采用了哪个模板”。
11. 如果是一页多图,模板是否全局分配过?有没有相似轮廓重复、暗卡过量、所有图都变成同一种径向图?
12. 每张图是否记录了图型编号、gallery 文件和卡内标题?成品的核心结构是否确实来自该模板,而不是重新发明?
13. 如果使用 Glance,是否写明 Lupi Editorial 与 Lupi Basics 为什么都不适配?如果没有,返工回到 Lupi / Basics。
14. 最后一问:这张图放回所选 gallery 的对应卡片旁边,是不是同一个模板家族,而不只是“风格有点像”?
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Mono — {图名}</title>
<!-- 需要 ECharts 时: -->
<script src="https://cdn.jsdelivr.net/npm/echarts@6/dist/echarts.min.js"></script>
<!-- 需要 Chart.js 时(G1 / G3): -->
<!-- <script src="https://cdn.jsdelivr.net/npm/chart.js@4/dist/chart.umd.min.js"></script> -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="{MONO.FONT.link}" rel="stylesheet">
<style>/* 内联 MONO.CARD_CSS */</style>
</head>
<body>
<div class="grid2">
<div class="card"><!-- 或 card dark / card wide -->
<h2>{结论式标题}</h2>
<div class="sub">{说明} · {图例} · {时间范围}</div>
<!-- 图容器按引擎三选一: -->
<div class="ch" id="ch"></div><!-- ECharts -->
<!-- 手写 SVG: <svg id="ch" viewBox="0 0 400 320"></svg> -->
<!-- Chart.js(G1/G3): <div class="wrap"><canvas id="ch"></canvas></div>,配 .wrap{position:relative;height:320px} -->
<!-- ⚠️ Chart.js 必须挂 <canvas>,套 <div class="ch"> 会报 can't acquire context -->
<div class="src">{图型名} · {系列} · {数据来源}</div>
</div>
</div>
<script>
// 内联 mono-tokens.js 全文
// ── 数据(用户只需要改这里)──
const DATA = [ /* ... */ ];
// ── 渲染 ──
MONO.obsReveal('ch', el => { /* ... */ });
</script>
</body>
</html>
Take larashero3-dotcom/lieflat-charts from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.