For AI agents: the complete documentation index is available at https://lazygophers.github.io/pamphlet/llms.txt, the full documentation bundle is available at https://lazygophers.github.io/pamphlet/llms-full.txt, and this page is available as Markdown at https://lazygophers.github.io/pamphlet/design/output.md.
  • 简体中文
  • 产物是什么样的

    一本 pamphlet 是一个 HTML 文件,里面有五段东西:骨架、样式、正文 HTML、内联的图表 SVG、一小段运行时 JavaScript。外加一段把源文档原样存起来的 HTML 注释。

    跑 pamphlet build --verbose 能看到各段占多少字节。

    打开时不向网络要任何东西

    没有 <link>、没有 <script src>、没有 CDN 引用、没有远程字体。

    这条由编译器强制:引用远程图片会直接编译失败(EMB-403),没有绕过开关。

    关掉 JavaScript 还能读全

    元素有 JavaScript没有 JavaScript
    标签页点击切换全部展开,每个标题变成小节标题
    折叠块点击展开原生 <details>,照样能点
    步骤带编号圆圈完全一样(纯 CSS)
    滚动入场滑入直接可见
    图表可缩放拖动完整显示,不能缩放
    目录锚点跳转完全一样(纯 CSS)

    一个字都不会丢。 这是设计的出发点而不是补丁:任何交互都必须先有一个不依赖脚本的形态,再往上叠脚本。

    深色是缺省,打印时才浅色

    产物一律深色,不看读者的系统设置:它是发出去给人看的一个文件,应该长成一个样子,而不是同一个文件在两个人手里长得不一样。

    浅色那一套变量同样躺在产物里,但只在 @media print 下生效 —— 深色底打出来是一整页油墨,而多数打印设置会直接丢掉背景,于是浅色的字落在白纸上等于一张空白。两套都是纯 CSS,没有一行 JavaScript 参与。

    图表的颜色也在同一层,所以切深色时图里的线和字跟着一起变。引擎输出里换不掉的硬编码色值会在编译时报 DIAG-304。

    窄屏上横向滚动,不重排

    Pamphlet 不做响应式布局。 正文最大宽度 52rem 居中,在窄屏上表格和代码块横向滚动,而不是折行挤压。

    这是有意的:重排会让表格和图表失去可读性,而横向滚动至少保住了内容的形状。

    在手机上打开

    Pamphlet 不承诺「怎么在手机上打开产物」,只承诺「打开之后的体验」。

    打开之后的部分是完整成立的:在手机浏览器里打开时(无论来自本地文件还是网址),Tab 可点、图表清晰、跟随系统亮暗。

    打不开的部分不是 Pamphlet 能解决的:

    • iOS 18.5 起 Safari 已不允许直接打开本地 HTML 文件(https://discussions.apple.com/thread/256102223,Apple 社区多人复现;这是社区帖不是官方文档)
    • 微信内置浏览器默认阻止本地 HTML 直接执行(中文技术社区来源,非官方文档)

    两件加起来,「把 HTML 发到微信里、对方点开就能看」在 2026 年的 iOS 上大概率不成立。

    三条绕行方式

    :::steps

    1. iOS 上用「文件」App 打开。 存到「文件」里,长按 → 用 Safari 打开。这条在 iOS 上是可行的。
    2. 让发送者放到任意网页服务器上。 产物是单个静态文件,扔到 GitHub Pages、对象存储、公司内网的任何一台 nginx 上都能用,不需要任何服务端配合。
    3. 发 PDF 给手机用户。 在电脑上打开产物、打印成 PDF。会丢掉交互,但读得到全部内容 —— 因为无 JavaScript 降级本来就要求所有内容都是展开可见的。 :::

    为什么不做一个「手机版」

    考虑过 --format hosted(为移动端多出一个可托管的多文件版本),落选:

    • 与「自包含单文件」这个核心定位背道而驰
    • 要维护第二条组装路径和第二套测试
    • 而且仍然受制于同一个限制 —— iOS 拦的是本地文件,多文件版本一样是本地文件

    任何试图绕过这条限制的方案,都会把复杂度引进产物却仍然受限。

    收窄之后的承诺是完全成立的:CSP、location.hash 深链、data URI 字体、打印时的浅色全部在 file:// 下实测通过。留一个做不到的承诺,比收窄承诺伤害更大。

    出处:ADR-0018

    产物即备份

    源文档默认原样存在产物的 HTML 注释里,pamphlet extract 能把它吐回来。只剩一个 HTML 文件也不会丢原稿。

    关掉这个行为用 --no-embed-source,代价是失去还原能力。