Content (内容)
渲染可信 HTML(支持剧透与内联图片灯箱)。不做 sanitize —— 不可信 HTML 请自行处理。
KunContent 不会 sanitize HTML
它原样渲染你传入的内容。绑定到 content 之前,请自行 sanitize 任何不可信 / 用户提供的 HTML(例如用 DOMPurify)。
基础用法
Rich content
KunContent renders trusted HTML, with spoiler and inline-image lightbox support.
Markdown 排版
排版:一门隐形的艺术
好的排版应当克制而有节奏。当它做得足够好时,读者甚至不会注意到它的存在,只会觉得"这篇文章读起来很舒服"。本页用一段示例内容展示 KunContent 的 Markdown 排版。
层级与节奏
标题与正文之间保持清晰的对比与呼吸感:标题的上间距明显大于下间距,从而和紧随其后的内容自然成组。正文行高 1.8,对中文与中西混排都更友好。
字体排印的最高境界,是让文字本身退后一步,把舞台让给意义。
列表
- 无序列表项,用于并列的要点
- 支持嵌套:
- 次级要点一
- 次级要点二
- 列表项之间有舒适的间距
- 有序步骤:先确定测量(每行字符数)
- 再调行高与段间距
- 最后打磨标题比例
代码
行内代码如 const kun = createKunUI(),与正文区分但不喧宾夺主;块级代码用于成段展示:
function greet(name) {
// 一句问候
return `你好,${name}!`
}
表格
| 组件 | 用途 | 关键特性 |
|---|---|---|
| KunContent | 渲染受信富文本 | 剧透 · 灯箱 · 排版 |
| KunMarkdown | Markdown 字形 | 内联 SVG |
| KunLightbox | 图片查看器 | 缩放 · 旋转 · 飞散 |
分割线之上是正文的结尾。按 Esc 可关闭大多数浮层。
剧透
剧透警告:凶手其实是管家(点击揭示)。
English: the butler did it in the library (click to reveal — each word is masked separately).
超长多段剧透
以下是完整剧情走向,涉及关键剧透(点击展开):
故事开篇,主角在一座被常年浓雾笼罩的海港小镇醒来,失去了过去三年的全部记忆。他唯一记得的,是一枚刻着陌生纹章的铜质怀表,以及一个反复出现在梦里的、背对着他的白衣少女的身影。镇上的人对他异常熟络,仿佛他从未离开过,这种熟悉感却让他遍体生寒。
随着调查深入,他发现镇上每个居民都在隐瞒同一件事:三年前的那场大火。所有记录都被人为抹去,教堂的地下室里藏着一本写满名字的册子,而他自己的名字,赫然被一道墨线划去。怀表在靠近灯塔时会无端发烫,指针逆向转动,像是在指引,又像是在警告。
真正的转折发生在第二幕:那位白衣少女并非梦境的产物,而是他亲手送走的妹妹。三年前的大火不是意外,而是他为了销毁某个足以颠覆整座小镇的秘密,亲自点燃的。失忆不是创伤的结果,而是他向镇上的“守夜人”交换来的——用记忆换取妹妹活下去的机会。
而那枚怀表,是契约的信物。当指针归零的那一刻,被交换的记忆会连本带利地归还,代价则是,他必须替代守夜人,永远留在这座小镇,维持浓雾不散。所谓的“守夜人”,正是历代做出同样选择的人,一个接一个,困在循环里。
结局有两条分支。其一,他选择再次遗忘,把怀表埋回灯塔之下,雾散人安,小镇恢复平静,但下一个失忆者将在某个清晨醒来,重复他的命运。其二,他砸碎怀表,直面归还的全部记忆与随之而来的崩塌,雾彻底散去,小镇暴露在真相之下,而他与妹妹得以并肩走出港口——代价是,这里的一切都将不复存在。
游戏在最后一个镜头停在那枚停摆的怀表上,表盖内侧刻着一行小字:“记得的人,才是被困住的人。”至此,标题的双关含义才真正揭晓。
(点击上方区块即可揭示;再长的段落也会被整块遮住。)
内联图片灯箱
点击任意图片打开灯箱(可左右切换):
正文图模糊占位(ThumbHash)
正文图是后端渲染的原始 <img>(不是组件)。只要标签带 width/height(浏览器据此原生预留空间、消除加载抖动)与 data-thumbhash,KunContent 就会自动把解码出的模糊占位画到图片背景上,加载完成后清除—— 零 DOM 改动,与灯箱、剧透共存。
后端把图片的宽高与 ThumbHash 直接写进标签,正文图便和封面一样享受占位:

宽高让浏览器按比例预留空间(不再加载跳动),ThumbHash 提供加载前的模糊预览。
属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| content * | string | — | |
| className | string | "" | |
| compact | boolean | false |