@mteditor/renderer-mini 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { MtDocument, MtMiniMode } from '@mteditor/document';
2
2
  export { MtMiniMode, MtMiniNode, MtMiniPlatform } from '@mteditor/document';
3
- import { M as MtMiniRenderOptions, a as MtMiniRenderResult, i as MtMiniChannelSwitch, h as MtMiniChannelOption } from './theme-COcEGLOF.js';
4
- export { b as MT_MINI_CAPABILITIES, c as MT_MINI_TOKENS_DARK, l as MT_MINI_TOKENS_DARK_OVERRIDES, d as MT_MINI_TOKENS_LIGHT, g as MtMiniCapabilities, j as MtMiniTheme, r as resolveCapabilities, k as resolveThemeTokens } from './theme-COcEGLOF.js';
3
+ import { M as MtMiniRenderOptions, a as MtMiniRenderResult, i as MtMiniChannelSwitch, h as MtMiniChannelOption } from './theme-CXitJYrs.js';
4
+ export { b as MT_MINI_CAPABILITIES, c as MT_MINI_TOKENS_DARK, l as MT_MINI_TOKENS_DARK_OVERRIDES, d as MT_MINI_TOKENS_LIGHT, g as MtMiniCapabilities, j as MtMiniTheme, r as resolveCapabilities, k as resolveThemeTokens } from './theme-CXitJYrs.js';
5
5
 
6
6
  /**
7
- * 渲染层主入口(ADR-0030)。
7
+ * 渲染层主入口。
8
8
  *
9
9
  * 本函数的职责边界刻意很窄 —— 只做三件事,**不自己拼 nodes**:
10
10
  *
@@ -15,7 +15,7 @@ export { b as MT_MINI_CAPABILITIES, c as MT_MINI_TOKENS_DARK, l as MT_MINI_TOKEN
15
15
  * | ③ 主题注入 | 内置 light / dark 字面量(小程序无 CSS 变量) |
16
16
  *
17
17
  * `nodes` 一律由 `@mteditor/document` 的 `serializeDocumentToMini` 产出
18
- * —— 这是 ADR-0021「序列化真相源唯一」在小程序端的同一条原则。
18
+ * —— 这是 「序列化真相源唯一」在小程序端的同一条原则。
19
19
  */
20
20
 
21
21
  /**
@@ -24,7 +24,7 @@ export { b as MT_MINI_CAPABILITIES, c as MT_MINI_TOKENS_DARK, l as MT_MINI_TOKEN
24
24
  * @param doc 文档(唯一真相源)
25
25
  * @param options 渲染选项
26
26
  * @returns 通道、nodes、降级报告、统计与自动切换记录
27
- * @throws {RangeError} `options.platform` 的能力表未经实测核实(ADR-0030 决策 5)
27
+ * @throws {RangeError} `options.platform` 的能力表未经实测核实
28
28
  *
29
29
  * @example
30
30
  * ```ts
@@ -42,7 +42,7 @@ export { b as MT_MINI_CAPABILITIES, c as MT_MINI_TOKENS_DARK, l as MT_MINI_TOKEN
42
42
  declare const renderMiniDocument: (doc: MtDocument, options?: MtMiniRenderOptions) => MtMiniRenderResult;
43
43
 
44
44
  /**
45
- * 通道解析(ADR-0005 双通道 / ADR-0030 决策 3)。
45
+ * 通道解析(双通道)。
46
46
  *
47
47
  * `@mteditor/document` 只接受显式的 `'component' | 'richText'`;把 `'auto'`
48
48
  * 解析成具体通道是**渲染层**的职责 —— 因为它需要知道 `maxNodes` 这类
@@ -59,7 +59,7 @@ interface MtChannelResolution {
59
59
  /**
60
60
  * 解析渲染通道。
61
61
  *
62
- * 规则(§9.2):
62
+ * 规则:
63
63
  * - 显式给出 `'component'` / `'richText'` 时**原样采用**,不做阈值判定
64
64
  * —— 宿主显式指定就代表它知道自己在做什么;
65
65
  * - `'auto'` 时按**文档节点数**判定:`nodeCount > maxNodes` 走 `richText`。
@@ -82,15 +82,15 @@ declare const resolveChannel: (doc: MtDocument, option: MtMiniChannelOption, max
82
82
  /**
83
83
  * 渲染层默认值。
84
84
  *
85
- * 单独成文件的理由:这些数值同时出现在**文档**(AGENTS.md §9.2)与
85
+ * 单独成文件的理由:这些数值同时出现在**文档**与
86
86
  * **测试**(阈值边界用例)里,散落在实现里会让「改默认值」变成一次考古。
87
87
  */
88
88
 
89
89
  /**
90
- * `mode: 'auto'` 的降级阈值,单位是**文档节点数**(§9.2)。
90
+ * `mode: 'auto'` 的降级阈值,单位是**文档节点数**。
91
91
  *
92
92
  * 判定依据不是「输出 nodes 数」:那需要先序列化一次才能判定,而判定的意义
93
- * 正是避免一次昂贵序列化(ADR-0030 决策 3)。
93
+ * 正是避免一次昂贵序列化。
94
94
  */
95
95
  declare const MT_DEFAULT_MAX_NODES = 3000;
96
96
  /** 缺省通道选择 */
package/dist/index.js CHANGED
@@ -89,7 +89,7 @@ var MT_MINI_CAPABILITIES = {
89
89
  supportsId: false,
90
90
  tagAttrs: MT_WECHAT_TAG_ATTRS,
91
91
  /**
92
- * `rich-text` 下不可表达、必须拆到组件外的节点(§9.2)。
92
+ * `rich-text` 下不可表达、必须拆到组件外的节点。
93
93
  * 组件通道下这些节点走原生组件,不受 `rich-text` 白名单限制。
94
94
  */
95
95
  nativeComponents: ["video", "audio"]
@@ -99,7 +99,7 @@ var resolveCapabilities = (platform) => {
99
99
  const found = MT_MINI_CAPABILITIES[platform];
100
100
  if (found === void 0) {
101
101
  throw new RangeError(
102
- `@mteditor/renderer-mini \u5C1A\u672A\u652F\u6301\u5E73\u53F0 "${platform}"\uFF1A\u5176 rich-text \u767D\u540D\u5355\u672A\u7ECF\u5B9E\u6D4B\u6838\u5B9E\uFF0C\u6309 AGENTS.md \xA74.4 \u7981\u6B62\u51ED\u731C\u6D4B\u63D0\u4F9B\u6620\u5C04\u8868\u3002\u5F53\u524D\u53EF\u7528\u5E73\u53F0\uFF1Awechat\u3002`
102
+ `@mteditor/renderer-mini \u5C1A\u672A\u652F\u6301\u5E73\u53F0 "${platform}"\uFF1A\u5176 rich-text \u767D\u540D\u5355\u672A\u7ECF\u5B9E\u6D4B\u6838\u5B9E\uFF0C\u4E0D\u63A5\u53D7\u51ED\u731C\u6D4B\u63D0\u4F9B\u7684\u6620\u5C04\u8868\u3002\u5F53\u524D\u53EF\u7528\u5E73\u53F0\uFF1Awechat\u3002`
103
103
  );
104
104
  }
105
105
  return found;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/capabilities.ts","../src/channel.ts","../src/options.ts","../src/theme.ts","../src/render.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 各端 `rich-text` 能力表(`docs/document-model.md` §9.1 / §9.4)。\n *\n * **准入条件:必须实测核实。** §4.4 明令「各子路径必须各自维护映射差异,\n * 禁止共用一份映射表」;反过来说,**没有实测过就不能让别人用**——\n * 一份「看起来能跑」的错误白名单比明确的报错危险得多(ADR-0030 决策 5)。\n *\n * 因此本文件当前只包含 `wechat`。支付宝 / 抖音的表在各自实测完成后\n * (M4-b,需各自开发者工具)追加,并同时回填 §9.4 的待确认项。\n */\n\nimport type { MtMiniCapabilities, MtMiniPlatform } from './types'\n\n/**\n * 微信小程序 `rich-text` 受信任标签白名单(§9.1,**已核实**)。\n *\n * 顺序与官方文档一致,便于逐条比对;`Set` 查询由调用方按需构造。\n */\nexport const MT_WECHAT_RICH_TEXT_TAGS: readonly string[] = [\n 'a',\n 'abbr',\n 'address',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'br',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'dd',\n 'del',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'fieldset',\n 'font',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'label',\n 'legend',\n 'li',\n 'mark',\n 'nav',\n 'ol',\n 'p',\n 'pre',\n 'q',\n 'rt',\n 'ruby',\n 's',\n 'section',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'tt',\n 'u',\n 'ul',\n]\n\n/**\n * 逐标签属性白名单(§9.1,**已核实**)。\n *\n * 未在表中的标签不接受额外属性;全局属性(`class` / `style`)单独由\n * `globalAttrs` 描述。**`id` 不在任何一张表里** —— 微信全局不支持 `id`。\n */\nexport const MT_WECHAT_TAG_ATTRS: Readonly<Record<string, readonly string[]>> = {\n img: ['alt', 'src', 'height', 'width'],\n table: ['width'],\n col: ['span', 'width'],\n colgroup: ['span', 'width'],\n td: ['colspan', 'height', 'rowspan', 'width'],\n th: ['colspan', 'height', 'rowspan', 'width'],\n tr: ['colspan', 'height', 'rowspan', 'width'],\n ol: ['start', 'type'],\n}\n\n/**\n * 小程序平台能力表。\n *\n * 当前只登记 `wechat`(§9.1 已核实)。缺失的平台在\n * `resolveCapabilities` 处**抛错**,不做容错。\n */\nexport const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMiniCapabilities>>> = {\n wechat: {\n platform: 'wechat',\n verified: true,\n tags: MT_WECHAT_RICH_TEXT_TAGS,\n globalAttrs: ['class', 'style'],\n supportsId: false,\n tagAttrs: MT_WECHAT_TAG_ATTRS,\n /**\n * `rich-text` 下不可表达、必须拆到组件外的节点(§9.2)。\n * 组件通道下这些节点走原生组件,不受 `rich-text` 白名单限制。\n */\n nativeComponents: ['video', 'audio'],\n },\n}\n\n/**\n * 取某个平台的能力表。\n *\n * @param platform 平台标识\n * @returns 该平台的能力描述\n * @throws {RangeError} 该平台尚未实测核实(ADR-0030 决策 5)\n *\n * @example\n * ```ts\n * resolveCapabilities('wechat').supportsId // false\n * resolveCapabilities('alipay') // 抛 RangeError:尚未实测\n * ```\n */\nexport const resolveCapabilities = (platform: MtMiniPlatform): MtMiniCapabilities => {\n const found = MT_MINI_CAPABILITIES[platform]\n if (found === undefined) {\n throw new RangeError(\n `@mteditor/renderer-mini 尚未支持平台 \"${platform}\":其 rich-text 白名单未经实测核实,` +\n '按 AGENTS.md §4.4 禁止凭猜测提供映射表。当前可用平台:wechat。',\n )\n }\n return found\n}\n","/**\n * 通道解析(ADR-0005 双通道 / ADR-0030 决策 3)。\n *\n * `@mteditor/document` 只接受显式的 `'component' | 'richText'`;把 `'auto'`\n * 解析成具体通道是**渲染层**的职责 —— 因为它需要知道 `maxNodes` 这类\n * 宿主侧的渲染成本概念,而 `document` 是零框架的文档模型层。\n */\n\nimport { computeTreeStats } from '@mteditor/document'\nimport type { MtDocument } from '@mteditor/document'\nimport type { MtMiniChannelOption, MtMiniChannelSwitch, MtMiniMode } from './types'\n\n/** 通道解析结果 */\nexport interface MtChannelResolution {\n /** 实际使用的通道 */\n mode: MtMiniMode\n /** 自动切换记录;未发生切换时为 `null` */\n switched: MtMiniChannelSwitch | null\n}\n\n/**\n * 解析渲染通道。\n *\n * 规则(§9.2):\n * - 显式给出 `'component'` / `'richText'` 时**原样采用**,不做阈值判定\n * —— 宿主显式指定就代表它知道自己在做什么;\n * - `'auto'` 时按**文档节点数**判定:`nodeCount > maxNodes` 走 `richText`。\n *\n * @param doc 文档\n * @param option 通道选择\n * @param maxNodes `'auto'` 的阈值(文档节点数)\n * @returns 通道与该次判定是否发生了切换\n *\n * @example\n * ```ts\n * // 3000 节点以内:组件通道\n * resolveChannel(doc, 'auto', 3000).mode // 'component'\n * // 显式指定时不看阈值\n * resolveChannel(hugeDoc, 'component', 1).mode // 'component'\n * ```\n */\nexport const resolveChannel = (\n doc: MtDocument,\n option: MtMiniChannelOption,\n maxNodes: number,\n): MtChannelResolution => {\n if (option !== 'auto') return { mode: option, switched: null }\n\n const { nodeCount } = computeTreeStats(doc.content)\n if (nodeCount <= maxNodes) return { mode: 'component', switched: null }\n\n return {\n mode: 'richText',\n switched: { from: 'component', to: 'richText', nodeCount, maxNodes },\n }\n}\n","/**\n * 渲染层默认值。\n *\n * 单独成文件的理由:这些数值同时出现在**文档**(AGENTS.md §9.2)与\n * **测试**(阈值边界用例)里,散落在实现里会让「改默认值」变成一次考古。\n */\n\nimport type { MtMiniMode } from './types'\n\n/**\n * `mode: 'auto'` 的降级阈值,单位是**文档节点数**(§9.2)。\n *\n * 判定依据不是「输出 nodes 数」:那需要先序列化一次才能判定,而判定的意义\n * 正是避免一次昂贵序列化(ADR-0030 决策 3)。\n */\nexport const MT_DEFAULT_MAX_NODES = 3000\n\n/** 缺省通道选择 */\nexport const MT_DEFAULT_MODE: 'auto' | MtMiniMode = 'auto'\n\n/** 缺省主题名 */\nexport const MT_DEFAULT_THEME = 'light'\n\n/** 缺省平台 */\nexport const MT_DEFAULT_PLATFORM = 'wechat'\n","/**\n * 内置主题字面量(ADR-0030 决策 4)。\n *\n * ## 为什么这份数据必须存在于本包\n *\n * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**(§9.3),\n * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default` 按 §6.1\n * 只产出 CSS、没有 JS 导出 —— 若要求宿主自备这份表,每个项目都要手抄\n * `tokens.css` 的 65 个键,抄错还**没有报错**(本仓库自己就踩过:\n * `mini.ts` 读的 `--mt-font-mono` 与 `tokens.css` 的 `--mt-font-family-mono`\n * 不一致,两个引用点恒走 fallback)。\n *\n * ## 与 tokens.css 的关系:允许独立,禁止无守卫地独立\n *\n * 本文件是 `packages/theme-default/src/tokens.css` 的**逐键镜像**\n * (`dark` 是 `light` 上的部分覆盖,与 CSS 的层叠语义一致)。\n * `scripts/check-theme-tokens.mjs` 断言两者键集合与取值完全一致 ——\n * 改任一侧而漏改另一侧会让 `pnpm verify` 失败。\n *\n * 取值风格与 CSS 一致:保留 `rgb(37 99 235 / 18%)` 这类现代空格语法,\n * 不自作主张转换为逗号语法(`@mteditor/document` 原样内联,不做解析)。\n */\n\nimport type { MtMiniTheme } from './types'\n\n/** 亮色主题:`tokens.css` 中 `:root, [data-mt-theme='light']` 块的完整镜像 */\nexport const MT_MINI_TOKENS_LIGHT: Readonly<Record<string, string>> = {\n '--mt-color-primary': '#2563eb',\n '--mt-color-primary-hover': '#1d4ed8',\n '--mt-color-primary-active': '#1e40af',\n '--mt-color-success': '#16a34a',\n '--mt-color-warning': '#d97706',\n '--mt-color-danger': '#dc2626',\n '--mt-color-link': '#2563eb',\n '--mt-color-text': '#1f2329',\n '--mt-color-text-secondary': '#646a73',\n '--mt-color-text-disabled': '#a6a9ad',\n '--mt-color-text-inverse': '#fff',\n '--mt-color-bg': '#fff',\n '--mt-color-bg-elevated': '#fff',\n '--mt-color-bg-muted': '#f5f7fa',\n '--mt-color-bg-hover': '#f2f3f5',\n '--mt-color-border': '#dee0e3',\n '--mt-color-border-strong': '#babdbf',\n '--mt-color-selection': 'rgb(37 99 235 / 18%)',\n '--mt-color-code-bg': '#f5f5f5',\n '--mt-color-code-text': '#c0392b',\n '--mt-color-quote-border': '#dee0e3',\n '--mt-color-mark-bg': '#fff3a3',\n '--mt-font-family':\n \"-apple-system, blinkmacsystemfont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif\",\n '--mt-font-family-mono': \"'SFMono-Regular', consolas, 'Liberation Mono', menlo, monospace\",\n '--mt-font-size': '15px',\n '--mt-font-size-sm': '13px',\n '--mt-font-size-lg': '17px',\n '--mt-line-height': '1.7',\n '--mt-letter-spacing': 'normal',\n '--mt-h1-font-size': '28px',\n '--mt-h2-font-size': '24px',\n '--mt-h3-font-size': '20px',\n '--mt-h4-font-size': '18px',\n '--mt-h5-font-size': '16px',\n '--mt-h6-font-size': '15px',\n '--mt-space-1': '4px',\n '--mt-space-2': '8px',\n '--mt-space-3': '12px',\n '--mt-space-4': '16px',\n '--mt-space-5': '24px',\n '--mt-space-6': '32px',\n '--mt-radius-sm': '3px',\n '--mt-radius-md': '6px',\n '--mt-radius-lg': '10px',\n '--mt-radius-full': '9999px',\n '--mt-shadow-sm': '0 1px 3px rgb(0 0 0 / 8%)',\n '--mt-shadow-md': '0 4px 12px rgb(0 0 0 / 10%)',\n '--mt-toolbar-height': '40px',\n '--mt-content-max-width': '860px',\n '--mt-content-padding': '20px',\n '--mt-control-size': '30px',\n '--mt-control-icon-size': '18px',\n '--mt-control-gap': '2px',\n '--mt-popup-padding': '4px',\n '--mt-popup-gap': '6px',\n '--mt-drawer-max-height': '60vh',\n '--mt-block-handle-width': '46px',\n '--mt-block-indicator-height': '2px',\n '--mt-outline-width': '200px',\n '--mt-outline-top': '0px',\n '--mt-z-toolbar': '100',\n '--mt-z-dropdown': '200',\n '--mt-z-popover': '300',\n '--mt-z-modal': '400',\n '--mt-z-toast': '500',\n '--mt-transition-fast': '120ms ease',\n '--mt-transition-base': '200ms ease',\n}\n\n/**\n * 暗色主题对亮色的**覆盖项**(与 `tokens.css` 的 `[data-mt-theme='dark']` 块一致)。\n *\n * 单独导出是为了让卡口脚本能分别比对「覆盖集」与「派生全集」——\n * 若只导出派生的全集,CSS 里删掉一个覆盖项(于是暗色回退到亮色值)\n * 在 TS 侧不可见。\n */\nexport const MT_MINI_TOKENS_DARK_OVERRIDES: Readonly<Record<string, string>> = {\n '--mt-color-primary': '#3b82f6',\n '--mt-color-primary-hover': '#60a5fa',\n '--mt-color-primary-active': '#2563eb',\n '--mt-color-success': '#22c55e',\n '--mt-color-warning': '#f59e0b',\n '--mt-color-danger': '#ef4444',\n '--mt-color-link': '#60a5fa',\n '--mt-color-text': '#e5e6eb',\n '--mt-color-text-secondary': '#a3a6ad',\n '--mt-color-text-disabled': '#6b6f76',\n '--mt-color-text-inverse': '#1f2329',\n '--mt-color-bg': '#1f2329',\n '--mt-color-bg-elevated': '#282c33',\n '--mt-color-bg-muted': '#282c33',\n '--mt-color-bg-hover': '#32363d',\n '--mt-color-border': '#3a3f47',\n '--mt-color-border-strong': '#4e545d',\n '--mt-color-selection': 'rgb(59 130 246 / 28%)',\n '--mt-color-code-bg': '#2b2f36',\n '--mt-color-code-text': '#f87171',\n '--mt-color-quote-border': '#3a3f47',\n '--mt-color-mark-bg': '#6b5a1a',\n '--mt-shadow-sm': '0 1px 3px rgb(0 0 0 / 40%)',\n '--mt-shadow-md': '0 4px 12px rgb(0 0 0 / 50%)',\n}\n\n/** 暗色主题全集(亮色为基底 + 覆盖项) */\nexport const MT_MINI_TOKENS_DARK: Readonly<Record<string, string>> = {\n ...MT_MINI_TOKENS_LIGHT,\n ...MT_MINI_TOKENS_DARK_OVERRIDES,\n}\n\n/**\n * 解析主题字面量表。\n *\n * 合并顺序:内置名(或自定义表)→ `themeTokens` 覆盖项。\n *\n * @param theme 内置主题名或自定义字面量表,缺省 `'light'`\n * @param override 覆盖项,键含 `--` 前缀;缺省不覆盖\n * @returns 可直接传给 `serializeDocumentToMini` 的 `themeTokens`\n *\n * @example\n * ```ts\n * resolveThemeTokens('dark') // 65 个键的暗色表\n * resolveThemeTokens(undefined, { '--mt-color-link': '#f00' })\n * // 亮色表,但链接色为 #f00\n * ```\n */\nexport const resolveThemeTokens = (\n theme?: MtMiniTheme,\n override?: Record<string, string>,\n): Record<string, string> => {\n const base =\n theme === undefined || theme === 'light'\n ? MT_MINI_TOKENS_LIGHT\n : theme === 'dark'\n ? MT_MINI_TOKENS_DARK\n : theme\n return override === undefined ? { ...base } : { ...base, ...override }\n}\n","/**\n * 渲染层主入口(ADR-0030)。\n *\n * 本函数的职责边界刻意很窄 —— 只做三件事,**不自己拼 nodes**:\n *\n * | 步骤 | 说明 |\n * |---|---|\n * | ① 平台准入 | 能力表未登记的平台直接抛错,不做容错 |\n * | ② 通道解析 | `'auto'` → 按 `maxNodes` 判定,并记录是否发生切换 |\n * | ③ 主题注入 | 内置 light / dark 字面量(小程序无 CSS 变量) |\n *\n * `nodes` 一律由 `@mteditor/document` 的 `serializeDocumentToMini` 产出\n * —— 这是 ADR-0021「序列化真相源唯一」在小程序端的同一条原则。\n */\n\nimport { serializeDocumentToMini } from '@mteditor/document'\nimport type { MtDocument } from '@mteditor/document'\nimport { resolveCapabilities } from './capabilities'\nimport { resolveChannel } from './channel'\nimport { MT_DEFAULT_MAX_NODES, MT_DEFAULT_MODE, MT_DEFAULT_PLATFORM } from './options'\nimport { resolveThemeTokens } from './theme'\nimport type { MtMiniRenderOptions, MtMiniRenderResult } from './types'\n\n/**\n * 把 `MtDocument` 渲染为小程序可直接 `setData` 的 payload。\n *\n * @param doc 文档(唯一真相源)\n * @param options 渲染选项\n * @returns 通道、nodes、降级报告、统计与自动切换记录\n * @throws {RangeError} `options.platform` 的能力表未经实测核实(ADR-0030 决策 5)\n *\n * @example\n * ```ts\n * import { renderMiniDocument } from '@mteditor/renderer-mini'\n *\n * const { mode, nodes, report, autoSwitched } = renderMiniDocument(doc, {\n * theme: 'dark',\n * mode: 'auto',\n * })\n *\n * if (autoSwitched) console.warn(`节点数 ${autoSwitched.nodeCount} 超过阈值,已切到 rich-text`)\n * if (report.length > 0) console.warn('内容有降级', report)\n * ```\n */\nexport const renderMiniDocument = (\n doc: MtDocument,\n options: MtMiniRenderOptions = {},\n): MtMiniRenderResult => {\n const platform = options.platform ?? MT_DEFAULT_PLATFORM\n // 平台准入:未实测核实的平台在此抛错,而不是拿微信的表硬跑(§4.4)\n void resolveCapabilities(platform)\n\n const { mode, switched } = resolveChannel(\n doc,\n options.mode ?? MT_DEFAULT_MODE,\n options.maxNodes ?? MT_DEFAULT_MAX_NODES,\n )\n\n const { output, report, stats } = serializeDocumentToMini(doc, {\n platform,\n mode,\n themeTokens: resolveThemeTokens(options.theme, options.themeTokens),\n ...(options.preRendered === undefined ? {} : { preRendered: options.preRendered }),\n })\n\n return { platform, mode, nodes: output, report, stats, autoSwitched: switched }\n}\n"]}
1
+ {"version":3,"sources":["../src/capabilities.ts","../src/channel.ts","../src/options.ts","../src/theme.ts","../src/render.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 各端 `rich-text` 能力表。\n *\n * **准入条件:必须实测核实。** 各子路径必须各自维护映射差异,\n * 禁止共用一份映射表;反过来说,**没有实测过就不能让别人用**——\n * 一份「看起来能跑」的错误白名单比明确的报错危险得多。\n *\n * 因此本文件当前只包含 `wechat`。支付宝 / 抖音的表在各自实测完成后\n * (需各自开发者工具)追加,并同时回填待确认项。\n */\n\nimport type { MtMiniCapabilities, MtMiniPlatform } from './types'\n\n/**\n * 微信小程序 `rich-text` 受信任标签白名单(**已核实**)。\n *\n * 顺序与官方文档一致,便于逐条比对;`Set` 查询由调用方按需构造。\n */\nexport const MT_WECHAT_RICH_TEXT_TAGS: readonly string[] = [\n 'a',\n 'abbr',\n 'address',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'br',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'dd',\n 'del',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'fieldset',\n 'font',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'label',\n 'legend',\n 'li',\n 'mark',\n 'nav',\n 'ol',\n 'p',\n 'pre',\n 'q',\n 'rt',\n 'ruby',\n 's',\n 'section',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'tt',\n 'u',\n 'ul',\n]\n\n/**\n * 逐标签属性白名单(**已核实**)。\n *\n * 未在表中的标签不接受额外属性;全局属性(`class` / `style`)单独由\n * `globalAttrs` 描述。**`id` 不在任何一张表里** —— 微信全局不支持 `id`。\n */\nexport const MT_WECHAT_TAG_ATTRS: Readonly<Record<string, readonly string[]>> = {\n img: ['alt', 'src', 'height', 'width'],\n table: ['width'],\n col: ['span', 'width'],\n colgroup: ['span', 'width'],\n td: ['colspan', 'height', 'rowspan', 'width'],\n th: ['colspan', 'height', 'rowspan', 'width'],\n tr: ['colspan', 'height', 'rowspan', 'width'],\n ol: ['start', 'type'],\n}\n\n/**\n * 小程序平台能力表。\n *\n * 当前只登记 `wechat`(已核实)。缺失的平台在\n * `resolveCapabilities` 处**抛错**,不做容错。\n */\nexport const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMiniCapabilities>>> = {\n wechat: {\n platform: 'wechat',\n verified: true,\n tags: MT_WECHAT_RICH_TEXT_TAGS,\n globalAttrs: ['class', 'style'],\n supportsId: false,\n tagAttrs: MT_WECHAT_TAG_ATTRS,\n /**\n * `rich-text` 下不可表达、必须拆到组件外的节点。\n * 组件通道下这些节点走原生组件,不受 `rich-text` 白名单限制。\n */\n nativeComponents: ['video', 'audio'],\n },\n}\n\n/**\n * 取某个平台的能力表。\n *\n * @param platform 平台标识\n * @returns 该平台的能力描述\n * @throws {RangeError} 该平台尚未实测核实\n *\n * @example\n * ```ts\n * resolveCapabilities('wechat').supportsId // false\n * resolveCapabilities('alipay') // 抛 RangeError:尚未实测\n * ```\n */\nexport const resolveCapabilities = (platform: MtMiniPlatform): MtMiniCapabilities => {\n const found = MT_MINI_CAPABILITIES[platform]\n if (found === undefined) {\n throw new RangeError(\n `@mteditor/renderer-mini 尚未支持平台 \"${platform}\":其 rich-text 白名单未经实测核实,` +\n '不接受凭猜测提供的映射表。当前可用平台:wechat。',\n )\n }\n return found\n}\n","/**\n * 通道解析(双通道)。\n *\n * `@mteditor/document` 只接受显式的 `'component' | 'richText'`;把 `'auto'`\n * 解析成具体通道是**渲染层**的职责 —— 因为它需要知道 `maxNodes` 这类\n * 宿主侧的渲染成本概念,而 `document` 是零框架的文档模型层。\n */\n\nimport { computeTreeStats } from '@mteditor/document'\nimport type { MtDocument } from '@mteditor/document'\nimport type { MtMiniChannelOption, MtMiniChannelSwitch, MtMiniMode } from './types'\n\n/** 通道解析结果 */\nexport interface MtChannelResolution {\n /** 实际使用的通道 */\n mode: MtMiniMode\n /** 自动切换记录;未发生切换时为 `null` */\n switched: MtMiniChannelSwitch | null\n}\n\n/**\n * 解析渲染通道。\n *\n * 规则:\n * - 显式给出 `'component'` / `'richText'` 时**原样采用**,不做阈值判定\n * —— 宿主显式指定就代表它知道自己在做什么;\n * - `'auto'` 时按**文档节点数**判定:`nodeCount > maxNodes` 走 `richText`。\n *\n * @param doc 文档\n * @param option 通道选择\n * @param maxNodes `'auto'` 的阈值(文档节点数)\n * @returns 通道与该次判定是否发生了切换\n *\n * @example\n * ```ts\n * // 3000 节点以内:组件通道\n * resolveChannel(doc, 'auto', 3000).mode // 'component'\n * // 显式指定时不看阈值\n * resolveChannel(hugeDoc, 'component', 1).mode // 'component'\n * ```\n */\nexport const resolveChannel = (\n doc: MtDocument,\n option: MtMiniChannelOption,\n maxNodes: number,\n): MtChannelResolution => {\n if (option !== 'auto') return { mode: option, switched: null }\n\n const { nodeCount } = computeTreeStats(doc.content)\n if (nodeCount <= maxNodes) return { mode: 'component', switched: null }\n\n return {\n mode: 'richText',\n switched: { from: 'component', to: 'richText', nodeCount, maxNodes },\n }\n}\n","/**\n * 渲染层默认值。\n *\n * 单独成文件的理由:这些数值同时出现在**文档**与\n * **测试**(阈值边界用例)里,散落在实现里会让「改默认值」变成一次考古。\n */\n\nimport type { MtMiniMode } from './types'\n\n/**\n * `mode: 'auto'` 的降级阈值,单位是**文档节点数**。\n *\n * 判定依据不是「输出 nodes 数」:那需要先序列化一次才能判定,而判定的意义\n * 正是避免一次昂贵序列化。\n */\nexport const MT_DEFAULT_MAX_NODES = 3000\n\n/** 缺省通道选择 */\nexport const MT_DEFAULT_MODE: 'auto' | MtMiniMode = 'auto'\n\n/** 缺省主题名 */\nexport const MT_DEFAULT_THEME = 'light'\n\n/** 缺省平台 */\nexport const MT_DEFAULT_PLATFORM = 'wechat'\n","/**\n * 内置主题字面量。\n *\n * ## 为什么这份数据必须存在于本包\n *\n * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**,\n * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default`\n * 只产出 CSS、没有 JS 导出 —— 若要求宿主自备这份表,每个项目都要手抄\n * `tokens.css` 的 65 个键,抄错还**没有报错**(本仓库自己就踩过:\n * `mini.ts` 读的 `--mt-font-mono` 与 `tokens.css` 的 `--mt-font-family-mono`\n * 不一致,两个引用点恒走 fallback)。\n *\n * ## 与 tokens.css 的关系:允许独立,禁止无守卫地独立\n *\n * 本文件是 `packages/theme-default/src/tokens.css` 的**逐键镜像**\n * (`dark` 是 `light` 上的部分覆盖,与 CSS 的层叠语义一致)。\n * `scripts/check-theme-tokens.mjs` 断言两者键集合与取值完全一致 ——\n * 改任一侧而漏改另一侧会让 `pnpm verify` 失败。\n *\n * 取值风格与 CSS 一致:保留 `rgb(37 99 235 / 18%)` 这类现代空格语法,\n * 不自作主张转换为逗号语法(`@mteditor/document` 原样内联,不做解析)。\n */\n\nimport type { MtMiniTheme } from './types'\n\n/** 亮色主题:`tokens.css` 中 `:root, [data-mt-theme='light']` 块的完整镜像 */\nexport const MT_MINI_TOKENS_LIGHT: Readonly<Record<string, string>> = {\n '--mt-color-primary': '#2563eb',\n '--mt-color-primary-hover': '#1d4ed8',\n '--mt-color-primary-active': '#1e40af',\n '--mt-color-success': '#16a34a',\n '--mt-color-warning': '#d97706',\n '--mt-color-danger': '#dc2626',\n '--mt-color-link': '#2563eb',\n '--mt-color-text': '#1f2329',\n '--mt-color-text-secondary': '#646a73',\n '--mt-color-text-disabled': '#a6a9ad',\n '--mt-color-text-inverse': '#fff',\n '--mt-color-bg': '#fff',\n '--mt-color-bg-elevated': '#fff',\n '--mt-color-bg-muted': '#f5f7fa',\n '--mt-color-bg-hover': '#f2f3f5',\n '--mt-color-border': '#dee0e3',\n '--mt-color-border-strong': '#babdbf',\n '--mt-color-selection': 'rgb(37 99 235 / 18%)',\n '--mt-color-code-bg': '#f5f5f5',\n '--mt-color-code-text': '#c0392b',\n '--mt-color-quote-border': '#dee0e3',\n '--mt-color-mark-bg': '#fff3a3',\n '--mt-font-family':\n \"-apple-system, blinkmacsystemfont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif\",\n '--mt-font-family-mono': \"'SFMono-Regular', consolas, 'Liberation Mono', menlo, monospace\",\n '--mt-font-size': '15px',\n '--mt-font-size-sm': '13px',\n '--mt-font-size-lg': '17px',\n '--mt-line-height': '1.7',\n '--mt-letter-spacing': 'normal',\n '--mt-h1-font-size': '28px',\n '--mt-h2-font-size': '24px',\n '--mt-h3-font-size': '20px',\n '--mt-h4-font-size': '18px',\n '--mt-h5-font-size': '16px',\n '--mt-h6-font-size': '15px',\n '--mt-space-1': '4px',\n '--mt-space-2': '8px',\n '--mt-space-3': '12px',\n '--mt-space-4': '16px',\n '--mt-space-5': '24px',\n '--mt-space-6': '32px',\n '--mt-radius-sm': '3px',\n '--mt-radius-md': '6px',\n '--mt-radius-lg': '10px',\n '--mt-radius-full': '9999px',\n '--mt-shadow-sm': '0 1px 3px rgb(0 0 0 / 8%)',\n '--mt-shadow-md': '0 4px 12px rgb(0 0 0 / 10%)',\n '--mt-toolbar-height': '40px',\n '--mt-content-max-width': '860px',\n '--mt-content-padding': '20px',\n '--mt-control-size': '30px',\n '--mt-control-icon-size': '18px',\n '--mt-control-gap': '2px',\n '--mt-popup-padding': '4px',\n '--mt-popup-gap': '6px',\n '--mt-drawer-max-height': '60vh',\n '--mt-block-handle-width': '46px',\n '--mt-block-indicator-height': '2px',\n '--mt-outline-width': '200px',\n '--mt-outline-top': '0px',\n '--mt-z-toolbar': '100',\n '--mt-z-dropdown': '200',\n '--mt-z-popover': '300',\n '--mt-z-modal': '400',\n '--mt-z-toast': '500',\n '--mt-transition-fast': '120ms ease',\n '--mt-transition-base': '200ms ease',\n}\n\n/**\n * 暗色主题对亮色的**覆盖项**(与 `tokens.css` 的 `[data-mt-theme='dark']` 块一致)。\n *\n * 单独导出是为了让卡口脚本能分别比对「覆盖集」与「派生全集」——\n * 若只导出派生的全集,CSS 里删掉一个覆盖项(于是暗色回退到亮色值)\n * 在 TS 侧不可见。\n */\nexport const MT_MINI_TOKENS_DARK_OVERRIDES: Readonly<Record<string, string>> = {\n '--mt-color-primary': '#3b82f6',\n '--mt-color-primary-hover': '#60a5fa',\n '--mt-color-primary-active': '#2563eb',\n '--mt-color-success': '#22c55e',\n '--mt-color-warning': '#f59e0b',\n '--mt-color-danger': '#ef4444',\n '--mt-color-link': '#60a5fa',\n '--mt-color-text': '#e5e6eb',\n '--mt-color-text-secondary': '#a3a6ad',\n '--mt-color-text-disabled': '#6b6f76',\n '--mt-color-text-inverse': '#1f2329',\n '--mt-color-bg': '#1f2329',\n '--mt-color-bg-elevated': '#282c33',\n '--mt-color-bg-muted': '#282c33',\n '--mt-color-bg-hover': '#32363d',\n '--mt-color-border': '#3a3f47',\n '--mt-color-border-strong': '#4e545d',\n '--mt-color-selection': 'rgb(59 130 246 / 28%)',\n '--mt-color-code-bg': '#2b2f36',\n '--mt-color-code-text': '#f87171',\n '--mt-color-quote-border': '#3a3f47',\n '--mt-color-mark-bg': '#6b5a1a',\n '--mt-shadow-sm': '0 1px 3px rgb(0 0 0 / 40%)',\n '--mt-shadow-md': '0 4px 12px rgb(0 0 0 / 50%)',\n}\n\n/** 暗色主题全集(亮色为基底 + 覆盖项) */\nexport const MT_MINI_TOKENS_DARK: Readonly<Record<string, string>> = {\n ...MT_MINI_TOKENS_LIGHT,\n ...MT_MINI_TOKENS_DARK_OVERRIDES,\n}\n\n/**\n * 解析主题字面量表。\n *\n * 合并顺序:内置名(或自定义表)→ `themeTokens` 覆盖项。\n *\n * @param theme 内置主题名或自定义字面量表,缺省 `'light'`\n * @param override 覆盖项,键含 `--` 前缀;缺省不覆盖\n * @returns 可直接传给 `serializeDocumentToMini` 的 `themeTokens`\n *\n * @example\n * ```ts\n * resolveThemeTokens('dark') // 65 个键的暗色表\n * resolveThemeTokens(undefined, { '--mt-color-link': '#f00' })\n * // 亮色表,但链接色为 #f00\n * ```\n */\nexport const resolveThemeTokens = (\n theme?: MtMiniTheme,\n override?: Record<string, string>,\n): Record<string, string> => {\n const base =\n theme === undefined || theme === 'light'\n ? MT_MINI_TOKENS_LIGHT\n : theme === 'dark'\n ? MT_MINI_TOKENS_DARK\n : theme\n return override === undefined ? { ...base } : { ...base, ...override }\n}\n","/**\n * 渲染层主入口。\n *\n * 本函数的职责边界刻意很窄 —— 只做三件事,**不自己拼 nodes**:\n *\n * | 步骤 | 说明 |\n * |---|---|\n * | ① 平台准入 | 能力表未登记的平台直接抛错,不做容错 |\n * | ② 通道解析 | `'auto'` → 按 `maxNodes` 判定,并记录是否发生切换 |\n * | ③ 主题注入 | 内置 light / dark 字面量(小程序无 CSS 变量) |\n *\n * `nodes` 一律由 `@mteditor/document` 的 `serializeDocumentToMini` 产出\n * —— 这是 「序列化真相源唯一」在小程序端的同一条原则。\n */\n\nimport { serializeDocumentToMini } from '@mteditor/document'\nimport type { MtDocument } from '@mteditor/document'\nimport { resolveCapabilities } from './capabilities'\nimport { resolveChannel } from './channel'\nimport { MT_DEFAULT_MAX_NODES, MT_DEFAULT_MODE, MT_DEFAULT_PLATFORM } from './options'\nimport { resolveThemeTokens } from './theme'\nimport type { MtMiniRenderOptions, MtMiniRenderResult } from './types'\n\n/**\n * 把 `MtDocument` 渲染为小程序可直接 `setData` 的 payload。\n *\n * @param doc 文档(唯一真相源)\n * @param options 渲染选项\n * @returns 通道、nodes、降级报告、统计与自动切换记录\n * @throws {RangeError} `options.platform` 的能力表未经实测核实\n *\n * @example\n * ```ts\n * import { renderMiniDocument } from '@mteditor/renderer-mini'\n *\n * const { mode, nodes, report, autoSwitched } = renderMiniDocument(doc, {\n * theme: 'dark',\n * mode: 'auto',\n * })\n *\n * if (autoSwitched) console.warn(`节点数 ${autoSwitched.nodeCount} 超过阈值,已切到 rich-text`)\n * if (report.length > 0) console.warn('内容有降级', report)\n * ```\n */\nexport const renderMiniDocument = (\n doc: MtDocument,\n options: MtMiniRenderOptions = {},\n): MtMiniRenderResult => {\n const platform = options.platform ?? MT_DEFAULT_PLATFORM\n // 平台准入:未实测核实的平台在此抛错,而不是拿微信的表硬跑\n void resolveCapabilities(platform)\n\n const { mode, switched } = resolveChannel(\n doc,\n options.mode ?? MT_DEFAULT_MODE,\n options.maxNodes ?? MT_DEFAULT_MAX_NODES,\n )\n\n const { output, report, stats } = serializeDocumentToMini(doc, {\n platform,\n mode,\n themeTokens: resolveThemeTokens(options.theme, options.themeTokens),\n ...(options.preRendered === undefined ? {} : { preRendered: options.preRendered }),\n })\n\n return { platform, mode, nodes: output, report, stats, autoSwitched: switched }\n}\n"]}
@@ -3,7 +3,7 @@ import { MtMiniPlatform, MtMiniMode, MtPreRenderedIndex, MtMiniNode, MtDegradati
3
3
  /**
4
4
  * `@mteditor/renderer-mini` 的公开契约。
5
5
  *
6
- * 本包**不自己序列化 nodes**(ADR-0030 决策 1),只做三件事:
6
+ * 本包**不自己序列化 nodes**,只做三件事:
7
7
  * 通道解析、主题字面量注入、平台能力表。`nodes` 一律来自
8
8
  * `@mteditor/document` 的 `serializeDocumentToMini`。
9
9
  */
@@ -11,7 +11,7 @@ import { MtMiniPlatform, MtMiniMode, MtPreRenderedIndex, MtMiniNode, MtDegradati
11
11
  /**
12
12
  * 通道选择。
13
13
  *
14
- * `'auto'` 表示交由渲染器按 `maxNodes` 判定(§9.2)——
14
+ * `'auto'` 表示交由渲染器按 `maxNodes` 判定——
15
15
  * 宿主不知道该选哪个通道正是它存在的理由。
16
16
  */
17
17
  type MtMiniChannelOption = 'auto' | MtMiniMode;
@@ -25,8 +25,8 @@ type MtMiniTheme = 'light' | 'dark' | Record<string, string>;
25
25
  /**
26
26
  * 平台能力描述。
27
27
  *
28
- * **`verified` 是这张表的准入条件**:§4.4 明令禁止「凭猜测共用一份映射表」,
29
- * 未实测的平台不得以「看起来能跑」的形态进入渲染路径(ADR-0030 决策 5)。
28
+ * **`verified` 是这张表的准入条件**:明令禁止「凭猜测共用一份映射表」
29
+ * 未实测的平台不得以「看起来能跑」的形态进入渲染路径。
30
30
  */
31
31
  interface MtMiniCapabilities {
32
32
  /** 平台标识 */
@@ -37,7 +37,7 @@ interface MtMiniCapabilities {
37
37
  tags: readonly string[];
38
38
  /** 全局支持的属性名(微信仅 `class` 与 `style`) */
39
39
  globalAttrs: readonly string[];
40
- /** 是否支持 `id` 属性(微信不支持,§9.1) */
40
+ /** 是否支持 `id` 属性(微信不支持) */
41
41
  supportsId: boolean;
42
42
  /** 逐标签的属性白名单 */
43
43
  tagAttrs: Readonly<Record<string, readonly string[]>>;
@@ -51,8 +51,8 @@ interface MtMiniRenderOptions {
51
51
  /** 渲染通道,缺省 `'auto'` */
52
52
  mode?: MtMiniChannelOption;
53
53
  /**
54
- * `mode: 'auto'` 的降级阈值,单位是**文档节点数**,缺省 `3000`(§9.2)。
55
- * 判定发生在序列化**之前**(ADR-0030 决策 3)。
54
+ * `mode: 'auto'` 的降级阈值,单位是**文档节点数**,缺省 `3000`。
55
+ * 判定发生在序列化**之前**。
56
56
  */
57
57
  maxNodes?: number;
58
58
  /** 内置主题名或自定义字面量表,缺省 `'light'` */
@@ -62,13 +62,13 @@ interface MtMiniRenderOptions {
62
62
  * 用途:宿主已有一套后台下发的品牌色,只覆盖少数几个键。
63
63
  */
64
64
  themeTokens?: Record<string, string>;
65
- /** 预渲染产物索引(公式 SVG / 代码高亮,ADR-0012 / ADR-0013) */
65
+ /** 预渲染产物索引(公式 SVG / 代码高亮) */
66
66
  preRendered?: MtPreRenderedIndex;
67
67
  }
68
68
  /**
69
69
  * 自动通道切换的记录。
70
70
  *
71
- * §9.2 要求自动降级「发出 warn」。渲染器不持有事件总线,故 warn 的载体就是这个
71
+ * 要求自动降级「发出 warn」。渲染器不持有事件总线,故 warn 的载体就是这个
72
72
  * **显式字段**而不是 `console.warn`——后者在宿主项目里会被彻底淹没,
73
73
  * 而「功能没按预期生效但也没有报错」是本项目出现次数最多的失败模式。
74
74
  */
@@ -88,17 +88,17 @@ interface MtMiniChannelSwitch {
88
88
  * 刻意**不提供关闭降级报告的开关**(与 `renderer-web` 的差异):
89
89
  * 小程序端 `rich-text` 通道会把 `video` / `audio` / 公式降级成文本,
90
90
  * 这类损失用户会直接看到。留一个「关掉报告」的开关等于给静默留后门
91
- * ——§12.2 要求降级必须可被调用方取到(ADR-0030 决策 1)。
91
+ * —— 要求降级必须可被调用方取到。
92
92
  */
93
93
  interface MtMiniRenderResult {
94
94
  /** 目标平台 */
95
95
  platform: MtMiniPlatform;
96
96
  /**
97
97
  * **实际使用**的通道。`mode: 'auto'` 传入时这里是解析后的结果,
98
- * 宿主必须按它选择 `<rich-text nodes>` 或递归组件(ADR-0030 决策 2)。
98
+ * 宿主必须按它选择 `<rich-text nodes>` 或递归组件。
99
99
  */
100
100
  mode: MtMiniMode;
101
- /** 小程序 nodes(**Array 形式**,§9.1) */
101
+ /** 小程序 nodes(**Array 形式**) */
102
102
  nodes: MtMiniNode[];
103
103
  /** 降级报告;无降级时为空数组。**始终返回**,不可关闭 */
104
104
  report: MtDegradationEntry[];
@@ -113,24 +113,24 @@ interface MtMiniRenderResult {
113
113
  }
114
114
 
115
115
  /**
116
- * 各端 `rich-text` 能力表(`docs/document-model.md` §9.1 / §9.4)。
116
+ * 各端 `rich-text` 能力表。
117
117
  *
118
- * **准入条件:必须实测核实。** §4.4 明令「各子路径必须各自维护映射差异,
119
- * 禁止共用一份映射表」;反过来说,**没有实测过就不能让别人用**——
120
- * 一份「看起来能跑」的错误白名单比明确的报错危险得多(ADR-0030 决策 5)。
118
+ * **准入条件:必须实测核实。** 各子路径必须各自维护映射差异,
119
+ * 禁止共用一份映射表;反过来说,**没有实测过就不能让别人用**——
120
+ * 一份「看起来能跑」的错误白名单比明确的报错危险得多。
121
121
  *
122
122
  * 因此本文件当前只包含 `wechat`。支付宝 / 抖音的表在各自实测完成后
123
- * (M4-b,需各自开发者工具)追加,并同时回填 §9.4 的待确认项。
123
+ * (需各自开发者工具)追加,并同时回填待确认项。
124
124
  */
125
125
 
126
126
  /**
127
- * 微信小程序 `rich-text` 受信任标签白名单(§9.1,**已核实**)。
127
+ * 微信小程序 `rich-text` 受信任标签白名单(**已核实**)。
128
128
  *
129
129
  * 顺序与官方文档一致,便于逐条比对;`Set` 查询由调用方按需构造。
130
130
  */
131
131
  declare const MT_WECHAT_RICH_TEXT_TAGS: readonly string[];
132
132
  /**
133
- * 逐标签属性白名单(§9.1,**已核实**)。
133
+ * 逐标签属性白名单(**已核实**)。
134
134
  *
135
135
  * 未在表中的标签不接受额外属性;全局属性(`class` / `style`)单独由
136
136
  * `globalAttrs` 描述。**`id` 不在任何一张表里** —— 微信全局不支持 `id`。
@@ -139,7 +139,7 @@ declare const MT_WECHAT_TAG_ATTRS: Readonly<Record<string, readonly string[]>>;
139
139
  /**
140
140
  * 小程序平台能力表。
141
141
  *
142
- * 当前只登记 `wechat`(§9.1 已核实)。缺失的平台在
142
+ * 当前只登记 `wechat`(已核实)。缺失的平台在
143
143
  * `resolveCapabilities` 处**抛错**,不做容错。
144
144
  */
145
145
  declare const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMiniCapabilities>>>;
@@ -148,7 +148,7 @@ declare const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMi
148
148
  *
149
149
  * @param platform 平台标识
150
150
  * @returns 该平台的能力描述
151
- * @throws {RangeError} 该平台尚未实测核实(ADR-0030 决策 5)
151
+ * @throws {RangeError} 该平台尚未实测核实
152
152
  *
153
153
  * @example
154
154
  * ```ts
@@ -159,12 +159,12 @@ declare const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMi
159
159
  declare const resolveCapabilities: (platform: MtMiniPlatform) => MtMiniCapabilities;
160
160
 
161
161
  /**
162
- * 内置主题字面量(ADR-0030 决策 4)。
162
+ * 内置主题字面量。
163
163
  *
164
164
  * ## 为什么这份数据必须存在于本包
165
165
  *
166
- * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**(§9.3),
167
- * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default` 按 §6.1
166
+ * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**,
167
+ * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default`
168
168
  * 只产出 CSS、没有 JS 导出 —— 若要求宿主自备这份表,每个项目都要手抄
169
169
  * `tokens.css` 的 65 个键,抄错还**没有报错**(本仓库自己就踩过:
170
170
  * `mini.ts` 读的 `--mt-font-mono` 与 `tokens.css` 的 `--mt-font-family-mono`
@@ -3,7 +3,7 @@ import { MtMiniPlatform, MtMiniMode, MtPreRenderedIndex, MtMiniNode, MtDegradati
3
3
  /**
4
4
  * `@mteditor/renderer-mini` 的公开契约。
5
5
  *
6
- * 本包**不自己序列化 nodes**(ADR-0030 决策 1),只做三件事:
6
+ * 本包**不自己序列化 nodes**,只做三件事:
7
7
  * 通道解析、主题字面量注入、平台能力表。`nodes` 一律来自
8
8
  * `@mteditor/document` 的 `serializeDocumentToMini`。
9
9
  */
@@ -11,7 +11,7 @@ import { MtMiniPlatform, MtMiniMode, MtPreRenderedIndex, MtMiniNode, MtDegradati
11
11
  /**
12
12
  * 通道选择。
13
13
  *
14
- * `'auto'` 表示交由渲染器按 `maxNodes` 判定(§9.2)——
14
+ * `'auto'` 表示交由渲染器按 `maxNodes` 判定——
15
15
  * 宿主不知道该选哪个通道正是它存在的理由。
16
16
  */
17
17
  type MtMiniChannelOption = 'auto' | MtMiniMode;
@@ -25,8 +25,8 @@ type MtMiniTheme = 'light' | 'dark' | Record<string, string>;
25
25
  /**
26
26
  * 平台能力描述。
27
27
  *
28
- * **`verified` 是这张表的准入条件**:§4.4 明令禁止「凭猜测共用一份映射表」,
29
- * 未实测的平台不得以「看起来能跑」的形态进入渲染路径(ADR-0030 决策 5)。
28
+ * **`verified` 是这张表的准入条件**:明令禁止「凭猜测共用一份映射表」
29
+ * 未实测的平台不得以「看起来能跑」的形态进入渲染路径。
30
30
  */
31
31
  interface MtMiniCapabilities {
32
32
  /** 平台标识 */
@@ -37,7 +37,7 @@ interface MtMiniCapabilities {
37
37
  tags: readonly string[];
38
38
  /** 全局支持的属性名(微信仅 `class` 与 `style`) */
39
39
  globalAttrs: readonly string[];
40
- /** 是否支持 `id` 属性(微信不支持,§9.1) */
40
+ /** 是否支持 `id` 属性(微信不支持) */
41
41
  supportsId: boolean;
42
42
  /** 逐标签的属性白名单 */
43
43
  tagAttrs: Readonly<Record<string, readonly string[]>>;
@@ -51,8 +51,8 @@ interface MtMiniRenderOptions {
51
51
  /** 渲染通道,缺省 `'auto'` */
52
52
  mode?: MtMiniChannelOption;
53
53
  /**
54
- * `mode: 'auto'` 的降级阈值,单位是**文档节点数**,缺省 `3000`(§9.2)。
55
- * 判定发生在序列化**之前**(ADR-0030 决策 3)。
54
+ * `mode: 'auto'` 的降级阈值,单位是**文档节点数**,缺省 `3000`。
55
+ * 判定发生在序列化**之前**。
56
56
  */
57
57
  maxNodes?: number;
58
58
  /** 内置主题名或自定义字面量表,缺省 `'light'` */
@@ -62,13 +62,13 @@ interface MtMiniRenderOptions {
62
62
  * 用途:宿主已有一套后台下发的品牌色,只覆盖少数几个键。
63
63
  */
64
64
  themeTokens?: Record<string, string>;
65
- /** 预渲染产物索引(公式 SVG / 代码高亮,ADR-0012 / ADR-0013) */
65
+ /** 预渲染产物索引(公式 SVG / 代码高亮) */
66
66
  preRendered?: MtPreRenderedIndex;
67
67
  }
68
68
  /**
69
69
  * 自动通道切换的记录。
70
70
  *
71
- * §9.2 要求自动降级「发出 warn」。渲染器不持有事件总线,故 warn 的载体就是这个
71
+ * 要求自动降级「发出 warn」。渲染器不持有事件总线,故 warn 的载体就是这个
72
72
  * **显式字段**而不是 `console.warn`——后者在宿主项目里会被彻底淹没,
73
73
  * 而「功能没按预期生效但也没有报错」是本项目出现次数最多的失败模式。
74
74
  */
@@ -88,17 +88,17 @@ interface MtMiniChannelSwitch {
88
88
  * 刻意**不提供关闭降级报告的开关**(与 `renderer-web` 的差异):
89
89
  * 小程序端 `rich-text` 通道会把 `video` / `audio` / 公式降级成文本,
90
90
  * 这类损失用户会直接看到。留一个「关掉报告」的开关等于给静默留后门
91
- * ——§12.2 要求降级必须可被调用方取到(ADR-0030 决策 1)。
91
+ * —— 要求降级必须可被调用方取到。
92
92
  */
93
93
  interface MtMiniRenderResult {
94
94
  /** 目标平台 */
95
95
  platform: MtMiniPlatform;
96
96
  /**
97
97
  * **实际使用**的通道。`mode: 'auto'` 传入时这里是解析后的结果,
98
- * 宿主必须按它选择 `<rich-text nodes>` 或递归组件(ADR-0030 决策 2)。
98
+ * 宿主必须按它选择 `<rich-text nodes>` 或递归组件。
99
99
  */
100
100
  mode: MtMiniMode;
101
- /** 小程序 nodes(**Array 形式**,§9.1) */
101
+ /** 小程序 nodes(**Array 形式**) */
102
102
  nodes: MtMiniNode[];
103
103
  /** 降级报告;无降级时为空数组。**始终返回**,不可关闭 */
104
104
  report: MtDegradationEntry[];
@@ -113,24 +113,24 @@ interface MtMiniRenderResult {
113
113
  }
114
114
 
115
115
  /**
116
- * 各端 `rich-text` 能力表(`docs/document-model.md` §9.1 / §9.4)。
116
+ * 各端 `rich-text` 能力表。
117
117
  *
118
- * **准入条件:必须实测核实。** §4.4 明令「各子路径必须各自维护映射差异,
119
- * 禁止共用一份映射表」;反过来说,**没有实测过就不能让别人用**——
120
- * 一份「看起来能跑」的错误白名单比明确的报错危险得多(ADR-0030 决策 5)。
118
+ * **准入条件:必须实测核实。** 各子路径必须各自维护映射差异,
119
+ * 禁止共用一份映射表;反过来说,**没有实测过就不能让别人用**——
120
+ * 一份「看起来能跑」的错误白名单比明确的报错危险得多。
121
121
  *
122
122
  * 因此本文件当前只包含 `wechat`。支付宝 / 抖音的表在各自实测完成后
123
- * (M4-b,需各自开发者工具)追加,并同时回填 §9.4 的待确认项。
123
+ * (需各自开发者工具)追加,并同时回填待确认项。
124
124
  */
125
125
 
126
126
  /**
127
- * 微信小程序 `rich-text` 受信任标签白名单(§9.1,**已核实**)。
127
+ * 微信小程序 `rich-text` 受信任标签白名单(**已核实**)。
128
128
  *
129
129
  * 顺序与官方文档一致,便于逐条比对;`Set` 查询由调用方按需构造。
130
130
  */
131
131
  declare const MT_WECHAT_RICH_TEXT_TAGS: readonly string[];
132
132
  /**
133
- * 逐标签属性白名单(§9.1,**已核实**)。
133
+ * 逐标签属性白名单(**已核实**)。
134
134
  *
135
135
  * 未在表中的标签不接受额外属性;全局属性(`class` / `style`)单独由
136
136
  * `globalAttrs` 描述。**`id` 不在任何一张表里** —— 微信全局不支持 `id`。
@@ -139,7 +139,7 @@ declare const MT_WECHAT_TAG_ATTRS: Readonly<Record<string, readonly string[]>>;
139
139
  /**
140
140
  * 小程序平台能力表。
141
141
  *
142
- * 当前只登记 `wechat`(§9.1 已核实)。缺失的平台在
142
+ * 当前只登记 `wechat`(已核实)。缺失的平台在
143
143
  * `resolveCapabilities` 处**抛错**,不做容错。
144
144
  */
145
145
  declare const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMiniCapabilities>>>;
@@ -148,7 +148,7 @@ declare const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMi
148
148
  *
149
149
  * @param platform 平台标识
150
150
  * @returns 该平台的能力描述
151
- * @throws {RangeError} 该平台尚未实测核实(ADR-0030 决策 5)
151
+ * @throws {RangeError} 该平台尚未实测核实
152
152
  *
153
153
  * @example
154
154
  * ```ts
@@ -159,12 +159,12 @@ declare const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMi
159
159
  declare const resolveCapabilities: (platform: MtMiniPlatform) => MtMiniCapabilities;
160
160
 
161
161
  /**
162
- * 内置主题字面量(ADR-0030 决策 4)。
162
+ * 内置主题字面量。
163
163
  *
164
164
  * ## 为什么这份数据必须存在于本包
165
165
  *
166
- * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**(§9.3),
167
- * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default` 按 §6.1
166
+ * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**,
167
+ * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default`
168
168
  * 只产出 CSS、没有 JS 导出 —— 若要求宿主自备这份表,每个项目都要手抄
169
169
  * `tokens.css` 的 65 个键,抄错还**没有报错**(本仓库自己就踩过:
170
170
  * `mini.ts` 读的 `--mt-font-mono` 与 `tokens.css` 的 `--mt-font-family-mono`
@@ -91,7 +91,7 @@ var MT_MINI_CAPABILITIES = {
91
91
  supportsId: false,
92
92
  tagAttrs: MT_WECHAT_TAG_ATTRS,
93
93
  /**
94
- * `rich-text` 下不可表达、必须拆到组件外的节点(§9.2)。
94
+ * `rich-text` 下不可表达、必须拆到组件外的节点。
95
95
  * 组件通道下这些节点走原生组件,不受 `rich-text` 白名单限制。
96
96
  */
97
97
  nativeComponents: ["video", "audio"]
@@ -101,7 +101,7 @@ var resolveCapabilities = (platform) => {
101
101
  const found = MT_MINI_CAPABILITIES[platform];
102
102
  if (found === void 0) {
103
103
  throw new RangeError(
104
- `@mteditor/renderer-mini \u5C1A\u672A\u652F\u6301\u5E73\u53F0 "${platform}"\uFF1A\u5176 rich-text \u767D\u540D\u5355\u672A\u7ECF\u5B9E\u6D4B\u6838\u5B9E\uFF0C\u6309 AGENTS.md \xA74.4 \u7981\u6B62\u51ED\u731C\u6D4B\u63D0\u4F9B\u6620\u5C04\u8868\u3002\u5F53\u524D\u53EF\u7528\u5E73\u53F0\uFF1Awechat\u3002`
104
+ `@mteditor/renderer-mini \u5C1A\u672A\u652F\u6301\u5E73\u53F0 "${platform}"\uFF1A\u5176 rich-text \u767D\u540D\u5355\u672A\u7ECF\u5B9E\u6D4B\u6838\u5B9E\uFF0C\u4E0D\u63A5\u53D7\u51ED\u731C\u6D4B\u63D0\u4F9B\u7684\u6620\u5C04\u8868\u3002\u5F53\u524D\u53EF\u7528\u5E73\u53F0\uFF1Awechat\u3002`
105
105
  );
106
106
  }
107
107
  return found;