视觉系统

Last Stand 小红书图文 · 制作经验与风格手册

用途:下次再做 Last Stand 的版本公告 / 小红书图文卡片时直接照抄这套规范,避免重复踩坑。


一、视觉系统(必须遵守)

1.1 尺寸 & 数量

1.2 配色(CSS 变量)

--paper:    #f4ede0;   /* 奶油纸主底色(默认) */
--paper-2:  #ece4d4;   /* 二级纸色 */
--ink:      #1a1412;   /* 主墨色(不是纯黑) */
--ink-faint:#7a6f63;   /* 注释、二级文字 */
--red:      #d92e33;   /* 强调红 */
--orange:   #e8843a;   /* 警示橙(仅极限难度行用) */

1.3 字体

用途字体
标题(独立游戏文学感)Noto Serif SC(思源宋体)·700
正文Noto Sans SC(思源黑体)·400/500/700
代码注释 / 版本号 / 数字JetBrains Mono·400/500/700

1.4 排版基线

1.5 手绘元素

1.6 反对清单

✗ 深色科技 PPT 风
✗ FINAL VERDICT 类 badge
✗ 数据柱状图 / 流程框图
✗ 渐变光效 / glow
✗ 商务风分块卡片 + 圆角左竖条 accent
✗ Inter / Roboto / 系统字体
✗ 复杂 SVG 角色 / 武器写实


二、八张卡的内容模板

#标签标题模式视觉备注
1// PATCH NOTES · YYYY.MM衬线大字 · 版本号标红火柴人士兵 + 鸟留 hook 引第 3 张
2// FIX 01衬线 + 红色下划线两个窗口框 + 鼠标飞出/飞回标准 FixCard 模板
3// FIX 02 · 真·惊喜88px 衬线 · 2 波标红单行高亮 git 代码主 hook,最戏剧化
4// FIX 03衬线文件柜 + 红色抽屉 + 钥匙标准 FixCard
5// NEW 01 · 战场清理衬线三难度行表格 + 三帧消失分镜表格用 dashed 分隔
6// NOT A BUG + 红色 stamp衬线大字 · “反而涨弹药”超大霰弹枪 + AMMO ↑ 框旋转 8° 的红框印章
7// COMING NEXT衬线 + 大数字 01/02无主图,纯排版列两条 v0.3 方向
8// FEEDBACK衬线QR + 手绘括号角 + 注解箭头QR 不要用大白卡

2.1 复用组件(cards.jsx 里)


三、关键经验教训

3.1 工具/技术坑

  1. 中文文件名 run_script 拒收 → 任何要进 run_script/readFile 的文件先 copy_files 重命名为 ASCII
  2. useTweaks 是 tuple 不是 objectconst [tweaks, setTweak] = useTweaks(defaults),不是 { tweaks, setTweak }
  3. html-to-image 在沙箱内不稳定:捕获 1080×1440 大图会随机 hang(CORS 字体 / 复杂 SVG),别用脚本批量截图——直接给用户离线 HTML 自己截
  4. save_screenshot 只截 viewport (924×540):不能截 1080×1440 的元素全图
  5. iframe 渲染 React 有竞态:第一次 eval_js 看到 #root 是空的属于正常,reload 一次或加 sleep
  6. 离线打包必须有 __bundler_thumbnail template:在 <head><template id="__bundler_thumbnail"><svg>...</svg></template>,否则 super_inline_html 不工作
  7. JSX 共享组件:每个 <script type="text/babel"> 是独立作用域,组件文件结尾必须 Object.assign(window, {Card1, Card2, ...})
  8. const styles = {} 全局命名冲突:用 cardStylesterminalStyles 等命名空间
  9. super_inline_html 不会追踪 JSX 字符串里的 <img src="...">:bundler 只解析 HTML 静态属性,对 babel 转译后的 JSX 里的资源路径无能为力。所有要随离线 HTML 一起交付的图片资源(QR、logo 等),必须直接以 base64 data URL 写进 jsx:先 readFileBinary + btoa 转成 data:image/png;base64,...,再 <img src={"data:..."}/>

3.2 设计/沟通坑

  1. 手绘人体不要用 fill 写实——用户会说”不如火柴人”。火柴人 + 不重叠是底线
  2. 红色框和黑色主体一定要坐标对齐(卡 4 文件柜抽屉路径 x 错位 10px 被抓出)
  3. QR 码不要做”大白卡 + 红色阴影”——会被说”突兀”。改用:
    • 小一点(260px 不是 320)
    • 手绘括号四角(替代实线边框)
    • QR 背景用 var(--paper-2) 不要纯白
    • 加一支虚线箭头 + “扫这边 →” 注解
  4. 代码块:用户嫌 git diff 双色块太”工具感”,最终选了”单行高亮 + 左红条”
  5. 文字别越界:SVG 内 <text> 的 y 坐标 + 字号必须留 viewBox 余量,否则被裁
  6. 导出:用户最后只要”能打开的离线 HTML”,不要再尝试在沙箱里批量生成 PNG,浪费时间

3.3 流程经验


四、文件结构(推荐)

/
├── Last Stand vX.Y.Z Patch Notes.html        ← 主预览(design canvas + tweaks)
├── Last Stand vX.Y.Z · Export.html           ← 8 张纵列导出预览
├── Last Stand vX.Y.Z · Export (offline).html ← 单文件离线版(交付)
├── cards.jsx                                  ← 8 张卡 + 共享组件
├── design-canvas.jsx                          ← starter
├── tweaks-panel.jsx                           ← starter
├── image-slot.js                              ← starter(如用 QR slot)
└── assets/
    ├── qr.png                                 ← 用户上传的 QR
    └── feedback-poster.png                    ← 原始素材

五、文案风格

六、下次开工 checklist


最后更新:2026-05 · v0.2.1 制作完成后总结

类型/IP视觉