@ptengine/lp-editor-core 1.0.0-alpha.3 → 1.0.0-alpha.5
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/golden/component-cases.json +550 -0
- package/dist/golden/fixtures/page/01-etvos-article-lp.html +1 -1
- package/dist/golden/fixtures/page/02-vivaia-campaign-lp.html +1 -1
- package/dist/golden/fixtures/popup/14-back-to-school-email-form.html +1 -1
- package/dist/golden/fixtures/popup/15-xtool-ebook-split-form.html +1 -1
- package/dist/golden/fixtures/popup/16-880-off-gradient-form.html +1 -1
- package/dist/golden/fixtures/popup/README.md +3 -3
- package/dist/golden/manifest.json +310 -9
- package/dist/golden/verify.mjs +12 -0
- package/dist/index.d.ts +392 -43
- package/dist/index.js +805 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom/parse.ts","../src/dom/parseFragment.ts","../src/serialize/canonical.ts","../src/rules/index.ts","../src/version.ts","../src/validate/tree.ts","../src/normalize.ts","../src/wrap.ts","../src/validate/variants.ts","../src/validate/palette.ts","../src/validate/index.ts","../src/errors.ts","../src/validate/structure.ts","../src/ops/guards.ts","../src/ops/apply.ts","../src/compile/index.ts","../src/generated/tw-css.ts","../src/compile/theme.ts","../src/collectClasses.ts","../src/index.ts"],"names":["tag","EVENT_ATTR","serializeChildren","out","child","twCompile"],"mappings":"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","file":"index.js","sourcesContent":["import type { DOMParserCtor } from './types.js';\n\n/**\n * 整文档解析。\n *\n * 注意产出的文档**没有 browsing context**,`defaultView` 恒为 `null`\n * (Chrome / Firefox / jsdom 一致)。所以 core 内部绝不能从文档反查\n * `doc.defaultView.DOMParser` —— 进入流程本身就是 DOMParser 解析,\n * 照那样写第一行就会抛。解析器一律由宿主注入。\n */\nexport function createParse(DOMParser: DOMParserCtor): (html: string) => Document {\n const parser = new DOMParser();\n return function parse(html: string): Document {\n if (typeof html !== 'string') {\n throw new TypeError('parse(): html 必须是字符串');\n }\n return parser.parseFromString(html, 'text/html');\n };\n}\n","/**\n * 片段解析:EditOp 的 `insert.html` / `replace.html` 从字符串变成节点的唯一入口。\n *\n * 不需要注入解析器 —— 用目标文档自己的 `<template>` 就够,而且这是**唯一**能\n * 正确处理上下文相关元素的通用做法:HTML5 的 \"in template\" 插入模式对\n * `<tr>` / `<td>` / `<col>` / `<li>` / `<option>` 会各自切到正确的表格 / 列表模式,\n * 元素不会被丢弃。所以不需要额外的 contextEl 参数,一个容器覆盖全部上下文。\n *\n * ⚠️ `template.content` 里的节点属于**模板内容所有者文档**,不是 `doc`。\n * 插入时由 DOM 的 pre-insert 自动 adopt,所以最终没问题;但在插入**之前**\n * `node.ownerDocument !== doc`,任何「同文档」断言都会误判。\n *\n * 这里是全包唯一允许写 innerHTML 的地方(见 eslint.config.js):写是解析,\n * 与「禁读 outerHTML」要防的事情无关。\n */\nexport function parseFragment(doc: Document, html: string): DocumentFragment {\n if (typeof html !== 'string') {\n throw new TypeError('parseFragment(): html 必须是字符串');\n }\n const tpl = doc.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n}\n\n/** 片段里的元素子节点(跳过纯空白文本),供单根校验使用。 */\nexport function fragmentElementRoots(fragment: DocumentFragment): Element[] {\n const roots: Element[] = [];\n let child: Node | null = fragment.firstChild;\n while (child) {\n if (child.nodeType === 1) roots.push(child as Element);\n child = child.nextSibling;\n }\n return roots;\n}\n","/**\n * 规范序列化(canonical serializer)。\n *\n * 目标:同一棵 DOM 树(由任何符合 HTML5 规范的树构造器产出),无论宿主是浏览器\n * 原生 DOM 还是 jsdom,都序列化成**逐字节相同**的字符串。这是「编辑器 apply ==\n * mastra apply」那条不变量的落点。\n *\n * 约束:\n * - 纯函数,无副作用、无 I/O\n * - 只依赖标准 DOM 读 API,同一份实现在浏览器与 Node 两侧跑\n * - 绝不使用 innerHTML / outerHTML —— 它们本身就是分歧的来源\n *\n * 规范规则(全部写死,不提供选项):\n * R1 标签名 HTML 命名空间元素小写;外来元素(SVG / MathML)保留\n * 解析器调整后的 localName(foreignObject、clipPath…)\n * R2 属性顺序 按限定名排序,UTF-16 码元序\n * R3 属性引号 一律 name=\"value\",双引号,永远带引号\n * R4 文本转义 & < > -> & < >\n * R5 属性值转义 & < > \" -> & < > "\n * R6 空元素 <br> —— 不带结尾斜杠、不带闭合标签\n * R7 pre/textarea/listing 空白原样保留;紧随起始标签的换行重新发出\n * (解析器会吃掉一个),保证再解析回同一棵树\n * R8 注释 原样 <!--data-->\n * R9 doctype 规范化;无 id 的 html -> <!DOCTYPE html>\n * R10 布尔/空属性 统一一种形态:disabled=\"\"、alt=\"\"\n * R11 raw text script/style/xmp/iframe/noembed/noframes/plaintext\n * 的字符数据原样输出,不转义\n * R12 template 经其 .content 片段序列化\n * R13 回车 U+000D 在文本与属性值里输出为 ,使输出可往返\n * R14 class 值 按空白切分后**去重**、单空格拼接,**不重排顺序**\n *\n * R13 与 R14 是相对 WHATWG 序列化器的**增补**,不是放宽:\n * - R13:词法分析器在建树前把 CR / CRLF 归一成 LF,不转义的 CR 会在下一次解析时\n * 静默变成 LF。原生 outerHTML 在所有引擎上都有这个毛病。\n * - R14:两侧按同一组 op 应用会得到同样的插入顺序,所以顺序天然确定、不需要排序;\n * 但源数据里的 `class=\"a b a\"` 这类写法会让字节不同。去重 + 折叠空白把它收敛掉。\n * **有意不排序** —— 排序会把作者写的顺序变成非作者的,而 `md:` 与基线的相对位置\n * 在读源码时是有意义的。\n */\n\nconst HTML_NS = 'http://www.w3.org/1999/xhtml';\n\n/** R6:HTML 空元素(含历史遗留的几个)。 */\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'basefont',\n 'bgsound',\n 'br',\n 'col',\n 'embed',\n 'frame',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\n/**\n * R11:子文本永不转义的元素。\n *\n * `noscript` 有意**不在**这个集合里。规范对 noscript 的规则取决于 scripting flag,\n * 而那个标志从 DOM 上观察不到。我们的两个宿主都以 scripting 关闭解析\n * (DOMParser 恒如此;jsdom 不设 runScripts 时也是),所以 noscript 的子节点\n * 在两侧都是真实元素 / 已转义文本,走「转义」这一支才逐字节一致且可往返。\n */\nconst RAW_TEXT_ELEMENTS = new Set([\n 'script',\n 'style',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext'\n]);\n\n/** R7:解析器会吃掉一个前导换行的元素。 */\nconst NEWLINE_EATING_ELEMENTS = new Set(['pre', 'textarea', 'listing']);\n\n// 节点类型常量写死,不依赖可能不存在的全局(裸 Node 进程里没有 Node.ELEMENT_NODE)。\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst CDATA_SECTION_NODE = 4;\nconst PROCESSING_INSTRUCTION_NODE = 7;\nconst COMMENT_NODE = 8;\nconst DOCUMENT_NODE = 9;\nconst DOCUMENT_TYPE_NODE = 10;\nconst DOCUMENT_FRAGMENT_NODE = 11;\n\n/** R4(+ R13)。 */\nfunction escapeText(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch === '&') out += '&';\n else if (ch === '<') out += '<';\n else if (ch === '>') out += '>';\n else if (ch === '\\r') out += ' ';\n else out += ch;\n }\n return out;\n}\n\n/** R5(+ R13)。 */\nfunction escapeAttribute(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch === '&') out += '&';\n else if (ch === '<') out += '<';\n else if (ch === '>') out += '>';\n else if (ch === '\"') out += '"';\n else if (ch === '\\r') out += ' ';\n else out += ch;\n }\n return out;\n}\n\n/**\n * R14:class 值去重 + 折叠空白,保持首次出现的顺序。\n * 导出是因为 EditOp 的 class 增删也要用同一份规则,否则「写进去的」与\n * 「序列化出来的」会是两套。\n */\nexport function normalizeClassValue(value: string): string {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of value.split(/[\\t\\n\\f\\r ]+/)) {\n if (token === '' || seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n }\n return out.join(' ');\n}\n\n/**\n * R1。HTML 命名空间元素小写(解析器已经做过,这里再做一次,防止程序化构造的树\n * 混进大小写);外来元素保留解析器调整后的 localName。\n */\nfunction canonicalTagName(el: Element): string {\n const local = el.localName;\n if (el.namespaceURI === HTML_NS || el.namespaceURI == null) {\n return local.toLowerCase();\n }\n return local;\n}\n\n/**\n * R2。按限定名排序,UTF-16 码元序。\n * 有意不用 `localeCompare`:它依赖 locale 与 ICU 版本,正是跨引擎分歧的来源。\n */\nfunction sortedAttributes(el: Element): Array<[string, string]> {\n const attrs: Array<[string, string]> = [];\n const list = el.attributes;\n for (let i = 0; i < list.length; i++) {\n const a = list[i];\n const raw = a.value === null || a.value === undefined ? '' : a.value;\n attrs.push([a.name, a.name === 'class' ? normalizeClassValue(raw) : raw]);\n }\n attrs.sort((x, y) => (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0));\n return attrs;\n}\n\n/** R3 + R10:每个属性都写成 name=\"value\",空值也写。 */\nfunction serializeAttributes(el: Element): string {\n let out = '';\n for (const [name, value] of sortedAttributes(el)) {\n out += ' ' + name + '=\"' + escapeAttribute(value) + '\"';\n }\n return out;\n}\n\n/** R9 */\nfunction serializeDoctype(dt: DocumentType): string {\n const name = (dt.name || '').toLowerCase();\n const publicId = dt.publicId || '';\n const systemId = dt.systemId || '';\n if (name === 'html' && publicId === '' && systemId === '') {\n return '<!DOCTYPE html>';\n }\n let out = '<!DOCTYPE ' + name;\n if (publicId !== '') {\n out += ' PUBLIC \"' + publicId + '\"';\n if (systemId !== '') out += ' \"' + systemId + '\"';\n } else if (systemId !== '') {\n out += ' SYSTEM \"' + systemId + '\"';\n }\n return out + '>';\n}\n\nfunction isRawTextElement(el: Element): boolean {\n return (\n (el.namespaceURI === HTML_NS || el.namespaceURI == null) &&\n RAW_TEXT_ELEMENTS.has(canonicalTagName(el))\n );\n}\n\nfunction isVoidElement(el: Element): boolean {\n return (\n (el.namespaceURI === HTML_NS || el.namespaceURI == null) &&\n VOID_ELEMENTS.has(canonicalTagName(el))\n );\n}\n\nfunction serializeChildren(node: Node, sink: string[]): void {\n let child: Node | null = node.firstChild;\n while (child) {\n serializeNode(child, sink);\n child = child.nextSibling;\n }\n}\n\nfunction serializeElement(el: Element, sink: string[]): void {\n const tag = canonicalTagName(el);\n sink.push('<' + tag + serializeAttributes(el) + '>');\n\n if (isVoidElement(el)) {\n // R6:无子节点、无闭合标签、无自闭合斜杠。\n return;\n }\n\n // R12:<template> 的内容在另一个 DocumentFragment 上。\n const isTemplate =\n tag === 'template' && (el.namespaceURI === HTML_NS || el.namespaceURI == null);\n const tplContent = (el as HTMLTemplateElement).content;\n const contentRoot: Node = isTemplate && tplContent ? tplContent : el;\n\n // R7:树构造器吞掉了起始标签后紧跟的一个换行,重新发出来,保证再解析回同一棵树。\n if (NEWLINE_EATING_ELEMENTS.has(tag) && !isTemplate) {\n const first = contentRoot.firstChild;\n if (first && first.nodeType === TEXT_NODE && (first as Text).data.charCodeAt(0) === 10) {\n sink.push('\\n');\n }\n }\n\n if (isRawTextElement(el)) {\n // R11:字符数据原样输出。\n let child: Node | null = contentRoot.firstChild;\n while (child) {\n if (child.nodeType === TEXT_NODE || child.nodeType === CDATA_SECTION_NODE) {\n sink.push((child as CharacterData).data);\n } else {\n serializeNode(child, sink);\n }\n child = child.nextSibling;\n }\n } else {\n serializeChildren(contentRoot, sink);\n }\n\n sink.push('</' + tag + '>');\n}\n\nfunction serializeNode(node: Node, sink: string[]): void {\n switch (node.nodeType) {\n case ELEMENT_NODE:\n serializeElement(node as Element, sink);\n break;\n\n case TEXT_NODE: {\n // R4;R11 由父元素处理(raw text 的父节点不会递归到这里)。\n const parent = node.parentNode;\n if (parent && parent.nodeType === ELEMENT_NODE && isRawTextElement(parent as Element)) {\n sink.push((node as Text).data);\n } else {\n sink.push(escapeText((node as Text).data));\n }\n break;\n }\n\n case CDATA_SECTION_NODE:\n // HTML 文档里不会出现(解析器把 <![CDATA[ 变成伪注释);\n // 程序化构造的树仍然处理。\n sink.push('<![CDATA[' + (node as CharacterData).data + ']]>');\n break;\n\n case PROCESSING_INSTRUCTION_NODE:\n // 同样不可能经 HTML 解析器产生,仍然规范化。\n sink.push(\n '<?' +\n (node as ProcessingInstruction).target +\n ' ' +\n (node as ProcessingInstruction).data +\n '>'\n );\n break;\n\n case COMMENT_NODE:\n // R8\n sink.push('<!--' + (node as Comment).data + '-->');\n break;\n\n case DOCUMENT_TYPE_NODE:\n sink.push(serializeDoctype(node as DocumentType));\n break;\n\n case DOCUMENT_NODE:\n case DOCUMENT_FRAGMENT_NODE:\n serializeChildren(node, sink);\n break;\n\n default:\n // Attr / entity / notation 节点从解析出的树里不可达。\n break;\n }\n}\n\n/**\n * 把 Document、DocumentFragment、Element 或 DocumentType 序列化成规范 HTML。\n *\n * 片段(DocumentFragment)与元素都走同一条路径 —— 片段序列化其全部子节点,\n * 所以 `serialize(parseFragment(doc, html))` 是幂等可比对的。\n */\nexport function serialize(node: Node): string {\n if (node === null || node === undefined) {\n throw new TypeError('serialize(): node 不能为空');\n }\n const sink: string[] = [];\n serializeNode(node, sink);\n return sink.join('');\n}\n","/**\n * 规则**数据表**。\n *\n * 这里只有数据,没有一句提示词措辞 —— 措辞在 mastra 的\n * `page-designer/segments/v4.ts`,从这张表渲染。core 因此可以作为公开包发布,\n * 措辞微调也不需要 core 发版。\n *\n * 代价是语义变更要两仓配对改。mastra 侧靠**双向**覆盖测试兜住:\n * 正向:规则段必须提到这里的每一项(防 core 新增、mastra 没跟)\n * 反向:规则段提到的每一项都能在这里找到(防 core 删除、mastra 还在讲)\n * 只做正向的话,删一个开关后测试仍是绿的。\n */\n\n/** 设备变体。`md:` 是 PC 覆盖,`max-md:` 是手机独占(两者无缝无重叠)。 */\nexport const DEVICE_VARIANTS = ['md', 'max-md'] as const;\n\n/**\n * 状态变体。\n *\n * 有意不含 `focus:` —— 统一用 `focus-visible:`。\n * 有意不含 `group-*` / `peer-*`:它们把样式绑到**别的元素**的状态上,\n * 面板表达不了、属性回显放不进(基线 / md / max-md)三槽。\n * 这两类 Tailwind 都能编译,拒绝它们是产品决定,不是能力限制。\n */\nexport const STATE_VARIANTS = ['hover', 'focus-visible', 'active', 'disabled'] as const;\n\nexport type DeviceVariant = (typeof DEVICE_VARIANTS)[number];\nexport type StateVariant = (typeof STATE_VARIANTS)[number];\n\n/** 属性回显的三个槽位。 */\nexport const PROPERTY_SLOTS = ['base', 'md', 'max-md'] as const;\nexport type PropertySlot = (typeof PROPERTY_SLOTS)[number];\n\n/** 结构层级。**唯一**一套,不按宿主分档。 */\nexport const LAYER_NAMES = ['section', 'container', 'leaf'] as const;\nexport type LayerName = (typeof LAYER_NAMES)[number];\n\n/** leaf 的类型。 */\nexport const LEAF_TYPES = ['text', 'media', 'button', 'shape'] as const;\nexport type LeafType = (typeof LEAF_TYPES)[number];\n\n/** data-pt-id 的格式。AI 不给就会生成 `data-pt-id=\"首屏标题\"`。 */\nexport const ID_PATTERN = /^[a-z][a-z0-9_-]{1,31}$/;\nexport const ID_PATTERN_SOURCE = '[a-z][a-z0-9_-]{1,31}';\n\n/** 主题块的固定 id。AI 用 set.text 改它的内容。 */\nexport const THEME_PT_ID = 'theme';\n\n/**\n * <body> 的固定 id。\n *\n * 必须有 —— section 只能是 body 的直接子元素,而 `insert` 是按 parentId 定位的:\n * body 没有 id 的话,AI 与面板都无法插入一个新区块,`delete` 一个 section 的\n * 逆操作也无处可指。与 `theme` 同为保留字面量,由 normalize 分配。\n */\nexport const ROOT_PT_ID = 'root';\n\n/** 源 HTML 的格式标记。 */\nexport const FORMAT_META_NAME = 'lpx-format';\nexport const FORMAT_VERSION = '4';\n\n/**\n * 合成包裹层的标记(布尔属性)。\n *\n * 片段型来源(弹窗一类)进编辑器前由 `wrap()` 规范化成文档,过程中合成一个\n * `section` + 一个 `container`。**这个标记是它们唯一的识别手段** —— `unwrap` 定位、\n * 图层树过滤、`apply` 门禁、`containerDepth` 豁免,四处全部只看它,\n * 不看 id、不看位置。位置只是今天恰好成立的巧合。\n */\nexport const WRAP_ATTR = 'data-pt-wrap';\n\n/**\n * 合成层的保留 id。与 `root` / `theme` 同为保留字面量。\n *\n * 它们只是「结构节点必须带 id」(`tree.ts` 的 `shouldHaveId`)的产物,是实现细节 ——\n * **没有谁按 id 找合成层**(那是 `WRAP_ATTR` 的活)。写进这里是为了可预测与可 grep。\n *\n * 加 `ptwrap` 前缀是让「这不是你写的」一眼可见;`root` / `theme` 用裸词是因为\n * 它们确实是用户 / AI 要引用的锚点。\n *\n * 固定字面量而**不是**「挑一个没被占用的 id」:能撞上它们的片段本身就说明上游\n * 出了问题(漏剥 / 回灌),悄悄换个 id 继续跑是把 bug 藏进数据里。而且两条路径\n * (编辑器 / mastra 直连)对同一份片段必须 wrap 出逐字节相同的文档,固定字面量\n * 天然满足,分配式的确定性挂在「遍历顺序 + 计数器实现」上。\n */\nexport const WRAP_SECTION_PT_ID = 'ptwrap-section';\nexport const WRAP_CONTAINER_PT_ID = 'ptwrap-container';\n\n/**\n * 两端差别的六个结构开关。面板与 mastra 规则段同源于此。\n */\nexport const SWITCHES = [\n {\n key: 'hide',\n attr: 'data-pt-hide',\n values: ['mobile', 'pc'],\n summary: '一端隐藏'\n },\n {\n key: 'layout-mobile',\n attr: 'data-pt-layout-mobile',\n values: ['stack', 'scroll'],\n summary: 'PC 轮播→手机纵向平铺 / PC 网格→手机横滑'\n },\n {\n key: 'swap-image',\n attr: null,\n values: [],\n summary: '<picture> 双 source,(min-width:768px) 分界'\n },\n {\n key: 'direction',\n attr: null,\n values: [],\n summary: 'flex-col md:flex-row'\n },\n {\n key: 'columns',\n attr: null,\n values: [],\n summary: 'grid-cols-1 md:grid-cols-{n}'\n },\n {\n key: 'placeholder',\n attr: 'data-pt-placeholder',\n values: [],\n summary: '未落图占位;必带 aspect-*,src 为空'\n }\n] as const;\n\n/**\n * 「两端一致」属性:这些属性两端应当相同,分开设几乎总是失误。\n * 它是 AI 侧规则与面板提示,**不对人硬限制**。\n */\nexport const CROSS_DEVICE_CONSISTENT_PROPERTIES = [\n 'color',\n 'font-weight',\n 'border',\n 'box-shadow',\n 'font-family'\n] as const;\n\n/** 不透明子树的两档。 */\nexport const OPAQUE_MODES = ['strict', 'text'] as const;\nexport type OpaqueMode = (typeof OPAQUE_MODES)[number];\nexport const OPAQUE_ATTR = 'data-pt-opaque';\n/** 裸 data-pt-opaque 等价于 strict,兼容既有语义。 */\nexport const OPAQUE_DEFAULT_MODE: OpaqueMode = 'strict';\n\n/** 不透明表格里仍需发 id、按文本叶子改文字的元素。 */\nexport const OPAQUE_TEXT_EDITABLE_TAGS = ['td', 'th'] as const;\n\n/**\n * 行内元素不发 id —— 文本叶子内部的 <b> <a> <span> 等。\n * v2 的 parse.ts 给 span 分配 id 的行为在 core 里关掉。\n */\nexport const INLINE_NO_ID_TAGS = [\n 'a',\n 'abbr',\n 'b',\n 'bdi',\n 'bdo',\n 'br',\n 'cite',\n 'code',\n 'data',\n 'dfn',\n 'em',\n 'i',\n 'kbd',\n 'mark',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'time',\n 'u',\n 'var',\n 'wbr'\n] as const;\n\n/** 唯一允许的内联 style:动效变量。 */\nexport const INLINE_STYLE_ALLOWED_PREFIX = '--pt-';\n\n/** EditOp 的类型词表。 */\nexport const EDIT_OP_KINDS = ['set', 'insert', 'delete', 'move', 'replace'] as const;\n\n/** 任意值的边界:这些属性允许写 `w-[43%]` 这类任意值,其余只给档位 / 刻度。 */\nexport const ARBITRARY_VALUE_ALLOWED_PROPERTIES = [\n 'width',\n 'height',\n 'aspect-ratio',\n 'background-image',\n 'max-width',\n 'min-height'\n] as const;\n\n/**\n * 整张表。mastra 的规则段渲染它,双向覆盖测试也比对它。\n * 加一项就要同步 mastra —— 这正是双向断言要暴露的事。\n */\nexport const rules = {\n deviceVariants: DEVICE_VARIANTS,\n stateVariants: STATE_VARIANTS,\n propertySlots: PROPERTY_SLOTS,\n layers: LAYER_NAMES,\n leafTypes: LEAF_TYPES,\n idPattern: ID_PATTERN_SOURCE,\n themePtId: THEME_PT_ID,\n rootPtId: ROOT_PT_ID,\n formatMetaName: FORMAT_META_NAME,\n formatVersion: FORMAT_VERSION,\n wrapAttr: WRAP_ATTR,\n wrapSectionPtId: WRAP_SECTION_PT_ID,\n wrapContainerPtId: WRAP_CONTAINER_PT_ID,\n switches: SWITCHES,\n crossDeviceConsistentProperties: CROSS_DEVICE_CONSISTENT_PROPERTIES,\n opaqueModes: OPAQUE_MODES,\n opaqueTextEditableTags: OPAQUE_TEXT_EDITABLE_TAGS,\n inlineNoIdTags: INLINE_NO_ID_TAGS,\n inlineStyleAllowedPrefix: INLINE_STYLE_ALLOWED_PREFIX,\n editOpKinds: EDIT_OP_KINDS,\n arbitraryValueAllowedProperties: ARBITRARY_VALUE_ALLOWED_PROPERTIES\n} as const;\n\nexport type Rules = typeof rules;\n","/**\n * 两个版本号,有意分家。\n *\n * `VERSION` 包版本,按 semver 走。改规则数据、改护栏逻辑、改注释都会动它。\n * `COMPILER_VERSION` **只在编译 / 导出 / 组件渲染 / 规范序列化的输出可能变时**\n * 手动递增。\n *\n * 为什么必须分开:iam 的 `compiler_version` 列存后者,保存去重也按后者。若用包版本,\n * 改一条 rules 数据就会让全租户的去重失效、把字节完全相同的成品重算一遍。\n *\n * 护栏:export golden 断言「输出变了而 COMPILER_VERSION 没变就红」。\n * 递增它是一次显式动作,不要顺手跟着包版本一起改。\n */\n\nexport const VERSION = '1.0.0-alpha.3';\n\nexport const COMPILER_VERSION = '1';\n","import {\n INLINE_NO_ID_TAGS,\n OPAQUE_ATTR,\n OPAQUE_DEFAULT_MODE,\n OPAQUE_MODES,\n OPAQUE_TEXT_EDITABLE_TAGS,\n type OpaqueMode\n} from '../rules/index.js';\n\n/**\n * 树形判定的共用工具。normalize 与 validate 都读它,避免两处各写一份\n * 「什么算结构节点」。\n */\n\nconst INLINE_SET: ReadonlySet<string> = new Set(INLINE_NO_ID_TAGS);\nconst OPAQUE_TEXT_TAGS: ReadonlySet<string> = new Set(OPAQUE_TEXT_EDITABLE_TAGS);\n\nexport function tag(el: Element): string {\n return el.localName.toLowerCase();\n}\n\nexport function isInlineTag(el: Element): boolean {\n return INLINE_SET.has(tag(el));\n}\n\n/**\n * 不透明子树的档位。\n *\n * 裸 `data-pt-opaque` 等价于 `strict`(组件库快照那套既有语义:内部是编译产物,\n * 任何 op 都拒绝)。表格用 `text`:结构锁定,但 td / th 的文字可改。\n *\n * 两档合用一个属性而不是另立 data-pt-type=\"table\",是因为表格与组件快照在\n * 「结构不可动」上本来同质;差别只在内部文字能不能编辑。\n */\nexport function opaqueMode(el: Element): OpaqueMode | null {\n if (!el.hasAttribute(OPAQUE_ATTR)) return null;\n const raw = (el.getAttribute(OPAQUE_ATTR) ?? '').trim();\n if (raw === '') return OPAQUE_DEFAULT_MODE;\n return (OPAQUE_MODES as readonly string[]).includes(raw)\n ? (raw as OpaqueMode)\n : OPAQUE_DEFAULT_MODE;\n}\n\n/** 从 el 向上找最近的不透明祖先(含自身)。 */\nexport function closestOpaque(el: Element): { host: Element; mode: OpaqueMode } | null {\n let cur: Element | null = el;\n while (cur) {\n const mode = opaqueMode(cur);\n if (mode) return { host: cur, mode };\n cur = cur.parentElement;\n }\n return null;\n}\n\n/** 文档骨架:永远不属于 pt 树,永远不发 id。 */\nconst SCAFFOLD_TAGS: ReadonlySet<string> = new Set([\n 'html',\n 'head',\n 'meta',\n 'title',\n 'link',\n 'base',\n 'style',\n 'script',\n 'noscript',\n 'template'\n]);\n\n/** 主题块:唯一允许的 <style>,`type=\"text/tailwindcss\"`,id 固定为 theme。 */\nexport function isThemeStyle(el: Element): boolean {\n return tag(el) === 'style' && el.getAttribute('type') === 'text/tailwindcss';\n}\n\n/** 自身之外,最近的一个「已声明叶子」祖先。 */\nfunction leafAncestor(el: Element): Element | null {\n let cur: Element | null = el.parentElement;\n while (cur) {\n if (cur.hasAttribute('data-pt-type') || cur.hasAttribute('data-pt-component')) return cur;\n cur = cur.parentElement;\n }\n return null;\n}\n\n/**\n * 这个元素该不该带 data-pt-id。\n *\n * 判据是**它是不是 pt 树上的一个节点**,不是「它是不是行内标签」—— 后者只是前者的\n * 一个粗糙代理,而且会判错最常见的一种元素:CTA 通常写成\n * `<a data-pt-type=\"button\">`,`<a>` 在行内表里,先看标签就会把按钮叶子判成\n * 「不该有 id」。\n *\n * 四段,顺序不能换:\n * 1. 显式声明过身份(data-pt-type / data-pt-component)的一律要 id,与标签名无关\n * 2. 文档骨架(html / head / body / meta / style…)永远不要\n * 3. **叶子内部**的一切都不要 —— <p data-pt-type=\"text\"> 里的 <span>、\n * <picture data-pt-type=\"media\"> 里的 <source> 与 <img> 都属于这一类。\n * (v2 的 parse.ts 给 span 发 id 的行为在这里关掉。)\n * 4. 不透明子树内部一律不要,**除了** text 档里的 td / th —— 它们是文字编辑的\n * 锚点。这一条漏掉的话,表格改文字就没有落点,而 td / th 既不在三层树里、\n * 也不是行内元素,照「结构节点才发 id」的字面实现刚好会被漏掉。\n */\nexport function shouldHaveId(el: Element): boolean {\n if (el.hasAttribute('data-pt-type') || el.hasAttribute('data-pt-component')) return true;\n\n // 主题块是骨架标签里唯一的例外:它是 AI 用 set.text 改 @theme 的锚点,\n // id 固定为字面量 theme。\n if (isThemeStyle(el)) return true;\n\n // <body> 是 section 的容器,必须可寻址(见 ROOT_PT_ID)。\n if (tag(el) === 'body') return true;\n\n if (SCAFFOLD_TAGS.has(tag(el))) return false;\n\n if (leafAncestor(el)) return false;\n\n const opaque = closestOpaque(el);\n if (opaque) {\n if (opaque.host === el) return true;\n return opaque.mode === 'text' && OPAQUE_TEXT_TAGS.has(tag(el));\n }\n\n // 兜底:容器层里混进来的裸行内元素不算节点。\n if (isInlineTag(el)) return false;\n\n return true;\n}\n\n/** 文档里所有已存在的 data-pt-id。 */\nexport function collectIds(root: Document | DocumentFragment | Element): Set<string> {\n const out = new Set<string>();\n const nodes = root.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const v = nodes[i].getAttribute('data-pt-id');\n if (v) out.add(v);\n }\n if (root instanceof Object && 'getAttribute' in root) {\n const self = (root as Element).getAttribute?.('data-pt-id');\n if (self) out.add(self);\n }\n return out;\n}\n","import { ID_PATTERN, ROOT_PT_ID, THEME_PT_ID } from './rules/index.js';\nimport { collectIds, shouldHaveId, tag } from './validate/tree.js';\n\n/**\n * 规范化:**唯一允许生成 data-pt-id 的地方**。\n *\n * 谁产出源谁负责调:向导、mastra 直连建页、编辑器加载三处同一条。`apply` 侧只搬运、\n * 永不生成 —— 否则两侧各自算 id,必然分叉。\n *\n * 对已有 id 幂等(只补缺的),所以编辑器加载时再跑一遍是安全的。\n *\n * 另外把向导的老占位注释格式(<!-- lpx-image-prompt: … -->)转成属性。\n */\n\n/** 老格式:紧跟在 img 前的注释。转成 data-pt-image-prompt。 */\nconst LEGACY_PROMPT_COMMENT = /^\\s*lpx-image-prompt:\\s*([\\s\\S]*?)\\s*$/;\n\nexport interface NormalizeOptions {\n /**\n * id 前缀。默认 `e`。\n * 有意不暴露「随机」开关:同一份输入必须得到同一份输出,否则 normalize 自己\n * 就成了两侧分叉的来源。\n */\n prefix?: string;\n}\n\n/**\n * 按文档序补齐缺失的 id。返回被修改的元素个数(0 表示本来就规范)。\n */\nexport function normalize(\n root: Document | DocumentFragment | Element,\n options: NormalizeOptions = {}\n): number {\n const prefix = options.prefix ?? 'e';\n if (!ID_PATTERN.test(`${prefix}1`)) {\n throw new TypeError(`normalize(): 前缀 ${prefix} 与 id 格式不兼容`);\n }\n\n let changed = 0;\n changed += legacyPlaceholderCommentsToAttributes(root);\n\n const used = collectIds(root);\n let counter = 0;\n const nextId = (): string => {\n let candidate: string;\n do {\n counter += 1;\n candidate = `${prefix}${counter}`;\n } while (used.has(candidate));\n used.add(candidate);\n return candidate;\n };\n\n for (const el of walkElements(root)) {\n if (!shouldHaveId(el)) continue;\n if (el.hasAttribute('data-pt-id')) continue;\n // body 与主题块的 id 是固定字面量,不参与自动分配。\n if (tag(el) === 'body' && !used.has(ROOT_PT_ID)) {\n el.setAttribute('data-pt-id', ROOT_PT_ID);\n used.add(ROOT_PT_ID);\n changed += 1;\n continue;\n }\n if (tag(el) === 'style' && el.getAttribute('type') === 'text/tailwindcss') {\n if (!used.has(THEME_PT_ID)) {\n el.setAttribute('data-pt-id', THEME_PT_ID);\n used.add(THEME_PT_ID);\n changed += 1;\n continue;\n }\n }\n el.setAttribute('data-pt-id', nextId());\n changed += 1;\n }\n return changed;\n}\n\n/**\n * 向导现有的 `<!-- lpx-image-prompt: … -->` 注释转为 img 上的属性。\n * 转换只在进入时做一次,之后源里只有属性形态。\n */\nfunction legacyPlaceholderCommentsToAttributes(\n root: Document | DocumentFragment | Element\n): number {\n let changed = 0;\n const comments: Comment[] = [];\n collectComments(root, comments);\n for (const comment of comments) {\n const match = LEGACY_PROMPT_COMMENT.exec(comment.data);\n if (!match) continue;\n const img = nextImageSibling(comment);\n if (!img) continue;\n if (!img.hasAttribute('data-pt-image-prompt')) {\n img.setAttribute('data-pt-image-prompt', match[1]);\n }\n if (!img.hasAttribute('data-pt-placeholder')) {\n img.setAttribute('data-pt-placeholder', '');\n }\n comment.parentNode?.removeChild(comment);\n changed += 1;\n }\n return changed;\n}\n\nfunction collectComments(node: Node, out: Comment[]): void {\n let child: Node | null = node.firstChild;\n while (child) {\n if (child.nodeType === 8) out.push(child as Comment);\n else if (child.nodeType === 1 || child.nodeType === 11) collectComments(child, out);\n child = child.nextSibling;\n }\n}\n\nfunction nextImageSibling(from: Node): Element | null {\n let sib: Node | null = from.nextSibling;\n while (sib) {\n if (sib.nodeType === 1) {\n const el = sib as Element;\n return el.localName.toLowerCase() === 'img' ? el : null;\n }\n if (sib.nodeType === 3 && (sib as Text).data.trim() !== '') return null;\n sib = sib.nextSibling;\n }\n return null;\n}\n\nfunction* walkElements(root: Document | DocumentFragment | Element): Generator<Element> {\n if ('tagName' in root) yield root as Element;\n const list = root.querySelectorAll('*');\n for (let i = 0; i < list.length; i++) yield list[i];\n}\n","import { parseFragment } from './dom/parseFragment.js';\nimport {\n FORMAT_META_NAME,\n FORMAT_VERSION,\n ROOT_PT_ID,\n THEME_PT_ID,\n WRAP_ATTR,\n WRAP_CONTAINER_PT_ID,\n WRAP_SECTION_PT_ID\n} from './rules/index.js';\nimport { isThemeStyle, tag } from './validate/tree.js';\n\n/**\n * 片段型来源的规范化包裹 / 剥离。\n *\n * **界线(这个文件存在的判据)**:core 可以知道「文档与片段的关系」,\n * **不可以**知道「某个宿主的运行时要什么标记」。前者是格式问题 —— 单一三层树里\n * leaf 必须落在 container 中,而片段顶层就是有裸 leaf,这条只与 v4 格式有关;\n * 后者是宿主问题,归调用方在进出边界上翻译(弹窗的 Engage 契约、rem→px、`:host`)。\n * 往这个文件里加任何一个具体产品的 DOM 约定,这条界线就没了。\n *\n * 为什么放 core 而不是全归调用方:往返无损是这条路上最容易出事的地方 ——\n * 每存一次多一层或少一层,前几次完全看不出来,症状滞后于原因数天。放在 core\n * 就落在已有的 golden 基建那一侧,有 19 份 fixture 与随包发布的复算脚本兜着。\n *\n * ## 两条必须记住的语义\n *\n * 1. **片段的根元素就是文档的 `<body>`**,不是被包在 body 里的一层。\n * `ROOT_PT_ID = 'root'` 本来就是 body 的保留字面量,而片段顶层那个 div 恒带这个\n * id —— 它们是同一个节点,所以「认领」而不是「再套一层」。不认领的坏法不止\n * 「两个 root → ID_DUPLICATE」一种:`normalize.ts` 是\n * `if (tag === 'body' && !used.has(ROOT_PT_ID))`,div 先占了 `root`,body 会掉进\n * `nextId()` 拿到 `e1`,于是 **body 带着普通 id、`root` 长在一个 div 上,而\n * validate 全绿** —— 这种更难查。\n *\n * 2. **`unwrap` 只保留 theme 块 + body 内容**,`<html lang>` / `<title>` / 其余 head\n * 一律丢。片段型来源没有「文档头」这个概念,这是设计不是遗漏。同理**不存原始\n * tag**(不加 `data-pt-wrap-tag`):存 tag 等于把宿主形态信息写回 core 文档,\n * 正是要赶走的东西。`unwrap` 恒出 `<div>`,真遇到 `<section>` 根再放。\n *\n * ## 三道闸\n *\n * 一律**抛错**,不修复、不改名、不绕开。野生 / 历史形状由调用方的 adapter 在边界上\n * 先规整 —— 那本来就是它的活。\n *\n * 1. 入参形状:可选 theme 块(若有必须排在最前)+ 单一根元素,且 `div` + `id=root`\n * 2. 保留字面量占用:`root` 只许在根元素上、`theme` 只许在主题 style 上、\n * 合成层的标记与两个保留 id 一次都不许出现\n * 3. 剥离前的结构断言:body 恰有一个带标记的子元素,它里面也恰有一个带标记的子元素\n */\n\n/** 合成层由 `wrap` 造,也只由 `wrap` 造 —— 判定一律只看这个标记。 */\nexport function isWrapLayer(el: Element): boolean {\n return el.hasAttribute(WRAP_ATTR);\n}\n\nconst SKELETON =\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\n `<meta name=\"${FORMAT_META_NAME}\" content=\"${FORMAT_VERSION}\">` +\n '</head><body></body></html>';\n\n/**\n * 片段 → 合规的三层树文档。\n *\n * 要造整份文档,所以需要注入的 DOMParser —— 与 `parse` 同列,挂在 `createCore`\n * 的返回值上。\n */\nexport function createWrap(parse: (html: string) => Document): (fragmentHtml: string) => Document {\n return function wrap(fragmentHtml: string): Document {\n if (typeof fragmentHtml !== 'string') {\n throw new TypeError('wrap(): fragmentHtml 必须是字符串');\n }\n\n const doc = parse(SKELETON);\n const frag = parseFragment(doc, fragmentHtml);\n const { theme, root, before, after } = checkFragmentShape(frag);\n checkReservedLiterals(frag, root, theme);\n\n const body = doc.body;\n // 认领:根元素的属性原样搬到 body 上(含保留 id 与 class)。\n const attrs = root.attributes;\n for (let i = 0; i < attrs.length; i++) {\n body.setAttribute(attrs[i].name, attrs[i].value);\n }\n\n if (theme) doc.head.appendChild(theme);\n\n // 合成**两层**。只合成 section 是不够的:片段顶层允许直接出现 leaf,\n // 而单一三层树里 leaf 必须落在 container 中。\n //\n // 连带一条不变量:因为恒有合成 container,用户容器的父永远是它而不是 section,\n // 于是 `deleteTarget` 那条「删掉 section 的最后一个 container 就连 section\n // 一起删」永远吃不到合成 section。简化成只合成 section 的话,现象是\n // 「用户删了个容器、保存时才报错」—— 删除本身成功,报错发生在几步之后。\n const section = doc.createElement('section');\n section.setAttribute(WRAP_ATTR, '');\n section.setAttribute('data-pt-id', WRAP_SECTION_PT_ID);\n const container = doc.createElement('div');\n container.setAttribute(WRAP_ATTR, '');\n container.setAttribute('data-pt-id', WRAP_CONTAINER_PT_ID);\n while (root.firstChild) container.appendChild(root.firstChild);\n section.appendChild(container);\n\n // 根元素前后的空白原样留在 body 里(section 之外)—— 往返要逐字节相同,\n // 这些文本节点也在 `serialize` 的产出里。\n for (const node of before) body.appendChild(node);\n body.appendChild(section);\n for (const node of after) body.appendChild(node);\n\n return doc;\n };\n}\n\ninterface FragmentShape {\n theme: Element | null;\n root: Element;\n /** 根元素之前、theme 之后的非元素节点(空白)。 */\n before: Node[];\n /** 根元素之后的非元素节点(空白)。 */\n after: Node[];\n}\n\nfunction checkFragmentShape(frag: DocumentFragment): FragmentShape {\n const elements: Element[] = [];\n const nonElements: { node: Node; afterElements: number }[] = [];\n\n let child: Node | null = frag.firstChild;\n while (child) {\n const next: Node | null = child.nextSibling;\n if (child.nodeType === 1) {\n elements.push(child as Element);\n } else if (child.nodeType === 3 && (child as Text).data.trim() === '') {\n nonElements.push({ node: child, afterElements: elements.length });\n } else {\n throw new TypeError(\n 'wrap(): 片段顶层只允许 theme 块、单一根元素与空白 —— ' +\n `出现了 ${describeNode(child)}。野生形状请在调用方的 adapter 里先规整。`\n );\n }\n child = next;\n }\n\n let theme: Element | null = null;\n let root: Element | undefined;\n if (elements.length === 2) {\n // theme 必须排在最前:`unwrap` 恒把它放回片段开头,排在后面的话往返就变位置了。\n if (!isThemeStyle(elements[0])) {\n throw new TypeError(\n 'wrap(): 片段顶层有两个元素时,第一个必须是主题块 ' +\n '<style type=\"text/tailwindcss\">'\n );\n }\n theme = elements[0];\n root = elements[1];\n } else if (elements.length === 1) {\n if (isThemeStyle(elements[0])) {\n throw new TypeError('wrap(): 片段只有主题块、没有根元素');\n }\n root = elements[0];\n } else {\n throw new TypeError(\n `wrap(): 片段顶层必须恰有一个根元素(可选一个主题块),实际有 ${elements.length} 个元素`\n );\n }\n\n if (tag(root) !== 'div') {\n throw new TypeError(`wrap(): 片段根元素必须是 <div>,实际是 <${tag(root)}>`);\n }\n if (root.getAttribute('data-pt-id') !== ROOT_PT_ID) {\n throw new TypeError(\n `wrap(): 片段根元素的 data-pt-id 必须是 ${ROOT_PT_ID},` +\n `实际是 ${JSON.stringify(root.getAttribute('data-pt-id'))}。` +\n '它会被认领成文档的 <body>,改名会让埋点锚点断链。'\n );\n }\n\n const rootIndex = elements.indexOf(root);\n const before: Node[] = [];\n const after: Node[] = [];\n for (const { node, afterElements } of nonElements) {\n if (afterElements <= rootIndex) before.push(node);\n else after.push(node);\n }\n return { theme, root, before, after };\n}\n\n/**\n * 保留字面量占用检查。\n *\n * 绝不「换一个没被占用的 id 继续跑」:能撞上这些字面量的片段本身就说明上游出了\n * 问题(漏剥、回灌、手工拼接),静默绕开是把 bug 藏进数据里。\n */\nfunction checkReservedLiterals(\n frag: DocumentFragment,\n root: Element,\n theme: Element | null\n): void {\n const all = frag.querySelectorAll('*');\n for (let i = 0; i < all.length; i++) {\n const el = all[i];\n if (el.hasAttribute(WRAP_ATTR)) {\n throw new TypeError(\n `wrap(): 片段里已经带着合成层标记 ${WRAP_ATTR} —— ` +\n '多半是上一轮漏剥或回灌,先查上游,不要重复包裹。'\n );\n }\n const id = el.getAttribute('data-pt-id');\n if (id === null) continue;\n if (id === WRAP_SECTION_PT_ID || id === WRAP_CONTAINER_PT_ID) {\n throw new TypeError(`wrap(): 片段里已经占用了合成层的保留 id ${id}`);\n }\n if (id === ROOT_PT_ID && el !== root) {\n throw new TypeError(\n `wrap(): 保留 id ${ROOT_PT_ID} 只许出现在片段根元素上,` +\n `这里出现在 <${tag(el)}> 上 —— 包裹后会变成重复 id`\n );\n }\n if (id === THEME_PT_ID && el !== theme) {\n throw new TypeError(\n `wrap(): 保留 id ${THEME_PT_ID} 只许出现在主题块上,` +\n `这里出现在 <${tag(el)}> 上`\n );\n }\n }\n}\n\n/**\n * 文档 → 片段,`wrap` 的逆。\n *\n * 纯函数(在克隆体上操作,入参文档一个字节都不动),**不吐字符串** ——\n * 让它自己产字节等于开第二条产字节路径,而「`serialize` 是唯一的规范序列化出口」\n * 正是这个包存在要守的东西。调用方 `serialize(unwrap(doc))`。\n *\n * 定位**只凭 `data-pt-wrap` 标记**,不用「取第一个 section」这类位置猜测:\n * `unwrap` 必须可证明是 `wrap` 的逆,而标记是两者之间唯一显式的耦合;位置只是\n * 今天恰好成立的巧合。\n */\nexport function unwrap(doc: Document): DocumentFragment {\n if (!doc || (doc as Document).nodeType !== 9) {\n throw new TypeError('unwrap(): 入参必须是 Document');\n }\n const clone = doc.cloneNode(true) as Document;\n const body = clone.body;\n if (!body) throw new TypeError('unwrap(): 文档没有 <body>');\n\n const section = onlyWrapChild(body, 'body');\n const container = onlyWrapChild(section, `<${tag(section)} ${WRAP_ATTR}>`);\n\n const div = clone.createElement('div');\n const attrs = body.attributes;\n for (let i = 0; i < attrs.length; i++) div.setAttribute(attrs[i].name, attrs[i].value);\n while (container.firstChild) div.appendChild(container.firstChild);\n\n const out = clone.createDocumentFragment();\n const theme = clone.head?.querySelector('style[type=\"text/tailwindcss\"]') ?? null;\n if (theme) out.appendChild(theme);\n\n // body 的子节点原样搬过来,合成 section 换成还原出来的 div。\n // 这样根元素前后的空白回到原位 —— 往返比的是规范序列化后的字节。\n const children = Array.from(body.childNodes);\n for (const node of children) {\n out.appendChild(node === section ? div : node);\n }\n return out;\n}\n\nfunction onlyWrapChild(parent: Element, label: string): Element {\n const kids = parent.children;\n if (kids.length !== 1) {\n throw new TypeError(\n `unwrap(): ${label} 下必须恰有一个合成层子元素,实际有 ${kids.length} 个 —— ` +\n '不猜一个出来。这份文档不是 wrap() 的产物,或者被改成了别的结构。'\n );\n }\n const only = kids[0];\n if (!only.hasAttribute(WRAP_ATTR)) {\n throw new TypeError(\n `unwrap(): ${label} 下唯一的子元素没有 ${WRAP_ATTR} 标记 —— ` +\n '这份文档没有被 wrap() 包裹过。'\n );\n }\n return only;\n}\n\nfunction describeNode(node: Node): string {\n if (node.nodeType === 8) return '注释节点';\n if (node.nodeType === 3) return `非空白文本 ${JSON.stringify((node as Text).data.trim())}`;\n return `nodeType ${node.nodeType}`;\n}\n","import { DEVICE_VARIANTS, STATE_VARIANTS } from '../rules/index.js';\n\nconst DEVICE: ReadonlySet<string> = new Set(DEVICE_VARIANTS);\nconst STATE: ReadonlySet<string> = new Set(STATE_VARIANTS);\n\nexport interface VariantCheck {\n ok: boolean;\n /** 不合规时给出第一个出问题的前缀,供消费端拼文案。 */\n offending?: string;\n reason?: 'not-allowed' | 'order';\n}\n\n/**\n * 变体前缀允许集与顺序。\n *\n * 允许:设备 md: / max-md:,状态 hover: / focus-visible: / active: / disabled:,\n * 组合只允许**设备在前、状态在后**(md:hover:),不允许 hover:md:。\n *\n * 为什么固定顺序:属性回显要把值放进(基线 / md / max-md)三槽,\n * 两种写法语义相同但会被当成两个不同的 class,同属性互斥就失效了。\n *\n * 注意 `group-*` / `peer-*` 与 `hover:md:` 这类 Tailwind **都能编译** ——\n * 拒绝它们是产品决定,所以必须由这条独立规则拦,「class 可编译」判定拦不住。\n */\nexport function checkVariants(className: string): VariantCheck {\n // 任意值里可能含冒号(如 bg-[url(https://…)]),从第一个 [ 之后不再切分。\n const bracket = className.indexOf('[');\n const head = bracket === -1 ? className : className.slice(0, bracket);\n const parts = head.split(':');\n if (parts.length <= 1) return { ok: true };\n\n const prefixes = parts.slice(0, -1);\n let seenState = false;\n for (const p of prefixes) {\n if (DEVICE.has(p)) {\n if (seenState) {\n // 设备前缀出现在状态之后 —— 顺序反了。\n return { ok: false, offending: p, reason: 'order' };\n }\n continue;\n }\n if (STATE.has(p)) {\n seenState = true;\n continue;\n }\n return { ok: false, offending: p, reason: 'not-allowed' };\n }\n return { ok: true };\n}\n","/**\n * Tailwind 内置色板的识别。\n *\n * 为什么需要这条独立规则:`theme.css` 在编译底座里,所以 `bg-red-500`\n * **是能编译出 CSS 的** —— 「class 可编译」那条判定对它一路绿灯。\n * 颜色必须走 @theme token 这件事,只能由这里拦。\n *\n * 有意**不拦** `white` / `black` / `transparent` / `current` / `inherit`:\n * 它们不是色板档位,而且输入约定自己的范例就写着 `text-white`\n * (`class=\"… bg-brand text-white\"`)。拦掉它会让规范的例子过不了自己的校验。\n *\n * 也有意不拦任意值颜色(`bg-[#f00]`)—— 那是另一条规则的事,这条只管色板。\n */\n\nexport const NATIVE_PALETTE_PREFIXES = [\n 'red',\n 'orange',\n 'amber',\n 'yellow',\n 'lime',\n 'green',\n 'emerald',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n 'slate',\n 'gray',\n 'zinc',\n 'neutral',\n 'stone'\n] as const;\n\nconst PALETTE: ReadonlySet<string> = new Set(NATIVE_PALETTE_PREFIXES);\n\n/** Tailwind 的档位:50,100–900 每百一档,950。 */\nconst SHADE = /^(50|950|[1-9]00)$/;\n\nexport function isNativePaletteClass(className: string): boolean {\n // 任意值里可能带 '-'、也可能带变体冒号,先剥掉变体,再排除任意值。\n const bracket = className.indexOf('[');\n if (bracket !== -1) return false;\n\n const lastColon = className.lastIndexOf(':');\n const base = lastColon === -1 ? className : className.slice(lastColon + 1);\n\n const parts = base.split('-');\n if (parts.length < 3) return false;\n\n const shade = parts[parts.length - 1];\n const name = parts[parts.length - 2];\n return SHADE.test(shade) && PALETTE.has(name);\n}\n","import {\n FORMAT_META_NAME,\n FORMAT_VERSION,\n ID_PATTERN,\n INLINE_STYLE_ALLOWED_PREFIX\n} from '../rules/index.js';\nimport type { Issue } from '../errors.js';\nimport { shouldHaveId, tag } from './tree.js';\nimport { checkVariants } from './variants.js';\nimport { NATIVE_PALETTE_PREFIXES, isNativePaletteClass } from './palette.js';\n\n/**\n * 校验开关。**扁平的可选项,不是「宿主档位」** —— core 不区分落地页与弹窗,\n * 它只知道「有一条可选规则叫禁视口单位」,不知道谁会用它。\n *\n * 全部默认**最宽松**:不传任何开关时只跑格式本身的硬规则。\n */\nexport interface ValidateOptions {\n /**\n * 允许视口相对单位(`vh` / `vw` / `dvh`… 以及 `h-screen` 这类等价刻度)。默认允许。\n *\n * 传 `false` 的场合:文档被装在一个比视口小的框里(片段型来源的宿主信封)。\n * 那里的视口单位按**整个浏览器视口**算,不是框自身 —— 数值看着对、显示全错。\n */\n allowVhUnits?: boolean;\n /**\n * 限定整份文档只有一个 `section`。默认不限。\n *\n * UI 挡得住人,挡不住 AI 和别的调用路径,所以这条兜底在校验侧。\n */\n singleSection?: boolean;\n /**\n * 判定单个 class 在当前 @theme 下是否能编译出 CSS。\n * 由调用方注入(编译器在另一个模块,validate 不直接依赖它)。\n * 不传则跳过这条规则 —— 用于只想跑结构 / 格式检查的场合。\n */\n canCompileClass?: (className: string) => boolean;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: Issue[];\n}\n\n/** 事件属性:on 开头即拒,不列白名单。 */\nconst EVENT_ATTR = /^on[a-z]/i;\n\n/**\n * 校验一份文档,或一段子树。\n *\n * **入参语义有区分,这条是硬约定**:只有 `Document` 入参才参与文档级规则(今天是\n * 格式标记)的判定;`DocumentFragment` / `Element` 入参一律按**子树**处理,文档级\n * 规则不参与 —— 所以拿一段尚未包裹的片段来校验**不会**报 `FORMAT_MISSING`。\n *\n * 保留子树入口是为了「在 apply 之前单独校验一段 AI 片段」这类用法;收窄成只吃\n * Document 的话,那种场合只能 apply 到克隆体再校验。\n */\nexport function validate(\n root: Document | DocumentFragment | Element,\n options: ValidateOptions = {}\n): ValidateResult {\n const issues: Issue[] = [];\n\n if (isDoc(root)) checkFormatMeta(root, issues);\n checkIds(root, issues);\n checkElements(root, options, issues);\n if (options.singleSection) checkSingleSection(root, issues);\n\n return { ok: issues.length === 0, issues };\n}\n\n/** 片段型来源没有「区块」这个概念:合成的那一层是脚手架,不是用户的结构。 */\nfunction checkSingleSection(root: Document | DocumentFragment | Element, issues: Issue[]): void {\n const sections = root.querySelectorAll('section');\n if (sections.length <= 1) return;\n for (let i = 1; i < sections.length; i++) {\n issues.push({\n ptId: sections[i].getAttribute('data-pt-id') ?? undefined,\n rule: 'STRUCTURE',\n params: { reason: 'multiple-sections', count: sections.length }\n });\n }\n}\n\nfunction isDoc(root: Document | DocumentFragment | Element): root is Document {\n return (root as Document).nodeType === 9;\n}\n\n/** 格式标记。不带它的输入一律不当作 v4 源,也不做任何转换。 */\nfunction checkFormatMeta(doc: Document, issues: Issue[]): void {\n const meta = doc.querySelector(`meta[name=\"${FORMAT_META_NAME}\"]`);\n if (!meta || meta.getAttribute('content') !== FORMAT_VERSION) {\n issues.push({ rule: 'FORMAT_MISSING' });\n }\n}\n\nfunction checkIds(root: Document | DocumentFragment | Element, issues: Issue[]): void {\n const seen = new Set<string>();\n const nodes = root.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i];\n const id = el.getAttribute('data-pt-id') ?? '';\n if (!ID_PATTERN.test(id)) {\n issues.push({ ptId: id, rule: 'ID_FORMAT', params: { id } });\n continue;\n }\n if (seen.has(id)) {\n issues.push({ ptId: id, rule: 'ID_DUPLICATE', params: { id } });\n continue;\n }\n seen.add(id);\n }\n}\n\nfunction checkElements(\n root: Document | DocumentFragment | Element,\n options: ValidateOptions,\n issues: Issue[]\n): void {\n const all = root.querySelectorAll('*');\n for (let i = 0; i < all.length; i++) {\n const el = all[i];\n const name = tag(el);\n const ptId = el.getAttribute('data-pt-id') ?? undefined;\n\n // 结构节点必须带 id(含 text 档不透明子树里的 td / th)。\n if (shouldHaveId(el) && !el.hasAttribute('data-pt-id')) {\n issues.push({ rule: 'ID_FORMAT', params: { tag: name, reason: 'missing' } });\n }\n\n // 行内元素与不透明内部不该带 id。\n if (!shouldHaveId(el) && el.hasAttribute('data-pt-id')) {\n issues.push({\n ptId,\n rule: 'ID_FORMAT',\n params: { tag: name, reason: 'unexpected' }\n });\n }\n\n if (name === 'script') {\n issues.push({ ptId, rule: 'SCRIPT_FORBIDDEN', params: { tag: name } });\n }\n\n checkAttributes(el, ptId, issues);\n checkClasses(el, ptId, options, issues);\n checkPlaceholder(el, ptId, issues);\n }\n}\n\nfunction checkAttributes(el: Element, ptId: string | undefined, issues: Issue[]): void {\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const a = attrs[i];\n if (EVENT_ATTR.test(a.name)) {\n issues.push({ ptId, rule: 'SCRIPT_FORBIDDEN', params: { attr: a.name } });\n continue;\n }\n if (a.name !== 'style') continue;\n\n // 唯一允许的内联 style:动效变量声明。\n const declarations = a.value\n .split(';')\n .map(s => s.trim())\n .filter(Boolean);\n const offending = declarations.find(d => !d.startsWith(INLINE_STYLE_ALLOWED_PREFIX));\n if (offending) {\n issues.push({ ptId, rule: 'INLINE_STYLE', params: { declaration: offending } });\n }\n }\n}\n\nfunction checkClasses(\n el: Element,\n ptId: string | undefined,\n options: ValidateOptions,\n issues: Issue[]\n): void {\n const raw = el.getAttribute('class');\n if (!raw) return;\n for (const cls of raw.split(/[\\t\\n\\f\\r ]+/)) {\n if (cls === '') continue;\n\n const variant = checkVariants(cls);\n if (!variant.ok) {\n issues.push({\n ptId,\n rule: 'VARIANT_FORBIDDEN',\n params: { className: cls, prefix: variant.offending ?? '', reason: variant.reason ?? '' }\n });\n continue;\n }\n\n // 原生色板:Tailwind 能编译它,所以「可编译」判定拦不住,必须独立一条。\n if (isNativePaletteClass(cls)) {\n issues.push({ ptId, rule: 'NATIVE_PALETTE', params: { className: cls } });\n continue;\n }\n\n // 视口单位:Tailwind 能编译它们,所以「可编译」判定同样拦不住 ——\n // 与原生色板一样,必须独立一条。\n if (options.allowVhUnits === false) {\n const unit = viewportUnitIn(cls);\n if (unit) {\n issues.push({ ptId, rule: 'UNIT_FORBIDDEN', params: { className: cls, unit } });\n continue;\n }\n }\n\n if (options.canCompileClass && !options.canCompileClass(cls)) {\n issues.push({ ptId, rule: 'CLASS_UNCOMPILABLE', params: { className: cls } });\n }\n }\n}\n\n/**\n * class 里的视口相对单位。\n *\n * 两种写法都要认,只认一种等于漏掉一半:\n * 1. 任意值里的单位:`h-[50vh]` / `max-md:min-h-[100dvh]`\n * 2. `*-screen` 刻度:`h-screen` / `min-h-dvh` 之类 —— 它们编译出来就是 `100vh`\n * 这一类,只是把单位藏在了刻度名里\n */\nconst ARBITRARY_VIEWPORT_UNIT = /\\[[^\\]]*?\\d(?:\\.\\d+)?(l|s|d)?(vh|vw|vmin|vmax|vb|vi)\\b/;\nconst SCREEN_SCALE = /(^|:)(min-|max-)?[hw]-(screen|[lsd]vh|[lsd]vw|dvh|dvw|svh|svw|lvh|lvw)$/;\n\nfunction viewportUnitIn(cls: string): string | null {\n const arbitrary = ARBITRARY_VIEWPORT_UNIT.exec(cls);\n if (arbitrary) return `${arbitrary[1] ?? ''}${arbitrary[2]}`;\n const scale = SCREEN_SCALE.exec(cls);\n if (scale) return scale[3];\n return null;\n}\n\n/** 占位:必带宽高比(落图前后布局不跳)、src 为空、不用第三方占位 URL。 */\nfunction checkPlaceholder(el: Element, ptId: string | undefined, issues: Issue[]): void {\n if (!el.hasAttribute('data-pt-placeholder')) return;\n\n const cls = el.getAttribute('class') ?? '';\n const hasAspect = cls.split(/\\s+/).some(c => /(^|:)aspect-/.test(c));\n if (!hasAspect) {\n issues.push({ ptId, rule: 'PLACEHOLDER_UNRESOLVED', params: { reason: 'missing-aspect' } });\n return;\n }\n\n const src = el.getAttribute('src') ?? '';\n if (src !== '') {\n issues.push({ ptId, rule: 'PLACEHOLDER_UNRESOLVED', params: { reason: 'src-not-empty' } });\n return;\n }\n\n // 未落图本身就是阻塞项:预览放行,发布必须拦。\n issues.push({ ptId, rule: 'PLACEHOLDER_UNRESOLVED', params: { reason: 'unresolved' } });\n}\n\nexport { NATIVE_PALETTE_PREFIXES };\n","/**\n * 错误码与校验条目的形状。\n *\n * core **只出结构,不出文案**。文案由各消费端渲染:编辑器用 lp-editor 的三语字典,\n * iam 发布拒绝按 `rule` 出后端文案,mastra 回给模型的结构化报错复用同一枚举。\n * 三处各一份措辞,但没有两份真源 —— 这也是 core 能作为公开包发布的前提之一。\n */\n\nexport const ERROR_CODES = [\n /** 源 HTML 缺 <meta name=\"lpx-format\" content=\"4\">,不是 v4 源。 */\n 'FORMAT_MISSING',\n /** 文档内出现重复的 data-pt-id。 */\n 'ID_DUPLICATE',\n /** 片段携带的 id 与目标文档中已有的 id 冲突。 */\n 'ID_CONFLICT',\n /** id 不符合 [a-z][a-z0-9_-]{1,31},或结构节点缺 id。 */\n 'ID_FORMAT',\n /** 操作引用了文档中不存在的 id(requireIdHit,用得最多的一条)。 */\n 'ID_NOT_FOUND',\n /** 出现 <script> 或 on* 事件属性。 */\n 'SCRIPT_FORBIDDEN',\n /** 出现内联 style(动效变量除外)。 */\n 'INLINE_STYLE',\n /** 使用了 Tailwind 内置色板。它本身可编译,所以必须由独立规则拦。 */\n 'NATIVE_PALETTE',\n /**\n * 用了视口相对单位(vh / dvh / h-screen…),而当前调用方关掉了它\n * (`validate(doc, { allowVhUnits: false })`)。同 NATIVE_PALETTE:它可编译,\n * 拒绝它是产品决定,所以「可编译」判定拦不住,必须独立一条。\n */\n 'UNIT_FORBIDDEN',\n /** class 在当前 @theme 下编译不出 CSS。 */\n 'CLASS_UNCOMPILABLE',\n /** 变体前缀不在允许集内,或组合顺序不是「设备在前、状态在后」。 */\n 'VARIANT_FORBIDDEN',\n /** 违反 section › container › leaf 三层结构,或往不透明子树里做结构编辑。 */\n 'STRUCTURE',\n /** insert / replace 的片段不是单根元素。 */\n 'MULTI_ROOT',\n /** replace 换掉了被替换元素的根 id(埋点锚点会静默断链)。 */\n 'REPLACE_ID_CHANGED',\n /** AI 基于过期文档产出的操作块,baseVersion 对不上。 */\n 'STALE_BASE_VERSION',\n /** 片段 canonical 往返不一致,说明 HTML 畸形。 */\n 'FRAGMENT_NOT_CANONICAL',\n /** 存在未落图的图片占位 —— 阻塞发布,不阻塞预览。 */\n 'PLACEHOLDER_UNRESOLVED'\n] as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[number];\n\nconst ERROR_CODE_SET: ReadonlySet<string> = new Set(ERROR_CODES);\n\nexport function isErrorCode(value: unknown): value is ErrorCode {\n return typeof value === 'string' && ERROR_CODE_SET.has(value);\n}\n\n/** 校验条目。**不带 message** —— 文案归消费端。 */\nexport interface Issue {\n /** 相关元素的 data-pt-id;文档级问题(如缺格式标记)没有。 */\n ptId?: string;\n rule: ErrorCode;\n /** 供消费端拼文案的结构化参数,如 { className: 'bg-red-500' }。 */\n params?: Readonly<Record<string, string | number>>;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: Issue[];\n}\n\n/** 阻塞发布的规则。预览放行,发布必须拦。 */\nexport const PUBLISH_BLOCKING_RULES: ReadonlySet<ErrorCode> = new Set<ErrorCode>([\n 'PLACEHOLDER_UNRESOLVED'\n]);\n\nexport function isPublishBlocking(issue: Issue): boolean {\n return PUBLISH_BLOCKING_RULES.has(issue.rule);\n}\n\n/** 编辑器 / mastra 抛出的错误。同样不带文案。 */\nexport interface EditorError {\n code: ErrorCode;\n rule?: ErrorCode;\n ptId?: string;\n params?: Readonly<Record<string, string | number>>;\n}\n\nexport function editorError(\n code: ErrorCode,\n extra?: Omit<EditorError, 'code'>\n): EditorError {\n return { code, ...extra };\n}\n","import { closestOpaque, tag } from './tree.js';\nimport { LEAF_TYPES, type LayerName } from '../rules/index.js';\nimport { isWrapLayer } from '../wrap.js';\n\n/**\n * 结构规则:section › container › leaf。**唯一**一套 —— 不按宿主分档。\n *\n * 片段型来源(弹窗一类)没有自己的一套层级:它进编辑器前由 `wrap()` 合成\n * section + container 两层,之后与落地页走同一条判定。\n *\n * 这些判定同时服务 validate(静态检查整棵树)与 apply(insert / move 前门禁),\n * 所以放在一处 —— 两边各写一份的话,「校验说合法、apply 说不合法」是迟早的事。\n */\n\n/** 文档骨架不属于任何一层。<body> 虽然有保留 id(section 的容器要可寻址),但它\n * 不是 container —— 否则 container 的嵌套深度会从它那里白多一层。 */\nconst NOT_A_LAYER: ReadonlySet<string> = new Set(['html', 'head', 'body']);\n\nconst LEAF_TYPE_SET: ReadonlySet<string> = new Set(LEAF_TYPES);\n\nexport function layerOf(el: Element): LayerName | null {\n const name = tag(el);\n if (NOT_A_LAYER.has(name)) return null;\n\n if (name === 'section') return 'section';\n\n const ptType = el.getAttribute('data-pt-type');\n if (ptType && LEAF_TYPE_SET.has(ptType)) return 'leaf';\n // 内置组件整体是一个 leaf。\n if (el.hasAttribute('data-pt-component')) return 'leaf';\n // 不透明子树(组件快照、表格)整体也是一个 leaf。\n const opaque = closestOpaque(el);\n if (opaque && opaque.host === el) return 'leaf';\n\n if (el.hasAttribute('data-pt-id')) return 'container';\n return null;\n}\n\n/** container 允许再嵌一层,不能更深。 */\nexport const MAX_CONTAINER_DEPTH = 2;\n\nexport function containerDepth(el: Element): number {\n let depth = 0;\n let cur: Element | null = el;\n while (cur) {\n // 合成容器不计入用户的嵌套预算 —— 它不是用户的结构。不豁免的话,片段型\n // 来源里用户只剩一层可用,做不了「两列、每列自己是个容器」的版式。\n if (layerOf(cur) === 'container' && !isWrapLayer(cur)) depth += 1;\n cur = cur.parentElement;\n }\n return depth;\n}\n\nexport type StructureRejection =\n | 'section-not-body-child'\n | 'container-too-deep'\n | 'leaf-cannot-contain'\n | 'opaque-subtree'\n | 'unknown-layer';\n\n/** 某个父节点能否接纳某一层的子节点。 */\nexport function canContain(parent: Element, childLayer: LayerName): StructureRejection | null {\n // 不透明子树内部一律不开放结构编辑(两档都一样,text 档只放行文字)。\n const opaque = closestOpaque(parent);\n if (opaque) return 'opaque-subtree';\n\n const parentLayer = layerOf(parent);\n\n if (childLayer === 'section') {\n const isBody = tag(parent) === 'body';\n return isBody ? null : 'section-not-body-child';\n }\n\n if (childLayer === 'container') {\n if (parentLayer === 'section') return null;\n if (parentLayer === 'container') {\n return containerDepth(parent) + 1 > MAX_CONTAINER_DEPTH ? 'container-too-deep' : null;\n }\n return parentLayer === 'leaf' ? 'leaf-cannot-contain' : 'unknown-layer';\n }\n\n // leaf\n if (parentLayer === 'container') return null;\n if (parentLayer === 'leaf') return 'leaf-cannot-contain';\n return 'unknown-layer';\n}\n\n/**\n * 删除的级联语义。\n *\n * 删掉 container 的最后一个 leaf —— container 保留(用户还要往里放东西)。\n * 删掉 section 的最后一个 container —— 连 section 一起删(空区块没有意义)。\n *\n * 返回**真正要从树上摘掉的那个节点**。\n *\n * ⚠️ 这条永远吃不到合成 section:`wrap` 恒合成 container + section 两层,用户容器\n * 的父永远是那个合成 container 而不是 section。见 wrap.ts 里同一条不变量。\n */\nexport function deleteTarget(el: Element): Element {\n const layer = layerOf(el);\n if (layer !== 'container') return el;\n\n const parent = el.parentElement;\n if (!parent || layerOf(parent) !== 'section') return el;\n\n const siblingContainers = Array.from(parent.children).filter(\n c => c !== el && layerOf(c) === 'container'\n );\n return siblingContainers.length === 0 ? parent : el;\n}\n","import { ID_PATTERN } from '../rules/index.js';\nimport { editorError, type EditorError } from '../errors.js';\nimport { parseFragment } from '../dom/parseFragment.js';\nimport { fragmentElementRoots } from '../dom/parseFragment.js';\nimport { serialize } from '../serialize/canonical.js';\nimport { shouldHaveId } from '../validate/tree.js';\n\n/**\n * AI 护栏。编辑器与 mastra 共用同一份 —— 两侧各写一份的话,\n * 「服务端放行、编辑器拒绝」这种事迟早发生。\n */\n\nconst EVENT_ATTR = /^on[a-z]/i;\n\n/** 操作引用的 id 必须在文档里。用得最多的一条。 */\nexport function requireIdHit(doc: Document | DocumentFragment, id: string): EditorError | null {\n if (!id || !ID_PATTERN.test(id)) {\n return editorError('ID_FORMAT', { ptId: id, params: { id } });\n }\n return findById(doc, id)\n ? null\n : editorError('ID_NOT_FOUND', { ptId: id, params: { id } });\n}\n\nexport function findById(root: Document | DocumentFragment | Element, id: string): Element | null {\n // 属性选择器里不能直接插裸值,先按格式校验过再拼是安全的。\n if (!ID_PATTERN.test(id)) return null;\n return root.querySelector(`[data-pt-id=\"${id}\"]`);\n}\n\n/** 片段与富文本里都不许有脚本与事件属性。 */\nexport function rejectScriptsAndHandlers(node: Node): EditorError | null {\n if (node.nodeType === 1) {\n const el = node as Element;\n if (el.localName.toLowerCase() === 'script') {\n return editorError('SCRIPT_FORBIDDEN', { params: { tag: 'script' } });\n }\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (EVENT_ATTR.test(attrs[i].name)) {\n return editorError('SCRIPT_FORBIDDEN', { params: { attr: attrs[i].name } });\n }\n }\n }\n let child: Node | null = node.firstChild;\n while (child) {\n const err = rejectScriptsAndHandlers(child);\n if (err) return err;\n child = child.nextSibling;\n }\n return null;\n}\n\n/**\n * 片段内每个结构节点都要自带 id,格式合规,且不与目标文档冲突。\n *\n * apply **永不生成 id** —— id 在构造 op 时就要写进 payload。两侧各自生成必然分叉,\n * 所以这里宁可整个事务拒绝,也不就地补一个。\n */\nexport function requireFragmentIds(\n fragment: DocumentFragment,\n existing: ReadonlySet<string>\n): EditorError | null {\n const seen = new Set<string>();\n const all = fragment.querySelectorAll('*');\n const check = (el: Element): EditorError | null => {\n if (!shouldHaveId(el)) return null;\n const id = el.getAttribute('data-pt-id');\n if (!id) {\n return editorError('ID_FORMAT', {\n params: { tag: el.localName, reason: 'missing' }\n });\n }\n if (!ID_PATTERN.test(id)) {\n return editorError('ID_FORMAT', { ptId: id, params: { id } });\n }\n if (existing.has(id) || seen.has(id)) {\n return editorError('ID_CONFLICT', { ptId: id, params: { id } });\n }\n seen.add(id);\n return null;\n };\n // querySelectorAll('*') 已经包含片段的直接子元素,不要再单独遍历一次根 ——\n // 那会让根元素跟自己撞成 ID_CONFLICT。\n for (let i = 0; i < all.length; i++) {\n const err = check(all[i]);\n if (err) return err;\n }\n return null;\n}\n\n/** 片段必须是单根元素。 */\nexport function requireSingleRoot(fragment: DocumentFragment): EditorError | null {\n const roots = fragmentElementRoots(fragment);\n if (roots.length === 1) return null;\n return editorError('MULTI_ROOT', { params: { count: roots.length } });\n}\n\n/**\n * 片段 canonical 往返一致:`serialize(parse(html))` 再解析一次仍相同。\n * 拦的是畸形 HTML —— 它在两侧的纠错结果可能不同。\n */\nexport function requireCanonicalFragment(doc: Document, html: string): EditorError | null {\n const once = serialize(parseFragment(doc, html));\n const twice = serialize(parseFragment(doc, once));\n return once === twice ? null : editorError('FRAGMENT_NOT_CANONICAL');\n}\n","import type { EditOp, InsertOp, MoveOp, SetOp } from './types.js';\nimport { editorError, type EditorError } from '../errors.js';\nimport { parseFragment, fragmentElementRoots } from '../dom/parseFragment.js';\nimport { serialize, normalizeClassValue } from '../serialize/canonical.js';\nimport { canContain, deleteTarget, layerOf } from '../validate/structure.js';\nimport { closestOpaque } from '../validate/tree.js';\nimport { isWrapLayer } from '../wrap.js';\nimport {\n findById,\n requireCanonicalFragment,\n requireFragmentIds,\n requireIdHit,\n rejectScriptsAndHandlers,\n requireSingleRoot\n} from './guards.js';\n\nexport type ApplyResult =\n | { ok: true; inverse: EditOp[] }\n | { ok: false; error: EditorError; failedIndex: number };\n\n/** raw text 元素(style / script)的内容按纯文本设置,不走片段解析。 */\nconst RAW_TEXT = new Set(['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'plaintext']);\n\n/**\n * 应用一组 EditOp,并产出逆操作。\n *\n * **事务语义**:一组 op 顺序应用,每条的下标基于**前一条应用之后**的状态。\n * 任何一条失败 → 整个事务不生效,文档一个字节都不变。\n *\n * 原子性的实现方式是「先在克隆体上试跑一遍,通过了再在真文档上跑」,而不是\n * 「边跑边记逆操作、失败了回滚」。后者的正确性取决于逆操作自身没有 bug,\n * 而失败时恰恰是最容易触发边角情况的时刻 —— 把原子性压在最脆弱的那条路径上\n * 不是好交易。克隆一次的代价(原生 cloneNode)远小于一次编译。\n */\nexport function apply(doc: Document, ops: EditOp[]): ApplyResult {\n if (!Array.isArray(ops)) throw new TypeError('apply(): ops 必须是数组');\n if (ops.length === 0) return { ok: true, inverse: [] };\n\n // 1. 克隆体上试跑。只看成败,产物丢弃。\n const rehearsal = doc.cloneNode(true) as Document;\n const dry = run(rehearsal, ops);\n if (!dry.ok) return dry;\n\n // 2. 真文档上跑。到这里不该再失败;万一失败(宿主在两次之间改了文档),\n // 仍然按失败返回,但此时文档可能已被部分修改 —— 这是宿主违反约定的后果,\n // 不是这里能兜的,所以不假装兜住。\n return run(doc, ops);\n}\n\nfunction run(doc: Document, ops: EditOp[]): ApplyResult {\n const inverse: EditOp[] = [];\n for (let i = 0; i < ops.length; i++) {\n const result = applyOne(doc, ops[i]);\n if (!result.ok) return { ok: false, error: result.error, failedIndex: i };\n // 逆操作要倒序回放。\n inverse.unshift(result.inverse);\n }\n return { ok: true, inverse };\n}\n\ntype OneResult = { ok: true; inverse: EditOp } | { ok: false; error: EditorError };\n\nfunction applyOne(doc: Document, op: EditOp): OneResult {\n switch (op.op) {\n case 'set':\n return applySet(doc, op);\n case 'insert':\n return applyInsert(doc, op);\n case 'delete':\n return applyDelete(doc, op);\n case 'move':\n return applyMove(doc, op);\n case 'replace':\n return applyReplace(doc, op);\n default:\n return {\n ok: false,\n error: editorError('STRUCTURE', {\n params: { reason: `未知的 op: ${String((op as { op: string }).op)}` }\n })\n };\n }\n}\n\n/**\n * 合成层的门禁。\n *\n * **精确到「目标 vs 父」**:以合成层节点为**目标**的 op(set / delete / move /\n * replace)一律拒绝;**往合成容器里 insert、或把节点 move 进去必须放行** ——\n * 那是片段型来源新内容唯一的落点。写成「拒绝一切碰到合成层的 op」会把插入路径\n * 一起堵死。\n *\n * 这道闸让「AI 看不看得见合成层」变得无所谓:发了也执行不了,拿到的是 STRUCTURE\n * 错误而不是一次静默破坏。\n */\nfunction rejectWrapTarget(el: Element, ptId: string): EditorError | null {\n return isWrapLayer(el)\n ? editorError('STRUCTURE', { ptId, params: { reason: 'wrap-layer-immutable' } })\n : null;\n}\n\n// ---------------------------------------------------------------- set\n\nfunction applySet(doc: Document, op: SetOp): OneResult {\n const miss = requireIdHit(doc, op.id);\n if (miss) return { ok: false, error: miss };\n const el = findById(doc, op.id)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n const opaque = closestOpaque(el);\n if (opaque && opaque.host !== el && opaque.mode !== 'text') {\n // strict 档的不透明子树内部是编译产物,改它没有意义也不安全。\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'opaque-subtree' } }) };\n }\n\n const invAttrs: Record<string, string | null> = {};\n if (op.attrs) {\n for (const name of Object.keys(op.attrs)) {\n if (/^on[a-z]/i.test(name)) {\n return { ok: false, error: editorError('SCRIPT_FORBIDDEN', { ptId: op.id, params: { attr: name } }) };\n }\n invAttrs[name] = el.hasAttribute(name) ? el.getAttribute(name) : null;\n }\n }\n\n let invClasses: { add?: string[]; remove?: string[] } | undefined;\n if (op.classes) {\n const before = new Set(\n normalizeClassValue(el.getAttribute('class') ?? '')\n .split(' ')\n .filter(Boolean)\n );\n // 逆操作只针对**真的发生了变化**的 class:加一个本来就有的、\n // 删一个本来就没有的,都不该在撤销时反向动它。\n const actuallyAdded = (op.classes.add ?? []).filter(c => !before.has(c));\n const actuallyRemoved = (op.classes.remove ?? []).filter(c => before.has(c));\n if (actuallyAdded.length || actuallyRemoved.length) {\n invClasses = { add: actuallyRemoved, remove: actuallyAdded };\n }\n }\n\n let invText: string | undefined;\n if (op.text !== undefined) {\n const err = checkTextPayload(doc, el, op.text);\n if (err) return { ok: false, error: { ...err, ptId: op.id } };\n invText = serializeChildren(el);\n }\n\n // 校验全过了才开始改。\n if (op.attrs) {\n for (const [name, value] of Object.entries(op.attrs)) {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n }\n }\n if (op.classes) applyClasses(el, op.classes);\n if (op.text !== undefined) setChildren(doc, el, op.text);\n\n const inv: SetOp = { op: 'set', id: op.id };\n if (op.attrs) inv.attrs = invAttrs;\n if (invClasses) inv.classes = invClasses;\n if (invText !== undefined) inv.text = invText;\n return { ok: true, inverse: inv };\n}\n\nfunction applyClasses(el: Element, spec: { add?: string[]; remove?: string[] }): void {\n const list = normalizeClassValue(el.getAttribute('class') ?? '')\n .split(' ')\n .filter(Boolean);\n const set = new Set(list);\n for (const c of spec.remove ?? []) set.delete(c);\n const out = list.filter(c => set.has(c));\n for (const c of spec.add ?? []) {\n if (!set.has(c)) {\n set.add(c);\n out.push(c);\n }\n }\n if (out.length === 0) el.removeAttribute('class');\n else el.setAttribute('class', out.join(' '));\n}\n\nfunction isRawText(el: Element): boolean {\n return RAW_TEXT.has(el.localName.toLowerCase());\n}\n\nfunction serializeChildren(el: Element): string {\n if (isRawText(el)) {\n let out = '';\n let child: Node | null = el.firstChild;\n while (child) {\n if (child.nodeType === 3) out += (child as Text).data;\n child = child.nextSibling;\n }\n return out;\n }\n let out = '';\n let child: Node | null = el.firstChild;\n while (child) {\n out += serialize(child);\n child = child.nextSibling;\n }\n return out;\n}\n\nfunction checkTextPayload(doc: Document, el: Element, text: string): EditorError | null {\n // style / script 的内容是原始文本(@theme 就走这条),不做片段解析。\n if (isRawText(el)) return null;\n const frag = parseFragment(doc, text);\n return rejectScriptsAndHandlers(frag);\n}\n\nfunction setChildren(doc: Document, el: Element, text: string): void {\n while (el.firstChild) el.removeChild(el.firstChild);\n if (isRawText(el)) {\n el.appendChild(doc.createTextNode(text));\n return;\n }\n el.appendChild(parseFragment(doc, text));\n}\n\n// ---------------------------------------------------------------- insert\n\nfunction applyInsert(doc: Document, op: InsertOp): OneResult {\n const miss = requireIdHit(doc, op.parentId);\n if (miss) return { ok: false, error: miss };\n const parent = findById(doc, op.parentId)!;\n\n const canonical = requireCanonicalFragment(doc, op.html);\n if (canonical) return { ok: false, error: canonical };\n\n const frag = parseFragment(doc, op.html);\n const single = requireSingleRoot(frag);\n if (single) return { ok: false, error: single };\n\n const scripts = rejectScriptsAndHandlers(frag);\n if (scripts) return { ok: false, error: scripts };\n\n const idErr = requireFragmentIds(frag, collectDocIds(doc));\n if (idErr) return { ok: false, error: idErr };\n\n const root = fragmentElementRoots(frag)[0];\n const childLayer = layerOf(root);\n if (!childLayer) {\n return { ok: false, error: editorError('STRUCTURE', { params: { reason: 'unknown-layer' } }) };\n }\n const rejection = canContain(parent, childLayer);\n if (rejection) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.parentId, params: { reason: rejection } }) };\n }\n\n const newId = root.getAttribute('data-pt-id')!;\n const at = resolveOffset(parent, op.index, op.nodeIndex);\n parent.insertBefore(frag, parent.childNodes[at] ?? null);\n\n return { ok: true, inverse: { op: 'delete', id: newId } };\n}\n\n// ---------------------------------------------------------------- delete\n\nfunction applyDelete(doc: Document, op: { id: string }): OneResult {\n const miss = requireIdHit(doc, op.id);\n if (miss) return { ok: false, error: miss };\n const el = findById(doc, op.id)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n const opaque = closestOpaque(el);\n if (opaque && opaque.host !== el) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'opaque-subtree' } }) };\n }\n\n // 删掉 container 的最后一个 leaf 时容器保留;删掉 section 的最后一个 container\n // 时连 section 一起删。\n const target = deleteTarget(el);\n const parent = target.parentElement;\n if (!parent) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'no-parent' } }) };\n }\n const parentId = parent.getAttribute('data-pt-id');\n if (!parentId) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'parent-has-no-id' } }) };\n }\n\n const nodeIndex = nodeOffset(parent, target);\n const html = serialize(target);\n parent.removeChild(target);\n\n return {\n ok: true,\n // 逆操作带上精确的 childNodes 偏移,空白节点才回得到原位。\n inverse: { op: 'insert', parentId, index: 0, html, nodeIndex }\n };\n}\n\n// ---------------------------------------------------------------- move\n\nfunction applyMove(doc: Document, op: MoveOp): OneResult {\n const missSelf = requireIdHit(doc, op.id);\n if (missSelf) return { ok: false, error: missSelf };\n const missParent = requireIdHit(doc, op.parentId);\n if (missParent) return { ok: false, error: missParent };\n\n const el = findById(doc, op.id)!;\n const parent = findById(doc, op.parentId)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n if (el === parent || el.contains(parent)) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'move-into-self' } }) };\n }\n\n const layer = layerOf(el);\n if (!layer) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'unknown-layer' } }) };\n }\n const rejection = canContain(parent, layer);\n if (rejection) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.parentId, params: { reason: rejection } }) };\n }\n\n const oldParent = el.parentElement;\n const oldParentId = oldParent?.getAttribute('data-pt-id');\n if (!oldParent || !oldParentId) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'parent-has-no-id' } }) };\n }\n const oldNodeIndex = nodeOffset(oldParent, el);\n\n const at = resolveOffset(parent, op.index, op.nodeIndex, el);\n parent.insertBefore(el, parent.childNodes[at] ?? null);\n\n return {\n ok: true,\n inverse: { op: 'move', id: op.id, parentId: oldParentId, index: 0, nodeIndex: oldNodeIndex }\n };\n}\n\n// ---------------------------------------------------------------- replace\n\nfunction applyReplace(doc: Document, op: { id: string; html: string }): OneResult {\n const miss = requireIdHit(doc, op.id);\n if (miss) return { ok: false, error: miss };\n const el = findById(doc, op.id)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n const canonical = requireCanonicalFragment(doc, op.html);\n if (canonical) return { ok: false, error: canonical };\n\n const frag = parseFragment(doc, op.html);\n const single = requireSingleRoot(frag);\n if (single) return { ok: false, error: single };\n\n const scripts = rejectScriptsAndHandlers(frag);\n if (scripts) return { ok: false, error: scripts };\n\n const root = fragmentElementRoots(frag)[0];\n const rootId = root.getAttribute('data-pt-id');\n if (rootId !== op.id) {\n // data-pt-id 会保留进发布产物当埋点锚点;换掉它,那一段的埋点数据就此断链,\n // 而报告里看不出来。\n return {\n ok: false,\n error: editorError('REPLACE_ID_CHANGED', { ptId: op.id, params: { got: rootId ?? '' } })\n };\n }\n\n // 根 id 是它自己,查重时要把自己排除掉。\n const existing = collectDocIds(doc);\n for (const id of collectIdsIn(el)) existing.delete(id);\n const idErr = requireFragmentIds(frag, existing);\n if (idErr) return { ok: false, error: idErr };\n\n const before = serialize(el);\n el.parentNode!.replaceChild(frag, el);\n\n return { ok: true, inverse: { op: 'replace', id: op.id, html: before } };\n}\n\n// ---------------------------------------------------------------- 位置换算\n\n/**\n * 把「元素下标」换算成 childNodes 下标。\n * `nodeIndex` 在场时直接用它 —— 那是 core 生成逆操作时记下的精确偏移。\n */\nfunction resolveOffset(\n parent: Element,\n elementIndex: number,\n nodeIndex: number | undefined,\n moving?: Element\n): number {\n if (typeof nodeIndex === 'number') {\n // nodeIndex 是**移除之后**的目标下标,而 insertBefore 的参照节点要在\n // 当前(尚未移除)的列表里取。被移动的节点若排在目标之前,移除会让后面\n // 整体前移一位,所以参照节点的当前下标要 +1。\n //\n // 方向很容易搞反:写成 -1 的话,同容器内换位会变成一次 no-op —— 撤销\n // 看起来「没反应」,而不是报错。\n let target = nodeIndex;\n if (moving && moving.parentElement === parent) {\n const cur = nodeOffset(parent, moving);\n if (cur < nodeIndex) target = nodeIndex + 1;\n }\n return Math.max(0, Math.min(target, parent.childNodes.length));\n }\n const children = parent.childNodes;\n let seen = 0;\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.nodeType !== 1) continue;\n if (node === moving) continue;\n if (seen === elementIndex) return i;\n seen += 1;\n }\n return children.length;\n}\n\nfunction nodeOffset(parent: Element, node: Node): number {\n const children = parent.childNodes;\n for (let i = 0; i < children.length; i++) {\n if (children[i] === node) return i;\n }\n return children.length;\n}\n\nfunction collectDocIds(doc: Document): Set<string> {\n const out = new Set<string>();\n const nodes = doc.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const v = nodes[i].getAttribute('data-pt-id');\n if (v) out.add(v);\n }\n return out;\n}\n\nfunction collectIdsIn(el: Element): Set<string> {\n const out = new Set<string>();\n const self = el.getAttribute('data-pt-id');\n if (self) out.add(self);\n const nodes = el.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const v = nodes[i].getAttribute('data-pt-id');\n if (v) out.add(v);\n }\n return out;\n}\n","import { compile as twCompile, __unstable__loadDesignSystem } from 'tailwindcss';\nimport { extendTailwindMerge } from 'tailwind-merge';\nimport { TW_SHEETS } from '../generated/tw-css.js';\nimport { EMPTY_THEME, themeTokens, type Theme } from './theme.js';\n\n/**\n * Tailwind 编译的两个入口 + 预热,同一份实现。\n *\n * incremental 画布用。累积只增(Tailwind 的 build() 原本语义),快。\n * fresh 每次新建引擎、候选排序后编译。输出只取决于内容,不取决于编译历史。\n * **export() 与 golden 只走它** —— 否则成品会带上编辑途中出现过\n * 又被删掉的 class。\n * warm 把该主题的缓存条目建齐。\n */\n\ntype TwCompiler = { build(candidates: string[]): string };\ntype DesignSystem = { candidatesToCss(classes: string[]): Array<string | null> };\ntype TwMerge = (...classes: string[]) => string;\n\nconst BASE_IMPORTS =\n '@import \"tailwindcss/theme.css\"; @import \"tailwindcss/preflight.css\"; @import \"tailwindcss/utilities.css\";';\n\nfunction inputFor(theme: Theme): string {\n return theme.source ? `${BASE_IMPORTS}\\n${theme.source}` : BASE_IMPORTS;\n}\n\nconst loadStylesheet = async (id: string, base: string) => {\n const content = TW_SHEETS[id];\n if (content === undefined) throw new Error(`lp-editor-core: 未知样式表 ${id}`);\n return { path: `virtual:${id}`, base, content };\n};\n\nconst compileOptions = { base: '/', loadStylesheet };\n\n/**\n * 一个主题 hash → 一个缓存条目,装三样。\n *\n * `fresh` 有意不入缓存(它的语义就是每次新建)。`warm()` 把三样都建齐 ——\n * 实测三样合计 11ms 左右,没有「只建一样」可争的收益;而首屏真正的成本在\n * core 分块的动态 import,`warm()` 早调一次顺带把它拉下来。\n */\ninterface CacheEntry {\n theme: Theme;\n designSystem?: DesignSystem;\n incremental?: TwCompiler;\n twMerge?: TwMerge;\n /** class → 能否编译。同一主题下反复问同一个 class 很常见(mastra 每个 ops 块都问)。 */\n compilable: Map<string, boolean>;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\nfunction entryOf(theme: Theme): CacheEntry {\n let e = cache.get(theme.hash);\n if (!e) {\n e = { theme, compilable: new Map() };\n cache.set(theme.hash, e);\n }\n return e;\n}\n\nasync function designSystemOf(theme: Theme): Promise<DesignSystem> {\n const e = entryOf(theme);\n if (!e.designSystem) {\n e.designSystem = (await __unstable__loadDesignSystem(\n inputFor(theme),\n compileOptions\n )) as unknown as DesignSystem;\n }\n return e.designSystem;\n}\n\nasync function incrementalOf(theme: Theme): Promise<TwCompiler> {\n const e = entryOf(theme);\n if (!e.incremental) {\n e.incremental = (await twCompile(inputFor(theme), compileOptions)) as unknown as TwCompiler;\n }\n return e.incremental;\n}\n\n/**\n * tailwind-merge 的 class group 必须**按当前 @theme 派生**。\n *\n * token 名是每页自定义的(`text-display-1` / `text-hero`),模块级单例配置\n * 认不出它们 → `set` 时删不掉旧 class → 两个都留在元素上 → 级联顺序说了算。\n * 那正是「同属性互斥」这条规则要防的 bug,配错等于没做。\n */\nfunction twMergeOf(theme: Theme): TwMerge {\n const e = entryOf(theme);\n if (!e.twMerge) {\n const t = themeTokens(theme);\n e.twMerge = extendTailwindMerge({\n extend: {\n theme: {\n color: t.color,\n text: t.text,\n spacing: t.spacing,\n radius: t.radius,\n shadow: t.shadow,\n font: t.font\n }\n }\n }) as unknown as TwMerge;\n }\n return e.twMerge;\n}\n\n/** 累积编译:返回迄今见过的所有候选的完整 CSS。画布用。 */\nexport async function incremental(candidates: Iterable<string>, theme: Theme = EMPTY_THEME): Promise<string> {\n const engine = await incrementalOf(theme);\n return engine.build([...candidates]);\n}\n\n/**\n * 全新编译:每次新建引擎,候选**排序后**编译。\n * 排序是为了让同一组 class 无论以什么顺序收集到,都产出同一串字节。\n */\nexport async function fresh(candidates: Iterable<string>, theme: Theme = EMPTY_THEME): Promise<string> {\n const engine = (await twCompile(inputFor(theme), compileOptions)) as unknown as TwCompiler;\n return engine.build([...new Set(candidates)].sort());\n}\n\n/** 把该主题的缓存条目建齐。`fresh` 按定义不受益。 */\nexport async function warm(theme: Theme = EMPTY_THEME): Promise<void> {\n await Promise.all([designSystemOf(theme), incrementalOf(theme)]);\n twMergeOf(theme);\n}\n\n/**\n * 「class 可编译」判定。\n *\n * 用 Tailwind 自己的 design system:`candidatesToCss` 对解析不出的候选直接返回\n * null。这是 Tailwind IntelliSense 与 prettier 插件用的同一个口子 —— 精确判定,\n * 不是在 CSS 字串里找转义选择器的启发式。\n *\n * 一个 ops 块一次调用,不是逐 class 建引擎(逐个建引擎每次约 3ms,\n * 20 个 class 的块冷缓存就要多花 60ms,加在每轮 AI 往返上)。\n *\n * ⚠️ 它挂着 `__unstable__` 前缀。我们本来就锁精确版本,所以现在是安全的;\n * 万一哪个版本拿掉它,退回「在 fresh 输出里查转义后的选择器」那条路,\n * 判定器同样只在这一处。\n */\nexport async function canCompile(\n classes: readonly string[],\n theme: Theme = EMPTY_THEME\n): Promise<Map<string, boolean>> {\n const e = entryOf(theme);\n const unknown = [...new Set(classes)].filter(c => !e.compilable.has(c));\n if (unknown.length > 0) {\n const ds = await designSystemOf(theme);\n const css = ds.candidatesToCss(unknown);\n unknown.forEach((c, i) => e.compilable.set(c, css[i] != null));\n }\n const out = new Map<string, boolean>();\n for (const c of classes) out.set(c, e.compilable.get(c) ?? false);\n return out;\n}\n\n/** 同属性互斥:按当前主题派生的冲突表合并 class 列表。 */\nexport function mergeClasses(classes: readonly string[], theme: Theme = EMPTY_THEME): string {\n return twMergeOf(theme)(...classes);\n}\n\n/** 测试与宿主重载主题时用。 */\nexport function clearCompileCache(): void {\n cache.clear();\n}\n\nexport { themeOf, themeFromSource, themeTokens, EMPTY_THEME } from './theme.js';\nexport type { Theme, ThemeTokens } from './theme.js';\n","// 本文件由 scripts/gen-tw-css.mjs 生成,请勿手改。\n// 重新生成:pnpm --filter @ptengine/lp-editor-core gen:tw-css\n\n/** 生成这三段 CSS 时解析到的 tailwindcss 版本。构建前由 gen:check 断言它仍然成立。 */\nexport const TAILWIND_VERSION = \"4.3.3\";\n\n/** tailwindcss/theme.css */\nexport const THEME_CSS = \"@theme default {\\n --font-sans:\\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial,\\n sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\\n --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;\\n --font-mono:\\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',\\n monospace;\\n\\n --color-red-50: oklch(97.1% 0.013 17.38);\\n --color-red-100: oklch(93.6% 0.032 17.717);\\n --color-red-200: oklch(88.5% 0.062 18.334);\\n --color-red-300: oklch(80.8% 0.114 19.571);\\n --color-red-400: oklch(70.4% 0.191 22.216);\\n --color-red-500: oklch(63.7% 0.237 25.331);\\n --color-red-600: oklch(57.7% 0.245 27.325);\\n --color-red-700: oklch(50.5% 0.213 27.518);\\n --color-red-800: oklch(44.4% 0.177 26.899);\\n --color-red-900: oklch(39.6% 0.141 25.723);\\n --color-red-950: oklch(25.8% 0.092 26.042);\\n\\n --color-orange-50: oklch(98% 0.016 73.684);\\n --color-orange-100: oklch(95.4% 0.038 75.164);\\n --color-orange-200: oklch(90.1% 0.076 70.697);\\n --color-orange-300: oklch(83.7% 0.128 66.29);\\n --color-orange-400: oklch(75% 0.183 55.934);\\n --color-orange-500: oklch(70.5% 0.213 47.604);\\n --color-orange-600: oklch(64.6% 0.222 41.116);\\n --color-orange-700: oklch(55.3% 0.195 38.402);\\n --color-orange-800: oklch(47% 0.157 37.304);\\n --color-orange-900: oklch(40.8% 0.123 38.172);\\n --color-orange-950: oklch(26.6% 0.079 36.259);\\n\\n --color-amber-50: oklch(98.7% 0.022 95.277);\\n --color-amber-100: oklch(96.2% 0.059 95.617);\\n --color-amber-200: oklch(92.4% 0.12 95.746);\\n --color-amber-300: oklch(87.9% 0.169 91.605);\\n --color-amber-400: oklch(82.8% 0.189 84.429);\\n --color-amber-500: oklch(76.9% 0.188 70.08);\\n --color-amber-600: oklch(66.6% 0.179 58.318);\\n --color-amber-700: oklch(55.5% 0.163 48.998);\\n --color-amber-800: oklch(47.3% 0.137 46.201);\\n --color-amber-900: oklch(41.4% 0.112 45.904);\\n --color-amber-950: oklch(27.9% 0.077 45.635);\\n\\n --color-yellow-50: oklch(98.7% 0.026 102.212);\\n --color-yellow-100: oklch(97.3% 0.071 103.193);\\n --color-yellow-200: oklch(94.5% 0.129 101.54);\\n --color-yellow-300: oklch(90.5% 0.182 98.111);\\n --color-yellow-400: oklch(85.2% 0.199 91.936);\\n --color-yellow-500: oklch(79.5% 0.184 86.047);\\n --color-yellow-600: oklch(68.1% 0.162 75.834);\\n --color-yellow-700: oklch(55.4% 0.135 66.442);\\n --color-yellow-800: oklch(47.6% 0.114 61.907);\\n --color-yellow-900: oklch(42.1% 0.095 57.708);\\n --color-yellow-950: oklch(28.6% 0.066 53.813);\\n\\n --color-lime-50: oklch(98.6% 0.031 120.757);\\n --color-lime-100: oklch(96.7% 0.067 122.328);\\n --color-lime-200: oklch(93.8% 0.127 124.321);\\n --color-lime-300: oklch(89.7% 0.196 126.665);\\n --color-lime-400: oklch(84.1% 0.238 128.85);\\n --color-lime-500: oklch(76.8% 0.233 130.85);\\n --color-lime-600: oklch(64.8% 0.2 131.684);\\n --color-lime-700: oklch(53.2% 0.157 131.589);\\n --color-lime-800: oklch(45.3% 0.124 130.933);\\n --color-lime-900: oklch(40.5% 0.101 131.063);\\n --color-lime-950: oklch(27.4% 0.072 132.109);\\n\\n --color-green-50: oklch(98.2% 0.018 155.826);\\n --color-green-100: oklch(96.2% 0.044 156.743);\\n --color-green-200: oklch(92.5% 0.084 155.995);\\n --color-green-300: oklch(87.1% 0.15 154.449);\\n --color-green-400: oklch(79.2% 0.209 151.711);\\n --color-green-500: oklch(72.3% 0.219 149.579);\\n --color-green-600: oklch(62.7% 0.194 149.214);\\n --color-green-700: oklch(52.7% 0.154 150.069);\\n --color-green-800: oklch(44.8% 0.119 151.328);\\n --color-green-900: oklch(39.3% 0.095 152.535);\\n --color-green-950: oklch(26.6% 0.065 152.934);\\n\\n --color-emerald-50: oklch(97.9% 0.021 166.113);\\n --color-emerald-100: oklch(95% 0.052 163.051);\\n --color-emerald-200: oklch(90.5% 0.093 164.15);\\n --color-emerald-300: oklch(84.5% 0.143 164.978);\\n --color-emerald-400: oklch(76.5% 0.177 163.223);\\n --color-emerald-500: oklch(69.6% 0.17 162.48);\\n --color-emerald-600: oklch(59.6% 0.145 163.225);\\n --color-emerald-700: oklch(50.8% 0.118 165.612);\\n --color-emerald-800: oklch(43.2% 0.095 166.913);\\n --color-emerald-900: oklch(37.8% 0.077 168.94);\\n --color-emerald-950: oklch(26.2% 0.051 172.552);\\n\\n --color-teal-50: oklch(98.4% 0.014 180.72);\\n --color-teal-100: oklch(95.3% 0.051 180.801);\\n --color-teal-200: oklch(91% 0.096 180.426);\\n --color-teal-300: oklch(85.5% 0.138 181.071);\\n --color-teal-400: oklch(77.7% 0.152 181.912);\\n --color-teal-500: oklch(70.4% 0.14 182.503);\\n --color-teal-600: oklch(60% 0.118 184.704);\\n --color-teal-700: oklch(51.1% 0.096 186.391);\\n --color-teal-800: oklch(43.7% 0.078 188.216);\\n --color-teal-900: oklch(38.6% 0.063 188.416);\\n --color-teal-950: oklch(27.7% 0.046 192.524);\\n\\n --color-cyan-50: oklch(98.4% 0.019 200.873);\\n --color-cyan-100: oklch(95.6% 0.045 203.388);\\n --color-cyan-200: oklch(91.7% 0.08 205.041);\\n --color-cyan-300: oklch(86.5% 0.127 207.078);\\n --color-cyan-400: oklch(78.9% 0.154 211.53);\\n --color-cyan-500: oklch(71.5% 0.143 215.221);\\n --color-cyan-600: oklch(60.9% 0.126 221.723);\\n --color-cyan-700: oklch(52% 0.105 223.128);\\n --color-cyan-800: oklch(45% 0.085 224.283);\\n --color-cyan-900: oklch(39.8% 0.07 227.392);\\n --color-cyan-950: oklch(30.2% 0.056 229.695);\\n\\n --color-sky-50: oklch(97.7% 0.013 236.62);\\n --color-sky-100: oklch(95.1% 0.026 236.824);\\n --color-sky-200: oklch(90.1% 0.058 230.902);\\n --color-sky-300: oklch(82.8% 0.111 230.318);\\n --color-sky-400: oklch(74.6% 0.16 232.661);\\n --color-sky-500: oklch(68.5% 0.169 237.323);\\n --color-sky-600: oklch(58.8% 0.158 241.966);\\n --color-sky-700: oklch(50% 0.134 242.749);\\n --color-sky-800: oklch(44.3% 0.11 240.79);\\n --color-sky-900: oklch(39.1% 0.09 240.876);\\n --color-sky-950: oklch(29.3% 0.066 243.157);\\n\\n --color-blue-50: oklch(97% 0.014 254.604);\\n --color-blue-100: oklch(93.2% 0.032 255.585);\\n --color-blue-200: oklch(88.2% 0.059 254.128);\\n --color-blue-300: oklch(80.9% 0.105 251.813);\\n --color-blue-400: oklch(70.7% 0.165 254.624);\\n --color-blue-500: oklch(62.3% 0.214 259.815);\\n --color-blue-600: oklch(54.6% 0.245 262.881);\\n --color-blue-700: oklch(48.8% 0.243 264.376);\\n --color-blue-800: oklch(42.4% 0.199 265.638);\\n --color-blue-900: oklch(37.9% 0.146 265.522);\\n --color-blue-950: oklch(28.2% 0.091 267.935);\\n\\n --color-indigo-50: oklch(96.2% 0.018 272.314);\\n --color-indigo-100: oklch(93% 0.034 272.788);\\n --color-indigo-200: oklch(87% 0.065 274.039);\\n --color-indigo-300: oklch(78.5% 0.115 274.713);\\n --color-indigo-400: oklch(67.3% 0.182 276.935);\\n --color-indigo-500: oklch(58.5% 0.233 277.117);\\n --color-indigo-600: oklch(51.1% 0.262 276.966);\\n --color-indigo-700: oklch(45.7% 0.24 277.023);\\n --color-indigo-800: oklch(39.8% 0.195 277.366);\\n --color-indigo-900: oklch(35.9% 0.144 278.697);\\n --color-indigo-950: oklch(25.7% 0.09 281.288);\\n\\n --color-violet-50: oklch(96.9% 0.016 293.756);\\n --color-violet-100: oklch(94.3% 0.029 294.588);\\n --color-violet-200: oklch(89.4% 0.057 293.283);\\n --color-violet-300: oklch(81.1% 0.111 293.571);\\n --color-violet-400: oklch(70.2% 0.183 293.541);\\n --color-violet-500: oklch(60.6% 0.25 292.717);\\n --color-violet-600: oklch(54.1% 0.281 293.009);\\n --color-violet-700: oklch(49.1% 0.27 292.581);\\n --color-violet-800: oklch(43.2% 0.232 292.759);\\n --color-violet-900: oklch(38% 0.189 293.745);\\n --color-violet-950: oklch(28.3% 0.141 291.089);\\n\\n --color-purple-50: oklch(97.7% 0.014 308.299);\\n --color-purple-100: oklch(94.6% 0.033 307.174);\\n --color-purple-200: oklch(90.2% 0.063 306.703);\\n --color-purple-300: oklch(82.7% 0.119 306.383);\\n --color-purple-400: oklch(71.4% 0.203 305.504);\\n --color-purple-500: oklch(62.7% 0.265 303.9);\\n --color-purple-600: oklch(55.8% 0.288 302.321);\\n --color-purple-700: oklch(49.6% 0.265 301.924);\\n --color-purple-800: oklch(43.8% 0.218 303.724);\\n --color-purple-900: oklch(38.1% 0.176 304.987);\\n --color-purple-950: oklch(29.1% 0.149 302.717);\\n\\n --color-fuchsia-50: oklch(97.7% 0.017 320.058);\\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\\n --color-fuchsia-200: oklch(90.3% 0.076 319.62);\\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\\n --color-fuchsia-400: oklch(74% 0.238 322.16);\\n --color-fuchsia-500: oklch(66.7% 0.295 322.15);\\n --color-fuchsia-600: oklch(59.1% 0.293 322.896);\\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\\n --color-fuchsia-800: oklch(45.2% 0.211 324.591);\\n --color-fuchsia-900: oklch(40.1% 0.17 325.612);\\n --color-fuchsia-950: oklch(29.3% 0.136 325.661);\\n\\n --color-pink-50: oklch(97.1% 0.014 343.198);\\n --color-pink-100: oklch(94.8% 0.028 342.258);\\n --color-pink-200: oklch(89.9% 0.061 343.231);\\n --color-pink-300: oklch(82.3% 0.12 346.018);\\n --color-pink-400: oklch(71.8% 0.202 349.761);\\n --color-pink-500: oklch(65.6% 0.241 354.308);\\n --color-pink-600: oklch(59.2% 0.249 0.584);\\n --color-pink-700: oklch(52.5% 0.223 3.958);\\n --color-pink-800: oklch(45.9% 0.187 3.815);\\n --color-pink-900: oklch(40.8% 0.153 2.432);\\n --color-pink-950: oklch(28.4% 0.109 3.907);\\n\\n --color-rose-50: oklch(96.9% 0.015 12.422);\\n --color-rose-100: oklch(94.1% 0.03 12.58);\\n --color-rose-200: oklch(89.2% 0.058 10.001);\\n --color-rose-300: oklch(81% 0.117 11.638);\\n --color-rose-400: oklch(71.2% 0.194 13.428);\\n --color-rose-500: oklch(64.5% 0.246 16.439);\\n --color-rose-600: oklch(58.6% 0.253 17.585);\\n --color-rose-700: oklch(51.4% 0.222 16.935);\\n --color-rose-800: oklch(45.5% 0.188 13.697);\\n --color-rose-900: oklch(41% 0.159 10.272);\\n --color-rose-950: oklch(27.1% 0.105 12.094);\\n\\n --color-slate-50: oklch(98.4% 0.003 247.858);\\n --color-slate-100: oklch(96.8% 0.007 247.896);\\n --color-slate-200: oklch(92.9% 0.013 255.508);\\n --color-slate-300: oklch(86.9% 0.022 252.894);\\n --color-slate-400: oklch(70.4% 0.04 256.788);\\n --color-slate-500: oklch(55.4% 0.046 257.417);\\n --color-slate-600: oklch(44.6% 0.043 257.281);\\n --color-slate-700: oklch(37.2% 0.044 257.287);\\n --color-slate-800: oklch(27.9% 0.041 260.031);\\n --color-slate-900: oklch(20.8% 0.042 265.755);\\n --color-slate-950: oklch(12.9% 0.042 264.695);\\n\\n --color-gray-50: oklch(98.5% 0.002 247.839);\\n --color-gray-100: oklch(96.7% 0.003 264.542);\\n --color-gray-200: oklch(92.8% 0.006 264.531);\\n --color-gray-300: oklch(87.2% 0.01 258.338);\\n --color-gray-400: oklch(70.7% 0.022 261.325);\\n --color-gray-500: oklch(55.1% 0.027 264.364);\\n --color-gray-600: oklch(44.6% 0.03 256.802);\\n --color-gray-700: oklch(37.3% 0.034 259.733);\\n --color-gray-800: oklch(27.8% 0.033 256.848);\\n --color-gray-900: oklch(21% 0.034 264.665);\\n --color-gray-950: oklch(13% 0.028 261.692);\\n\\n --color-zinc-50: oklch(98.5% 0 none);\\n --color-zinc-100: oklch(96.7% 0.001 286.375);\\n --color-zinc-200: oklch(92% 0.004 286.32);\\n --color-zinc-300: oklch(87.1% 0.006 286.286);\\n --color-zinc-400: oklch(70.5% 0.015 286.067);\\n --color-zinc-500: oklch(55.2% 0.016 285.938);\\n --color-zinc-600: oklch(44.2% 0.017 285.786);\\n --color-zinc-700: oklch(37% 0.013 285.805);\\n --color-zinc-800: oklch(27.4% 0.006 286.033);\\n --color-zinc-900: oklch(21% 0.006 285.885);\\n --color-zinc-950: oklch(14.1% 0.005 285.823);\\n\\n --color-neutral-50: oklch(98.5% 0 none);\\n --color-neutral-100: oklch(97% 0 none);\\n --color-neutral-200: oklch(92.2% 0 none);\\n --color-neutral-300: oklch(87% 0 none);\\n --color-neutral-400: oklch(70.8% 0 none);\\n --color-neutral-500: oklch(55.6% 0 none);\\n --color-neutral-600: oklch(43.9% 0 none);\\n --color-neutral-700: oklch(37.1% 0 none);\\n --color-neutral-800: oklch(26.9% 0 none);\\n --color-neutral-900: oklch(20.5% 0 none);\\n --color-neutral-950: oklch(14.5% 0 none);\\n\\n --color-stone-50: oklch(98.5% 0.001 106.423);\\n --color-stone-100: oklch(97% 0.001 106.424);\\n --color-stone-200: oklch(92.3% 0.003 48.717);\\n --color-stone-300: oklch(86.9% 0.005 56.366);\\n --color-stone-400: oklch(70.9% 0.01 56.259);\\n --color-stone-500: oklch(55.3% 0.013 58.071);\\n --color-stone-600: oklch(44.4% 0.011 73.639);\\n --color-stone-700: oklch(37.4% 0.01 67.558);\\n --color-stone-800: oklch(26.8% 0.007 34.298);\\n --color-stone-900: oklch(21.6% 0.006 56.043);\\n --color-stone-950: oklch(14.7% 0.004 49.25);\\n\\n --color-mauve-50: oklch(98.5% 0 none);\\n --color-mauve-100: oklch(96% 0.003 325.6);\\n --color-mauve-200: oklch(92.2% 0.005 325.62);\\n --color-mauve-300: oklch(86.5% 0.012 325.68);\\n --color-mauve-400: oklch(71.1% 0.019 323.02);\\n --color-mauve-500: oklch(54.2% 0.034 322.5);\\n --color-mauve-600: oklch(43.5% 0.029 321.78);\\n --color-mauve-700: oklch(36.4% 0.029 323.89);\\n --color-mauve-800: oklch(26.3% 0.024 320.12);\\n --color-mauve-900: oklch(21.2% 0.019 322.12);\\n --color-mauve-950: oklch(14.5% 0.008 326);\\n\\n --color-olive-50: oklch(98.8% 0.003 106.5);\\n --color-olive-100: oklch(96.6% 0.005 106.5);\\n --color-olive-200: oklch(93% 0.007 106.5);\\n --color-olive-300: oklch(88% 0.011 106.6);\\n --color-olive-400: oklch(73.7% 0.021 106.9);\\n --color-olive-500: oklch(58% 0.031 107.3);\\n --color-olive-600: oklch(46.6% 0.025 107.3);\\n --color-olive-700: oklch(39.4% 0.023 107.4);\\n --color-olive-800: oklch(28.6% 0.016 107.4);\\n --color-olive-900: oklch(22.8% 0.013 107.4);\\n --color-olive-950: oklch(15.3% 0.006 107.1);\\n\\n --color-mist-50: oklch(98.7% 0.002 197.1);\\n --color-mist-100: oklch(96.3% 0.002 197.1);\\n --color-mist-200: oklch(92.5% 0.005 214.3);\\n --color-mist-300: oklch(87.2% 0.007 219.6);\\n --color-mist-400: oklch(72.3% 0.014 214.4);\\n --color-mist-500: oklch(56% 0.021 213.5);\\n --color-mist-600: oklch(45% 0.017 213.2);\\n --color-mist-700: oklch(37.8% 0.015 216);\\n --color-mist-800: oklch(27.5% 0.011 216.9);\\n --color-mist-900: oklch(21.8% 0.008 223.9);\\n --color-mist-950: oklch(14.8% 0.004 228.8);\\n\\n --color-taupe-50: oklch(98.6% 0.002 67.8);\\n --color-taupe-100: oklch(96% 0.002 17.2);\\n --color-taupe-200: oklch(92.2% 0.005 34.3);\\n --color-taupe-300: oklch(86.8% 0.007 39.5);\\n --color-taupe-400: oklch(71.4% 0.014 41.2);\\n --color-taupe-500: oklch(54.7% 0.021 43.1);\\n --color-taupe-600: oklch(43.8% 0.017 39.3);\\n --color-taupe-700: oklch(36.7% 0.016 35.7);\\n --color-taupe-800: oklch(26.8% 0.011 36.5);\\n --color-taupe-900: oklch(21.4% 0.009 43.1);\\n --color-taupe-950: oklch(14.7% 0.004 49.3);\\n\\n --color-black: #000;\\n --color-white: #fff;\\n\\n --spacing: 0.25rem;\\n\\n --breakpoint-sm: 40rem;\\n --breakpoint-md: 48rem;\\n --breakpoint-lg: 64rem;\\n --breakpoint-xl: 80rem;\\n --breakpoint-2xl: 96rem;\\n\\n --container-3xs: 16rem;\\n --container-2xs: 18rem;\\n --container-xs: 20rem;\\n --container-sm: 24rem;\\n --container-md: 28rem;\\n --container-lg: 32rem;\\n --container-xl: 36rem;\\n --container-2xl: 42rem;\\n --container-3xl: 48rem;\\n --container-4xl: 56rem;\\n --container-5xl: 64rem;\\n --container-6xl: 72rem;\\n --container-7xl: 80rem;\\n\\n --text-xs: 0.75rem;\\n --text-xs--line-height: calc(1 / 0.75);\\n --text-sm: 0.875rem;\\n --text-sm--line-height: calc(1.25 / 0.875);\\n --text-base: 1rem;\\n --text-base--line-height: calc(1.5 / 1);\\n --text-lg: 1.125rem;\\n --text-lg--line-height: calc(1.75 / 1.125);\\n --text-xl: 1.25rem;\\n --text-xl--line-height: calc(1.75 / 1.25);\\n --text-2xl: 1.5rem;\\n --text-2xl--line-height: calc(2 / 1.5);\\n --text-3xl: 1.875rem;\\n --text-3xl--line-height: calc(2.25 / 1.875);\\n --text-4xl: 2.25rem;\\n --text-4xl--line-height: calc(2.5 / 2.25);\\n --text-5xl: 3rem;\\n --text-5xl--line-height: 1;\\n --text-6xl: 3.75rem;\\n --text-6xl--line-height: 1;\\n --text-7xl: 4.5rem;\\n --text-7xl--line-height: 1;\\n --text-8xl: 6rem;\\n --text-8xl--line-height: 1;\\n --text-9xl: 8rem;\\n --text-9xl--line-height: 1;\\n\\n --font-weight-thin: 100;\\n --font-weight-extralight: 200;\\n --font-weight-light: 300;\\n --font-weight-normal: 400;\\n --font-weight-medium: 500;\\n --font-weight-semibold: 600;\\n --font-weight-bold: 700;\\n --font-weight-extrabold: 800;\\n --font-weight-black: 900;\\n\\n --tracking-tighter: -0.05em;\\n --tracking-tight: -0.025em;\\n --tracking-normal: 0em;\\n --tracking-wide: 0.025em;\\n --tracking-wider: 0.05em;\\n --tracking-widest: 0.1em;\\n\\n --leading-tight: 1.25;\\n --leading-snug: 1.375;\\n --leading-normal: 1.5;\\n --leading-relaxed: 1.625;\\n --leading-loose: 2;\\n\\n --radius-xs: 0.125rem;\\n --radius-sm: 0.25rem;\\n --radius-md: 0.375rem;\\n --radius-lg: 0.5rem;\\n --radius-xl: 0.75rem;\\n --radius-2xl: 1rem;\\n --radius-3xl: 1.5rem;\\n --radius-4xl: 2rem;\\n\\n --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\\n\\n --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\\n --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\\n --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\\n\\n --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\\n --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\\n --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\\n --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\\n --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\\n\\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\\n --text-shadow-sm:\\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\\n --text-shadow-md:\\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\\n --text-shadow-lg:\\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\\n\\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\\n\\n --animate-spin: spin 1s linear infinite;\\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\\n --animate-bounce: bounce 1s infinite;\\n\\n @keyframes spin {\\n to {\\n transform: rotate(360deg);\\n }\\n }\\n\\n @keyframes ping {\\n 75%,\\n 100% {\\n transform: scale(2);\\n opacity: 0;\\n }\\n }\\n\\n @keyframes pulse {\\n 50% {\\n opacity: 0.5;\\n }\\n }\\n\\n @keyframes bounce {\\n 0%,\\n 100% {\\n transform: translateY(-25%);\\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\\n }\\n\\n 50% {\\n transform: none;\\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n }\\n }\\n\\n --blur-xs: 4px;\\n --blur-sm: 8px;\\n --blur-md: 12px;\\n --blur-lg: 16px;\\n --blur-xl: 24px;\\n --blur-2xl: 40px;\\n --blur-3xl: 64px;\\n\\n --perspective-dramatic: 100px;\\n --perspective-near: 300px;\\n --perspective-normal: 500px;\\n --perspective-midrange: 800px;\\n --perspective-distant: 1200px;\\n\\n --aspect-video: 16 / 9;\\n\\n --default-transition-duration: 150ms;\\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n --default-font-family: --theme(--font-sans, initial);\\n --default-font-feature-settings: --theme(--font-sans--font-feature-settings, initial);\\n --default-font-variation-settings: --theme(--font-sans--font-variation-settings, initial);\\n --default-mono-font-family: --theme(--font-mono, initial);\\n --default-mono-font-feature-settings: --theme(--font-mono--font-feature-settings, initial);\\n --default-mono-font-variation-settings: --theme(--font-mono--font-variation-settings, initial);\\n}\\n\\n/* Deprecated */\\n@theme default inline reference {\\n --blur: 8px;\\n --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\\n --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\\n --radius: 0.25rem;\\n --max-width-prose: 65ch;\\n}\\n\";\n\n/** tailwindcss/preflight.css */\nexport const PREFLIGHT_CSS = \"/*\\n 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\\n 2. Remove default margins and padding\\n 3. Reset all borders.\\n*/\\n\\n*,\\n::after,\\n::before,\\n::backdrop,\\n::file-selector-button {\\n box-sizing: border-box; /* 1 */\\n margin: 0; /* 2 */\\n padding: 0; /* 2 */\\n border: 0 solid; /* 3 */\\n}\\n\\n/*\\n 1. Use a consistent sensible line-height in all browsers.\\n 2. Prevent adjustments of font size after orientation changes in iOS.\\n 3. Use a more readable tab size.\\n 4. Use the user's configured `sans` font-family by default.\\n 5. Use the user's configured `sans` font-feature-settings by default.\\n 6. Use the user's configured `sans` font-variation-settings by default.\\n 7. Disable tap highlights on iOS.\\n*/\\n\\nhtml,\\n:host {\\n line-height: 1.5; /* 1 */\\n -webkit-text-size-adjust: 100%; /* 2 */\\n tab-size: 4; /* 3 */\\n font-family: --theme(\\n --default-font-family,\\n -apple-system,\\n BlinkMacSystemFont,\\n 'Segoe UI',\\n Roboto,\\n 'Helvetica Neue',\\n 'Noto Sans',\\n Arial,\\n sans-serif,\\n 'Apple Color Emoji',\\n 'Segoe UI Emoji',\\n 'Segoe UI Symbol',\\n 'Noto Color Emoji'\\n ); /* 4 */\\n font-feature-settings: --theme(--default-font-feature-settings, normal); /* 5 */\\n font-variation-settings: --theme(--default-font-variation-settings, normal); /* 6 */\\n -webkit-tap-highlight-color: transparent; /* 7 */\\n}\\n\\n/*\\n 1. Add the correct height in Firefox.\\n 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\\n 3. Reset the default border style to a 1px solid border.\\n*/\\n\\nhr {\\n height: 0; /* 1 */\\n color: inherit; /* 2 */\\n border-top-width: 1px; /* 3 */\\n}\\n\\n/*\\n Add the correct text decoration in Chrome, Edge, and Safari.\\n*/\\n\\nabbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\n\\n/*\\n Remove the default font size and weight for headings.\\n*/\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n\\n/*\\n Reset links to optimize for opt-in styling instead of opt-out.\\n*/\\n\\na {\\n color: inherit;\\n -webkit-text-decoration: inherit;\\n text-decoration: inherit;\\n}\\n\\n/*\\n Add the correct font weight in Edge and Safari.\\n*/\\n\\nb,\\nstrong {\\n font-weight: bolder;\\n}\\n\\n/*\\n 1. Use the user's configured `mono` font-family by default.\\n 2. Use the user's configured `mono` font-feature-settings by default.\\n 3. Use the user's configured `mono` font-variation-settings by default.\\n 4. Correct the odd `em` font sizing in all browsers.\\n*/\\n\\ncode,\\nkbd,\\nsamp,\\npre {\\n font-family: --theme(\\n --default-mono-font-family,\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n 'Liberation Mono',\\n 'Courier New',\\n monospace\\n ); /* 1 */\\n font-feature-settings: --theme(--default-mono-font-feature-settings, normal); /* 2 */\\n font-variation-settings: --theme(--default-mono-font-variation-settings, normal); /* 3 */\\n font-size: 1em; /* 4 */\\n}\\n\\n/*\\n Add the correct font size in all browsers.\\n*/\\n\\nsmall {\\n font-size: 80%;\\n}\\n\\n/*\\n Prevent `sub` and `sup` elements from affecting the line height in all browsers.\\n*/\\n\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\n\\nsub {\\n bottom: -0.25em;\\n}\\n\\nsup {\\n top: -0.5em;\\n}\\n\\n/*\\n 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\\n 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\\n 3. Remove gaps between table borders by default.\\n*/\\n\\ntable {\\n text-indent: 0; /* 1 */\\n border-color: inherit; /* 2 */\\n border-collapse: collapse; /* 3 */\\n}\\n\\n/*\\n Use the modern Firefox focus style for all focusable elements.\\n*/\\n\\n:-moz-focusring:where(:not(iframe)) {\\n outline: auto;\\n}\\n\\n/*\\n Add the correct vertical alignment in Chrome and Firefox.\\n*/\\n\\nprogress {\\n vertical-align: baseline;\\n}\\n\\n/*\\n Add the correct display in Chrome and Safari.\\n*/\\n\\nsummary {\\n display: list-item;\\n}\\n\\n/*\\n Make lists unstyled by default.\\n*/\\n\\nol,\\nul,\\nmenu {\\n list-style: none;\\n}\\n\\n/*\\n 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\\n 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\\n This can trigger a poorly considered lint error in some tools but is included by design.\\n*/\\n\\nimg,\\nsvg,\\nvideo,\\ncanvas,\\naudio,\\niframe,\\nembed,\\nobject {\\n display: block; /* 1 */\\n vertical-align: middle; /* 2 */\\n}\\n\\n/*\\n Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\\n*/\\n\\nimg,\\nvideo {\\n max-width: 100%;\\n height: auto;\\n}\\n\\n/*\\n 1. Inherit font styles in all browsers.\\n 2. Remove border radius in all browsers.\\n 3. Remove background color in all browsers.\\n 4. Ensure consistent opacity for disabled states in all browsers.\\n*/\\n\\nbutton,\\ninput,\\nselect,\\noptgroup,\\ntextarea,\\n::file-selector-button {\\n font: inherit; /* 1 */\\n font-feature-settings: inherit; /* 1 */\\n font-variation-settings: inherit; /* 1 */\\n letter-spacing: inherit; /* 1 */\\n color: inherit; /* 1 */\\n border-radius: 0; /* 2 */\\n background-color: transparent; /* 3 */\\n opacity: 1; /* 4 */\\n}\\n\\n/*\\n Restore default font weight.\\n*/\\n\\n:where(select:is([multiple], [size])) optgroup {\\n font-weight: bolder;\\n}\\n\\n/*\\n Restore indentation.\\n*/\\n\\n:where(select:is([multiple], [size])) optgroup option {\\n padding-inline-start: 20px;\\n}\\n\\n/*\\n Restore space after button.\\n*/\\n\\n::file-selector-button {\\n margin-inline-end: 4px;\\n}\\n\\n/*\\n Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\\n*/\\n\\n::placeholder {\\n opacity: 1;\\n}\\n\\n/*\\n Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\\n crash when using `color-mix(…)` with `currentcolor`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\\n*/\\n\\n@supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\\n (contain-intrinsic-size: 1px) /* Safari 17+ */ {\\n ::placeholder {\\n color: color-mix(in oklab, currentcolor 50%, transparent);\\n }\\n}\\n\\n/*\\n Prevent resizing textareas horizontally by default.\\n*/\\n\\ntextarea {\\n resize: vertical;\\n}\\n\\n/*\\n Remove the inner padding in Chrome and Safari on macOS.\\n*/\\n\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n\\n/*\\n 1. Ensure date/time inputs have the same height when empty in iOS Safari.\\n 2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\\n*/\\n\\n::-webkit-date-and-time-value {\\n min-height: 1lh; /* 1 */\\n text-align: inherit; /* 2 */\\n}\\n\\n/*\\n Prevent height from changing on date/time inputs in macOS Safari when the input is set to `display: block`.\\n*/\\n\\n::-webkit-datetime-edit {\\n display: inline-flex;\\n}\\n\\n/*\\n Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\\n*/\\n\\n::-webkit-datetime-edit-fields-wrapper {\\n padding: 0;\\n}\\n\\n::-webkit-datetime-edit,\\n::-webkit-datetime-edit-year-field,\\n::-webkit-datetime-edit-month-field,\\n::-webkit-datetime-edit-day-field,\\n::-webkit-datetime-edit-hour-field,\\n::-webkit-datetime-edit-minute-field,\\n::-webkit-datetime-edit-second-field,\\n::-webkit-datetime-edit-millisecond-field,\\n::-webkit-datetime-edit-meridiem-field {\\n padding-block: 0;\\n}\\n\\n/*\\n Center dropdown marker shown on inputs with paired `<datalist>`s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\\n*/\\n\\n::-webkit-calendar-picker-indicator {\\n line-height: 1;\\n}\\n\\n/*\\n Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\\n*/\\n\\n:-moz-ui-invalid {\\n box-shadow: none;\\n}\\n\\n/*\\n Correct the inability to style the border radius in iOS Safari.\\n*/\\n\\nbutton,\\ninput:where([type='button'], [type='reset'], [type='submit']),\\n::file-selector-button {\\n appearance: button;\\n}\\n\\n/*\\n Correct the cursor style of increment and decrement buttons in Safari.\\n*/\\n\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n height: auto;\\n}\\n\\n/*\\n Make elements with the HTML hidden attribute stay hidden by default.\\n*/\\n\\n[hidden]:where(:not([hidden='until-found'])) {\\n display: none !important;\\n}\\n\";\n\n/** tailwindcss/utilities.css */\nexport const UTILITIES_CSS = \"@tailwind utilities;\\n\";\n\n/** 虚拟样式表映射:编译时 loadStylesheet 按 `tailwindcss/<name>.css` 查这张表。 */\nexport const TW_SHEETS: Readonly<Record<string, string>> = {\n 'tailwindcss/theme.css': THEME_CSS,\n 'tailwindcss/preflight.css': PREFLIGHT_CSS,\n 'tailwindcss/utilities.css': UTILITIES_CSS\n};\n","import { THEME_PT_ID } from '../rules/index.js';\n\n/**\n * 主题:`<style type=\"text/tailwindcss\" data-pt-id=\"theme\">` 里的 @theme 块内容。\n *\n * 它是缓存的键:一个 class 成不成立、tailwind-merge 认不认得某个 token,\n * 都取决于当前主题。\n */\n\nexport interface Theme {\n /** @theme 块的原文(含 `@theme { … }` 外壳)。 */\n source: string;\n /** 内容 hash,作为缓存键。 */\n hash: string;\n}\n\nexport const EMPTY_THEME: Theme = { source: '', hash: '0' };\n\n/** 从文档里取出主题块。取不到就是空主题。 */\nexport function themeOf(root: Document | DocumentFragment | Element): Theme {\n const el =\n root.querySelector(`style[data-pt-id=\"${THEME_PT_ID}\"]`) ??\n root.querySelector('style[type=\"text/tailwindcss\"]');\n if (!el) return EMPTY_THEME;\n return themeFromSource(el.textContent ?? '');\n}\n\nexport function themeFromSource(source: string): Theme {\n return { source, hash: hashString(source) };\n}\n\n/**\n * FNV-1a 32 位。\n *\n * 只用作缓存键,不做正确性判断 —— 所以不需要加密强度,但**必须两侧同算法**,\n * 否则同一主题在浏览器与 Node 会落到不同的缓存条目(那只是浪费,不会出错,\n * 但也没有理由让它发生)。\n */\nexport function hashString(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/**\n * 从 @theme 原文里抽出各命名空间的 token 名。\n * 供 tailwind-merge 的 class group 派生 —— token 名是每页自定义的,\n * 模块级单例配置认不出它们。\n */\nexport interface ThemeTokens {\n color: string[];\n text: string[];\n spacing: string[];\n radius: string[];\n shadow: string[];\n font: string[];\n}\n\nconst NAMESPACES: Array<[keyof ThemeTokens, string]> = [\n ['color', '--color-'],\n ['text', '--text-'],\n ['spacing', '--spacing-'],\n ['radius', '--radius-'],\n ['shadow', '--shadow-'],\n ['font', '--font-']\n];\n\nexport function themeTokens(theme: Theme): ThemeTokens {\n const out: ThemeTokens = { color: [], text: [], spacing: [], radius: [], shadow: [], font: [] };\n // 只扫声明名,不解析值 —— 我们要的只是 token 名。\n const re = /--[a-z0-9-]+(?=\\s*:)/gi;\n const seen = new Set<string>();\n for (const match of theme.source.matchAll(re)) {\n const name = match[0];\n if (seen.has(name)) continue;\n seen.add(name);\n for (const [key, prefix] of NAMESPACES) {\n if (name.startsWith(prefix)) {\n const token = name.slice(prefix.length);\n // `--text-display-1--line-height` 这类派生声明不算独立 token。\n if (token && !token.includes('--')) out[key].push(token);\n break;\n }\n }\n }\n return out;\n}\n","/**\n * 收集文档里用到的全部 class。\n *\n * 接 `Document` 而不是 HTML 字串 —— 与其余 API 一致,也免得调用方为了收集 class\n * 再解析一遍(浏览器侧先 parse 即可)。\n *\n * 注意它扫的是**源文档**:内置组件在源里只是一个空壳,展开后才出现的类名不在\n * 这里。这正是「渲染器产出的 markup 不使用 Tailwind class」那条规则存在的原因 ——\n * 组件自带 CSS,不走这条编译管线。\n */\nexport function collectClasses(root: Document | DocumentFragment | Element): Set<string> {\n const out = new Set<string>();\n const add = (el: Element) => {\n const raw = el.getAttribute('class');\n if (!raw) return;\n for (const c of raw.split(/[\\t\\n\\f\\r ]+/)) if (c) out.add(c);\n };\n if ('getAttribute' in root && typeof (root as Element).getAttribute === 'function') {\n add(root as Element);\n }\n const nodes = root.querySelectorAll('[class]');\n for (let i = 0; i < nodes.length; i++) add(nodes[i]);\n return out;\n}\n","import { createParse } from './dom/parse.js';\nimport { parseFragment, fragmentElementRoots } from './dom/parseFragment.js';\nimport { serialize, normalizeClassValue } from './serialize/canonical.js';\nimport { rules } from './rules/index.js';\nimport { VERSION, COMPILER_VERSION } from './version.js';\nimport { normalize } from './normalize.js';\nimport { createWrap, unwrap } from './wrap.js';\nimport { validate } from './validate/index.js';\nimport { apply } from './ops/apply.js';\nimport * as guards from './ops/guards.js';\nimport * as compile from './compile/index.js';\nimport { collectClasses } from './collectClasses.js';\nimport type { CoreOptions, DOMParserCtor, DOMParserLike } from './dom/types.js';\n\nexport type { CoreOptions, DOMParserCtor, DOMParserLike };\nexport type {\n ErrorCode,\n Issue,\n ValidateResult,\n EditorError\n} from './errors.js';\nexport type { Rules, DeviceVariant, StateVariant, PropertySlot, LayerName, LeafType, OpaqueMode } from './rules/index.js';\n\nexport { serialize, normalizeClassValue, parseFragment, fragmentElementRoots };\nexport { normalize } from './normalize.js';\nexport { unwrap, isWrapLayer } from './wrap.js';\nexport { validate } from './validate/index.js';\nexport { apply } from './ops/apply.js';\nexport { layerOf, canContain, containerDepth, deleteTarget, MAX_CONTAINER_DEPTH } from './validate/structure.js';\nexport type { StructureRejection } from './validate/structure.js';\nexport { checkVariants } from './validate/variants.js';\nexport { isNativePaletteClass } from './validate/palette.js';\nexport * as guards from './ops/guards.js';\nexport * as compile from './compile/index.js';\nexport { collectClasses } from './collectClasses.js';\nexport { themeOf, themeFromSource, themeTokens, EMPTY_THEME } from './compile/theme.js';\nexport type { Theme, ThemeTokens } from './compile/theme.js';\nexport type { EditOp, SetOp, InsertOp, DeleteOp, MoveOp, ReplaceOp, Transaction } from './ops/types.js';\nexport type { ApplyResult } from './ops/apply.js';\nexport type { ValidateOptions } from './validate/index.js';\nexport type { NormalizeOptions } from './normalize.js';\nexport { rules } from './rules/index.js';\nexport { VERSION, COMPILER_VERSION } from './version.js';\nexport {\n ERROR_CODES,\n isErrorCode,\n PUBLISH_BLOCKING_RULES,\n isPublishBlocking,\n editorError\n} from './errors.js';\n\n/**\n * core 的入口。宿主注入 DOM 之后拿到一组行为。\n *\n * 只有 `parse` 真的需要注入(整文档解析)。其余能力都是纯函数,挂在这里只是给宿主\n * 一个单一入口;它们同时也是具名导出 —— golden 测试直接对着纯函数比对最省事,\n * 也省得两份设计文档里所有签名都写成 core.x(...)。\n */\nexport function createCore(options: CoreOptions) {\n if (!options || typeof options.DOMParser !== 'function') {\n throw new TypeError('createCore(): 必须注入 DOMParser 构造器');\n }\n const parse = createParse(options.DOMParser);\n return {\n parse,\n parseFragment,\n wrap: createWrap(parse),\n unwrap,\n serialize,\n normalize,\n validate,\n apply,\n guards,\n compile,\n collectClasses,\n rules,\n VERSION,\n COMPILER_VERSION\n };\n}\n\nexport type Core = ReturnType<typeof createCore>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dom/parse.ts","../src/dom/parseFragment.ts","../src/serialize/canonical.ts","../src/rules/index.ts","../src/version.ts","../src/validate/tree.ts","../src/normalize.ts","../src/wrap.ts","../src/validate/variants.ts","../src/validate/palette.ts","../src/components/contracts.ts","../src/components/settings.ts","../src/components/resolve.ts","../src/validate/components.ts","../src/validate/index.ts","../src/errors.ts","../src/validate/structure.ts","../src/ops/guards.ts","../src/ops/apply.ts","../src/compile/index.ts","../src/generated/tw-css.ts","../src/compile/theme.ts","../src/components/index.ts","../src/components/renderers/shared.ts","../src/components/renderers/carousel.ts","../src/components/renderers/faq.ts","../src/components/renderers/form.ts","../src/components/renderers/stickyCta.ts","../src/components/renderers/tabs.ts","../src/components/render.ts","../src/components/contract.ts","../src/collectClasses.ts","../src/index.ts"],"names":["list","tag","EVENT_ATTR","serializeChildren","out","child","twCompile","field","icon"],"mappings":"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","file":"index.js","sourcesContent":["import type { DOMParserCtor } from './types.js';\n\n/**\n * 整文档解析。\n *\n * 注意产出的文档**没有 browsing context**,`defaultView` 恒为 `null`\n * (Chrome / Firefox / jsdom 一致)。所以 core 内部绝不能从文档反查\n * `doc.defaultView.DOMParser` —— 进入流程本身就是 DOMParser 解析,\n * 照那样写第一行就会抛。解析器一律由宿主注入。\n */\nexport function createParse(DOMParser: DOMParserCtor): (html: string) => Document {\n const parser = new DOMParser();\n return function parse(html: string): Document {\n if (typeof html !== 'string') {\n throw new TypeError('parse(): html 必须是字符串');\n }\n return parser.parseFromString(html, 'text/html');\n };\n}\n","/**\n * 片段解析:EditOp 的 `insert.html` / `replace.html` 从字符串变成节点的唯一入口。\n *\n * 不需要注入解析器 —— 用目标文档自己的 `<template>` 就够,而且这是**唯一**能\n * 正确处理上下文相关元素的通用做法:HTML5 的 \"in template\" 插入模式对\n * `<tr>` / `<td>` / `<col>` / `<li>` / `<option>` 会各自切到正确的表格 / 列表模式,\n * 元素不会被丢弃。所以不需要额外的 contextEl 参数,一个容器覆盖全部上下文。\n *\n * ⚠️ `template.content` 里的节点属于**模板内容所有者文档**,不是 `doc`。\n * 插入时由 DOM 的 pre-insert 自动 adopt,所以最终没问题;但在插入**之前**\n * `node.ownerDocument !== doc`,任何「同文档」断言都会误判。\n *\n * 这里是全包唯一允许写 innerHTML 的地方(见 eslint.config.js):写是解析,\n * 与「禁读 outerHTML」要防的事情无关。\n */\nexport function parseFragment(doc: Document, html: string): DocumentFragment {\n if (typeof html !== 'string') {\n throw new TypeError('parseFragment(): html 必须是字符串');\n }\n const tpl = doc.createElement('template');\n tpl.innerHTML = html;\n return tpl.content;\n}\n\n/** 片段里的元素子节点(跳过纯空白文本),供单根校验使用。 */\nexport function fragmentElementRoots(fragment: DocumentFragment): Element[] {\n const roots: Element[] = [];\n let child: Node | null = fragment.firstChild;\n while (child) {\n if (child.nodeType === 1) roots.push(child as Element);\n child = child.nextSibling;\n }\n return roots;\n}\n","/**\n * 规范序列化(canonical serializer)。\n *\n * 目标:同一棵 DOM 树(由任何符合 HTML5 规范的树构造器产出),无论宿主是浏览器\n * 原生 DOM 还是 jsdom,都序列化成**逐字节相同**的字符串。这是「编辑器 apply ==\n * mastra apply」那条不变量的落点。\n *\n * 约束:\n * - 纯函数,无副作用、无 I/O\n * - 只依赖标准 DOM 读 API,同一份实现在浏览器与 Node 两侧跑\n * - 绝不使用 innerHTML / outerHTML —— 它们本身就是分歧的来源\n *\n * 规范规则(全部写死,不提供选项):\n * R1 标签名 HTML 命名空间元素小写;外来元素(SVG / MathML)保留\n * 解析器调整后的 localName(foreignObject、clipPath…)\n * R2 属性顺序 按限定名排序,UTF-16 码元序\n * R3 属性引号 一律 name=\"value\",双引号,永远带引号\n * R4 文本转义 & < > -> & < >\n * R5 属性值转义 & < > \" -> & < > "\n * R6 空元素 <br> —— 不带结尾斜杠、不带闭合标签\n * R7 pre/textarea/listing 空白原样保留;紧随起始标签的换行重新发出\n * (解析器会吃掉一个),保证再解析回同一棵树\n * R8 注释 原样 <!--data-->\n * R9 doctype 规范化;无 id 的 html -> <!DOCTYPE html>\n * R10 布尔/空属性 统一一种形态:disabled=\"\"、alt=\"\"\n * R11 raw text script/style/xmp/iframe/noembed/noframes/plaintext\n * 的字符数据原样输出,不转义\n * R12 template 经其 .content 片段序列化\n * R13 回车 U+000D 在文本与属性值里输出为 ,使输出可往返\n * R14 class 值 按空白切分后**去重**、单空格拼接,**不重排顺序**\n *\n * R13 与 R14 是相对 WHATWG 序列化器的**增补**,不是放宽:\n * - R13:词法分析器在建树前把 CR / CRLF 归一成 LF,不转义的 CR 会在下一次解析时\n * 静默变成 LF。原生 outerHTML 在所有引擎上都有这个毛病。\n * - R14:两侧按同一组 op 应用会得到同样的插入顺序,所以顺序天然确定、不需要排序;\n * 但源数据里的 `class=\"a b a\"` 这类写法会让字节不同。去重 + 折叠空白把它收敛掉。\n * **有意不排序** —— 排序会把作者写的顺序变成非作者的,而 `md:` 与基线的相对位置\n * 在读源码时是有意义的。\n */\n\nconst HTML_NS = 'http://www.w3.org/1999/xhtml';\n\n/** R6:HTML 空元素(含历史遗留的几个)。 */\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'basefont',\n 'bgsound',\n 'br',\n 'col',\n 'embed',\n 'frame',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\n/**\n * R11:子文本永不转义的元素。\n *\n * `noscript` 有意**不在**这个集合里。规范对 noscript 的规则取决于 scripting flag,\n * 而那个标志从 DOM 上观察不到。我们的两个宿主都以 scripting 关闭解析\n * (DOMParser 恒如此;jsdom 不设 runScripts 时也是),所以 noscript 的子节点\n * 在两侧都是真实元素 / 已转义文本,走「转义」这一支才逐字节一致且可往返。\n */\nconst RAW_TEXT_ELEMENTS = new Set([\n 'script',\n 'style',\n 'xmp',\n 'iframe',\n 'noembed',\n 'noframes',\n 'plaintext'\n]);\n\n/** R7:解析器会吃掉一个前导换行的元素。 */\nconst NEWLINE_EATING_ELEMENTS = new Set(['pre', 'textarea', 'listing']);\n\n// 节点类型常量写死,不依赖可能不存在的全局(裸 Node 进程里没有 Node.ELEMENT_NODE)。\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst CDATA_SECTION_NODE = 4;\nconst PROCESSING_INSTRUCTION_NODE = 7;\nconst COMMENT_NODE = 8;\nconst DOCUMENT_NODE = 9;\nconst DOCUMENT_TYPE_NODE = 10;\nconst DOCUMENT_FRAGMENT_NODE = 11;\n\n/**\n * R4(+ R13)。\n *\n * 导出给组件渲染器复用(不进 `index.ts` 的公开面)—— 渲染器自己写一份转义的话,\n * 产物过一次 parse → serialize 往返就会变字节,而「两端逐字节相同」正是这个包存在的理由。\n */\nexport function escapeText(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch === '&') out += '&';\n else if (ch === '<') out += '<';\n else if (ch === '>') out += '>';\n else if (ch === '\\r') out += ' ';\n else out += ch;\n }\n return out;\n}\n\n/** R5(+ R13)。同上,导出给渲染器复用。 */\nexport function escapeAttribute(value: string): string {\n let out = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i];\n if (ch === '&') out += '&';\n else if (ch === '<') out += '<';\n else if (ch === '>') out += '>';\n else if (ch === '\"') out += '"';\n else if (ch === '\\r') out += ' ';\n else out += ch;\n }\n return out;\n}\n\n/**\n * R14:class 值去重 + 折叠空白,保持首次出现的顺序。\n * 导出是因为 EditOp 的 class 增删也要用同一份规则,否则「写进去的」与\n * 「序列化出来的」会是两套。\n */\nexport function normalizeClassValue(value: string): string {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of value.split(/[\\t\\n\\f\\r ]+/)) {\n if (token === '' || seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n }\n return out.join(' ');\n}\n\n/**\n * R1。HTML 命名空间元素小写(解析器已经做过,这里再做一次,防止程序化构造的树\n * 混进大小写);外来元素保留解析器调整后的 localName。\n */\nfunction canonicalTagName(el: Element): string {\n const local = el.localName;\n if (el.namespaceURI === HTML_NS || el.namespaceURI == null) {\n return local.toLowerCase();\n }\n return local;\n}\n\n/**\n * R2。按限定名排序,UTF-16 码元序。\n * 有意不用 `localeCompare`:它依赖 locale 与 ICU 版本,正是跨引擎分歧的来源。\n */\nfunction sortedAttributes(el: Element): Array<[string, string]> {\n const attrs: Array<[string, string]> = [];\n const list = el.attributes;\n for (let i = 0; i < list.length; i++) {\n const a = list[i];\n const raw = a.value === null || a.value === undefined ? '' : a.value;\n attrs.push([a.name, a.name === 'class' ? normalizeClassValue(raw) : raw]);\n }\n attrs.sort((x, y) => (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0));\n return attrs;\n}\n\n/** R3 + R10:每个属性都写成 name=\"value\",空值也写。 */\nfunction serializeAttributes(el: Element): string {\n let out = '';\n for (const [name, value] of sortedAttributes(el)) {\n out += ' ' + name + '=\"' + escapeAttribute(value) + '\"';\n }\n return out;\n}\n\n/** R9 */\nfunction serializeDoctype(dt: DocumentType): string {\n const name = (dt.name || '').toLowerCase();\n const publicId = dt.publicId || '';\n const systemId = dt.systemId || '';\n if (name === 'html' && publicId === '' && systemId === '') {\n return '<!DOCTYPE html>';\n }\n let out = '<!DOCTYPE ' + name;\n if (publicId !== '') {\n out += ' PUBLIC \"' + publicId + '\"';\n if (systemId !== '') out += ' \"' + systemId + '\"';\n } else if (systemId !== '') {\n out += ' SYSTEM \"' + systemId + '\"';\n }\n return out + '>';\n}\n\nfunction isRawTextElement(el: Element): boolean {\n return (\n (el.namespaceURI === HTML_NS || el.namespaceURI == null) &&\n RAW_TEXT_ELEMENTS.has(canonicalTagName(el))\n );\n}\n\nfunction isVoidElement(el: Element): boolean {\n return (\n (el.namespaceURI === HTML_NS || el.namespaceURI == null) &&\n VOID_ELEMENTS.has(canonicalTagName(el))\n );\n}\n\nfunction serializeChildren(node: Node, sink: string[]): void {\n let child: Node | null = node.firstChild;\n while (child) {\n serializeNode(child, sink);\n child = child.nextSibling;\n }\n}\n\nfunction serializeElement(el: Element, sink: string[]): void {\n const tag = canonicalTagName(el);\n sink.push('<' + tag + serializeAttributes(el) + '>');\n\n if (isVoidElement(el)) {\n // R6:无子节点、无闭合标签、无自闭合斜杠。\n return;\n }\n\n // R12:<template> 的内容在另一个 DocumentFragment 上。\n const isTemplate =\n tag === 'template' && (el.namespaceURI === HTML_NS || el.namespaceURI == null);\n const tplContent = (el as HTMLTemplateElement).content;\n const contentRoot: Node = isTemplate && tplContent ? tplContent : el;\n\n // R7:树构造器吞掉了起始标签后紧跟的一个换行,重新发出来,保证再解析回同一棵树。\n if (NEWLINE_EATING_ELEMENTS.has(tag) && !isTemplate) {\n const first = contentRoot.firstChild;\n if (first && first.nodeType === TEXT_NODE && (first as Text).data.charCodeAt(0) === 10) {\n sink.push('\\n');\n }\n }\n\n if (isRawTextElement(el)) {\n // R11:字符数据原样输出。\n let child: Node | null = contentRoot.firstChild;\n while (child) {\n if (child.nodeType === TEXT_NODE || child.nodeType === CDATA_SECTION_NODE) {\n sink.push((child as CharacterData).data);\n } else {\n serializeNode(child, sink);\n }\n child = child.nextSibling;\n }\n } else {\n serializeChildren(contentRoot, sink);\n }\n\n sink.push('</' + tag + '>');\n}\n\nfunction serializeNode(node: Node, sink: string[]): void {\n switch (node.nodeType) {\n case ELEMENT_NODE:\n serializeElement(node as Element, sink);\n break;\n\n case TEXT_NODE: {\n // R4;R11 由父元素处理(raw text 的父节点不会递归到这里)。\n const parent = node.parentNode;\n if (parent && parent.nodeType === ELEMENT_NODE && isRawTextElement(parent as Element)) {\n sink.push((node as Text).data);\n } else {\n sink.push(escapeText((node as Text).data));\n }\n break;\n }\n\n case CDATA_SECTION_NODE:\n // HTML 文档里不会出现(解析器把 <![CDATA[ 变成伪注释);\n // 程序化构造的树仍然处理。\n sink.push('<![CDATA[' + (node as CharacterData).data + ']]>');\n break;\n\n case PROCESSING_INSTRUCTION_NODE:\n // 同样不可能经 HTML 解析器产生,仍然规范化。\n sink.push(\n '<?' +\n (node as ProcessingInstruction).target +\n ' ' +\n (node as ProcessingInstruction).data +\n '>'\n );\n break;\n\n case COMMENT_NODE:\n // R8\n sink.push('<!--' + (node as Comment).data + '-->');\n break;\n\n case DOCUMENT_TYPE_NODE:\n sink.push(serializeDoctype(node as DocumentType));\n break;\n\n case DOCUMENT_NODE:\n case DOCUMENT_FRAGMENT_NODE:\n serializeChildren(node, sink);\n break;\n\n default:\n // Attr / entity / notation 节点从解析出的树里不可达。\n break;\n }\n}\n\n/**\n * 把 Document、DocumentFragment、Element 或 DocumentType 序列化成规范 HTML。\n *\n * 片段(DocumentFragment)与元素都走同一条路径 —— 片段序列化其全部子节点,\n * 所以 `serialize(parseFragment(doc, html))` 是幂等可比对的。\n */\nexport function serialize(node: Node): string {\n if (node === null || node === undefined) {\n throw new TypeError('serialize(): node 不能为空');\n }\n const sink: string[] = [];\n serializeNode(node, sink);\n return sink.join('');\n}\n","/**\n * 规则**数据表**。\n *\n * 这里只有数据,没有一句提示词措辞 —— 措辞在 mastra 的\n * `page-designer/segments/v4.ts`,从这张表渲染。core 因此可以作为公开包发布,\n * 措辞微调也不需要 core 发版。\n *\n * 代价是语义变更要两仓配对改。mastra 侧靠**双向**覆盖测试兜住:\n * 正向:规则段必须提到这里的每一项(防 core 新增、mastra 没跟)\n * 反向:规则段提到的每一项都能在这里找到(防 core 删除、mastra 还在讲)\n * 只做正向的话,删一个开关后测试仍是绿的。\n */\n\n/** 设备变体。`md:` 是 PC 覆盖,`max-md:` 是手机独占(两者无缝无重叠)。 */\nexport const DEVICE_VARIANTS = ['md', 'max-md'] as const;\n\n/**\n * 状态变体。\n *\n * 有意不含 `focus:` —— 统一用 `focus-visible:`。\n * 有意不含 `group-*` / `peer-*`:它们把样式绑到**别的元素**的状态上,\n * 面板表达不了、属性回显放不进(基线 / md / max-md)三槽。\n * 这两类 Tailwind 都能编译,拒绝它们是产品决定,不是能力限制。\n */\nexport const STATE_VARIANTS = ['hover', 'focus-visible', 'active', 'disabled'] as const;\n\nexport type DeviceVariant = (typeof DEVICE_VARIANTS)[number];\nexport type StateVariant = (typeof STATE_VARIANTS)[number];\n\n/** 属性回显的三个槽位。 */\nexport const PROPERTY_SLOTS = ['base', 'md', 'max-md'] as const;\nexport type PropertySlot = (typeof PROPERTY_SLOTS)[number];\n\n/** 结构层级。**唯一**一套,不按宿主分档。 */\nexport const LAYER_NAMES = ['section', 'container', 'leaf'] as const;\nexport type LayerName = (typeof LAYER_NAMES)[number];\n\n/** leaf 的类型。 */\nexport const LEAF_TYPES = ['text', 'media', 'button', 'shape'] as const;\nexport type LeafType = (typeof LEAF_TYPES)[number];\n\n/** data-pt-id 的格式。AI 不给就会生成 `data-pt-id=\"首屏标题\"`。 */\nexport const ID_PATTERN = /^[a-z][a-z0-9_-]{1,31}$/;\nexport const ID_PATTERN_SOURCE = '[a-z][a-z0-9_-]{1,31}';\n\n/** 主题块的固定 id。AI 用 set.text 改它的内容。 */\nexport const THEME_PT_ID = 'theme';\n\n/**\n * <body> 的固定 id。\n *\n * 必须有 —— section 只能是 body 的直接子元素,而 `insert` 是按 parentId 定位的:\n * body 没有 id 的话,AI 与面板都无法插入一个新区块,`delete` 一个 section 的\n * 逆操作也无处可指。与 `theme` 同为保留字面量,由 normalize 分配。\n */\nexport const ROOT_PT_ID = 'root';\n\n/** 源 HTML 的格式标记。 */\nexport const FORMAT_META_NAME = 'lpx-format';\nexport const FORMAT_VERSION = '4';\n\n/**\n * 合成包裹层的标记(布尔属性)。\n *\n * 片段型来源(弹窗一类)进编辑器前由 `wrap()` 规范化成文档,过程中合成一个\n * `section` + 一个 `container`。**这个标记是它们唯一的识别手段** —— `unwrap` 定位、\n * 图层树过滤、`apply` 门禁、`containerDepth` 豁免,四处全部只看它,\n * 不看 id、不看位置。位置只是今天恰好成立的巧合。\n */\nexport const WRAP_ATTR = 'data-pt-wrap';\n\n/**\n * 合成层的保留 id。与 `root` / `theme` 同为保留字面量。\n *\n * 它们只是「结构节点必须带 id」(`tree.ts` 的 `shouldHaveId`)的产物,是实现细节 ——\n * **没有谁按 id 找合成层**(那是 `WRAP_ATTR` 的活)。写进这里是为了可预测与可 grep。\n *\n * 加 `ptwrap` 前缀是让「这不是你写的」一眼可见;`root` / `theme` 用裸词是因为\n * 它们确实是用户 / AI 要引用的锚点。\n *\n * 固定字面量而**不是**「挑一个没被占用的 id」:能撞上它们的片段本身就说明上游\n * 出了问题(漏剥 / 回灌),悄悄换个 id 继续跑是把 bug 藏进数据里。而且两条路径\n * (编辑器 / mastra 直连)对同一份片段必须 wrap 出逐字节相同的文档,固定字面量\n * 天然满足,分配式的确定性挂在「遍历顺序 + 计数器实现」上。\n */\nexport const WRAP_SECTION_PT_ID = 'ptwrap-section';\nexport const WRAP_CONTAINER_PT_ID = 'ptwrap-container';\n\n/**\n * 两端差别的六个结构开关。面板与 mastra 规则段同源于此。\n */\nexport const SWITCHES = [\n {\n key: 'hide',\n attr: 'data-pt-hide',\n values: ['mobile', 'pc'],\n summary: '一端隐藏'\n },\n {\n key: 'layout-mobile',\n attr: 'data-pt-layout-mobile',\n values: ['stack', 'scroll'],\n summary: 'PC 轮播→手机纵向平铺 / PC 网格→手机横滑'\n },\n {\n key: 'swap-image',\n attr: null,\n values: [],\n summary: '<picture> 双 source,(min-width:768px) 分界'\n },\n {\n key: 'direction',\n attr: null,\n values: [],\n summary: 'flex-col md:flex-row'\n },\n {\n key: 'columns',\n attr: null,\n values: [],\n summary: 'grid-cols-1 md:grid-cols-{n}'\n },\n {\n key: 'placeholder',\n attr: 'data-pt-placeholder',\n values: [],\n summary: '未落图占位;必带 aspect-*,src 为空'\n }\n] as const;\n\n/**\n * 「两端一致」属性:这些属性两端应当相同,分开设几乎总是失误。\n * 它是 AI 侧规则与面板提示,**不对人硬限制**。\n */\nexport const CROSS_DEVICE_CONSISTENT_PROPERTIES = [\n 'color',\n 'font-weight',\n 'border',\n 'box-shadow',\n 'font-family'\n] as const;\n\n/** 不透明子树的两档。 */\nexport const OPAQUE_MODES = ['strict', 'text'] as const;\nexport type OpaqueMode = (typeof OPAQUE_MODES)[number];\nexport const OPAQUE_ATTR = 'data-pt-opaque';\n/** 裸 data-pt-opaque 等价于 strict,兼容既有语义。 */\nexport const OPAQUE_DEFAULT_MODE: OpaqueMode = 'strict';\n\n/** 不透明表格里仍需发 id、按文本叶子改文字的元素。 */\nexport const OPAQUE_TEXT_EDITABLE_TAGS = ['td', 'th'] as const;\n\n/**\n * 行内元素不发 id —— 文本叶子内部的 <b> <a> <span> 等。\n * v2 的 parse.ts 给 span 分配 id 的行为在 core 里关掉。\n */\nexport const INLINE_NO_ID_TAGS = [\n 'a',\n 'abbr',\n 'b',\n 'bdi',\n 'bdo',\n 'br',\n 'cite',\n 'code',\n 'data',\n 'dfn',\n 'em',\n 'i',\n 'kbd',\n 'mark',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'time',\n 'u',\n 'var',\n 'wbr'\n] as const;\n\n/** 唯一允许的内联 style:动效变量。 */\nexport const INLINE_STYLE_ALLOWED_PREFIX = '--pt-';\n\n/** EditOp 的类型词表。 */\nexport const EDIT_OP_KINDS = ['set', 'insert', 'delete', 'move', 'replace'] as const;\n\n/** 任意值的边界:这些属性允许写 `w-[43%]` 这类任意值,其余只给档位 / 刻度。 */\nexport const ARBITRARY_VALUE_ALLOWED_PROPERTIES = [\n 'width',\n 'height',\n 'aspect-ratio',\n 'background-image',\n 'max-width',\n 'min-height'\n] as const;\n\n/**\n * 整张表。mastra 的规则段渲染它,双向覆盖测试也比对它。\n * 加一项就要同步 mastra —— 这正是双向断言要暴露的事。\n */\nexport const rules = {\n deviceVariants: DEVICE_VARIANTS,\n stateVariants: STATE_VARIANTS,\n propertySlots: PROPERTY_SLOTS,\n layers: LAYER_NAMES,\n leafTypes: LEAF_TYPES,\n idPattern: ID_PATTERN_SOURCE,\n themePtId: THEME_PT_ID,\n rootPtId: ROOT_PT_ID,\n formatMetaName: FORMAT_META_NAME,\n formatVersion: FORMAT_VERSION,\n wrapAttr: WRAP_ATTR,\n wrapSectionPtId: WRAP_SECTION_PT_ID,\n wrapContainerPtId: WRAP_CONTAINER_PT_ID,\n switches: SWITCHES,\n crossDeviceConsistentProperties: CROSS_DEVICE_CONSISTENT_PROPERTIES,\n opaqueModes: OPAQUE_MODES,\n opaqueTextEditableTags: OPAQUE_TEXT_EDITABLE_TAGS,\n inlineNoIdTags: INLINE_NO_ID_TAGS,\n inlineStyleAllowedPrefix: INLINE_STYLE_ALLOWED_PREFIX,\n editOpKinds: EDIT_OP_KINDS,\n arbitraryValueAllowedProperties: ARBITRARY_VALUE_ALLOWED_PROPERTIES\n} as const;\n\nexport type Rules = typeof rules;\n","/**\n * 两个版本号,有意分家。\n *\n * `VERSION` 包版本,按 semver 走。改规则数据、改护栏逻辑、改注释都会动它。\n * `COMPILER_VERSION` **只在编译 / 导出 / 组件渲染 / 规范序列化的输出可能变时**\n * 手动递增。\n *\n * 为什么必须分开:iam 的 `compiler_version` 列存后者,保存去重也按后者。若用包版本,\n * 改一条 rules 数据就会让全租户的去重失效、把字节完全相同的成品重算一遍。\n *\n * 护栏:export golden 断言「输出变了而 COMPILER_VERSION 没变就红」。\n * 递增它是一次显式动作,不要顺手跟着包版本一起改。\n */\n\nexport const VERSION = '1.0.0-alpha.5';\n\nexport const COMPILER_VERSION = '2';\n","import {\n INLINE_NO_ID_TAGS,\n OPAQUE_ATTR,\n OPAQUE_DEFAULT_MODE,\n OPAQUE_MODES,\n OPAQUE_TEXT_EDITABLE_TAGS,\n type OpaqueMode\n} from '../rules/index.js';\n\n/**\n * 树形判定的共用工具。normalize 与 validate 都读它,避免两处各写一份\n * 「什么算结构节点」。\n */\n\nconst INLINE_SET: ReadonlySet<string> = new Set(INLINE_NO_ID_TAGS);\nconst OPAQUE_TEXT_TAGS: ReadonlySet<string> = new Set(OPAQUE_TEXT_EDITABLE_TAGS);\n\nexport function tag(el: Element): string {\n return el.localName.toLowerCase();\n}\n\nexport function isInlineTag(el: Element): boolean {\n return INLINE_SET.has(tag(el));\n}\n\n/**\n * 不透明子树的档位。\n *\n * 裸 `data-pt-opaque` 等价于 `strict`(组件库快照那套既有语义:内部是编译产物,\n * 任何 op 都拒绝)。表格用 `text`:结构锁定,但 td / th 的文字可改。\n *\n * 两档合用一个属性而不是另立 data-pt-type=\"table\",是因为表格与组件快照在\n * 「结构不可动」上本来同质;差别只在内部文字能不能编辑。\n */\nexport function opaqueMode(el: Element): OpaqueMode | null {\n if (!el.hasAttribute(OPAQUE_ATTR)) return null;\n const raw = (el.getAttribute(OPAQUE_ATTR) ?? '').trim();\n if (raw === '') return OPAQUE_DEFAULT_MODE;\n return (OPAQUE_MODES as readonly string[]).includes(raw)\n ? (raw as OpaqueMode)\n : OPAQUE_DEFAULT_MODE;\n}\n\n/** 从 el 向上找最近的不透明祖先(含自身)。 */\nexport function closestOpaque(el: Element): { host: Element; mode: OpaqueMode } | null {\n let cur: Element | null = el;\n while (cur) {\n const mode = opaqueMode(cur);\n if (mode) return { host: cur, mode };\n cur = cur.parentElement;\n }\n return null;\n}\n\n/** 文档骨架:永远不属于 pt 树,永远不发 id。 */\nconst SCAFFOLD_TAGS: ReadonlySet<string> = new Set([\n 'html',\n 'head',\n 'meta',\n 'title',\n 'link',\n 'base',\n 'style',\n 'script',\n 'noscript',\n 'template'\n]);\n\n/** 主题块:唯一允许的 <style>,`type=\"text/tailwindcss\"`,id 固定为 theme。 */\nexport function isThemeStyle(el: Element): boolean {\n return tag(el) === 'style' && el.getAttribute('type') === 'text/tailwindcss';\n}\n\n/** 自身之外,最近的一个「已声明叶子」祖先。 */\nfunction leafAncestor(el: Element): Element | null {\n let cur: Element | null = el.parentElement;\n while (cur) {\n if (cur.hasAttribute('data-pt-type') || cur.hasAttribute('data-pt-component')) return cur;\n cur = cur.parentElement;\n }\n return null;\n}\n\n/**\n * 这个元素该不该带 data-pt-id。\n *\n * 判据是**它是不是 pt 树上的一个节点**,不是「它是不是行内标签」—— 后者只是前者的\n * 一个粗糙代理,而且会判错最常见的一种元素:CTA 通常写成\n * `<a data-pt-type=\"button\">`,`<a>` 在行内表里,先看标签就会把按钮叶子判成\n * 「不该有 id」。\n *\n * 四段,顺序不能换:\n * 1. 显式声明过身份(data-pt-type / data-pt-component)的一律要 id,与标签名无关\n * 2. 文档骨架(html / head / body / meta / style…)永远不要\n * 3. **叶子内部**的一切都不要 —— <p data-pt-type=\"text\"> 里的 <span>、\n * <picture data-pt-type=\"media\"> 里的 <source> 与 <img> 都属于这一类。\n * (v2 的 parse.ts 给 span 发 id 的行为在这里关掉。)\n * 4. 不透明子树内部一律不要,**除了** text 档里的 td / th —— 它们是文字编辑的\n * 锚点。这一条漏掉的话,表格改文字就没有落点,而 td / th 既不在三层树里、\n * 也不是行内元素,照「结构节点才发 id」的字面实现刚好会被漏掉。\n */\nexport function shouldHaveId(el: Element): boolean {\n if (el.hasAttribute('data-pt-type') || el.hasAttribute('data-pt-component')) return true;\n\n // 主题块是骨架标签里唯一的例外:它是 AI 用 set.text 改 @theme 的锚点,\n // id 固定为字面量 theme。\n if (isThemeStyle(el)) return true;\n\n // <body> 是 section 的容器,必须可寻址(见 ROOT_PT_ID)。\n if (tag(el) === 'body') return true;\n\n if (SCAFFOLD_TAGS.has(tag(el))) return false;\n\n if (leafAncestor(el)) return false;\n\n const opaque = closestOpaque(el);\n if (opaque) {\n if (opaque.host === el) return true;\n return opaque.mode === 'text' && OPAQUE_TEXT_TAGS.has(tag(el));\n }\n\n // 兜底:容器层里混进来的裸行内元素不算节点。\n if (isInlineTag(el)) return false;\n\n return true;\n}\n\n/** 文档里所有已存在的 data-pt-id。 */\nexport function collectIds(root: Document | DocumentFragment | Element): Set<string> {\n const out = new Set<string>();\n const nodes = root.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const v = nodes[i].getAttribute('data-pt-id');\n if (v) out.add(v);\n }\n if (root instanceof Object && 'getAttribute' in root) {\n const self = (root as Element).getAttribute?.('data-pt-id');\n if (self) out.add(self);\n }\n return out;\n}\n","import { ID_PATTERN, ROOT_PT_ID, THEME_PT_ID } from './rules/index.js';\nimport { collectIds, shouldHaveId, tag } from './validate/tree.js';\n\n/**\n * 规范化:**唯一允许生成 data-pt-id 的地方**。\n *\n * 谁产出源谁负责调:向导、mastra 直连建页、编辑器加载三处同一条。`apply` 侧只搬运、\n * 永不生成 —— 否则两侧各自算 id,必然分叉。\n *\n * 对已有 id 幂等(只补缺的),所以编辑器加载时再跑一遍是安全的。\n *\n * 另外把向导的老占位注释格式(<!-- lpx-image-prompt: … -->)转成属性。\n */\n\n/** 老格式:紧跟在 img 前的注释。转成 data-pt-image-prompt。 */\nconst LEGACY_PROMPT_COMMENT = /^\\s*lpx-image-prompt:\\s*([\\s\\S]*?)\\s*$/;\n\nexport interface NormalizeOptions {\n /**\n * id 前缀。默认 `e`。\n * 有意不暴露「随机」开关:同一份输入必须得到同一份输出,否则 normalize 自己\n * 就成了两侧分叉的来源。\n */\n prefix?: string;\n}\n\n/**\n * 按文档序补齐缺失的 id。返回被修改的元素个数(0 表示本来就规范)。\n */\nexport function normalize(\n root: Document | DocumentFragment | Element,\n options: NormalizeOptions = {}\n): number {\n const prefix = options.prefix ?? 'e';\n if (!ID_PATTERN.test(`${prefix}1`)) {\n throw new TypeError(`normalize(): 前缀 ${prefix} 与 id 格式不兼容`);\n }\n\n let changed = 0;\n changed += legacyPlaceholderCommentsToAttributes(root);\n\n const used = collectIds(root);\n let counter = 0;\n const nextId = (): string => {\n let candidate: string;\n do {\n counter += 1;\n candidate = `${prefix}${counter}`;\n } while (used.has(candidate));\n used.add(candidate);\n return candidate;\n };\n\n for (const el of walkElements(root)) {\n if (!shouldHaveId(el)) continue;\n if (el.hasAttribute('data-pt-id')) continue;\n // body 与主题块的 id 是固定字面量,不参与自动分配。\n if (tag(el) === 'body' && !used.has(ROOT_PT_ID)) {\n el.setAttribute('data-pt-id', ROOT_PT_ID);\n used.add(ROOT_PT_ID);\n changed += 1;\n continue;\n }\n if (tag(el) === 'style' && el.getAttribute('type') === 'text/tailwindcss') {\n if (!used.has(THEME_PT_ID)) {\n el.setAttribute('data-pt-id', THEME_PT_ID);\n used.add(THEME_PT_ID);\n changed += 1;\n continue;\n }\n }\n el.setAttribute('data-pt-id', nextId());\n changed += 1;\n }\n return changed;\n}\n\n/**\n * 向导现有的 `<!-- lpx-image-prompt: … -->` 注释转为 img 上的属性。\n * 转换只在进入时做一次,之后源里只有属性形态。\n */\nfunction legacyPlaceholderCommentsToAttributes(\n root: Document | DocumentFragment | Element\n): number {\n let changed = 0;\n const comments: Comment[] = [];\n collectComments(root, comments);\n for (const comment of comments) {\n const match = LEGACY_PROMPT_COMMENT.exec(comment.data);\n if (!match) continue;\n const img = nextImageSibling(comment);\n if (!img) continue;\n if (!img.hasAttribute('data-pt-image-prompt')) {\n img.setAttribute('data-pt-image-prompt', match[1]);\n }\n if (!img.hasAttribute('data-pt-placeholder')) {\n img.setAttribute('data-pt-placeholder', '');\n }\n comment.parentNode?.removeChild(comment);\n changed += 1;\n }\n return changed;\n}\n\nfunction collectComments(node: Node, out: Comment[]): void {\n let child: Node | null = node.firstChild;\n while (child) {\n if (child.nodeType === 8) out.push(child as Comment);\n else if (child.nodeType === 1 || child.nodeType === 11) collectComments(child, out);\n child = child.nextSibling;\n }\n}\n\nfunction nextImageSibling(from: Node): Element | null {\n let sib: Node | null = from.nextSibling;\n while (sib) {\n if (sib.nodeType === 1) {\n const el = sib as Element;\n return el.localName.toLowerCase() === 'img' ? el : null;\n }\n if (sib.nodeType === 3 && (sib as Text).data.trim() !== '') return null;\n sib = sib.nextSibling;\n }\n return null;\n}\n\nfunction* walkElements(root: Document | DocumentFragment | Element): Generator<Element> {\n if ('tagName' in root) yield root as Element;\n const list = root.querySelectorAll('*');\n for (let i = 0; i < list.length; i++) yield list[i];\n}\n","import { parseFragment } from './dom/parseFragment.js';\nimport {\n FORMAT_META_NAME,\n FORMAT_VERSION,\n ROOT_PT_ID,\n THEME_PT_ID,\n WRAP_ATTR,\n WRAP_CONTAINER_PT_ID,\n WRAP_SECTION_PT_ID\n} from './rules/index.js';\nimport { isThemeStyle, tag } from './validate/tree.js';\n\n/**\n * 片段型来源的规范化包裹 / 剥离。\n *\n * **界线(这个文件存在的判据)**:core 可以知道「文档与片段的关系」,\n * **不可以**知道「某个宿主的运行时要什么标记」。前者是格式问题 —— 单一三层树里\n * leaf 必须落在 container 中,而片段顶层就是有裸 leaf,这条只与 v4 格式有关;\n * 后者是宿主问题,归调用方在进出边界上翻译(弹窗的 Engage 契约、rem→px、`:host`)。\n * 往这个文件里加任何一个具体产品的 DOM 约定,这条界线就没了。\n *\n * 为什么放 core 而不是全归调用方:往返无损是这条路上最容易出事的地方 ——\n * 每存一次多一层或少一层,前几次完全看不出来,症状滞后于原因数天。放在 core\n * 就落在已有的 golden 基建那一侧,有 19 份 fixture 与随包发布的复算脚本兜着。\n *\n * ## 两条必须记住的语义\n *\n * 1. **片段的根元素就是文档的 `<body>`**,不是被包在 body 里的一层。\n * `ROOT_PT_ID = 'root'` 本来就是 body 的保留字面量,而片段顶层那个 div 恒带这个\n * id —— 它们是同一个节点,所以「认领」而不是「再套一层」。不认领的坏法不止\n * 「两个 root → ID_DUPLICATE」一种:`normalize.ts` 是\n * `if (tag === 'body' && !used.has(ROOT_PT_ID))`,div 先占了 `root`,body 会掉进\n * `nextId()` 拿到 `e1`,于是 **body 带着普通 id、`root` 长在一个 div 上,而\n * validate 全绿** —— 这种更难查。\n *\n * 2. **`unwrap` 只保留 theme 块 + body 内容**,`<html lang>` / `<title>` / 其余 head\n * 一律丢。片段型来源没有「文档头」这个概念,这是设计不是遗漏。同理**不存原始\n * tag**(不加 `data-pt-wrap-tag`):存 tag 等于把宿主形态信息写回 core 文档,\n * 正是要赶走的东西。`unwrap` 恒出 `<div>`,真遇到 `<section>` 根再放。\n *\n * ## 三道闸\n *\n * 一律**抛错**,不修复、不改名、不绕开。野生 / 历史形状由调用方的 adapter 在边界上\n * 先规整 —— 那本来就是它的活。\n *\n * 1. 入参形状:可选 theme 块(若有必须排在最前)+ 单一根元素,且 `div` + `id=root`\n * 2. 保留字面量占用:`root` 只许在根元素上、`theme` 只许在主题 style 上、\n * 合成层的标记与两个保留 id 一次都不许出现\n * 3. 剥离前的结构断言:body 恰有一个带标记的子元素,它里面也恰有一个带标记的子元素\n */\n\n/** 合成层由 `wrap` 造,也只由 `wrap` 造 —— 判定一律只看这个标记。 */\nexport function isWrapLayer(el: Element): boolean {\n return el.hasAttribute(WRAP_ATTR);\n}\n\nconst SKELETON =\n '<!DOCTYPE html><html><head><meta charset=\"utf-8\">' +\n `<meta name=\"${FORMAT_META_NAME}\" content=\"${FORMAT_VERSION}\">` +\n '</head><body></body></html>';\n\n/**\n * 片段 → 合规的三层树文档。\n *\n * 要造整份文档,所以需要注入的 DOMParser —— 与 `parse` 同列,挂在 `createCore`\n * 的返回值上。\n */\nexport function createWrap(parse: (html: string) => Document): (fragmentHtml: string) => Document {\n return function wrap(fragmentHtml: string): Document {\n if (typeof fragmentHtml !== 'string') {\n throw new TypeError('wrap(): fragmentHtml 必须是字符串');\n }\n\n const doc = parse(SKELETON);\n const frag = parseFragment(doc, fragmentHtml);\n const { theme, root, before, after } = checkFragmentShape(frag);\n checkReservedLiterals(frag, root, theme);\n\n const body = doc.body;\n // 认领:根元素的属性原样搬到 body 上(含保留 id 与 class)。\n const attrs = root.attributes;\n for (let i = 0; i < attrs.length; i++) {\n body.setAttribute(attrs[i].name, attrs[i].value);\n }\n\n if (theme) doc.head.appendChild(theme);\n\n // 合成**两层**。只合成 section 是不够的:片段顶层允许直接出现 leaf,\n // 而单一三层树里 leaf 必须落在 container 中。\n //\n // 连带一条不变量:因为恒有合成 container,用户容器的父永远是它而不是 section,\n // 于是 `deleteTarget` 那条「删掉 section 的最后一个 container 就连 section\n // 一起删」永远吃不到合成 section。简化成只合成 section 的话,现象是\n // 「用户删了个容器、保存时才报错」—— 删除本身成功,报错发生在几步之后。\n const section = doc.createElement('section');\n section.setAttribute(WRAP_ATTR, '');\n section.setAttribute('data-pt-id', WRAP_SECTION_PT_ID);\n const container = doc.createElement('div');\n container.setAttribute(WRAP_ATTR, '');\n container.setAttribute('data-pt-id', WRAP_CONTAINER_PT_ID);\n while (root.firstChild) container.appendChild(root.firstChild);\n section.appendChild(container);\n\n // 根元素前后的空白原样留在 body 里(section 之外)—— 往返要逐字节相同,\n // 这些文本节点也在 `serialize` 的产出里。\n for (const node of before) body.appendChild(node);\n body.appendChild(section);\n for (const node of after) body.appendChild(node);\n\n return doc;\n };\n}\n\ninterface FragmentShape {\n theme: Element | null;\n root: Element;\n /** 根元素之前、theme 之后的非元素节点(空白)。 */\n before: Node[];\n /** 根元素之后的非元素节点(空白)。 */\n after: Node[];\n}\n\nfunction checkFragmentShape(frag: DocumentFragment): FragmentShape {\n const elements: Element[] = [];\n const nonElements: { node: Node; afterElements: number }[] = [];\n\n let child: Node | null = frag.firstChild;\n while (child) {\n const next: Node | null = child.nextSibling;\n if (child.nodeType === 1) {\n elements.push(child as Element);\n } else if (child.nodeType === 3 && (child as Text).data.trim() === '') {\n nonElements.push({ node: child, afterElements: elements.length });\n } else {\n throw new TypeError(\n 'wrap(): 片段顶层只允许 theme 块、单一根元素与空白 —— ' +\n `出现了 ${describeNode(child)}。野生形状请在调用方的 adapter 里先规整。`\n );\n }\n child = next;\n }\n\n let theme: Element | null = null;\n let root: Element | undefined;\n if (elements.length === 2) {\n // theme 必须排在最前:`unwrap` 恒把它放回片段开头,排在后面的话往返就变位置了。\n if (!isThemeStyle(elements[0])) {\n throw new TypeError(\n 'wrap(): 片段顶层有两个元素时,第一个必须是主题块 ' +\n '<style type=\"text/tailwindcss\">'\n );\n }\n theme = elements[0];\n root = elements[1];\n } else if (elements.length === 1) {\n if (isThemeStyle(elements[0])) {\n throw new TypeError('wrap(): 片段只有主题块、没有根元素');\n }\n root = elements[0];\n } else {\n throw new TypeError(\n `wrap(): 片段顶层必须恰有一个根元素(可选一个主题块),实际有 ${elements.length} 个元素`\n );\n }\n\n if (tag(root) !== 'div') {\n throw new TypeError(`wrap(): 片段根元素必须是 <div>,实际是 <${tag(root)}>`);\n }\n if (root.getAttribute('data-pt-id') !== ROOT_PT_ID) {\n throw new TypeError(\n `wrap(): 片段根元素的 data-pt-id 必须是 ${ROOT_PT_ID},` +\n `实际是 ${JSON.stringify(root.getAttribute('data-pt-id'))}。` +\n '它会被认领成文档的 <body>,改名会让埋点锚点断链。'\n );\n }\n\n const rootIndex = elements.indexOf(root);\n const before: Node[] = [];\n const after: Node[] = [];\n for (const { node, afterElements } of nonElements) {\n if (afterElements <= rootIndex) before.push(node);\n else after.push(node);\n }\n return { theme, root, before, after };\n}\n\n/**\n * 保留字面量占用检查。\n *\n * 绝不「换一个没被占用的 id 继续跑」:能撞上这些字面量的片段本身就说明上游出了\n * 问题(漏剥、回灌、手工拼接),静默绕开是把 bug 藏进数据里。\n */\nfunction checkReservedLiterals(\n frag: DocumentFragment,\n root: Element,\n theme: Element | null\n): void {\n const all = frag.querySelectorAll('*');\n for (let i = 0; i < all.length; i++) {\n const el = all[i];\n if (el.hasAttribute(WRAP_ATTR)) {\n throw new TypeError(\n `wrap(): 片段里已经带着合成层标记 ${WRAP_ATTR} —— ` +\n '多半是上一轮漏剥或回灌,先查上游,不要重复包裹。'\n );\n }\n const id = el.getAttribute('data-pt-id');\n if (id === null) continue;\n if (id === WRAP_SECTION_PT_ID || id === WRAP_CONTAINER_PT_ID) {\n throw new TypeError(`wrap(): 片段里已经占用了合成层的保留 id ${id}`);\n }\n if (id === ROOT_PT_ID && el !== root) {\n throw new TypeError(\n `wrap(): 保留 id ${ROOT_PT_ID} 只许出现在片段根元素上,` +\n `这里出现在 <${tag(el)}> 上 —— 包裹后会变成重复 id`\n );\n }\n if (id === THEME_PT_ID && el !== theme) {\n throw new TypeError(\n `wrap(): 保留 id ${THEME_PT_ID} 只许出现在主题块上,` +\n `这里出现在 <${tag(el)}> 上`\n );\n }\n }\n}\n\n/**\n * 文档 → 片段,`wrap` 的逆。\n *\n * 纯函数(在克隆体上操作,入参文档一个字节都不动),**不吐字符串** ——\n * 让它自己产字节等于开第二条产字节路径,而「`serialize` 是唯一的规范序列化出口」\n * 正是这个包存在要守的东西。调用方 `serialize(unwrap(doc))`。\n *\n * 定位**只凭 `data-pt-wrap` 标记**,不用「取第一个 section」这类位置猜测:\n * `unwrap` 必须可证明是 `wrap` 的逆,而标记是两者之间唯一显式的耦合;位置只是\n * 今天恰好成立的巧合。\n */\nexport function unwrap(doc: Document): DocumentFragment {\n if (!doc || (doc as Document).nodeType !== 9) {\n throw new TypeError('unwrap(): 入参必须是 Document');\n }\n const clone = doc.cloneNode(true) as Document;\n const body = clone.body;\n if (!body) throw new TypeError('unwrap(): 文档没有 <body>');\n\n const section = onlyWrapChild(body, 'body');\n const container = onlyWrapChild(section, `<${tag(section)} ${WRAP_ATTR}>`);\n\n const div = clone.createElement('div');\n const attrs = body.attributes;\n for (let i = 0; i < attrs.length; i++) div.setAttribute(attrs[i].name, attrs[i].value);\n while (container.firstChild) div.appendChild(container.firstChild);\n\n const out = clone.createDocumentFragment();\n const theme = clone.head?.querySelector('style[type=\"text/tailwindcss\"]') ?? null;\n if (theme) out.appendChild(theme);\n\n // body 的子节点原样搬过来,合成 section 换成还原出来的 div。\n // 这样根元素前后的空白回到原位 —— 往返比的是规范序列化后的字节。\n const children = Array.from(body.childNodes);\n for (const node of children) {\n out.appendChild(node === section ? div : node);\n }\n return out;\n}\n\nfunction onlyWrapChild(parent: Element, label: string): Element {\n const kids = parent.children;\n if (kids.length !== 1) {\n throw new TypeError(\n `unwrap(): ${label} 下必须恰有一个合成层子元素,实际有 ${kids.length} 个 —— ` +\n '不猜一个出来。这份文档不是 wrap() 的产物,或者被改成了别的结构。'\n );\n }\n const only = kids[0];\n if (!only.hasAttribute(WRAP_ATTR)) {\n throw new TypeError(\n `unwrap(): ${label} 下唯一的子元素没有 ${WRAP_ATTR} 标记 —— ` +\n '这份文档没有被 wrap() 包裹过。'\n );\n }\n return only;\n}\n\nfunction describeNode(node: Node): string {\n if (node.nodeType === 8) return '注释节点';\n if (node.nodeType === 3) return `非空白文本 ${JSON.stringify((node as Text).data.trim())}`;\n return `nodeType ${node.nodeType}`;\n}\n","import { DEVICE_VARIANTS, STATE_VARIANTS } from '../rules/index.js';\n\nconst DEVICE: ReadonlySet<string> = new Set(DEVICE_VARIANTS);\nconst STATE: ReadonlySet<string> = new Set(STATE_VARIANTS);\n\nexport interface VariantCheck {\n ok: boolean;\n /** 不合规时给出第一个出问题的前缀,供消费端拼文案。 */\n offending?: string;\n reason?: 'not-allowed' | 'order';\n}\n\n/**\n * 变体前缀允许集与顺序。\n *\n * 允许:设备 md: / max-md:,状态 hover: / focus-visible: / active: / disabled:,\n * 组合只允许**设备在前、状态在后**(md:hover:),不允许 hover:md:。\n *\n * 为什么固定顺序:属性回显要把值放进(基线 / md / max-md)三槽,\n * 两种写法语义相同但会被当成两个不同的 class,同属性互斥就失效了。\n *\n * 注意 `group-*` / `peer-*` 与 `hover:md:` 这类 Tailwind **都能编译** ——\n * 拒绝它们是产品决定,所以必须由这条独立规则拦,「class 可编译」判定拦不住。\n */\nexport function checkVariants(className: string): VariantCheck {\n // 任意值里可能含冒号(如 bg-[url(https://…)]),从第一个 [ 之后不再切分。\n const bracket = className.indexOf('[');\n const head = bracket === -1 ? className : className.slice(0, bracket);\n const parts = head.split(':');\n if (parts.length <= 1) return { ok: true };\n\n const prefixes = parts.slice(0, -1);\n let seenState = false;\n for (const p of prefixes) {\n if (DEVICE.has(p)) {\n if (seenState) {\n // 设备前缀出现在状态之后 —— 顺序反了。\n return { ok: false, offending: p, reason: 'order' };\n }\n continue;\n }\n if (STATE.has(p)) {\n seenState = true;\n continue;\n }\n return { ok: false, offending: p, reason: 'not-allowed' };\n }\n return { ok: true };\n}\n","/**\n * Tailwind 内置色板的识别。\n *\n * 为什么需要这条独立规则:`theme.css` 在编译底座里,所以 `bg-red-500`\n * **是能编译出 CSS 的** —— 「class 可编译」那条判定对它一路绿灯。\n * 颜色必须走 @theme token 这件事,只能由这里拦。\n *\n * 有意**不拦** `white` / `black` / `transparent` / `current` / `inherit`:\n * 它们不是色板档位,而且输入约定自己的范例就写着 `text-white`\n * (`class=\"… bg-brand text-white\"`)。拦掉它会让规范的例子过不了自己的校验。\n *\n * 也有意不拦任意值颜色(`bg-[#f00]`)—— 那是另一条规则的事,这条只管色板。\n */\n\nexport const NATIVE_PALETTE_PREFIXES = [\n 'red',\n 'orange',\n 'amber',\n 'yellow',\n 'lime',\n 'green',\n 'emerald',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n 'slate',\n 'gray',\n 'zinc',\n 'neutral',\n 'stone'\n] as const;\n\nconst PALETTE: ReadonlySet<string> = new Set(NATIVE_PALETTE_PREFIXES);\n\n/** Tailwind 的档位:50,100–900 每百一档,950。 */\nconst SHADE = /^(50|950|[1-9]00)$/;\n\nexport function isNativePaletteClass(className: string): boolean {\n // 任意值里可能带 '-'、也可能带变体冒号,先剥掉变体,再排除任意值。\n const bracket = className.indexOf('[');\n if (bracket !== -1) return false;\n\n const lastColon = className.lastIndexOf(':');\n const base = lastColon === -1 ? className : className.slice(lastColon + 1);\n\n const parts = base.split('-');\n if (parts.length < 3) return false;\n\n const shade = parts[parts.length - 1];\n const name = parts[parts.length - 2];\n return SHADE.test(shade) && PALETTE.has(name);\n}\n","/**\n * 五件内置组件的**字段契约数据**。形状见 `contract.ts`。\n *\n * 逐字段的「留 / 删 / 转 `--pt-*`」判定见本 change 的 `field-audit.md`(84 个 v2 字段\n * 过 design D1 的三条判据:①内容 ②改变结构或行为 ③脚本要读它,其余一律删)。\n * 这里只是那张表的结果,不重复理由 —— 但有两条口径值得在代码旁边留一句,因为\n * 照着 v2 抄会自然违反它们:\n *\n * 1. **文案型字段的默认值一律空串。** v2 的 `'Submit'` / `'Tab'` / `'Question?'` /\n * `'Slide Title'` 不照搬:core 是公开 npm 包,装文案就得装三语。日文页的 AI 漏给\n * `submitText`,线上是个写着 Submit 的英文按钮且不报错;空串渲出空按钮 ——\n * 那是**可见的**错。结构型默认值照给(`buttonUrl: '#'` / `interval: 5000` /\n * `defaultTab: 0`),它们不是用户可见文字。\n * 2. **颜色、字号、圆角、间距、对齐一个都不在这里。** 颜色走实例根元素上的\n * `--pt-<comp>-<slot>`(D1 的唯一例外),刻度类由组件 CSS 直接读页面 `@theme` 的\n * `--radius-*` / `--spacing` / `--text-*`。往这里加一条 `titleColor` 就是把 v4\n * 退回 v2。\n *\n * **字段 id 跨组件同名必须同义**:`buttonText` / `buttonUrl`(carousel 的 slide 与\n * sticky-cta)、`title`(section 或条目的标题)、`label`(form 里字段的标题,与\n * sticky-cta 的按钮文字**有意不同名** —— 同 id 异义是 AI 最容易写混的一种)。\n *\n * 字段 id 集合由 `__tests__/contracts.spec.ts` 逐件锁定 —— 契约是对外的(apps/x 的\n * 面板按它渲染、mastra 按它生成),加一条删一条都要在 review 里被看见。\n */\n\nimport type { ComponentContract } from './contract.js';\n\n/**\n * 轮播。v2 叫 `swiper`,改名是因为产物里禁止出现 `swiper-slide` 类名\n * (SDK 表单模块用它定校验范围,撞名会让弹窗表单永远校验失败,见 tasks 2.5)。\n *\n * `layout` 的 v2 枚举有第三档 `peek`,渲染器里直接回落 `hero` —— 从未实现,不带过来。\n * `dotColor` → `--pt-carousel-dot-on`(未激活态一并收成 `--pt-carousel-dot-off`),\n * slide 的 `bgColor` → `--pt-carousel-slide-bg`,`dotOffset` 删。\n *\n * ⚠️ `--pt-carousel-slide-bg` 是**实例级一个值、全部 slide 共用**,不是逐 slide 的。\n * 逐 slide 的取值没有第二条通道:slide 元素由渲染器生成,作者没有地方写 class、也没有\n * 地方挂 `--pt-*` 内联样式,唯一入口就是该块的 settings —— 所以「转变量」对块级字段\n * 根本不成立,真正的选项只有「留成块字段」与「删」。按 D1 的三条判据,逐 slide 底色\n * 一条都不满足,删;而它的恢复是**兼容变更**(加字段兼容、删字段不兼容),真有页面\n * 需要时再加,代价近乎零。2.5 写渲染器时:无 image 的 slide 回落到这个实例级变量。\n */\nexport const carouselContract: ComponentContract = {\n type: 'carousel',\n fields: [\n // image 档不渲染标题/副标题/按钮 —— 是结构差异,不是外观档位。\n { id: 'layout', type: 'enum', values: ['hero', 'image'], default: 'hero' },\n { id: 'autoplay', type: 'boolean', default: true },\n { id: 'interval', type: 'number', default: 5000 },\n { id: 'showDots', type: 'boolean', default: true },\n { id: 'showArrows', type: 'boolean', default: true }\n ],\n blocks: [\n {\n type: 'slide',\n fields: [\n { id: 'image', type: 'image', default: '' },\n { id: 'title', type: 'text', default: '' },\n { id: 'subtitle', type: 'text', default: '' },\n { id: 'buttonText', type: 'text', default: '' },\n { id: 'buttonUrl', type: 'url', default: '#' }\n ]\n }\n ]\n};\n\n/**\n * 常见问题。\n *\n * `answer` 是 `richtext`(原样插入),`question` 是 `text`(必须转义)—— 这个区别\n * v2 只存在于渲染器代码里(`esc(question)` 与 `String(answer)`),没进 schema,\n * 于是面板与 AI 都看不见它。它关乎注入安全,属于契约。\n *\n * 18 个组件级字段里留 3 个:`titleAlign` / `titleColor` / `questionColor` /\n * `titleSize` / `questionSize` / `answerSize` / `questionLineHeight` / `answerBg` /\n * `containerBg` / `itemRadius` / `itemGap` / `titleGap` 全删(根 class 与 `@theme`),\n * `answerColor` / `borderColor` / `summaryBg` 转 `--pt-faq-answer-fg` /\n * `--pt-faq-border` / `--pt-faq-summary-bg`。\n */\nexport const faqContract: ComponentContract = {\n type: 'faq',\n fields: [\n { id: 'title', type: 'text', default: '' },\n // list 档不出 <details>、不出脚本 —— 两套结构。\n { id: 'style', type: 'enum', values: ['accordion', 'list'], default: 'accordion' },\n { id: 'iconStyle', type: 'enum', values: ['chevron', 'plus'], default: 'chevron' }\n ],\n blocks: [\n {\n type: 'item',\n fields: [\n { id: 'question', type: 'text', default: '' },\n { id: 'answer', type: 'richtext', default: '' },\n { id: 'defaultOpen', type: 'boolean', default: false }\n ]\n }\n ]\n};\n\n/**\n * 选项卡。\n *\n * `tabStyle` 用 schema 的 `boxed`,**不是** v2 渲染器里比的 `'box'` —— 那条漂移让\n * boxed 档静默落到 underline 分支(`componentRenderers.ts:142`)。\n *\n * `activeColor` → `--pt-tabs-accent`(激活态由脚本切属性、属性选择器取色,外层 class\n * 够不着,且三档全引用它);v2 渲染器读、而 schema 里根本不存在的 `borderColor` 收成\n * `--pt-tabs-border`,`inactiveColor` 由继承色派生、不立通道。\n * `tabFontSize` / `contentPadding` 删(后者在 v2 里类型就对不上:schema 声明 number、\n * 渲染器当字符串拼进 style,面板填 24 产出无单位的 `padding:24`)。\n */\nexport const tabsContract: ComponentContract = {\n type: 'tabs',\n fields: [\n { id: 'title', type: 'text', default: '' },\n { id: 'tabStyle', type: 'enum', values: ['underline', 'pill', 'boxed'], default: 'underline' },\n { id: 'defaultTab', type: 'number', default: 0 }\n ],\n blocks: [\n {\n type: 'tab',\n fields: [\n { id: 'title', type: 'text', default: '' },\n { id: 'content', type: 'richtext', default: '' },\n { id: 'icon', type: 'text', default: '' }\n ]\n }\n ]\n};\n\n/**\n * 表单。v2 叫 `dynamic-form`。41 个字段留 18。\n *\n * 枚举收敛三处,都是在消掉 v2 自身的漂移,不是偏好:\n *\n * - `fieldType` 13 → 11:去掉 `cascade` 与 `postal`(v2 文件头自己写着\"尚未支持\",\n * 渲染器里 `cascade` 退化成普通 select、`postal` 退化成 text)。随之 `cascadeData` /\n * `cascadeGroup` / `cascadeLevel` / `postalGroup` / `postalRole` 五个字段一并删 ——\n * 契约不该发一个没有消费端的字段,那正是 D3 要堵的失败模式。\n * - `width` 7 档 → `full | half`:v2 的枚举是 `1/4|1/3|1/2|2/3|3/4|full|auto`,而渲染器\n * 只认 `'half'` —— `'half'` **不在枚举里**,所以这个字段今天 100% 失效,面板上是个\n * 选了毫无效果的下拉。\n * - `nextText` / `showConfirm` / `confirmText` 删:渲染器一个都不读。\n *\n * `requiredBadgeText` 是 settings 字段而**不是 core 查表**(tasks 2.6)—— core 不装文案,\n * 所以它的默认值也是空串,尽管 v2 给的是 `'必須'`。\n *\n * 颜色六条转变量:`requiredBadgeColor` → `--pt-form-required-fg`;`submitColor` 与\n * `stepActiveColor` 合并成 `--pt-form-accent`(默认值本就相同,语义同为「主色块背景」);\n * `submitTextColor` → `--pt-form-on-accent`;`inputBorderColor` / `inputBgColor` /\n * `inputTextColor` → `--pt-form-field-border` / `-bg` / `-fg`。\n * `stepInactiveColor` 从 accent 派生、`submitFullWidth` 改由组件 CSS 默认做对\n * (手机满宽、`md` 起自适应)、`inputRadius` / `fieldSpacing` 走 `@theme`。\n */\nexport const formContract: ComponentContract = {\n type: 'form',\n fields: [\n // 外部提交按钮按它定位表单 —— 判据②。\n { id: 'formName', type: 'text', default: '' },\n { id: 'showSubmit', type: 'boolean', default: true },\n { id: 'submitText', type: 'text', default: '' },\n // 四档各一套 glyph markup;空串档 = 不出 glyph。\n { id: 'submitIcon', type: 'enum', values: ['', 'email', 'arrow', 'check'], default: '' },\n // richtext 而非 text:v2 原样插入它(`componentRenderers.ts:303` 无 esc),\n // 而页脚正是隐私政策链接的所在。定成 text 会把 <a> 渲成字面字符。\n // 紧邻的 successMessage 是转义的(同文件 :225)—— 这两个字段在 v2 里行为本就\n // 不同,schema 却都标成 textarea,又一处只活在渲染器里的区别。\n { id: 'footerText', type: 'richtext', default: '' },\n { id: 'successMessage', type: 'text', default: '' },\n { id: 'multiStep', type: 'boolean', default: false },\n // inline 是另一套 markup(label 在旁 vs 在上),不是对齐取值。\n { id: 'labelPosition', type: 'enum', values: ['top', 'inline'], default: 'top' },\n { id: 'requiredStyle', type: 'enum', values: ['asterisk', 'badge'], default: 'asterisk' },\n { id: 'requiredBadgeText', type: 'text', default: '' },\n // 决定 <form action method> —— 判据②。\n { id: 'formAction', type: 'url', default: '' }\n ],\n blocks: [\n {\n type: 'field',\n fields: [\n { id: 'label', type: 'text', default: '' },\n // 提交数据的键名。v2 默认 'field',不照抄:多个字段同键会静默产出错数据。\n // 空串**也不是**可见的错 —— HTML 的表单提交算法会跳过 name 为空的控件,\n // 那一栏的数据就这么没了,页面上一点痕迹都没有。选空串是因为它是唯一\n // **可辨识**的「作者没填」:'field' 与作者真的填了 'field' 无法区分。\n // 由此 2.6 的渲染器负责把它变成可见的错:控件型 fieldType(label / step\n // 之外)拿到空 name 即渲染失败抛错(D4)—— 画布上是占位、导出直接失败,\n // 而不是发布之后才发现表单少收一栏。\n { id: 'name', type: 'text', default: '' },\n {\n id: 'fieldType',\n type: 'enum',\n values: [\n 'text',\n 'email',\n 'tel',\n 'number',\n 'textarea',\n 'select',\n 'checkbox',\n 'radio',\n 'date',\n 'label',\n 'step'\n ],\n default: 'text'\n },\n { id: 'placeholder', type: 'text', default: '' },\n // select / checkbox / radio 的选项表。v2 存成换行分隔的字符串,渲染器要用\n // /\\r?\\n|\\\\n/ 去拆 —— 那个 \\\\n 分支的存在本身就说明 AI 写出过字面量反斜杠 n。\n { id: 'options', type: 'list', default: [] },\n { id: 'required', type: 'boolean', default: false },\n { id: 'width', type: 'enum', values: ['full', 'half'], default: 'full' }\n ]\n }\n ]\n};\n\n/**\n * 底部吸附条。五件里唯一没有 v2 对应物的一件,但**有一个既有用例且在 golden 里**:\n * `__fixtures__/page/02-vivaia-campaign-lp.html` 的 `k1` 节点写着\n * `{label, href, showAfter, hideOnPc, align}`,而那份 fixture 过 page-fixtures 的\n * 「占位除外零 issue」断言 —— 所以 4.2 落地后这里认不认这几个字段,直接决定那条既有\n * 测试红不红。对齐由 tasks 1.5 做(改 fixture + 重生成 canonical golden),是已知代价。\n *\n * 三处与 fixture 不同,都有理由:\n * - `label` → `buttonText`、`href` → `buttonUrl`:与 carousel 的 slide 块对齐,且避开\n * `label` 在 form 的 field 块里的另一层含义(字段标题)。\n * - `hideOnPc` → `showOn`:正向表述,没有双重否定。fixture 的 `hideOnPc: false`\n * 对应 `showOn: 'all'`。\n *\n * **不是字段**:底部留白与 safe-area 是组件 CSS 的固有行为(`env(safe-area-inset-bottom)`\n * + 给页面留出等高空白),是 tasks 2.7 的验收项,不是旋钮。\n */\nexport const stickyCtaContract: ComponentContract = {\n type: 'sticky-cta',\n fields: [\n { id: 'buttonText', type: 'text', default: '' },\n { id: 'buttonUrl', type: 'url', default: '#' },\n // 按钮左侧的说明文字。\n { id: 'text', type: 'text', default: '' },\n // 滚动多少 px 之后出现 —— 判据③,脚本读。\n { id: 'showAfter', type: 'number', default: 0 },\n { id: 'showOn', type: 'enum', values: ['mobile', 'all'], default: 'mobile' },\n // 条内排布模式(justify-content)而非纯对齐取值 —— 根元素的 text-* 顶不上去。\n { id: 'align', type: 'enum', values: ['center', 'between'], default: 'center' }\n ]\n};\n\n/**\n * 全部内置组件的契约,按类型 id 索引。\n *\n * `validate` 与渲染器注册表都读它;**契约里没有的类型就是未知类型**,不存在「渲染器\n * 有、契约没有」的中间态 —— 那正是 v2 烧过的「改了没反应、无报错」。\n */\nexport const COMPONENT_CONTRACTS: Readonly<Record<string, ComponentContract>> = {\n [carouselContract.type]: carouselContract,\n [faqContract.type]: faqContract,\n [tabsContract.type]: tabsContract,\n [formContract.type]: formContract,\n [stickyCtaContract.type]: stickyCtaContract\n};\n\n/** 内置组件的类型 id。顺序即上面的声明顺序。 */\nexport const COMPONENT_TYPES = Object.keys(COMPONENT_CONTRACTS) as readonly string[];\n","/**\n * 一份**实例设置**的形状 —— 与契约形状(`contract.ts`)分开。\n *\n * 两者是一个契约的两端:契约说「这件组件有哪些字段、各是什么类型」,实例设置是\n * 某个声明节点上 `data-pt-component-settings` 里实际写着的东西。\n *\n * 分成两个模块不是为了整齐:`contract.ts` 上挂着一条属性名锁定测试(「契约里不得\n * 出现任何文案或界面元信息」),而实例设置这边的 `settings` 是个正当属性名。\n * 放在一起会逼那条锁定测试放宽,护栏就钝了。\n */\n\n/** 一份实例设置。`_blocks` 之外的键都是设置项。 */\nexport type ComponentSettings = Readonly<Record<string, unknown>>;\n\n/** 实例设置里的一块。 */\nexport interface ComponentBlockValue {\n readonly type: string;\n readonly settings: ComponentSettings;\n}\n\n/** `_blocks` 在实例设置里的键名。与 v2 一致,存量声明直接可读。 */\nexport const BLOCKS_KEY = '_blocks';\n","/**\n * 从字段契约解析出一份**完整且类型正确**的设置(tasks 1.4)。\n *\n * 合并顺序:契约默认值 ← 实例 settings。渲染器拿到的永远是每个契约字段都在场、\n * 且类型与契约一致的值 —— 所以 2.x 的五个渲染器里**不需要**再写 v2 那套\n * `str(settings, 'x', '默认')` / `num(settings, 'y', 16)` 兜底。那套兜底正是 v2\n * 事故的温床:同一个字段的默认值在 schema 与渲染器里各写一份,然后悄悄漂移\n * (`borderRadius` 面板显示 0、实际渲染 8;`labelFontWeight` 产出 `NaN`)。\n * 默认值只有契约一处,是这个模块存在的全部理由。\n *\n * ---\n *\n * **三类脏输入一律回落到契约默认值,不抛错、不强转**:\n *\n * | 输入 | 这里 | 谁去告诉作者 |\n * | --- | --- | --- |\n * | 契约里没有的字段 | 丢掉 | `validate` 的 `COMPONENT_SETTING_UNKNOWN`(4.2) |\n * | 类型不符(`interval: '5000'`) | 回落默认值 | `COMPONENT_SETTING_INVALID`(4.2) |\n * | 枚举越界(`tabStyle: 'box'`) | 回落默认值 | 同上 |\n *\n * 分工是刻意的:**解析保证渲染器安全,校验保证作者看得见。** 两件事合成一件的话,\n * 要么渲染器得处理脏值(回到 v2),要么脏值会打断整份渲染(一个拼错的字段名让整页\n * 导不出去)。\n *\n * 不强转也是刻意的:`Number('5000')` 看着无害,但 `Number('')` 是 0、\n * `Number('abc')` 是 `NaN`,而 `NaN` 会一路渲进 markup —— v2 的 `labelFontWeight`\n * 就是这么产出 `font-weight:NaN` 的。回落到一个契约写明的值,至少是可预期的。\n */\n\nimport type {\n ComponentBlockSpec,\n ComponentContract,\n ComponentSettingSpec,\n SettingValue\n} from './contract.js';\nimport { BLOCKS_KEY, type ComponentSettings } from './settings.js';\n\n/** 一份解析完的设置:契约里每个字段都在场,且类型与契约一致。 */\nexport type ResolvedSettings = Readonly<Record<string, SettingValue>>;\n\n/** 解析完的一块。 */\nexport interface ResolvedBlock {\n readonly type: string;\n readonly settings: ResolvedSettings;\n}\n\n/** 解析完的一件组件实例。 */\nexport interface ResolvedComponent {\n readonly type: string;\n readonly settings: ResolvedSettings;\n /** 契约没有块定义时恒为空数组 —— 渲染器不必判空。 */\n readonly blocks: readonly ResolvedBlock[];\n}\n\n/**\n * 这个值符合该字段的契约吗。不符合就回落默认值。\n *\n * 导出给 `validate` 复用(不进公开面)。两份「符不符合」的实现一旦漂移,就会出现\n * 「校验说没问题、解析却悄悄回落默认值」—— 那正是 D3 要堵的「改了没反应、无报错」,\n * 只不过换了个地方发生。\n */\nexport function matches(spec: ComponentSettingSpec, value: unknown): value is SettingValue {\n switch (spec.type) {\n case 'text':\n case 'richtext':\n case 'url':\n case 'image':\n return typeof value === 'string';\n case 'number':\n // Number.isFinite 排掉 NaN 与 ±Infinity —— 它们是 number,但渲进 markup\n // 就是 `padding:NaN`。\n return typeof value === 'number' && Number.isFinite(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'enum':\n return typeof value === 'string' && spec.values.includes(value);\n case 'list':\n return Array.isArray(value) && value.every(v => typeof v === 'string');\n default: {\n // 词表加了一种类型而这里没跟 —— 编译期就该红。\n const never: never = spec;\n throw new Error(`resolveComponent: 未处理的取值类型 ${JSON.stringify(never)}`);\n }\n }\n}\n\nfunction resolveFields(\n fields: readonly ComponentSettingSpec[],\n raw: ComponentSettings | undefined\n): ResolvedSettings {\n const out: Record<string, SettingValue> = {};\n for (const spec of fields) {\n const given = raw?.[spec.id];\n // 契约默认值(含 list 的空数组)原样透传、不复制:它们是 readonly,复制只会\n // 让每次渲染多造一个对象。\n out[spec.id] = given !== undefined && matches(spec, given) ? given : spec.default;\n }\n return out;\n}\n\n/** `_blocks` 的原始形状。存量声明与 v2 一致,这里只做形状认领、不做纠错。 */\nfunction rawBlocks(raw: ComponentSettings): { type?: unknown; settings?: unknown }[] {\n const value = raw[BLOCKS_KEY];\n if (!Array.isArray(value)) return [];\n return value.filter((b): b is { type?: unknown; settings?: unknown } =>\n typeof b === 'object' && b !== null\n );\n}\n\nfunction blockSpecOf(\n blocks: readonly ComponentBlockSpec[] | undefined,\n type: unknown\n): ComponentBlockSpec | undefined {\n if (typeof type !== 'string') return undefined;\n return blocks?.find(b => b.type === type);\n}\n\n/**\n * 把一份实例设置解析成渲染器可以直接用的形状。\n *\n * 契约里没有块定义、或实例没写 `_blocks` 时,`blocks` 是空数组 —— 渲染器不必判空,\n * 也就不会出现「某个渲染器忘了判空于是整页导出炸掉」。\n *\n * 类型不认识的块(`_blocks` 里写着契约没有的 `type`)整块丢掉,与未知字段同一口径:\n * 解析只负责给出安全的输入,指出问题是 `validate` 的事。\n */\nexport function resolveComponent(\n contract: ComponentContract,\n raw: ComponentSettings = {}\n): ResolvedComponent {\n const blocks: ResolvedBlock[] = [];\n for (const block of rawBlocks(raw)) {\n const spec = blockSpecOf(contract.blocks, block.type);\n if (!spec) continue;\n const settings =\n typeof block.settings === 'object' && block.settings !== null\n ? (block.settings as ComponentSettings)\n : undefined;\n blocks.push({ type: spec.type, settings: resolveFields(spec.fields, settings) });\n }\n return {\n type: contract.type,\n settings: resolveFields(contract.fields, raw),\n blocks\n };\n}\n","/**\n * 组件设置的校验(design D3)。\n *\n * 只为「取默认值」的话,字段契约放哪都行。放进 core 并让 `validate` 认它,是为了堵\n * 一个**这个仓已经烧过的**失败模式:AI 或面板写出渲染器不认的字段 → 渲染器按默认值\n * 渲染 → 改了没反应、无报错。\n *\n * 方向是单向的:报「消费端有、契约没有」(写了没反应),不报「契约有、消费端没暴露」\n * (只是少个入口,无声无害)。\n *\n * **判定复用 `resolve.ts` 的 `matches`**,不另写一份 —— 两份实现一旦漂移,就会出现\n * 「校验说没问题、解析却悄悄回落默认值」,换个地方重演同一个 bug。\n */\n\nimport type { Issue } from '../errors.js';\nimport type { ValidateOptions } from './index.js';\nimport { COMPONENT_CONTRACTS } from '../components/contracts.js';\nimport { matches } from '../components/resolve.js';\nimport { BLOCKS_KEY } from '../components/settings.js';\nimport type { ComponentBlockSpec, ComponentSettingSpec } from '../components/contract.js';\n\nconst SETTINGS_ATTR = 'data-pt-component-settings';\nconst TYPE_ATTR = 'data-pt-component';\n\n/** 参数里只放能进 `Record<string, string | number>` 的东西 —— 条目不带文案。 */\nfunction brief(value: unknown): string {\n if (typeof value === 'string') return value.length > 40 ? `${value.slice(0, 40)}…` : value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\nfunction checkFields(\n fields: readonly ComponentSettingSpec[],\n settings: Record<string, unknown>,\n base: Record<string, string | number>,\n ptId: string | undefined,\n issues: Issue[]\n): void {\n const known = new Map(fields.map(spec => [spec.id, spec]));\n\n for (const key of Object.keys(settings)) {\n // `_blocks` 不是设置项,是块的容器。\n if (key === BLOCKS_KEY) continue;\n const spec = known.get(key);\n if (!spec) {\n issues.push({ ptId, rule: 'COMPONENT_SETTING_UNKNOWN', params: { ...base, field: key } });\n continue;\n }\n const value = settings[key];\n if (value === undefined) continue;\n if (matches(spec, value)) continue;\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_INVALID',\n params: {\n ...base,\n field: key,\n // 枚举越界与类型不符在这里分得开:前者类型对、只是取值不在集合里。\n reason: spec.type === 'enum' && typeof value === 'string' ? 'enum' : 'type',\n expected: spec.type,\n value: brief(value)\n }\n });\n }\n}\n\nfunction checkBlocks(\n specs: readonly ComponentBlockSpec[] | undefined,\n raw: unknown,\n component: string,\n ptId: string | undefined,\n issues: Issue[]\n): void {\n if (raw === undefined) return;\n if (!Array.isArray(raw)) {\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_INVALID',\n params: { component, field: BLOCKS_KEY, reason: 'type', expected: 'array', value: brief(raw) }\n });\n return;\n }\n\n for (const [index, block] of raw.entries()) {\n if (typeof block !== 'object' || block === null) {\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_INVALID',\n params: { component, field: BLOCKS_KEY, index, reason: 'type', expected: 'object', value: brief(block) }\n });\n continue;\n }\n const type = (block as { type?: unknown }).type;\n const spec = specs?.find(b => b.type === type);\n if (!spec) {\n // 整块被 resolve 丢掉 —— 比一个字段没生效更严重,不能不报。\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_UNKNOWN',\n params: { component, field: BLOCKS_KEY, index, block: brief(type) }\n });\n continue;\n }\n const settings = (block as { settings?: unknown }).settings;\n if (settings === undefined) continue;\n if (typeof settings !== 'object' || settings === null) {\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_INVALID',\n params: { component, field: BLOCKS_KEY, index, reason: 'type', expected: 'object', value: brief(settings) }\n });\n continue;\n }\n checkFields(\n spec.fields,\n settings as Record<string, unknown>,\n { component, block: spec.type, index },\n ptId,\n issues\n );\n }\n}\n\n/**\n * 校验一个组件声明节点的设置。\n *\n * **永远不抛。** 一份坏 JSON 若能打断整份校验,用户会看到「校验挂了」而不是\n * 「这里有个问题」,而且同一份文档里其余的问题一条都报不出来。\n */\nexport function checkComponentSettings(\n el: Element,\n ptId: string | undefined,\n options: ValidateOptions,\n issues: Issue[]\n): void {\n const component = el.getAttribute(TYPE_ATTR);\n if (component === null) return;\n\n const contract = COMPONENT_CONTRACTS[component];\n if (!contract) {\n // 契约里没有的类型:默认**不报**。core 不感知宿主 —— 弹窗那条路有自己的\n // `countdown`,归宿主 adapter;而这种错在渲染那一侧已经很响了(renderHtml\n // 直接抛 COMPONENT_UNKNOWN)。调用方掌握完整词表时用 knownComponentsOnly\n // 把它打开。\n //\n // 没有契约就无从检查字段,所以两种情况都到此为止。\n if (options.knownComponentsOnly) {\n issues.push({ ptId, rule: 'COMPONENT_SETTING_UNKNOWN', params: { component } });\n }\n return;\n }\n\n const rawText = el.getAttribute(SETTINGS_ATTR);\n if (rawText === null || rawText === '') return;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawText);\n } catch {\n // **有意不做 v2 那种容错修复**(`safeParseSettings` 会把裸控制字符转义后重试)。\n // 那是在给「AI 写出了非法 JSON」打补丁,而补丁让问题不可见。这里报出来,\n // 写的人才知道要改。\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_INVALID',\n params: { component, reason: 'json' }\n });\n return;\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n issues.push({\n ptId,\n rule: 'COMPONENT_SETTING_INVALID',\n params: { component, reason: 'type', expected: 'object', value: brief(parsed) }\n });\n return;\n }\n\n const settings = parsed as Record<string, unknown>;\n checkFields(contract.fields, settings, { component }, ptId, issues);\n checkBlocks(contract.blocks, settings[BLOCKS_KEY], component, ptId, issues);\n}\n","import {\n FORMAT_META_NAME,\n FORMAT_VERSION,\n ID_PATTERN,\n INLINE_STYLE_ALLOWED_PREFIX\n} from '../rules/index.js';\nimport type { Issue } from '../errors.js';\nimport { shouldHaveId, tag } from './tree.js';\nimport { checkVariants } from './variants.js';\nimport { NATIVE_PALETTE_PREFIXES, isNativePaletteClass } from './palette.js';\nimport { checkComponentSettings } from './components.js';\n\n/**\n * 校验开关。**扁平的可选项,不是「宿主档位」** —— core 不区分落地页与弹窗,\n * 它只知道「有一条可选规则叫禁视口单位」,不知道谁会用它。\n *\n * 全部默认**最宽松**:不传任何开关时只跑格式本身的硬规则。\n */\nexport interface ValidateOptions {\n /**\n * 允许视口相对单位(`vh` / `vw` / `dvh`… 以及 `h-screen` 这类等价刻度)。默认允许。\n *\n * 传 `false` 的场合:文档被装在一个比视口小的框里(片段型来源的宿主信封)。\n * 那里的视口单位按**整个浏览器视口**算,不是框自身 —— 数值看着对、显示全错。\n */\n allowVhUnits?: boolean;\n /**\n * 限定整份文档只有一个 `section`。默认不限。\n *\n * UI 挡得住人,挡不住 AI 和别的调用路径,所以这条兜底在校验侧。\n */\n singleSection?: boolean;\n /**\n * 判定单个 class 在当前 @theme 下是否能编译出 CSS。\n * 由调用方注入(编译器在另一个模块,validate 不直接依赖它)。\n * 不传则跳过这条规则 —— 用于只想跑结构 / 格式检查的场合。\n */\n canCompileClass?: (className: string) => boolean;\n /**\n * 只允许 core 契约里有的组件类型。默认**不限**。\n *\n * 为什么默认宽松:core 不感知宿主(弹窗那条路就有自己的 `countdown`,归宿主\n * adapter),而「契约里没有的类型」在渲染那一侧已经很响了 —— `renderHtml` 直接抛\n * `COMPONENT_UNKNOWN`,成品拼装会整体失败。不需要 validate 再拦一道。\n *\n * 对比之下,未知**字段**是静默的(渲染器按默认值渲染、改了没反应),所以那一条\n * 无条件报,不受这个开关影响。两者的响度不同,处理也就不同。\n *\n * 传 `true` 的场合:调用方掌握着完整的组件词表(比如落地页编辑器),想在发布前\n * 就把「AI 编了一个谁也不认识的组件」挡下来。\n */\n knownComponentsOnly?: boolean;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: Issue[];\n}\n\n/** 事件属性:on 开头即拒,不列白名单。 */\nconst EVENT_ATTR = /^on[a-z]/i;\n\n/**\n * 校验一份文档,或一段子树。\n *\n * **入参语义有区分,这条是硬约定**:只有 `Document` 入参才参与文档级规则(今天是\n * 格式标记)的判定;`DocumentFragment` / `Element` 入参一律按**子树**处理,文档级\n * 规则不参与 —— 所以拿一段尚未包裹的片段来校验**不会**报 `FORMAT_MISSING`。\n *\n * 保留子树入口是为了「在 apply 之前单独校验一段 AI 片段」这类用法;收窄成只吃\n * Document 的话,那种场合只能 apply 到克隆体再校验。\n */\nexport function validate(\n root: Document | DocumentFragment | Element,\n options: ValidateOptions = {}\n): ValidateResult {\n const issues: Issue[] = [];\n\n if (isDoc(root)) checkFormatMeta(root, issues);\n checkIds(root, issues);\n checkElements(root, options, issues);\n if (options.singleSection) checkSingleSection(root, issues);\n\n return { ok: issues.length === 0, issues };\n}\n\n/** 片段型来源没有「区块」这个概念:合成的那一层是脚手架,不是用户的结构。 */\nfunction checkSingleSection(root: Document | DocumentFragment | Element, issues: Issue[]): void {\n const sections = root.querySelectorAll('section');\n if (sections.length <= 1) return;\n for (let i = 1; i < sections.length; i++) {\n issues.push({\n ptId: sections[i].getAttribute('data-pt-id') ?? undefined,\n rule: 'STRUCTURE',\n params: { reason: 'multiple-sections', count: sections.length }\n });\n }\n}\n\nfunction isDoc(root: Document | DocumentFragment | Element): root is Document {\n return (root as Document).nodeType === 9;\n}\n\n/** 格式标记。不带它的输入一律不当作 v4 源,也不做任何转换。 */\nfunction checkFormatMeta(doc: Document, issues: Issue[]): void {\n const meta = doc.querySelector(`meta[name=\"${FORMAT_META_NAME}\"]`);\n if (!meta || meta.getAttribute('content') !== FORMAT_VERSION) {\n issues.push({ rule: 'FORMAT_MISSING' });\n }\n}\n\nfunction checkIds(root: Document | DocumentFragment | Element, issues: Issue[]): void {\n const seen = new Set<string>();\n const nodes = root.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i];\n const id = el.getAttribute('data-pt-id') ?? '';\n if (!ID_PATTERN.test(id)) {\n issues.push({ ptId: id, rule: 'ID_FORMAT', params: { id } });\n continue;\n }\n if (seen.has(id)) {\n issues.push({ ptId: id, rule: 'ID_DUPLICATE', params: { id } });\n continue;\n }\n seen.add(id);\n }\n}\n\nfunction checkElements(\n root: Document | DocumentFragment | Element,\n options: ValidateOptions,\n issues: Issue[]\n): void {\n const all = root.querySelectorAll('*');\n for (let i = 0; i < all.length; i++) {\n const el = all[i];\n const name = tag(el);\n const ptId = el.getAttribute('data-pt-id') ?? undefined;\n\n // 结构节点必须带 id(含 text 档不透明子树里的 td / th)。\n if (shouldHaveId(el) && !el.hasAttribute('data-pt-id')) {\n issues.push({ rule: 'ID_FORMAT', params: { tag: name, reason: 'missing' } });\n }\n\n // 行内元素与不透明内部不该带 id。\n if (!shouldHaveId(el) && el.hasAttribute('data-pt-id')) {\n issues.push({\n ptId,\n rule: 'ID_FORMAT',\n params: { tag: name, reason: 'unexpected' }\n });\n }\n\n if (name === 'script') {\n issues.push({ ptId, rule: 'SCRIPT_FORBIDDEN', params: { tag: name } });\n }\n\n checkAttributes(el, ptId, issues);\n checkClasses(el, ptId, options, issues);\n checkComponentSettings(el, ptId, options, issues);\n checkPlaceholder(el, ptId, issues);\n }\n}\n\nfunction checkAttributes(el: Element, ptId: string | undefined, issues: Issue[]): void {\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const a = attrs[i];\n if (EVENT_ATTR.test(a.name)) {\n issues.push({ ptId, rule: 'SCRIPT_FORBIDDEN', params: { attr: a.name } });\n continue;\n }\n if (a.name !== 'style') continue;\n\n // 唯一允许的内联 style:动效变量声明。\n const declarations = a.value\n .split(';')\n .map(s => s.trim())\n .filter(Boolean);\n const offending = declarations.find(d => !d.startsWith(INLINE_STYLE_ALLOWED_PREFIX));\n if (offending) {\n issues.push({ ptId, rule: 'INLINE_STYLE', params: { declaration: offending } });\n }\n }\n}\n\nfunction checkClasses(\n el: Element,\n ptId: string | undefined,\n options: ValidateOptions,\n issues: Issue[]\n): void {\n const raw = el.getAttribute('class');\n if (!raw) return;\n for (const cls of raw.split(/[\\t\\n\\f\\r ]+/)) {\n if (cls === '') continue;\n\n const variant = checkVariants(cls);\n if (!variant.ok) {\n issues.push({\n ptId,\n rule: 'VARIANT_FORBIDDEN',\n params: { className: cls, prefix: variant.offending ?? '', reason: variant.reason ?? '' }\n });\n continue;\n }\n\n // 原生色板:Tailwind 能编译它,所以「可编译」判定拦不住,必须独立一条。\n if (isNativePaletteClass(cls)) {\n issues.push({ ptId, rule: 'NATIVE_PALETTE', params: { className: cls } });\n continue;\n }\n\n // 视口单位:Tailwind 能编译它们,所以「可编译」判定同样拦不住 ——\n // 与原生色板一样,必须独立一条。\n if (options.allowVhUnits === false) {\n const unit = viewportUnitIn(cls);\n if (unit) {\n issues.push({ ptId, rule: 'UNIT_FORBIDDEN', params: { className: cls, unit } });\n continue;\n }\n }\n\n if (options.canCompileClass && !options.canCompileClass(cls)) {\n issues.push({ ptId, rule: 'CLASS_UNCOMPILABLE', params: { className: cls } });\n }\n }\n}\n\n/**\n * class 里的视口相对单位。\n *\n * 两种写法都要认,只认一种等于漏掉一半:\n * 1. 任意值里的单位:`h-[50vh]` / `max-md:min-h-[100dvh]`\n * 2. `*-screen` 刻度:`h-screen` / `min-h-dvh` 之类 —— 它们编译出来就是 `100vh`\n * 这一类,只是把单位藏在了刻度名里\n */\nconst ARBITRARY_VIEWPORT_UNIT = /\\[[^\\]]*?\\d(?:\\.\\d+)?(l|s|d)?(vh|vw|vmin|vmax|vb|vi)\\b/;\nconst SCREEN_SCALE = /(^|:)(min-|max-)?[hw]-(screen|[lsd]vh|[lsd]vw|dvh|dvw|svh|svw|lvh|lvw)$/;\n\nfunction viewportUnitIn(cls: string): string | null {\n const arbitrary = ARBITRARY_VIEWPORT_UNIT.exec(cls);\n if (arbitrary) return `${arbitrary[1] ?? ''}${arbitrary[2]}`;\n const scale = SCREEN_SCALE.exec(cls);\n if (scale) return scale[3];\n return null;\n}\n\n/** 占位:必带宽高比(落图前后布局不跳)、src 为空、不用第三方占位 URL。 */\nfunction checkPlaceholder(el: Element, ptId: string | undefined, issues: Issue[]): void {\n if (!el.hasAttribute('data-pt-placeholder')) return;\n\n const cls = el.getAttribute('class') ?? '';\n const hasAspect = cls.split(/\\s+/).some(c => /(^|:)aspect-/.test(c));\n if (!hasAspect) {\n issues.push({ ptId, rule: 'PLACEHOLDER_UNRESOLVED', params: { reason: 'missing-aspect' } });\n return;\n }\n\n const src = el.getAttribute('src') ?? '';\n if (src !== '') {\n issues.push({ ptId, rule: 'PLACEHOLDER_UNRESOLVED', params: { reason: 'src-not-empty' } });\n return;\n }\n\n // 未落图本身就是阻塞项:预览放行,发布必须拦。\n issues.push({ ptId, rule: 'PLACEHOLDER_UNRESOLVED', params: { reason: 'unresolved' } });\n}\n\nexport { NATIVE_PALETTE_PREFIXES };\n","/**\n * 错误码与校验条目的形状。\n *\n * core **只出结构,不出文案**。文案由各消费端渲染:编辑器用 lp-editor 的三语字典,\n * iam 发布拒绝按 `rule` 出后端文案,mastra 回给模型的结构化报错复用同一枚举。\n * 三处各一份措辞,但没有两份真源 —— 这也是 core 能作为公开包发布的前提之一。\n */\n\nexport const ERROR_CODES = [\n /** 源 HTML 缺 <meta name=\"lpx-format\" content=\"4\">,不是 v4 源。 */\n 'FORMAT_MISSING',\n /** 文档内出现重复的 data-pt-id。 */\n 'ID_DUPLICATE',\n /** 片段携带的 id 与目标文档中已有的 id 冲突。 */\n 'ID_CONFLICT',\n /** id 不符合 [a-z][a-z0-9_-]{1,31},或结构节点缺 id。 */\n 'ID_FORMAT',\n /** 操作引用了文档中不存在的 id(requireIdHit,用得最多的一条)。 */\n 'ID_NOT_FOUND',\n /** 出现 <script> 或 on* 事件属性。 */\n 'SCRIPT_FORBIDDEN',\n /** 出现内联 style(动效变量除外)。 */\n 'INLINE_STYLE',\n /** 使用了 Tailwind 内置色板。它本身可编译,所以必须由独立规则拦。 */\n 'NATIVE_PALETTE',\n /**\n * 用了视口相对单位(vh / dvh / h-screen…),而当前调用方关掉了它\n * (`validate(doc, { allowVhUnits: false })`)。同 NATIVE_PALETTE:它可编译,\n * 拒绝它是产品决定,所以「可编译」判定拦不住,必须独立一条。\n */\n 'UNIT_FORBIDDEN',\n /** class 在当前 @theme 下编译不出 CSS。 */\n 'CLASS_UNCOMPILABLE',\n /** 变体前缀不在允许集内,或组合顺序不是「设备在前、状态在后」。 */\n 'VARIANT_FORBIDDEN',\n /** 违反 section › container › leaf 三层结构,或往不透明子树里做结构编辑。 */\n 'STRUCTURE',\n /** insert / replace 的片段不是单根元素。 */\n 'MULTI_ROOT',\n /** replace 换掉了被替换元素的根 id(埋点锚点会静默断链)。 */\n 'REPLACE_ID_CHANGED',\n /** AI 基于过期文档产出的操作块,baseVersion 对不上。 */\n 'STALE_BASE_VERSION',\n /** 片段 canonical 往返不一致,说明 HTML 畸形。 */\n 'FRAGMENT_NOT_CANONICAL',\n /** 存在未落图的图片占位 —— 阻塞发布,不阻塞预览。 */\n 'PLACEHOLDER_UNRESOLVED',\n /**\n * 渲染了一个注册表里没有的组件类型。\n *\n * 渲染**不返回降级标记**(v2 会返回一段「渲染失败」的灰色 div),所以这条必须抛。\n * 画布可以捕获后显示自己的占位(文案在宿主的三语字典里),成品拼装则应当整体失败 ——\n * 吞掉它就会静默产出一份缺了一块的成品,用户发布完才发现。\n */\n 'COMPONENT_UNKNOWN',\n /** 渲染器自身抛错。同上,不降级、不吞。 */\n 'COMPONENT_RENDER_FAILED',\n /**\n * 组件设置里出现了契约中不存在的字段。\n *\n * 这是**危险的那个方向**:写了一个渲染器不认的字段 → 渲染器按默认值渲染 →\n * 改了没反应、无报错(这个仓对弹窗内置件烧过同样的账)。反方向(契约有、面板\n * 没暴露)只是少个入口,无声无害,不报。\n */\n 'COMPONENT_SETTING_UNKNOWN',\n /** 组件设置的取值类型不符、枚举越界,或设置 JSON 本身解析不出来。 */\n 'COMPONENT_SETTING_INVALID'\n] as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[number];\n\nconst ERROR_CODE_SET: ReadonlySet<string> = new Set(ERROR_CODES);\n\nexport function isErrorCode(value: unknown): value is ErrorCode {\n return typeof value === 'string' && ERROR_CODE_SET.has(value);\n}\n\n/** 校验条目。**不带 message** —— 文案归消费端。 */\nexport interface Issue {\n /** 相关元素的 data-pt-id;文档级问题(如缺格式标记)没有。 */\n ptId?: string;\n rule: ErrorCode;\n /** 供消费端拼文案的结构化参数,如 { className: 'bg-red-500' }。 */\n params?: Readonly<Record<string, string | number>>;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: Issue[];\n}\n\n/** 阻塞发布的规则。预览放行,发布必须拦。 */\nexport const PUBLISH_BLOCKING_RULES: ReadonlySet<ErrorCode> = new Set<ErrorCode>([\n 'PLACEHOLDER_UNRESOLVED'\n]);\n\nexport function isPublishBlocking(issue: Issue): boolean {\n return PUBLISH_BLOCKING_RULES.has(issue.rule);\n}\n\n/** 编辑器 / mastra 抛出的错误。同样不带文案。 */\nexport interface EditorError {\n code: ErrorCode;\n rule?: ErrorCode;\n ptId?: string;\n params?: Readonly<Record<string, string | number>>;\n}\n\nexport function editorError(\n code: ErrorCode,\n extra?: Omit<EditorError, 'code'>\n): EditorError {\n return { code, ...extra };\n}\n","import { closestOpaque, tag } from './tree.js';\nimport { LEAF_TYPES, type LayerName } from '../rules/index.js';\nimport { isWrapLayer } from '../wrap.js';\n\n/**\n * 结构规则:section › container › leaf。**唯一**一套 —— 不按宿主分档。\n *\n * 片段型来源(弹窗一类)没有自己的一套层级:它进编辑器前由 `wrap()` 合成\n * section + container 两层,之后与落地页走同一条判定。\n *\n * 这些判定同时服务 validate(静态检查整棵树)与 apply(insert / move 前门禁),\n * 所以放在一处 —— 两边各写一份的话,「校验说合法、apply 说不合法」是迟早的事。\n */\n\n/** 文档骨架不属于任何一层。<body> 虽然有保留 id(section 的容器要可寻址),但它\n * 不是 container —— 否则 container 的嵌套深度会从它那里白多一层。 */\nconst NOT_A_LAYER: ReadonlySet<string> = new Set(['html', 'head', 'body']);\n\nconst LEAF_TYPE_SET: ReadonlySet<string> = new Set(LEAF_TYPES);\n\nexport function layerOf(el: Element): LayerName | null {\n const name = tag(el);\n if (NOT_A_LAYER.has(name)) return null;\n\n if (name === 'section') return 'section';\n\n const ptType = el.getAttribute('data-pt-type');\n if (ptType && LEAF_TYPE_SET.has(ptType)) return 'leaf';\n // 内置组件整体是一个 leaf。\n if (el.hasAttribute('data-pt-component')) return 'leaf';\n // 不透明子树(组件快照、表格)整体也是一个 leaf。\n const opaque = closestOpaque(el);\n if (opaque && opaque.host === el) return 'leaf';\n\n if (el.hasAttribute('data-pt-id')) return 'container';\n return null;\n}\n\n/** container 允许再嵌一层,不能更深。 */\nexport const MAX_CONTAINER_DEPTH = 2;\n\nexport function containerDepth(el: Element): number {\n let depth = 0;\n let cur: Element | null = el;\n while (cur) {\n // 合成容器不计入用户的嵌套预算 —— 它不是用户的结构。不豁免的话,片段型\n // 来源里用户只剩一层可用,做不了「两列、每列自己是个容器」的版式。\n if (layerOf(cur) === 'container' && !isWrapLayer(cur)) depth += 1;\n cur = cur.parentElement;\n }\n return depth;\n}\n\nexport type StructureRejection =\n | 'section-not-body-child'\n | 'container-too-deep'\n | 'leaf-cannot-contain'\n | 'opaque-subtree'\n | 'unknown-layer';\n\n/** 某个父节点能否接纳某一层的子节点。 */\nexport function canContain(parent: Element, childLayer: LayerName): StructureRejection | null {\n // 不透明子树内部一律不开放结构编辑(两档都一样,text 档只放行文字)。\n const opaque = closestOpaque(parent);\n if (opaque) return 'opaque-subtree';\n\n const parentLayer = layerOf(parent);\n\n if (childLayer === 'section') {\n const isBody = tag(parent) === 'body';\n return isBody ? null : 'section-not-body-child';\n }\n\n if (childLayer === 'container') {\n if (parentLayer === 'section') return null;\n if (parentLayer === 'container') {\n return containerDepth(parent) + 1 > MAX_CONTAINER_DEPTH ? 'container-too-deep' : null;\n }\n return parentLayer === 'leaf' ? 'leaf-cannot-contain' : 'unknown-layer';\n }\n\n // leaf\n if (parentLayer === 'container') return null;\n if (parentLayer === 'leaf') return 'leaf-cannot-contain';\n return 'unknown-layer';\n}\n\n/**\n * 删除的级联语义。\n *\n * 删掉 container 的最后一个 leaf —— container 保留(用户还要往里放东西)。\n * 删掉 section 的最后一个 container —— 连 section 一起删(空区块没有意义)。\n *\n * 返回**真正要从树上摘掉的那个节点**。\n *\n * ⚠️ 这条永远吃不到合成 section:`wrap` 恒合成 container + section 两层,用户容器\n * 的父永远是那个合成 container 而不是 section。见 wrap.ts 里同一条不变量。\n */\nexport function deleteTarget(el: Element): Element {\n const layer = layerOf(el);\n if (layer !== 'container') return el;\n\n const parent = el.parentElement;\n if (!parent || layerOf(parent) !== 'section') return el;\n\n const siblingContainers = Array.from(parent.children).filter(\n c => c !== el && layerOf(c) === 'container'\n );\n return siblingContainers.length === 0 ? parent : el;\n}\n","import { ID_PATTERN } from '../rules/index.js';\nimport { editorError, type EditorError } from '../errors.js';\nimport { parseFragment } from '../dom/parseFragment.js';\nimport { fragmentElementRoots } from '../dom/parseFragment.js';\nimport { serialize } from '../serialize/canonical.js';\nimport { shouldHaveId } from '../validate/tree.js';\n\n/**\n * AI 护栏。编辑器与 mastra 共用同一份 —— 两侧各写一份的话,\n * 「服务端放行、编辑器拒绝」这种事迟早发生。\n */\n\nconst EVENT_ATTR = /^on[a-z]/i;\n\n/** 操作引用的 id 必须在文档里。用得最多的一条。 */\nexport function requireIdHit(doc: Document | DocumentFragment, id: string): EditorError | null {\n if (!id || !ID_PATTERN.test(id)) {\n return editorError('ID_FORMAT', { ptId: id, params: { id } });\n }\n return findById(doc, id)\n ? null\n : editorError('ID_NOT_FOUND', { ptId: id, params: { id } });\n}\n\nexport function findById(root: Document | DocumentFragment | Element, id: string): Element | null {\n // 属性选择器里不能直接插裸值,先按格式校验过再拼是安全的。\n if (!ID_PATTERN.test(id)) return null;\n return root.querySelector(`[data-pt-id=\"${id}\"]`);\n}\n\n/** 片段与富文本里都不许有脚本与事件属性。 */\nexport function rejectScriptsAndHandlers(node: Node): EditorError | null {\n if (node.nodeType === 1) {\n const el = node as Element;\n if (el.localName.toLowerCase() === 'script') {\n return editorError('SCRIPT_FORBIDDEN', { params: { tag: 'script' } });\n }\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (EVENT_ATTR.test(attrs[i].name)) {\n return editorError('SCRIPT_FORBIDDEN', { params: { attr: attrs[i].name } });\n }\n }\n }\n let child: Node | null = node.firstChild;\n while (child) {\n const err = rejectScriptsAndHandlers(child);\n if (err) return err;\n child = child.nextSibling;\n }\n return null;\n}\n\n/**\n * 片段内每个结构节点都要自带 id,格式合规,且不与目标文档冲突。\n *\n * apply **永不生成 id** —— id 在构造 op 时就要写进 payload。两侧各自生成必然分叉,\n * 所以这里宁可整个事务拒绝,也不就地补一个。\n */\nexport function requireFragmentIds(\n fragment: DocumentFragment,\n existing: ReadonlySet<string>\n): EditorError | null {\n const seen = new Set<string>();\n const all = fragment.querySelectorAll('*');\n const check = (el: Element): EditorError | null => {\n if (!shouldHaveId(el)) return null;\n const id = el.getAttribute('data-pt-id');\n if (!id) {\n return editorError('ID_FORMAT', {\n params: { tag: el.localName, reason: 'missing' }\n });\n }\n if (!ID_PATTERN.test(id)) {\n return editorError('ID_FORMAT', { ptId: id, params: { id } });\n }\n if (existing.has(id) || seen.has(id)) {\n return editorError('ID_CONFLICT', { ptId: id, params: { id } });\n }\n seen.add(id);\n return null;\n };\n // querySelectorAll('*') 已经包含片段的直接子元素,不要再单独遍历一次根 ——\n // 那会让根元素跟自己撞成 ID_CONFLICT。\n for (let i = 0; i < all.length; i++) {\n const err = check(all[i]);\n if (err) return err;\n }\n return null;\n}\n\n/** 片段必须是单根元素。 */\nexport function requireSingleRoot(fragment: DocumentFragment): EditorError | null {\n const roots = fragmentElementRoots(fragment);\n if (roots.length === 1) return null;\n return editorError('MULTI_ROOT', { params: { count: roots.length } });\n}\n\n/**\n * 片段 canonical 往返一致:`serialize(parse(html))` 再解析一次仍相同。\n * 拦的是畸形 HTML —— 它在两侧的纠错结果可能不同。\n */\nexport function requireCanonicalFragment(doc: Document, html: string): EditorError | null {\n const once = serialize(parseFragment(doc, html));\n const twice = serialize(parseFragment(doc, once));\n return once === twice ? null : editorError('FRAGMENT_NOT_CANONICAL');\n}\n","import type { EditOp, InsertOp, MoveOp, SetOp } from './types.js';\nimport { editorError, type EditorError } from '../errors.js';\nimport { parseFragment, fragmentElementRoots } from '../dom/parseFragment.js';\nimport { serialize, normalizeClassValue } from '../serialize/canonical.js';\nimport { canContain, deleteTarget, layerOf } from '../validate/structure.js';\nimport { closestOpaque } from '../validate/tree.js';\nimport { isWrapLayer } from '../wrap.js';\nimport {\n findById,\n requireCanonicalFragment,\n requireFragmentIds,\n requireIdHit,\n rejectScriptsAndHandlers,\n requireSingleRoot\n} from './guards.js';\n\nexport type ApplyResult =\n | { ok: true; inverse: EditOp[] }\n | { ok: false; error: EditorError; failedIndex: number };\n\n/** raw text 元素(style / script)的内容按纯文本设置,不走片段解析。 */\nconst RAW_TEXT = new Set(['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'plaintext']);\n\n/**\n * 应用一组 EditOp,并产出逆操作。\n *\n * **事务语义**:一组 op 顺序应用,每条的下标基于**前一条应用之后**的状态。\n * 任何一条失败 → 整个事务不生效,文档一个字节都不变。\n *\n * 原子性的实现方式是「先在克隆体上试跑一遍,通过了再在真文档上跑」,而不是\n * 「边跑边记逆操作、失败了回滚」。后者的正确性取决于逆操作自身没有 bug,\n * 而失败时恰恰是最容易触发边角情况的时刻 —— 把原子性压在最脆弱的那条路径上\n * 不是好交易。克隆一次的代价(原生 cloneNode)远小于一次编译。\n */\nexport function apply(doc: Document, ops: EditOp[]): ApplyResult {\n if (!Array.isArray(ops)) throw new TypeError('apply(): ops 必须是数组');\n if (ops.length === 0) return { ok: true, inverse: [] };\n\n // 1. 克隆体上试跑。只看成败,产物丢弃。\n const rehearsal = doc.cloneNode(true) as Document;\n const dry = run(rehearsal, ops);\n if (!dry.ok) return dry;\n\n // 2. 真文档上跑。到这里不该再失败;万一失败(宿主在两次之间改了文档),\n // 仍然按失败返回,但此时文档可能已被部分修改 —— 这是宿主违反约定的后果,\n // 不是这里能兜的,所以不假装兜住。\n return run(doc, ops);\n}\n\nfunction run(doc: Document, ops: EditOp[]): ApplyResult {\n const inverse: EditOp[] = [];\n for (let i = 0; i < ops.length; i++) {\n const result = applyOne(doc, ops[i]);\n if (!result.ok) return { ok: false, error: result.error, failedIndex: i };\n // 逆操作要倒序回放。\n inverse.unshift(result.inverse);\n }\n return { ok: true, inverse };\n}\n\ntype OneResult = { ok: true; inverse: EditOp } | { ok: false; error: EditorError };\n\nfunction applyOne(doc: Document, op: EditOp): OneResult {\n switch (op.op) {\n case 'set':\n return applySet(doc, op);\n case 'insert':\n return applyInsert(doc, op);\n case 'delete':\n return applyDelete(doc, op);\n case 'move':\n return applyMove(doc, op);\n case 'replace':\n return applyReplace(doc, op);\n default:\n return {\n ok: false,\n error: editorError('STRUCTURE', {\n params: { reason: `未知的 op: ${String((op as { op: string }).op)}` }\n })\n };\n }\n}\n\n/**\n * 合成层的门禁。\n *\n * **精确到「目标 vs 父」**:以合成层节点为**目标**的 op(set / delete / move /\n * replace)一律拒绝;**往合成容器里 insert、或把节点 move 进去必须放行** ——\n * 那是片段型来源新内容唯一的落点。写成「拒绝一切碰到合成层的 op」会把插入路径\n * 一起堵死。\n *\n * 这道闸让「AI 看不看得见合成层」变得无所谓:发了也执行不了,拿到的是 STRUCTURE\n * 错误而不是一次静默破坏。\n */\nfunction rejectWrapTarget(el: Element, ptId: string): EditorError | null {\n return isWrapLayer(el)\n ? editorError('STRUCTURE', { ptId, params: { reason: 'wrap-layer-immutable' } })\n : null;\n}\n\n// ---------------------------------------------------------------- set\n\nfunction applySet(doc: Document, op: SetOp): OneResult {\n const miss = requireIdHit(doc, op.id);\n if (miss) return { ok: false, error: miss };\n const el = findById(doc, op.id)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n const opaque = closestOpaque(el);\n if (opaque && opaque.host !== el && opaque.mode !== 'text') {\n // strict 档的不透明子树内部是编译产物,改它没有意义也不安全。\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'opaque-subtree' } }) };\n }\n\n const invAttrs: Record<string, string | null> = {};\n if (op.attrs) {\n for (const name of Object.keys(op.attrs)) {\n if (/^on[a-z]/i.test(name)) {\n return { ok: false, error: editorError('SCRIPT_FORBIDDEN', { ptId: op.id, params: { attr: name } }) };\n }\n invAttrs[name] = el.hasAttribute(name) ? el.getAttribute(name) : null;\n }\n }\n\n let invClasses: { add?: string[]; remove?: string[] } | undefined;\n if (op.classes) {\n const before = new Set(\n normalizeClassValue(el.getAttribute('class') ?? '')\n .split(' ')\n .filter(Boolean)\n );\n // 逆操作只针对**真的发生了变化**的 class:加一个本来就有的、\n // 删一个本来就没有的,都不该在撤销时反向动它。\n const actuallyAdded = (op.classes.add ?? []).filter(c => !before.has(c));\n const actuallyRemoved = (op.classes.remove ?? []).filter(c => before.has(c));\n if (actuallyAdded.length || actuallyRemoved.length) {\n invClasses = { add: actuallyRemoved, remove: actuallyAdded };\n }\n }\n\n let invText: string | undefined;\n if (op.text !== undefined) {\n const err = checkTextPayload(doc, el, op.text);\n if (err) return { ok: false, error: { ...err, ptId: op.id } };\n invText = serializeChildren(el);\n }\n\n // 校验全过了才开始改。\n if (op.attrs) {\n for (const [name, value] of Object.entries(op.attrs)) {\n if (value === null) el.removeAttribute(name);\n else el.setAttribute(name, value);\n }\n }\n if (op.classes) applyClasses(el, op.classes);\n if (op.text !== undefined) setChildren(doc, el, op.text);\n\n const inv: SetOp = { op: 'set', id: op.id };\n if (op.attrs) inv.attrs = invAttrs;\n if (invClasses) inv.classes = invClasses;\n if (invText !== undefined) inv.text = invText;\n return { ok: true, inverse: inv };\n}\n\nfunction applyClasses(el: Element, spec: { add?: string[]; remove?: string[] }): void {\n const list = normalizeClassValue(el.getAttribute('class') ?? '')\n .split(' ')\n .filter(Boolean);\n const set = new Set(list);\n for (const c of spec.remove ?? []) set.delete(c);\n const out = list.filter(c => set.has(c));\n for (const c of spec.add ?? []) {\n if (!set.has(c)) {\n set.add(c);\n out.push(c);\n }\n }\n if (out.length === 0) el.removeAttribute('class');\n else el.setAttribute('class', out.join(' '));\n}\n\nfunction isRawText(el: Element): boolean {\n return RAW_TEXT.has(el.localName.toLowerCase());\n}\n\nfunction serializeChildren(el: Element): string {\n if (isRawText(el)) {\n let out = '';\n let child: Node | null = el.firstChild;\n while (child) {\n if (child.nodeType === 3) out += (child as Text).data;\n child = child.nextSibling;\n }\n return out;\n }\n let out = '';\n let child: Node | null = el.firstChild;\n while (child) {\n out += serialize(child);\n child = child.nextSibling;\n }\n return out;\n}\n\nfunction checkTextPayload(doc: Document, el: Element, text: string): EditorError | null {\n // style / script 的内容是原始文本(@theme 就走这条),不做片段解析。\n if (isRawText(el)) return null;\n const frag = parseFragment(doc, text);\n return rejectScriptsAndHandlers(frag);\n}\n\nfunction setChildren(doc: Document, el: Element, text: string): void {\n while (el.firstChild) el.removeChild(el.firstChild);\n if (isRawText(el)) {\n el.appendChild(doc.createTextNode(text));\n return;\n }\n el.appendChild(parseFragment(doc, text));\n}\n\n// ---------------------------------------------------------------- insert\n\nfunction applyInsert(doc: Document, op: InsertOp): OneResult {\n const miss = requireIdHit(doc, op.parentId);\n if (miss) return { ok: false, error: miss };\n const parent = findById(doc, op.parentId)!;\n\n const canonical = requireCanonicalFragment(doc, op.html);\n if (canonical) return { ok: false, error: canonical };\n\n const frag = parseFragment(doc, op.html);\n const single = requireSingleRoot(frag);\n if (single) return { ok: false, error: single };\n\n const scripts = rejectScriptsAndHandlers(frag);\n if (scripts) return { ok: false, error: scripts };\n\n const idErr = requireFragmentIds(frag, collectDocIds(doc));\n if (idErr) return { ok: false, error: idErr };\n\n const root = fragmentElementRoots(frag)[0];\n const childLayer = layerOf(root);\n if (!childLayer) {\n return { ok: false, error: editorError('STRUCTURE', { params: { reason: 'unknown-layer' } }) };\n }\n const rejection = canContain(parent, childLayer);\n if (rejection) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.parentId, params: { reason: rejection } }) };\n }\n\n const newId = root.getAttribute('data-pt-id')!;\n const at = resolveOffset(parent, op.index, op.nodeIndex);\n parent.insertBefore(frag, parent.childNodes[at] ?? null);\n\n return { ok: true, inverse: { op: 'delete', id: newId } };\n}\n\n// ---------------------------------------------------------------- delete\n\nfunction applyDelete(doc: Document, op: { id: string }): OneResult {\n const miss = requireIdHit(doc, op.id);\n if (miss) return { ok: false, error: miss };\n const el = findById(doc, op.id)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n const opaque = closestOpaque(el);\n if (opaque && opaque.host !== el) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'opaque-subtree' } }) };\n }\n\n // 删掉 container 的最后一个 leaf 时容器保留;删掉 section 的最后一个 container\n // 时连 section 一起删。\n const target = deleteTarget(el);\n const parent = target.parentElement;\n if (!parent) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'no-parent' } }) };\n }\n const parentId = parent.getAttribute('data-pt-id');\n if (!parentId) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'parent-has-no-id' } }) };\n }\n\n const nodeIndex = nodeOffset(parent, target);\n const html = serialize(target);\n parent.removeChild(target);\n\n return {\n ok: true,\n // 逆操作带上精确的 childNodes 偏移,空白节点才回得到原位。\n inverse: { op: 'insert', parentId, index: 0, html, nodeIndex }\n };\n}\n\n// ---------------------------------------------------------------- move\n\nfunction applyMove(doc: Document, op: MoveOp): OneResult {\n const missSelf = requireIdHit(doc, op.id);\n if (missSelf) return { ok: false, error: missSelf };\n const missParent = requireIdHit(doc, op.parentId);\n if (missParent) return { ok: false, error: missParent };\n\n const el = findById(doc, op.id)!;\n const parent = findById(doc, op.parentId)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n if (el === parent || el.contains(parent)) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'move-into-self' } }) };\n }\n\n const layer = layerOf(el);\n if (!layer) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'unknown-layer' } }) };\n }\n const rejection = canContain(parent, layer);\n if (rejection) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.parentId, params: { reason: rejection } }) };\n }\n\n const oldParent = el.parentElement;\n const oldParentId = oldParent?.getAttribute('data-pt-id');\n if (!oldParent || !oldParentId) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'parent-has-no-id' } }) };\n }\n const oldNodeIndex = nodeOffset(oldParent, el);\n\n const at = resolveOffset(parent, op.index, op.nodeIndex, el);\n parent.insertBefore(el, parent.childNodes[at] ?? null);\n\n return {\n ok: true,\n inverse: { op: 'move', id: op.id, parentId: oldParentId, index: 0, nodeIndex: oldNodeIndex }\n };\n}\n\n// ---------------------------------------------------------------- replace\n\nfunction applyReplace(doc: Document, op: { id: string; html: string }): OneResult {\n const miss = requireIdHit(doc, op.id);\n if (miss) return { ok: false, error: miss };\n const el = findById(doc, op.id)!;\n\n const wrapped = rejectWrapTarget(el, op.id);\n if (wrapped) return { ok: false, error: wrapped };\n\n const canonical = requireCanonicalFragment(doc, op.html);\n if (canonical) return { ok: false, error: canonical };\n\n const frag = parseFragment(doc, op.html);\n const single = requireSingleRoot(frag);\n if (single) return { ok: false, error: single };\n\n const scripts = rejectScriptsAndHandlers(frag);\n if (scripts) return { ok: false, error: scripts };\n\n const root = fragmentElementRoots(frag)[0];\n const rootId = root.getAttribute('data-pt-id');\n if (rootId !== op.id) {\n // data-pt-id 会保留进发布产物当埋点锚点;换掉它,那一段的埋点数据就此断链,\n // 而报告里看不出来。\n return {\n ok: false,\n error: editorError('REPLACE_ID_CHANGED', { ptId: op.id, params: { got: rootId ?? '' } })\n };\n }\n\n // 根 id 是它自己,查重时要把自己排除掉。\n const existing = collectDocIds(doc);\n for (const id of collectIdsIn(el)) existing.delete(id);\n const idErr = requireFragmentIds(frag, existing);\n if (idErr) return { ok: false, error: idErr };\n\n const before = serialize(el);\n el.parentNode!.replaceChild(frag, el);\n\n return { ok: true, inverse: { op: 'replace', id: op.id, html: before } };\n}\n\n// ---------------------------------------------------------------- 位置换算\n\n/**\n * 把「元素下标」换算成 childNodes 下标。\n * `nodeIndex` 在场时直接用它 —— 那是 core 生成逆操作时记下的精确偏移。\n */\nfunction resolveOffset(\n parent: Element,\n elementIndex: number,\n nodeIndex: number | undefined,\n moving?: Element\n): number {\n if (typeof nodeIndex === 'number') {\n // nodeIndex 是**移除之后**的目标下标,而 insertBefore 的参照节点要在\n // 当前(尚未移除)的列表里取。被移动的节点若排在目标之前,移除会让后面\n // 整体前移一位,所以参照节点的当前下标要 +1。\n //\n // 方向很容易搞反:写成 -1 的话,同容器内换位会变成一次 no-op —— 撤销\n // 看起来「没反应」,而不是报错。\n let target = nodeIndex;\n if (moving && moving.parentElement === parent) {\n const cur = nodeOffset(parent, moving);\n if (cur < nodeIndex) target = nodeIndex + 1;\n }\n return Math.max(0, Math.min(target, parent.childNodes.length));\n }\n const children = parent.childNodes;\n let seen = 0;\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.nodeType !== 1) continue;\n if (node === moving) continue;\n if (seen === elementIndex) return i;\n seen += 1;\n }\n return children.length;\n}\n\nfunction nodeOffset(parent: Element, node: Node): number {\n const children = parent.childNodes;\n for (let i = 0; i < children.length; i++) {\n if (children[i] === node) return i;\n }\n return children.length;\n}\n\nfunction collectDocIds(doc: Document): Set<string> {\n const out = new Set<string>();\n const nodes = doc.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const v = nodes[i].getAttribute('data-pt-id');\n if (v) out.add(v);\n }\n return out;\n}\n\nfunction collectIdsIn(el: Element): Set<string> {\n const out = new Set<string>();\n const self = el.getAttribute('data-pt-id');\n if (self) out.add(self);\n const nodes = el.querySelectorAll('[data-pt-id]');\n for (let i = 0; i < nodes.length; i++) {\n const v = nodes[i].getAttribute('data-pt-id');\n if (v) out.add(v);\n }\n return out;\n}\n","import { compile as twCompile, __unstable__loadDesignSystem } from 'tailwindcss';\nimport { extendTailwindMerge } from 'tailwind-merge';\nimport { TW_SHEETS } from '../generated/tw-css.js';\nimport { EMPTY_THEME, themeTokens, type Theme } from './theme.js';\n\n/**\n * Tailwind 编译的两个入口 + 预热,同一份实现。\n *\n * incremental 画布用。累积只增(Tailwind 的 build() 原本语义),快。\n * fresh 每次新建引擎、候选排序后编译。输出只取决于内容,不取决于编译历史。\n * **export() 与 golden 只走它** —— 否则成品会带上编辑途中出现过\n * 又被删掉的 class。\n * warm 把该主题的缓存条目建齐。\n */\n\ntype TwCompiler = { build(candidates: string[]): string };\ntype DesignSystem = { candidatesToCss(classes: string[]): Array<string | null> };\ntype TwMerge = (...classes: string[]) => string;\n\nconst BASE_IMPORTS =\n '@import \"tailwindcss/theme.css\"; @import \"tailwindcss/preflight.css\"; @import \"tailwindcss/utilities.css\";';\n\nfunction inputFor(theme: Theme): string {\n return theme.source ? `${BASE_IMPORTS}\\n${theme.source}` : BASE_IMPORTS;\n}\n\nconst loadStylesheet = async (id: string, base: string) => {\n const content = TW_SHEETS[id];\n if (content === undefined) throw new Error(`lp-editor-core: 未知样式表 ${id}`);\n return { path: `virtual:${id}`, base, content };\n};\n\nconst compileOptions = { base: '/', loadStylesheet };\n\n/**\n * 一个主题 hash → 一个缓存条目,装三样。\n *\n * `fresh` 有意不入缓存(它的语义就是每次新建)。`warm()` 把三样都建齐 ——\n * 实测三样合计 11ms 左右,没有「只建一样」可争的收益;而首屏真正的成本在\n * core 分块的动态 import,`warm()` 早调一次顺带把它拉下来。\n */\ninterface CacheEntry {\n theme: Theme;\n designSystem?: DesignSystem;\n incremental?: TwCompiler;\n twMerge?: TwMerge;\n /** class → 能否编译。同一主题下反复问同一个 class 很常见(mastra 每个 ops 块都问)。 */\n compilable: Map<string, boolean>;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\nfunction entryOf(theme: Theme): CacheEntry {\n let e = cache.get(theme.hash);\n if (!e) {\n e = { theme, compilable: new Map() };\n cache.set(theme.hash, e);\n }\n return e;\n}\n\nasync function designSystemOf(theme: Theme): Promise<DesignSystem> {\n const e = entryOf(theme);\n if (!e.designSystem) {\n e.designSystem = (await __unstable__loadDesignSystem(\n inputFor(theme),\n compileOptions\n )) as unknown as DesignSystem;\n }\n return e.designSystem;\n}\n\nasync function incrementalOf(theme: Theme): Promise<TwCompiler> {\n const e = entryOf(theme);\n if (!e.incremental) {\n e.incremental = (await twCompile(inputFor(theme), compileOptions)) as unknown as TwCompiler;\n }\n return e.incremental;\n}\n\n/**\n * tailwind-merge 的 class group 必须**按当前 @theme 派生**。\n *\n * token 名是每页自定义的(`text-display-1` / `text-hero`),模块级单例配置\n * 认不出它们 → `set` 时删不掉旧 class → 两个都留在元素上 → 级联顺序说了算。\n * 那正是「同属性互斥」这条规则要防的 bug,配错等于没做。\n */\nfunction twMergeOf(theme: Theme): TwMerge {\n const e = entryOf(theme);\n if (!e.twMerge) {\n const t = themeTokens(theme);\n e.twMerge = extendTailwindMerge({\n extend: {\n theme: {\n color: t.color,\n text: t.text,\n spacing: t.spacing,\n radius: t.radius,\n shadow: t.shadow,\n font: t.font\n }\n }\n }) as unknown as TwMerge;\n }\n return e.twMerge;\n}\n\n/** 累积编译:返回迄今见过的所有候选的完整 CSS。画布用。 */\nexport async function incremental(candidates: Iterable<string>, theme: Theme = EMPTY_THEME): Promise<string> {\n const engine = await incrementalOf(theme);\n return engine.build([...candidates]);\n}\n\n/**\n * 全新编译:每次新建引擎,候选**排序后**编译。\n * 排序是为了让同一组 class 无论以什么顺序收集到,都产出同一串字节。\n */\nexport async function fresh(candidates: Iterable<string>, theme: Theme = EMPTY_THEME): Promise<string> {\n const engine = (await twCompile(inputFor(theme), compileOptions)) as unknown as TwCompiler;\n return engine.build([...new Set(candidates)].sort());\n}\n\n/** 把该主题的缓存条目建齐。`fresh` 按定义不受益。 */\nexport async function warm(theme: Theme = EMPTY_THEME): Promise<void> {\n await Promise.all([designSystemOf(theme), incrementalOf(theme)]);\n twMergeOf(theme);\n}\n\n/**\n * 「class 可编译」判定。\n *\n * 用 Tailwind 自己的 design system:`candidatesToCss` 对解析不出的候选直接返回\n * null。这是 Tailwind IntelliSense 与 prettier 插件用的同一个口子 —— 精确判定,\n * 不是在 CSS 字串里找转义选择器的启发式。\n *\n * 一个 ops 块一次调用,不是逐 class 建引擎(逐个建引擎每次约 3ms,\n * 20 个 class 的块冷缓存就要多花 60ms,加在每轮 AI 往返上)。\n *\n * ⚠️ 它挂着 `__unstable__` 前缀。我们本来就锁精确版本,所以现在是安全的;\n * 万一哪个版本拿掉它,退回「在 fresh 输出里查转义后的选择器」那条路,\n * 判定器同样只在这一处。\n */\nexport async function canCompile(\n classes: readonly string[],\n theme: Theme = EMPTY_THEME\n): Promise<Map<string, boolean>> {\n const e = entryOf(theme);\n const unknown = [...new Set(classes)].filter(c => !e.compilable.has(c));\n if (unknown.length > 0) {\n const ds = await designSystemOf(theme);\n const css = ds.candidatesToCss(unknown);\n unknown.forEach((c, i) => e.compilable.set(c, css[i] != null));\n }\n const out = new Map<string, boolean>();\n for (const c of classes) out.set(c, e.compilable.get(c) ?? false);\n return out;\n}\n\n/** 同属性互斥:按当前主题派生的冲突表合并 class 列表。 */\nexport function mergeClasses(classes: readonly string[], theme: Theme = EMPTY_THEME): string {\n return twMergeOf(theme)(...classes);\n}\n\n/** 测试与宿主重载主题时用。 */\nexport function clearCompileCache(): void {\n cache.clear();\n}\n\nexport { themeOf, themeFromSource, themeTokens, EMPTY_THEME } from './theme.js';\nexport type { Theme, ThemeTokens } from './theme.js';\n","// 本文件由 scripts/gen-tw-css.mjs 生成,请勿手改。\n// 重新生成:pnpm --filter @ptengine/lp-editor-core gen:tw-css\n\n/** 生成这三段 CSS 时解析到的 tailwindcss 版本。构建前由 gen:check 断言它仍然成立。 */\nexport const TAILWIND_VERSION = \"4.3.3\";\n\n/** tailwindcss/theme.css */\nexport const THEME_CSS = \"@theme default {\\n --font-sans:\\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial,\\n sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\\n --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;\\n --font-mono:\\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',\\n monospace;\\n\\n --color-red-50: oklch(97.1% 0.013 17.38);\\n --color-red-100: oklch(93.6% 0.032 17.717);\\n --color-red-200: oklch(88.5% 0.062 18.334);\\n --color-red-300: oklch(80.8% 0.114 19.571);\\n --color-red-400: oklch(70.4% 0.191 22.216);\\n --color-red-500: oklch(63.7% 0.237 25.331);\\n --color-red-600: oklch(57.7% 0.245 27.325);\\n --color-red-700: oklch(50.5% 0.213 27.518);\\n --color-red-800: oklch(44.4% 0.177 26.899);\\n --color-red-900: oklch(39.6% 0.141 25.723);\\n --color-red-950: oklch(25.8% 0.092 26.042);\\n\\n --color-orange-50: oklch(98% 0.016 73.684);\\n --color-orange-100: oklch(95.4% 0.038 75.164);\\n --color-orange-200: oklch(90.1% 0.076 70.697);\\n --color-orange-300: oklch(83.7% 0.128 66.29);\\n --color-orange-400: oklch(75% 0.183 55.934);\\n --color-orange-500: oklch(70.5% 0.213 47.604);\\n --color-orange-600: oklch(64.6% 0.222 41.116);\\n --color-orange-700: oklch(55.3% 0.195 38.402);\\n --color-orange-800: oklch(47% 0.157 37.304);\\n --color-orange-900: oklch(40.8% 0.123 38.172);\\n --color-orange-950: oklch(26.6% 0.079 36.259);\\n\\n --color-amber-50: oklch(98.7% 0.022 95.277);\\n --color-amber-100: oklch(96.2% 0.059 95.617);\\n --color-amber-200: oklch(92.4% 0.12 95.746);\\n --color-amber-300: oklch(87.9% 0.169 91.605);\\n --color-amber-400: oklch(82.8% 0.189 84.429);\\n --color-amber-500: oklch(76.9% 0.188 70.08);\\n --color-amber-600: oklch(66.6% 0.179 58.318);\\n --color-amber-700: oklch(55.5% 0.163 48.998);\\n --color-amber-800: oklch(47.3% 0.137 46.201);\\n --color-amber-900: oklch(41.4% 0.112 45.904);\\n --color-amber-950: oklch(27.9% 0.077 45.635);\\n\\n --color-yellow-50: oklch(98.7% 0.026 102.212);\\n --color-yellow-100: oklch(97.3% 0.071 103.193);\\n --color-yellow-200: oklch(94.5% 0.129 101.54);\\n --color-yellow-300: oklch(90.5% 0.182 98.111);\\n --color-yellow-400: oklch(85.2% 0.199 91.936);\\n --color-yellow-500: oklch(79.5% 0.184 86.047);\\n --color-yellow-600: oklch(68.1% 0.162 75.834);\\n --color-yellow-700: oklch(55.4% 0.135 66.442);\\n --color-yellow-800: oklch(47.6% 0.114 61.907);\\n --color-yellow-900: oklch(42.1% 0.095 57.708);\\n --color-yellow-950: oklch(28.6% 0.066 53.813);\\n\\n --color-lime-50: oklch(98.6% 0.031 120.757);\\n --color-lime-100: oklch(96.7% 0.067 122.328);\\n --color-lime-200: oklch(93.8% 0.127 124.321);\\n --color-lime-300: oklch(89.7% 0.196 126.665);\\n --color-lime-400: oklch(84.1% 0.238 128.85);\\n --color-lime-500: oklch(76.8% 0.233 130.85);\\n --color-lime-600: oklch(64.8% 0.2 131.684);\\n --color-lime-700: oklch(53.2% 0.157 131.589);\\n --color-lime-800: oklch(45.3% 0.124 130.933);\\n --color-lime-900: oklch(40.5% 0.101 131.063);\\n --color-lime-950: oklch(27.4% 0.072 132.109);\\n\\n --color-green-50: oklch(98.2% 0.018 155.826);\\n --color-green-100: oklch(96.2% 0.044 156.743);\\n --color-green-200: oklch(92.5% 0.084 155.995);\\n --color-green-300: oklch(87.1% 0.15 154.449);\\n --color-green-400: oklch(79.2% 0.209 151.711);\\n --color-green-500: oklch(72.3% 0.219 149.579);\\n --color-green-600: oklch(62.7% 0.194 149.214);\\n --color-green-700: oklch(52.7% 0.154 150.069);\\n --color-green-800: oklch(44.8% 0.119 151.328);\\n --color-green-900: oklch(39.3% 0.095 152.535);\\n --color-green-950: oklch(26.6% 0.065 152.934);\\n\\n --color-emerald-50: oklch(97.9% 0.021 166.113);\\n --color-emerald-100: oklch(95% 0.052 163.051);\\n --color-emerald-200: oklch(90.5% 0.093 164.15);\\n --color-emerald-300: oklch(84.5% 0.143 164.978);\\n --color-emerald-400: oklch(76.5% 0.177 163.223);\\n --color-emerald-500: oklch(69.6% 0.17 162.48);\\n --color-emerald-600: oklch(59.6% 0.145 163.225);\\n --color-emerald-700: oklch(50.8% 0.118 165.612);\\n --color-emerald-800: oklch(43.2% 0.095 166.913);\\n --color-emerald-900: oklch(37.8% 0.077 168.94);\\n --color-emerald-950: oklch(26.2% 0.051 172.552);\\n\\n --color-teal-50: oklch(98.4% 0.014 180.72);\\n --color-teal-100: oklch(95.3% 0.051 180.801);\\n --color-teal-200: oklch(91% 0.096 180.426);\\n --color-teal-300: oklch(85.5% 0.138 181.071);\\n --color-teal-400: oklch(77.7% 0.152 181.912);\\n --color-teal-500: oklch(70.4% 0.14 182.503);\\n --color-teal-600: oklch(60% 0.118 184.704);\\n --color-teal-700: oklch(51.1% 0.096 186.391);\\n --color-teal-800: oklch(43.7% 0.078 188.216);\\n --color-teal-900: oklch(38.6% 0.063 188.416);\\n --color-teal-950: oklch(27.7% 0.046 192.524);\\n\\n --color-cyan-50: oklch(98.4% 0.019 200.873);\\n --color-cyan-100: oklch(95.6% 0.045 203.388);\\n --color-cyan-200: oklch(91.7% 0.08 205.041);\\n --color-cyan-300: oklch(86.5% 0.127 207.078);\\n --color-cyan-400: oklch(78.9% 0.154 211.53);\\n --color-cyan-500: oklch(71.5% 0.143 215.221);\\n --color-cyan-600: oklch(60.9% 0.126 221.723);\\n --color-cyan-700: oklch(52% 0.105 223.128);\\n --color-cyan-800: oklch(45% 0.085 224.283);\\n --color-cyan-900: oklch(39.8% 0.07 227.392);\\n --color-cyan-950: oklch(30.2% 0.056 229.695);\\n\\n --color-sky-50: oklch(97.7% 0.013 236.62);\\n --color-sky-100: oklch(95.1% 0.026 236.824);\\n --color-sky-200: oklch(90.1% 0.058 230.902);\\n --color-sky-300: oklch(82.8% 0.111 230.318);\\n --color-sky-400: oklch(74.6% 0.16 232.661);\\n --color-sky-500: oklch(68.5% 0.169 237.323);\\n --color-sky-600: oklch(58.8% 0.158 241.966);\\n --color-sky-700: oklch(50% 0.134 242.749);\\n --color-sky-800: oklch(44.3% 0.11 240.79);\\n --color-sky-900: oklch(39.1% 0.09 240.876);\\n --color-sky-950: oklch(29.3% 0.066 243.157);\\n\\n --color-blue-50: oklch(97% 0.014 254.604);\\n --color-blue-100: oklch(93.2% 0.032 255.585);\\n --color-blue-200: oklch(88.2% 0.059 254.128);\\n --color-blue-300: oklch(80.9% 0.105 251.813);\\n --color-blue-400: oklch(70.7% 0.165 254.624);\\n --color-blue-500: oklch(62.3% 0.214 259.815);\\n --color-blue-600: oklch(54.6% 0.245 262.881);\\n --color-blue-700: oklch(48.8% 0.243 264.376);\\n --color-blue-800: oklch(42.4% 0.199 265.638);\\n --color-blue-900: oklch(37.9% 0.146 265.522);\\n --color-blue-950: oklch(28.2% 0.091 267.935);\\n\\n --color-indigo-50: oklch(96.2% 0.018 272.314);\\n --color-indigo-100: oklch(93% 0.034 272.788);\\n --color-indigo-200: oklch(87% 0.065 274.039);\\n --color-indigo-300: oklch(78.5% 0.115 274.713);\\n --color-indigo-400: oklch(67.3% 0.182 276.935);\\n --color-indigo-500: oklch(58.5% 0.233 277.117);\\n --color-indigo-600: oklch(51.1% 0.262 276.966);\\n --color-indigo-700: oklch(45.7% 0.24 277.023);\\n --color-indigo-800: oklch(39.8% 0.195 277.366);\\n --color-indigo-900: oklch(35.9% 0.144 278.697);\\n --color-indigo-950: oklch(25.7% 0.09 281.288);\\n\\n --color-violet-50: oklch(96.9% 0.016 293.756);\\n --color-violet-100: oklch(94.3% 0.029 294.588);\\n --color-violet-200: oklch(89.4% 0.057 293.283);\\n --color-violet-300: oklch(81.1% 0.111 293.571);\\n --color-violet-400: oklch(70.2% 0.183 293.541);\\n --color-violet-500: oklch(60.6% 0.25 292.717);\\n --color-violet-600: oklch(54.1% 0.281 293.009);\\n --color-violet-700: oklch(49.1% 0.27 292.581);\\n --color-violet-800: oklch(43.2% 0.232 292.759);\\n --color-violet-900: oklch(38% 0.189 293.745);\\n --color-violet-950: oklch(28.3% 0.141 291.089);\\n\\n --color-purple-50: oklch(97.7% 0.014 308.299);\\n --color-purple-100: oklch(94.6% 0.033 307.174);\\n --color-purple-200: oklch(90.2% 0.063 306.703);\\n --color-purple-300: oklch(82.7% 0.119 306.383);\\n --color-purple-400: oklch(71.4% 0.203 305.504);\\n --color-purple-500: oklch(62.7% 0.265 303.9);\\n --color-purple-600: oklch(55.8% 0.288 302.321);\\n --color-purple-700: oklch(49.6% 0.265 301.924);\\n --color-purple-800: oklch(43.8% 0.218 303.724);\\n --color-purple-900: oklch(38.1% 0.176 304.987);\\n --color-purple-950: oklch(29.1% 0.149 302.717);\\n\\n --color-fuchsia-50: oklch(97.7% 0.017 320.058);\\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\\n --color-fuchsia-200: oklch(90.3% 0.076 319.62);\\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\\n --color-fuchsia-400: oklch(74% 0.238 322.16);\\n --color-fuchsia-500: oklch(66.7% 0.295 322.15);\\n --color-fuchsia-600: oklch(59.1% 0.293 322.896);\\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\\n --color-fuchsia-800: oklch(45.2% 0.211 324.591);\\n --color-fuchsia-900: oklch(40.1% 0.17 325.612);\\n --color-fuchsia-950: oklch(29.3% 0.136 325.661);\\n\\n --color-pink-50: oklch(97.1% 0.014 343.198);\\n --color-pink-100: oklch(94.8% 0.028 342.258);\\n --color-pink-200: oklch(89.9% 0.061 343.231);\\n --color-pink-300: oklch(82.3% 0.12 346.018);\\n --color-pink-400: oklch(71.8% 0.202 349.761);\\n --color-pink-500: oklch(65.6% 0.241 354.308);\\n --color-pink-600: oklch(59.2% 0.249 0.584);\\n --color-pink-700: oklch(52.5% 0.223 3.958);\\n --color-pink-800: oklch(45.9% 0.187 3.815);\\n --color-pink-900: oklch(40.8% 0.153 2.432);\\n --color-pink-950: oklch(28.4% 0.109 3.907);\\n\\n --color-rose-50: oklch(96.9% 0.015 12.422);\\n --color-rose-100: oklch(94.1% 0.03 12.58);\\n --color-rose-200: oklch(89.2% 0.058 10.001);\\n --color-rose-300: oklch(81% 0.117 11.638);\\n --color-rose-400: oklch(71.2% 0.194 13.428);\\n --color-rose-500: oklch(64.5% 0.246 16.439);\\n --color-rose-600: oklch(58.6% 0.253 17.585);\\n --color-rose-700: oklch(51.4% 0.222 16.935);\\n --color-rose-800: oklch(45.5% 0.188 13.697);\\n --color-rose-900: oklch(41% 0.159 10.272);\\n --color-rose-950: oklch(27.1% 0.105 12.094);\\n\\n --color-slate-50: oklch(98.4% 0.003 247.858);\\n --color-slate-100: oklch(96.8% 0.007 247.896);\\n --color-slate-200: oklch(92.9% 0.013 255.508);\\n --color-slate-300: oklch(86.9% 0.022 252.894);\\n --color-slate-400: oklch(70.4% 0.04 256.788);\\n --color-slate-500: oklch(55.4% 0.046 257.417);\\n --color-slate-600: oklch(44.6% 0.043 257.281);\\n --color-slate-700: oklch(37.2% 0.044 257.287);\\n --color-slate-800: oklch(27.9% 0.041 260.031);\\n --color-slate-900: oklch(20.8% 0.042 265.755);\\n --color-slate-950: oklch(12.9% 0.042 264.695);\\n\\n --color-gray-50: oklch(98.5% 0.002 247.839);\\n --color-gray-100: oklch(96.7% 0.003 264.542);\\n --color-gray-200: oklch(92.8% 0.006 264.531);\\n --color-gray-300: oklch(87.2% 0.01 258.338);\\n --color-gray-400: oklch(70.7% 0.022 261.325);\\n --color-gray-500: oklch(55.1% 0.027 264.364);\\n --color-gray-600: oklch(44.6% 0.03 256.802);\\n --color-gray-700: oklch(37.3% 0.034 259.733);\\n --color-gray-800: oklch(27.8% 0.033 256.848);\\n --color-gray-900: oklch(21% 0.034 264.665);\\n --color-gray-950: oklch(13% 0.028 261.692);\\n\\n --color-zinc-50: oklch(98.5% 0 none);\\n --color-zinc-100: oklch(96.7% 0.001 286.375);\\n --color-zinc-200: oklch(92% 0.004 286.32);\\n --color-zinc-300: oklch(87.1% 0.006 286.286);\\n --color-zinc-400: oklch(70.5% 0.015 286.067);\\n --color-zinc-500: oklch(55.2% 0.016 285.938);\\n --color-zinc-600: oklch(44.2% 0.017 285.786);\\n --color-zinc-700: oklch(37% 0.013 285.805);\\n --color-zinc-800: oklch(27.4% 0.006 286.033);\\n --color-zinc-900: oklch(21% 0.006 285.885);\\n --color-zinc-950: oklch(14.1% 0.005 285.823);\\n\\n --color-neutral-50: oklch(98.5% 0 none);\\n --color-neutral-100: oklch(97% 0 none);\\n --color-neutral-200: oklch(92.2% 0 none);\\n --color-neutral-300: oklch(87% 0 none);\\n --color-neutral-400: oklch(70.8% 0 none);\\n --color-neutral-500: oklch(55.6% 0 none);\\n --color-neutral-600: oklch(43.9% 0 none);\\n --color-neutral-700: oklch(37.1% 0 none);\\n --color-neutral-800: oklch(26.9% 0 none);\\n --color-neutral-900: oklch(20.5% 0 none);\\n --color-neutral-950: oklch(14.5% 0 none);\\n\\n --color-stone-50: oklch(98.5% 0.001 106.423);\\n --color-stone-100: oklch(97% 0.001 106.424);\\n --color-stone-200: oklch(92.3% 0.003 48.717);\\n --color-stone-300: oklch(86.9% 0.005 56.366);\\n --color-stone-400: oklch(70.9% 0.01 56.259);\\n --color-stone-500: oklch(55.3% 0.013 58.071);\\n --color-stone-600: oklch(44.4% 0.011 73.639);\\n --color-stone-700: oklch(37.4% 0.01 67.558);\\n --color-stone-800: oklch(26.8% 0.007 34.298);\\n --color-stone-900: oklch(21.6% 0.006 56.043);\\n --color-stone-950: oklch(14.7% 0.004 49.25);\\n\\n --color-mauve-50: oklch(98.5% 0 none);\\n --color-mauve-100: oklch(96% 0.003 325.6);\\n --color-mauve-200: oklch(92.2% 0.005 325.62);\\n --color-mauve-300: oklch(86.5% 0.012 325.68);\\n --color-mauve-400: oklch(71.1% 0.019 323.02);\\n --color-mauve-500: oklch(54.2% 0.034 322.5);\\n --color-mauve-600: oklch(43.5% 0.029 321.78);\\n --color-mauve-700: oklch(36.4% 0.029 323.89);\\n --color-mauve-800: oklch(26.3% 0.024 320.12);\\n --color-mauve-900: oklch(21.2% 0.019 322.12);\\n --color-mauve-950: oklch(14.5% 0.008 326);\\n\\n --color-olive-50: oklch(98.8% 0.003 106.5);\\n --color-olive-100: oklch(96.6% 0.005 106.5);\\n --color-olive-200: oklch(93% 0.007 106.5);\\n --color-olive-300: oklch(88% 0.011 106.6);\\n --color-olive-400: oklch(73.7% 0.021 106.9);\\n --color-olive-500: oklch(58% 0.031 107.3);\\n --color-olive-600: oklch(46.6% 0.025 107.3);\\n --color-olive-700: oklch(39.4% 0.023 107.4);\\n --color-olive-800: oklch(28.6% 0.016 107.4);\\n --color-olive-900: oklch(22.8% 0.013 107.4);\\n --color-olive-950: oklch(15.3% 0.006 107.1);\\n\\n --color-mist-50: oklch(98.7% 0.002 197.1);\\n --color-mist-100: oklch(96.3% 0.002 197.1);\\n --color-mist-200: oklch(92.5% 0.005 214.3);\\n --color-mist-300: oklch(87.2% 0.007 219.6);\\n --color-mist-400: oklch(72.3% 0.014 214.4);\\n --color-mist-500: oklch(56% 0.021 213.5);\\n --color-mist-600: oklch(45% 0.017 213.2);\\n --color-mist-700: oklch(37.8% 0.015 216);\\n --color-mist-800: oklch(27.5% 0.011 216.9);\\n --color-mist-900: oklch(21.8% 0.008 223.9);\\n --color-mist-950: oklch(14.8% 0.004 228.8);\\n\\n --color-taupe-50: oklch(98.6% 0.002 67.8);\\n --color-taupe-100: oklch(96% 0.002 17.2);\\n --color-taupe-200: oklch(92.2% 0.005 34.3);\\n --color-taupe-300: oklch(86.8% 0.007 39.5);\\n --color-taupe-400: oklch(71.4% 0.014 41.2);\\n --color-taupe-500: oklch(54.7% 0.021 43.1);\\n --color-taupe-600: oklch(43.8% 0.017 39.3);\\n --color-taupe-700: oklch(36.7% 0.016 35.7);\\n --color-taupe-800: oklch(26.8% 0.011 36.5);\\n --color-taupe-900: oklch(21.4% 0.009 43.1);\\n --color-taupe-950: oklch(14.7% 0.004 49.3);\\n\\n --color-black: #000;\\n --color-white: #fff;\\n\\n --spacing: 0.25rem;\\n\\n --breakpoint-sm: 40rem;\\n --breakpoint-md: 48rem;\\n --breakpoint-lg: 64rem;\\n --breakpoint-xl: 80rem;\\n --breakpoint-2xl: 96rem;\\n\\n --container-3xs: 16rem;\\n --container-2xs: 18rem;\\n --container-xs: 20rem;\\n --container-sm: 24rem;\\n --container-md: 28rem;\\n --container-lg: 32rem;\\n --container-xl: 36rem;\\n --container-2xl: 42rem;\\n --container-3xl: 48rem;\\n --container-4xl: 56rem;\\n --container-5xl: 64rem;\\n --container-6xl: 72rem;\\n --container-7xl: 80rem;\\n\\n --text-xs: 0.75rem;\\n --text-xs--line-height: calc(1 / 0.75);\\n --text-sm: 0.875rem;\\n --text-sm--line-height: calc(1.25 / 0.875);\\n --text-base: 1rem;\\n --text-base--line-height: calc(1.5 / 1);\\n --text-lg: 1.125rem;\\n --text-lg--line-height: calc(1.75 / 1.125);\\n --text-xl: 1.25rem;\\n --text-xl--line-height: calc(1.75 / 1.25);\\n --text-2xl: 1.5rem;\\n --text-2xl--line-height: calc(2 / 1.5);\\n --text-3xl: 1.875rem;\\n --text-3xl--line-height: calc(2.25 / 1.875);\\n --text-4xl: 2.25rem;\\n --text-4xl--line-height: calc(2.5 / 2.25);\\n --text-5xl: 3rem;\\n --text-5xl--line-height: 1;\\n --text-6xl: 3.75rem;\\n --text-6xl--line-height: 1;\\n --text-7xl: 4.5rem;\\n --text-7xl--line-height: 1;\\n --text-8xl: 6rem;\\n --text-8xl--line-height: 1;\\n --text-9xl: 8rem;\\n --text-9xl--line-height: 1;\\n\\n --font-weight-thin: 100;\\n --font-weight-extralight: 200;\\n --font-weight-light: 300;\\n --font-weight-normal: 400;\\n --font-weight-medium: 500;\\n --font-weight-semibold: 600;\\n --font-weight-bold: 700;\\n --font-weight-extrabold: 800;\\n --font-weight-black: 900;\\n\\n --tracking-tighter: -0.05em;\\n --tracking-tight: -0.025em;\\n --tracking-normal: 0em;\\n --tracking-wide: 0.025em;\\n --tracking-wider: 0.05em;\\n --tracking-widest: 0.1em;\\n\\n --leading-tight: 1.25;\\n --leading-snug: 1.375;\\n --leading-normal: 1.5;\\n --leading-relaxed: 1.625;\\n --leading-loose: 2;\\n\\n --radius-xs: 0.125rem;\\n --radius-sm: 0.25rem;\\n --radius-md: 0.375rem;\\n --radius-lg: 0.5rem;\\n --radius-xl: 0.75rem;\\n --radius-2xl: 1rem;\\n --radius-3xl: 1.5rem;\\n --radius-4xl: 2rem;\\n\\n --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\\n\\n --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\\n --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\\n --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\\n\\n --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\\n --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\\n --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\\n --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\\n --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\\n\\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\\n --text-shadow-sm:\\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\\n --text-shadow-md:\\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\\n --text-shadow-lg:\\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\\n\\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\\n\\n --animate-spin: spin 1s linear infinite;\\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\\n --animate-bounce: bounce 1s infinite;\\n\\n @keyframes spin {\\n to {\\n transform: rotate(360deg);\\n }\\n }\\n\\n @keyframes ping {\\n 75%,\\n 100% {\\n transform: scale(2);\\n opacity: 0;\\n }\\n }\\n\\n @keyframes pulse {\\n 50% {\\n opacity: 0.5;\\n }\\n }\\n\\n @keyframes bounce {\\n 0%,\\n 100% {\\n transform: translateY(-25%);\\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\\n }\\n\\n 50% {\\n transform: none;\\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\\n }\\n }\\n\\n --blur-xs: 4px;\\n --blur-sm: 8px;\\n --blur-md: 12px;\\n --blur-lg: 16px;\\n --blur-xl: 24px;\\n --blur-2xl: 40px;\\n --blur-3xl: 64px;\\n\\n --perspective-dramatic: 100px;\\n --perspective-near: 300px;\\n --perspective-normal: 500px;\\n --perspective-midrange: 800px;\\n --perspective-distant: 1200px;\\n\\n --aspect-video: 16 / 9;\\n\\n --default-transition-duration: 150ms;\\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\\n --default-font-family: --theme(--font-sans, initial);\\n --default-font-feature-settings: --theme(--font-sans--font-feature-settings, initial);\\n --default-font-variation-settings: --theme(--font-sans--font-variation-settings, initial);\\n --default-mono-font-family: --theme(--font-mono, initial);\\n --default-mono-font-feature-settings: --theme(--font-mono--font-feature-settings, initial);\\n --default-mono-font-variation-settings: --theme(--font-mono--font-variation-settings, initial);\\n}\\n\\n/* Deprecated */\\n@theme default inline reference {\\n --blur: 8px;\\n --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\\n --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\\n --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\\n --radius: 0.25rem;\\n --max-width-prose: 65ch;\\n}\\n\";\n\n/** tailwindcss/preflight.css */\nexport const PREFLIGHT_CSS = \"/*\\n 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\\n 2. Remove default margins and padding\\n 3. Reset all borders.\\n*/\\n\\n*,\\n::after,\\n::before,\\n::backdrop,\\n::file-selector-button {\\n box-sizing: border-box; /* 1 */\\n margin: 0; /* 2 */\\n padding: 0; /* 2 */\\n border: 0 solid; /* 3 */\\n}\\n\\n/*\\n 1. Use a consistent sensible line-height in all browsers.\\n 2. Prevent adjustments of font size after orientation changes in iOS.\\n 3. Use a more readable tab size.\\n 4. Use the user's configured `sans` font-family by default.\\n 5. Use the user's configured `sans` font-feature-settings by default.\\n 6. Use the user's configured `sans` font-variation-settings by default.\\n 7. Disable tap highlights on iOS.\\n*/\\n\\nhtml,\\n:host {\\n line-height: 1.5; /* 1 */\\n -webkit-text-size-adjust: 100%; /* 2 */\\n tab-size: 4; /* 3 */\\n font-family: --theme(\\n --default-font-family,\\n -apple-system,\\n BlinkMacSystemFont,\\n 'Segoe UI',\\n Roboto,\\n 'Helvetica Neue',\\n 'Noto Sans',\\n Arial,\\n sans-serif,\\n 'Apple Color Emoji',\\n 'Segoe UI Emoji',\\n 'Segoe UI Symbol',\\n 'Noto Color Emoji'\\n ); /* 4 */\\n font-feature-settings: --theme(--default-font-feature-settings, normal); /* 5 */\\n font-variation-settings: --theme(--default-font-variation-settings, normal); /* 6 */\\n -webkit-tap-highlight-color: transparent; /* 7 */\\n}\\n\\n/*\\n 1. Add the correct height in Firefox.\\n 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\\n 3. Reset the default border style to a 1px solid border.\\n*/\\n\\nhr {\\n height: 0; /* 1 */\\n color: inherit; /* 2 */\\n border-top-width: 1px; /* 3 */\\n}\\n\\n/*\\n Add the correct text decoration in Chrome, Edge, and Safari.\\n*/\\n\\nabbr:where([title]) {\\n -webkit-text-decoration: underline dotted;\\n text-decoration: underline dotted;\\n}\\n\\n/*\\n Remove the default font size and weight for headings.\\n*/\\n\\nh1,\\nh2,\\nh3,\\nh4,\\nh5,\\nh6 {\\n font-size: inherit;\\n font-weight: inherit;\\n}\\n\\n/*\\n Reset links to optimize for opt-in styling instead of opt-out.\\n*/\\n\\na {\\n color: inherit;\\n -webkit-text-decoration: inherit;\\n text-decoration: inherit;\\n}\\n\\n/*\\n Add the correct font weight in Edge and Safari.\\n*/\\n\\nb,\\nstrong {\\n font-weight: bolder;\\n}\\n\\n/*\\n 1. Use the user's configured `mono` font-family by default.\\n 2. Use the user's configured `mono` font-feature-settings by default.\\n 3. Use the user's configured `mono` font-variation-settings by default.\\n 4. Correct the odd `em` font sizing in all browsers.\\n*/\\n\\ncode,\\nkbd,\\nsamp,\\npre {\\n font-family: --theme(\\n --default-mono-font-family,\\n ui-monospace,\\n SFMono-Regular,\\n Menlo,\\n Monaco,\\n Consolas,\\n 'Liberation Mono',\\n 'Courier New',\\n monospace\\n ); /* 1 */\\n font-feature-settings: --theme(--default-mono-font-feature-settings, normal); /* 2 */\\n font-variation-settings: --theme(--default-mono-font-variation-settings, normal); /* 3 */\\n font-size: 1em; /* 4 */\\n}\\n\\n/*\\n Add the correct font size in all browsers.\\n*/\\n\\nsmall {\\n font-size: 80%;\\n}\\n\\n/*\\n Prevent `sub` and `sup` elements from affecting the line height in all browsers.\\n*/\\n\\nsub,\\nsup {\\n font-size: 75%;\\n line-height: 0;\\n position: relative;\\n vertical-align: baseline;\\n}\\n\\nsub {\\n bottom: -0.25em;\\n}\\n\\nsup {\\n top: -0.5em;\\n}\\n\\n/*\\n 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\\n 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\\n 3. Remove gaps between table borders by default.\\n*/\\n\\ntable {\\n text-indent: 0; /* 1 */\\n border-color: inherit; /* 2 */\\n border-collapse: collapse; /* 3 */\\n}\\n\\n/*\\n Use the modern Firefox focus style for all focusable elements.\\n*/\\n\\n:-moz-focusring:where(:not(iframe)) {\\n outline: auto;\\n}\\n\\n/*\\n Add the correct vertical alignment in Chrome and Firefox.\\n*/\\n\\nprogress {\\n vertical-align: baseline;\\n}\\n\\n/*\\n Add the correct display in Chrome and Safari.\\n*/\\n\\nsummary {\\n display: list-item;\\n}\\n\\n/*\\n Make lists unstyled by default.\\n*/\\n\\nol,\\nul,\\nmenu {\\n list-style: none;\\n}\\n\\n/*\\n 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\\n 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\\n This can trigger a poorly considered lint error in some tools but is included by design.\\n*/\\n\\nimg,\\nsvg,\\nvideo,\\ncanvas,\\naudio,\\niframe,\\nembed,\\nobject {\\n display: block; /* 1 */\\n vertical-align: middle; /* 2 */\\n}\\n\\n/*\\n Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\\n*/\\n\\nimg,\\nvideo {\\n max-width: 100%;\\n height: auto;\\n}\\n\\n/*\\n 1. Inherit font styles in all browsers.\\n 2. Remove border radius in all browsers.\\n 3. Remove background color in all browsers.\\n 4. Ensure consistent opacity for disabled states in all browsers.\\n*/\\n\\nbutton,\\ninput,\\nselect,\\noptgroup,\\ntextarea,\\n::file-selector-button {\\n font: inherit; /* 1 */\\n font-feature-settings: inherit; /* 1 */\\n font-variation-settings: inherit; /* 1 */\\n letter-spacing: inherit; /* 1 */\\n color: inherit; /* 1 */\\n border-radius: 0; /* 2 */\\n background-color: transparent; /* 3 */\\n opacity: 1; /* 4 */\\n}\\n\\n/*\\n Restore default font weight.\\n*/\\n\\n:where(select:is([multiple], [size])) optgroup {\\n font-weight: bolder;\\n}\\n\\n/*\\n Restore indentation.\\n*/\\n\\n:where(select:is([multiple], [size])) optgroup option {\\n padding-inline-start: 20px;\\n}\\n\\n/*\\n Restore space after button.\\n*/\\n\\n::file-selector-button {\\n margin-inline-end: 4px;\\n}\\n\\n/*\\n Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\\n*/\\n\\n::placeholder {\\n opacity: 1;\\n}\\n\\n/*\\n Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\\n crash when using `color-mix(…)` with `currentcolor`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\\n*/\\n\\n@supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\\n (contain-intrinsic-size: 1px) /* Safari 17+ */ {\\n ::placeholder {\\n color: color-mix(in oklab, currentcolor 50%, transparent);\\n }\\n}\\n\\n/*\\n Prevent resizing textareas horizontally by default.\\n*/\\n\\ntextarea {\\n resize: vertical;\\n}\\n\\n/*\\n Remove the inner padding in Chrome and Safari on macOS.\\n*/\\n\\n::-webkit-search-decoration {\\n -webkit-appearance: none;\\n}\\n\\n/*\\n 1. Ensure date/time inputs have the same height when empty in iOS Safari.\\n 2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\\n*/\\n\\n::-webkit-date-and-time-value {\\n min-height: 1lh; /* 1 */\\n text-align: inherit; /* 2 */\\n}\\n\\n/*\\n Prevent height from changing on date/time inputs in macOS Safari when the input is set to `display: block`.\\n*/\\n\\n::-webkit-datetime-edit {\\n display: inline-flex;\\n}\\n\\n/*\\n Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\\n*/\\n\\n::-webkit-datetime-edit-fields-wrapper {\\n padding: 0;\\n}\\n\\n::-webkit-datetime-edit,\\n::-webkit-datetime-edit-year-field,\\n::-webkit-datetime-edit-month-field,\\n::-webkit-datetime-edit-day-field,\\n::-webkit-datetime-edit-hour-field,\\n::-webkit-datetime-edit-minute-field,\\n::-webkit-datetime-edit-second-field,\\n::-webkit-datetime-edit-millisecond-field,\\n::-webkit-datetime-edit-meridiem-field {\\n padding-block: 0;\\n}\\n\\n/*\\n Center dropdown marker shown on inputs with paired `<datalist>`s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\\n*/\\n\\n::-webkit-calendar-picker-indicator {\\n line-height: 1;\\n}\\n\\n/*\\n Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\\n*/\\n\\n:-moz-ui-invalid {\\n box-shadow: none;\\n}\\n\\n/*\\n Correct the inability to style the border radius in iOS Safari.\\n*/\\n\\nbutton,\\ninput:where([type='button'], [type='reset'], [type='submit']),\\n::file-selector-button {\\n appearance: button;\\n}\\n\\n/*\\n Correct the cursor style of increment and decrement buttons in Safari.\\n*/\\n\\n::-webkit-inner-spin-button,\\n::-webkit-outer-spin-button {\\n height: auto;\\n}\\n\\n/*\\n Make elements with the HTML hidden attribute stay hidden by default.\\n*/\\n\\n[hidden]:where(:not([hidden='until-found'])) {\\n display: none !important;\\n}\\n\";\n\n/** tailwindcss/utilities.css */\nexport const UTILITIES_CSS = \"@tailwind utilities;\\n\";\n\n/** 虚拟样式表映射:编译时 loadStylesheet 按 `tailwindcss/<name>.css` 查这张表。 */\nexport const TW_SHEETS: Readonly<Record<string, string>> = {\n 'tailwindcss/theme.css': THEME_CSS,\n 'tailwindcss/preflight.css': PREFLIGHT_CSS,\n 'tailwindcss/utilities.css': UTILITIES_CSS\n};\n","import { THEME_PT_ID } from '../rules/index.js';\n\n/**\n * 主题:`<style type=\"text/tailwindcss\" data-pt-id=\"theme\">` 里的 @theme 块内容。\n *\n * 它是缓存的键:一个 class 成不成立、tailwind-merge 认不认得某个 token,\n * 都取决于当前主题。\n */\n\nexport interface Theme {\n /** @theme 块的原文(含 `@theme { … }` 外壳)。 */\n source: string;\n /** 内容 hash,作为缓存键。 */\n hash: string;\n}\n\nexport const EMPTY_THEME: Theme = { source: '', hash: '0' };\n\n/** 从文档里取出主题块。取不到就是空主题。 */\nexport function themeOf(root: Document | DocumentFragment | Element): Theme {\n const el =\n root.querySelector(`style[data-pt-id=\"${THEME_PT_ID}\"]`) ??\n root.querySelector('style[type=\"text/tailwindcss\"]');\n if (!el) return EMPTY_THEME;\n return themeFromSource(el.textContent ?? '');\n}\n\nexport function themeFromSource(source: string): Theme {\n return { source, hash: hashString(source) };\n}\n\n/**\n * FNV-1a 32 位。\n *\n * 只用作缓存键,不做正确性判断 —— 所以不需要加密强度,但**必须两侧同算法**,\n * 否则同一主题在浏览器与 Node 会落到不同的缓存条目(那只是浪费,不会出错,\n * 但也没有理由让它发生)。\n */\nexport function hashString(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/**\n * 从 @theme 原文里抽出各命名空间的 token 名。\n * 供 tailwind-merge 的 class group 派生 —— token 名是每页自定义的,\n * 模块级单例配置认不出它们。\n */\nexport interface ThemeTokens {\n color: string[];\n text: string[];\n spacing: string[];\n radius: string[];\n shadow: string[];\n font: string[];\n}\n\nconst NAMESPACES: Array<[keyof ThemeTokens, string]> = [\n ['color', '--color-'],\n ['text', '--text-'],\n ['spacing', '--spacing-'],\n ['radius', '--radius-'],\n ['shadow', '--shadow-'],\n ['font', '--font-']\n];\n\nexport function themeTokens(theme: Theme): ThemeTokens {\n const out: ThemeTokens = { color: [], text: [], spacing: [], radius: [], shadow: [], font: [] };\n // 只扫声明名,不解析值 —— 我们要的只是 token 名。\n const re = /--[a-z0-9-]+(?=\\s*:)/gi;\n const seen = new Set<string>();\n for (const match of theme.source.matchAll(re)) {\n const name = match[0];\n if (seen.has(name)) continue;\n seen.add(name);\n for (const [key, prefix] of NAMESPACES) {\n if (name.startsWith(prefix)) {\n const token = name.slice(prefix.length);\n // `--text-display-1--line-height` 这类派生声明不算独立 token。\n if (token && !token.includes('--')) out[key].push(token);\n break;\n }\n }\n }\n return out;\n}\n","/**\n * 内置组件的公开面。以 `components` 命名空间整体导出(同 `compile` / `guards` 的惯例),\n * 这样加一件组件、加一个契约字段都不必动顶层导出名的锁定测试 —— 那条锁该盯的是\n * 「公开面多了一整块能力」,不是「契约里多了一个字段」。\n */\n\nexport { renderHtml, renderCss, renderJs } from './render.js';\nexport {\n COMPONENT_CONTRACTS,\n COMPONENT_TYPES,\n carouselContract,\n faqContract,\n tabsContract,\n formContract,\n stickyCtaContract\n} from './contracts.js';\nexport { resolveComponent } from './resolve.js';\nexport { SETTING_TYPES } from './contract.js';\nexport { BLOCKS_KEY } from './settings.js';\n\nexport type {\n SettingType,\n SettingValue,\n ComponentContract,\n ComponentBlockSpec,\n ComponentSettingSpec\n} from './contract.js';\nexport type { ComponentSettings, ComponentBlockValue } from './settings.js';\nexport type { ResolvedComponent, ResolvedBlock, ResolvedSettings } from './resolve.js';\n","/**\n * 五件渲染器共用的小工具。\n *\n * 转义**直接复用 canonical serializer 的 R4 / R5**(`serialize/canonical.ts`),\n * 不另写一份:渲染产物会与源一起进出 parse → serialize,两套转义规则会让同一份产物\n * 在往返后变字节,而「浏览器与 Node 两端 apply/序列化逐字节相同」正是这个包存在的理由。\n */\n\nimport { escapeAttribute, escapeText } from '../../serialize/canonical.js';\nimport type { ResolvedSettings } from '../resolve.js';\n\n/** 文本内容转义(`text` 型字段)。`richtext` 型**不过**这里 —— 它按契约原样插入。 */\nexport const esc = escapeText;\n\n/** 属性值转义。 */\nexport const escAttr = escapeAttribute;\n\n/**\n * 读一个字符串型字段。\n *\n * `resolveComponent` 已经保证「契约里每个字段都在场,且类型与契约一致」,所以这里\n * 不再兜底 —— 兜底会把「契约与渲染器对不上」这类真 bug 静默掉,那正是 v2 的病。\n */\nexport function str(settings: ResolvedSettings, id: string): string {\n return settings[id] as string;\n}\n\nexport function num(settings: ResolvedSettings, id: string): number {\n return settings[id] as number;\n}\n\nexport function bool(settings: ResolvedSettings, id: string): boolean {\n return settings[id] as boolean;\n}\n\nexport function list(settings: ResolvedSettings, id: string): readonly string[] {\n return settings[id] as readonly string[];\n}\n\n/**\n * 脚本产物的统一外壳:IIFE + 全量发现 + 幂等 + 不依赖自身位置(design D5)。\n *\n * 三条要求在这里一次做对,五件各自只写 `init(root)`:\n *\n * - **全量发现**:`querySelectorAll('[data-pt-component=\"<type>\"]')`,不是\n * `document.currentScript.closest(...)`。v2 那个写法在「按类型去重」之后完全失效 ——\n * 一份脚本要服务任意多个实例,而 `currentScript` 只认得它自己紧邻的那一棵树。\n * - **幂等**:已初始化的实例在元素上打属性标记后跳过。画布会反复注入、宿主会重放,\n * 漏了这条的症状是「越点越卡」「一次点击触发两次」。用元素自身属性而不是闭包里的\n * Set:重复注入是**两个不同的闭包**,闭包里的标记互相看不见。\n * - **不依赖位置**:脚本可能在 `<head>`(DOM 还没解析完),也可能在 body 末尾。\n * `readyState === 'loading'` 时等 `DOMContentLoaded`,否则立即扫。\n *\n * 标记用 JS 属性(`el[FLAG]`)而不是 DOM 属性:DOM 属性会进 `innerHTML`,\n * 万一哪个宿主从 DOM 回读,标记就漏进了源。\n */\nexport function componentScript(type: string, initBody: string): string {\n // 类型 id 是 kebab 标识符(契约的锁定测试盯着),所以能安全地用单引号包一个内含\n // 双引号的选择器 —— 比 JSON.stringify 出来的 \"[data-pt-component=\\\"faq\\\"]\" 可读,\n // 而这些产物是要进 golden、要被人一眼看懂的。\n if (!/^[a-z][a-z0-9-]*$/.test(type)) throw new TypeError(type);\n return (\n '(function(){' +\n `var T='[data-pt-component=\"${type}\"]',F='__pt_${type.replace(/-/g, '_')}';` +\n `function init(root){if(root[F])return;root[F]=1;${initBody}}` +\n 'function scan(){var l=document.querySelectorAll(T);for(var i=0;i<l.length;i++)init(l[i]);}' +\n \"if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',scan);else scan();\" +\n '})();'\n );\n}\n","/**\n * 轮播。从 v2 `componentRenderers.ts:renderSwiper` 翻译。\n *\n * **类名一个 `swiper` 都不许有。** v2 叫 swiper,而 `ptengine-sdk` 的表单模块用\n * `.swiper-slide` 圈定校验范围 —— 落地页里出现同名类,弹窗表单会永远校验失败。\n * 这里统一 `ptc-carousel-*`,并有一条断言盯着产物里搜不到 `swiper`。\n *\n * **滑动交给 CSS scroll-snap,脚本只管自动播 / 圆点 / 箭头。** v2 是「绝对定位叠放\n * 一堆 slide,脚本逐个 `style.display`」:脚本一停,整件就只剩第一页,而且触摸滑动\n * 完全没有。scroll-snap 版反过来 —— 不跑脚本也能用手指滑,脚本只是补上圆点与自动播。\n *\n * 图片用真 `<img>` 而不是 v2 的 `background-image`:预览链路只渲染 html + css,\n * 背景图在那里也能出,但 `<img>` 还白捡 alt、lazy 与 srcset 的余地,而且**产物里\n * 一条内联 style 都不需要** —— v2 那条 `background-image:url('…')` 是内联样式,\n * 而 v4 的格式只给 `--pt-` 前缀开口子。\n *\n * `peek` 档没有翻译:v2 的枚举里有它,实现里直接回落 hero(文件头自己写着未实现),\n * 契约已收敛成 `hero | image`。\n */\n\nimport type { ComponentRenderer } from '../render.js';\nimport type { ResolvedComponent } from '../resolve.js';\nimport { bool, componentScript, esc, escAttr, num, str } from './shared.js';\n\nexport const carouselRenderer: ComponentRenderer = {\n html(instance: ResolvedComponent): string {\n const layout = str(instance.settings, 'layout');\n const imageOnly = layout === 'image';\n const slides = instance.blocks.filter(b => b.type === 'slide');\n const many = slides.length > 1;\n const showDots = bool(instance.settings, 'showDots') && many;\n const showArrows = bool(instance.settings, 'showArrows') && many;\n\n const track = slides\n .map(slide => {\n const image = str(slide.settings, 'image');\n const title = str(slide.settings, 'title');\n const subtitle = str(slide.settings, 'subtitle');\n const buttonText = str(slide.settings, 'buttonText');\n // alt 用标题:图片是装饰时标题多半也空着,alt=\"\" 正是装饰图该有的值。\n const img = image\n ? `<img class=\"ptc-carousel-img\" src=\"${escAttr(image)}\" alt=\"${escAttr(title)}\" loading=\"lazy\">`\n : '';\n // image 档不出文案与按钮 —— 这是结构差异,不是外观档位。\n const body = imageOnly\n ? ''\n : [\n title ? `<h3 class=\"ptc-carousel-title\">${esc(title)}</h3>` : '',\n subtitle ? `<p class=\"ptc-carousel-sub\">${esc(subtitle)}</p>` : '',\n buttonText\n ? `<a class=\"ptc-carousel-btn\" href=\"${escAttr(str(slide.settings, 'buttonUrl'))}\">${esc(buttonText)}</a>`\n : ''\n ].join('');\n return (\n '<div class=\"ptc-carousel-slide\">' +\n img +\n (body ? `<div class=\"ptc-carousel-body\">${body}</div>` : '') +\n '</div>'\n );\n })\n .join('');\n\n const dots = showDots\n ? '<div class=\"ptc-carousel-dots\">' +\n slides\n .map(\n (_, i) =>\n `<button type=\"button\" class=\"ptc-carousel-dot\" data-go=\"${i}\"` +\n ` aria-current=\"${i === 0 ? 'true' : 'false'}\"></button>`\n )\n .join('') +\n '</div>'\n : '';\n\n const arrows = showArrows\n ? '<button type=\"button\" class=\"ptc-carousel-arrow\" data-go=\"prev\">‹</button>' +\n '<button type=\"button\" class=\"ptc-carousel-arrow\" data-go=\"next\">›</button>'\n : '';\n\n // 自动播的两个参数由脚本从这里读 —— 闭包里不存任何实例信息。\n return (\n `<div class=\"ptc-carousel\" data-carousel-layout=\"${escAttr(layout)}\"` +\n ` data-autoplay=\"${bool(instance.settings, 'autoplay') && many ? 'true' : 'false'}\"` +\n ` data-interval=\"${num(instance.settings, 'interval')}\">` +\n `<div class=\"ptc-carousel-track\">${track}</div>` +\n dots +\n arrows +\n '</div>'\n );\n },\n\n css(): string {\n return [\n '.ptc-carousel{position:relative;width:100%}',\n // 滑动本体:不跑脚本也能用手指滑。\n '.ptc-carousel-track{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none}',\n '.ptc-carousel-track::-webkit-scrollbar{display:none}',\n '.ptc-carousel-slide{position:relative;flex:0 0 100%;scroll-snap-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:calc(var(--spacing)*2);aspect-ratio:16/9;overflow:hidden;background:var(--pt-carousel-slide-bg,color-mix(in oklab,currentColor 6%,transparent))}',\n '.ptc-carousel-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}',\n '.ptc-carousel-body{position:relative;padding:calc(var(--spacing)*6)}',\n '.ptc-carousel-title{margin:0;font-size:2em;font-weight:700}',\n '.ptc-carousel-sub{margin:calc(var(--spacing)*2) 0 0}',\n '.ptc-carousel-btn{display:inline-block;margin-top:calc(var(--spacing)*4);padding:calc(var(--spacing)*3) calc(var(--spacing)*7);border-radius:var(--radius-lg);text-decoration:none;background:var(--pt-carousel-btn-bg,currentColor);color:var(--pt-carousel-btn-fg,white)}',\n '.ptc-carousel-dots{position:absolute;left:0;right:0;bottom:calc(var(--spacing)*4);display:flex;justify-content:center;gap:calc(var(--spacing)*2)}',\n '.ptc-carousel-dot{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5);padding:0;border:0;border-radius:var(--radius-4xl);cursor:pointer;background:var(--pt-carousel-dot-off,color-mix(in oklab,currentColor 25%,transparent))}',\n '.ptc-carousel-dot[aria-current=\"true\"]{background:var(--pt-carousel-dot-on,currentColor)}',\n '.ptc-carousel-arrow{position:absolute;top:50%;translate:0 -50%;display:flex;align-items:center;justify-content:center;width:calc(var(--spacing)*9);height:calc(var(--spacing)*9);border:0;border-radius:var(--radius-4xl);cursor:pointer;font-size:1.25em;line-height:1;background:var(--pt-carousel-arrow-bg,color-mix(in oklab,currentColor 20%,transparent))}',\n '.ptc-carousel-arrow[data-go=\"prev\"]{left:calc(var(--spacing)*3)}',\n '.ptc-carousel-arrow[data-go=\"next\"]{right:calc(var(--spacing)*3)}',\n // image 档没有文案层,body 不渲染;这条只是把 padding 的余味也去掉。\n '[data-carousel-layout=\"image\"] .ptc-carousel-slide{gap:0}',\n '@media (prefers-reduced-motion:reduce){.ptc-carousel-track{scroll-behavior:auto}}'\n ].join('');\n },\n\n js(): string {\n // 位置由 scrollLeft 反推,不由闭包里的 cur 变量记 —— 用户用手指滑的时候没有人\n // 通知脚本,自己记的那个下标会和真实位置越走越远(v2 没有触摸滑动,不存在这问题)。\n return componentScript(\n 'carousel',\n \"var tk=root.querySelector('.ptc-carousel-track');if(!tk)return;\" +\n \"var dt=root.querySelectorAll('.ptc-carousel-dot');\" +\n 'function at(){return tk.clientWidth?Math.round(tk.scrollLeft/tk.clientWidth):0;}' +\n 'function go(i){var n=tk.children.length;if(!n)return;' +\n 'var t=((i%n)+n)%n;tk.scrollTo({left:t*tk.clientWidth,behavior:\"smooth\"});}' +\n \"function sync(){var c=at();for(var i=0;i<dt.length;i++)dt[i].setAttribute('aria-current',i===c?'true':'false');}\" +\n \"tk.addEventListener('scroll',sync);\" +\n \"root.addEventListener('click',function(e){\" +\n 'var t=e.target,el=t&&t.closest?t.closest(\"[data-go]\"):null;' +\n 'if(!el||!root.contains(el))return;' +\n \"var v=el.getAttribute('data-go');\" +\n \"if(v==='prev')go(at()-1);else if(v==='next')go(at()+1);else go(parseInt(v,10));});\" +\n \"if(root.getAttribute('data-autoplay')==='true'){\" +\n \"var ms=parseInt(root.getAttribute('data-interval'),10);\" +\n 'if(ms>0)setInterval(function(){go(at()+1);},ms);}' +\n 'sync();'\n );\n }\n};\n","/**\n * 常见问题(accordion / list)。从 v2 `componentRenderers.ts:renderFaq` 翻译。\n *\n * 与 v2 的三处实质差别:\n *\n * 1. **外观全部出 settings**。v2 的 18 个组件级字段里 12 个是颜色 / 字号 / 圆角 /\n * 间距,靠 settings 传进去写成内联 style。这里只剩 `title` / `style` / `iconStyle`\n * 三个(内容与结构),外观由使用方在组件节点上写 class、由页面 `@theme` 的刻度变量\n * 定圆角与间距、由三个 `--pt-faq-*` 变量定颜色。\n * 2. **`<details>` 结构保留**,所以**不跑脚本也能展开** —— 这是浏览器原生行为,\n * 也是「无脚本时内容可读」那条的底气。脚本只多做一件事:开一收其余。\n * 3. **一份 CSS / 一份脚本服务全部实例**。v2 是每实例一个 `.ptc-faq-<id>` 类加一段\n * 烤进 markup 的 `<script>`。\n *\n * `answer` 是 `richtext`(原样插入),`question` 是 `text`(转义)—— 这个区别在 v2 里\n * 只存在于渲染器代码里(`esc(question)` 对 `String(answer)`),没进 schema,于是面板\n * 与 AI 都看不见它。它关乎注入面,所以在 v4 里是契约的一部分。\n */\n\nimport type { ComponentRenderer } from '../render.js';\nimport type { ResolvedComponent } from '../resolve.js';\nimport { componentScript, esc, escAttr, str } from './shared.js';\n\n/** chevron 一个字形靠 CSS 旋转;plus 两个字形靠 CSS 显隐 —— 都不需要脚本。 */\nfunction icon(kind: string): string {\n if (kind === 'plus') {\n return (\n '<span class=\"ptc-faq-ic\" aria-hidden=\"true\">' +\n '<span class=\"ptc-faq-ic-p\">+</span>' +\n '<span class=\"ptc-faq-ic-m\">−</span>' +\n '</span>'\n );\n }\n return '<span class=\"ptc-faq-ic\" aria-hidden=\"true\">›</span>';\n}\n\nfunction item(question: string, answer: string, open: boolean, listStyle: boolean, ic: string): string {\n const q = esc(question);\n if (listStyle) {\n // list 档没有 <details>:全部展开,脚本对它无事可做。\n return (\n '<div class=\"ptc-faq-item\">' +\n `<div class=\"ptc-faq-q\">${q}</div>` +\n `<div class=\"ptc-faq-a\">${answer}</div>` +\n '</div>'\n );\n }\n return (\n `<details class=\"ptc-faq-item\"${open ? ' open' : ''}>` +\n `<summary class=\"ptc-faq-q\"><span>${q}</span>${ic}</summary>` +\n `<div class=\"ptc-faq-a\">${answer}</div>` +\n '</details>'\n );\n}\n\nexport const faqRenderer: ComponentRenderer = {\n html(instance: ResolvedComponent): string {\n const style = str(instance.settings, 'style');\n const iconStyle = str(instance.settings, 'iconStyle');\n const title = str(instance.settings, 'title');\n const listStyle = style === 'list';\n const ic = icon(iconStyle);\n\n const head = title ? `<h3 class=\"ptc-faq-title\">${esc(title)}</h3>` : '';\n const items = instance.blocks\n .filter(b => b.type === 'item')\n .map(b =>\n item(\n str(b.settings, 'question'),\n // richtext:按契约原样插入,不转义。\n str(b.settings, 'answer'),\n b.settings['defaultOpen'] === true,\n listStyle,\n ic\n )\n )\n .join('');\n\n // 实例差异只经由 data-* 属性 —— 外观由属性选择器在那一份 CSS 里管。\n return (\n `<div class=\"ptc-faq\" data-faq-style=\"${escAttr(style)}\" data-faq-icon=\"${escAttr(iconStyle)}\">` +\n head +\n `<div class=\"ptc-faq-items\">${items}</div>` +\n '</div>'\n );\n },\n\n css(): string {\n // 刻度走页面 @theme(圆角 / 间距 / 字号),颜色走 --pt-faq-* 且默认从 currentColor\n // 派生 —— 写死灰值会让组件在深色主题下自己脱节。\n return [\n '.ptc-faq{width:100%}',\n '.ptc-faq-title{margin:0 0 calc(var(--spacing)*10);font-size:1.5em;font-weight:700}',\n '.ptc-faq-items{display:flex;flex-direction:column;gap:calc(var(--spacing)*2)}',\n '.ptc-faq-item{border:1px solid var(--pt-faq-border,color-mix(in oklab,currentColor 15%,transparent));border-radius:var(--radius-lg);overflow:hidden}',\n '.ptc-faq-q{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing)*3);padding:calc(var(--spacing)*3) calc(var(--spacing)*4);font-weight:500}',\n '.ptc-faq-a{padding:calc(var(--spacing)*3) calc(var(--spacing)*4);line-height:1.6;color:var(--pt-faq-answer-fg,color-mix(in oklab,currentColor 70%,transparent))}',\n 'details.ptc-faq-item>.ptc-faq-q{cursor:pointer;list-style:none;background:var(--pt-faq-summary-bg,color-mix(in oklab,currentColor 4%,transparent))}',\n 'details.ptc-faq-item>.ptc-faq-q::-webkit-details-marker{display:none}',\n '.ptc-faq-ic{flex:none;font-size:1.2em;line-height:1}',\n // chevron:靠旋转表达开合,一个字形。\n '[data-faq-icon=\"chevron\"] .ptc-faq-ic{transition:transform .2s}',\n '[data-faq-icon=\"chevron\"] details[open]>.ptc-faq-q .ptc-faq-ic{transform:rotate(90deg)}',\n // plus:两个字形,显隐由 [open] 决定,同样不需要脚本。\n '[data-faq-icon=\"plus\"] .ptc-faq-ic-m{display:none}',\n '[data-faq-icon=\"plus\"] details[open]>.ptc-faq-q .ptc-faq-ic-p{display:none}',\n '[data-faq-icon=\"plus\"] details[open]>.ptc-faq-q .ptc-faq-ic-m{display:inline}',\n // list 档:没有 <details>,去掉交互态的余味。\n '[data-faq-style=\"list\"] .ptc-faq-item{border:0;border-radius:0}',\n '[data-faq-style=\"list\"] .ptc-faq-q{padding-inline:0;background:none}',\n '[data-faq-style=\"list\"] .ptc-faq-a{padding-inline:0}'\n ].join('');\n },\n\n js(): string {\n // 只做「开一收其余」。展开本身是 <details> 的原生行为,脚本不参与。\n //\n // 监听 **click 而不是 toggle**。toggle 看着更贴切(它才是状态变化),但有两个坑:\n //\n // 1. `<details open>` 被 innerHTML 插入文档时会**排一个 toggle 任务**,而那条\n // 事件晚于随后的用户点击到达。处理器分不出它和「用户刚打开这条」,于是会把\n // 用户真正点开的那条收掉 —— 浏览器用例里实测到的就是这个(画布反复注入的\n // 路径尤其容易碰上)。\n // 2. toggle 不冒泡,得靠捕获阶段委托。那个做法本身成立(非冒泡事件仍走捕获\n // 阶段经过祖先,已实测),但没必要为它付上面那条的代价。\n //\n // click 是**用户意图**,同步到达,且键盘激活 summary 也会派发 click,覆盖一致。\n // 此刻 `open` 还是点击前的旧值:为真说明这条正要收起,无事可做。\n return componentScript(\n 'faq',\n \"root.addEventListener('click',function(e){\" +\n 'var t=e.target,s=t&&t.closest?t.closest(\"summary\"):null;' +\n 'if(!s||!root.contains(s))return;' +\n 'var d=s.parentNode;' +\n \"if(!d||d.tagName!=='DETAILS'||d.open)return;\" +\n \"var l=root.querySelectorAll('details');\" +\n \"for(var i=0;i<l.length;i++)if(l[i]!==d)l[i].removeAttribute('open');\" +\n '});'\n );\n }\n};\n","/**\n * 表单。v2 叫 `dynamic-form`,从 `componentRenderers.ts:renderForm` 翻译。\n *\n * 保住 v2 的两件行为:**分步切换**与**提交事件派发**(`pt-form-submit`,\n * `bubbles` + `composed`,detail 是 FormData 的平铺)。宿主按这个事件接自己的收集\n * 管线,改名就是破坏性变更。\n *\n * 三处与 v2 不同:\n *\n * 1. **必填徽章文案是 settings 字段**(`requiredBadgeText`),不是 core 查表。\n * v2 走 `i18n.t('landingPages.editorV2.components.formRequiredBadge')` —— core 是\n * 公开 npm 包,装文案就得装三语。\n * 2. **`formAction` 真的会提交了。** v2 在 submit 里无条件 `preventDefault()`,于是\n * `action` / `method` 虽然渲染进了 `<form>`,原生提交**永远不会发生** ——\n * 面板上是个填了没反应的字段。这里改成:填了 action 就放行原生提交(事件照发),\n * 没填才拦下并显示成功态。\n * 3. **控件型字段的 `name` 为空即渲染失败**(见下),而不是渲出一个静默丢数据的控件。\n */\n\nimport { editorError } from '../../errors.js';\nimport type { ComponentRenderer } from '../render.js';\nimport type { ResolvedBlock, ResolvedComponent } from '../resolve.js';\nimport { bool, componentScript, esc, escAttr, list, str } from './shared.js';\n\n/** 这两档不是控件:`label` 是一段说明文字,`step` 是分步分隔符。 */\nconst NOT_A_CONTROL = new Set(['label', 'step']);\n\n/** `<input type>` 能直接用的那几档;其余走 text。 */\nconst INPUT_TYPES = new Set(['email', 'tel', 'number', 'date']);\n\nconst SUBMIT_ICONS: Readonly<Record<string, string>> = {\n email: '✉︎ ',\n arrow: '→ ',\n check: '✓ '\n};\n\nfunction requiredMark(style: string, badgeText: string): string {\n if (style === 'badge') return `<span class=\"ptc-form-badge\">${esc(badgeText)}</span>`;\n return '<span class=\"ptc-form-star\" aria-hidden=\"true\">*</span>';\n}\n\nfunction control(field: ResolvedBlock, id: string, name: string): string {\n const type = str(field.settings, 'fieldType');\n const required = bool(field.settings, 'required') ? ' required' : '';\n const placeholder = str(field.settings, 'placeholder');\n const ph = placeholder ? ` placeholder=\"${escAttr(placeholder)}\"` : '';\n\n if (type === 'textarea') {\n return `<textarea class=\"ptc-form-input\" id=\"${id}\" name=\"${name}\"${ph}${required}></textarea>`;\n }\n if (type === 'select') {\n const options = list(field.settings, 'options')\n .map(o => `<option>${esc(o)}</option>`)\n .join('');\n return `<select class=\"ptc-form-input\" id=\"${id}\" name=\"${name}\"${required}>${options}</select>`;\n }\n if (type === 'checkbox' || type === 'radio') {\n // 一组同名控件:required 只挂第一个(radio 组的语义就是这样;checkbox 组挂满\n // 会变成「每一项都必选」)。\n return list(field.settings, 'options')\n .map(\n (o, i) =>\n '<label class=\"ptc-form-choice\">' +\n `<input type=\"${type}\" name=\"${name}\" value=\"${escAttr(o)}\"${i === 0 ? required : ''}>` +\n `<span>${esc(o)}</span></label>`\n )\n .join('');\n }\n const inputType = INPUT_TYPES.has(type) ? type : 'text';\n return `<input class=\"ptc-form-input\" type=\"${inputType}\" id=\"${id}\" name=\"${name}\"${ph}${required}>`;\n}\n\nfunction field(block: ResolvedBlock, index: number, instanceId: string, style: string, badge: string): string {\n const type = str(block.settings, 'fieldType');\n const label = str(block.settings, 'label');\n\n if (NOT_A_CONTROL.has(type)) {\n // `step` 在非分步模式下什么都不是(分步模式里它被 intoSteps 吃掉、到不了这里)。\n // 少了这条,一个关掉 multiStep 的表单会把分隔符当控件渲染,而分隔符通常没有\n // name —— 于是整件渲染失败,症状离原因很远。\n return type === 'label' ? `<div class=\"ptc-form-note\">${esc(label)}</div>` : '';\n }\n\n const name = str(block.settings, 'name');\n if (!name) {\n // 空 name **不是**可见的错:HTML 的表单提交算法会跳过 name 为空的控件,那一栏\n // 的数据就这么没了,页面上一点痕迹都没有。所以在这里失败掉 —— 画布上是占位、\n // 导出直接失败,而不是发布之后才发现表单少收一栏。\n throw editorError('COMPONENT_RENDER_FAILED', {\n params: { type: 'form', field: index, fieldType: type }\n });\n }\n\n const id = `${escAttr(instanceId)}-f${index}`;\n const mark = bool(block.settings, 'required') ? requiredMark(style, badge) : '';\n const body = control(block, id, escAttr(name));\n const width = str(block.settings, 'width');\n\n if (type === 'checkbox' || type === 'radio') {\n // 一组控件配一个 <legend> 而不是 <label for> —— for 只能指一个控件。\n return (\n `<fieldset class=\"ptc-form-field\" data-width=\"${escAttr(width)}\">` +\n `<legend class=\"ptc-form-label\">${esc(label)}${mark}</legend>` +\n `<div class=\"ptc-form-choices\">${body}</div></fieldset>`\n );\n }\n return (\n `<div class=\"ptc-form-field\" data-width=\"${escAttr(width)}\">` +\n `<label class=\"ptc-form-label\" for=\"${id}\">${esc(label)}${mark}</label>` +\n `${body}</div>`\n );\n}\n\n/** 按 `fieldType === 'step'` 的分隔符把字段分组;分隔符的 `label` 是那一步的名字。 */\nfunction intoSteps(blocks: readonly ResolvedBlock[]): { title: string; fields: ResolvedBlock[] }[] {\n const steps: { title: string; fields: ResolvedBlock[] }[] = [];\n let current: { title: string; fields: ResolvedBlock[] } = { title: '', fields: [] };\n let started = false;\n for (const block of blocks) {\n if (str(block.settings, 'fieldType') === 'step') {\n if (started || current.fields.length > 0) steps.push(current);\n current = { title: str(block.settings, 'label'), fields: [] };\n started = true;\n } else {\n current.fields.push(block);\n }\n }\n steps.push(current);\n return steps;\n}\n\nexport const formRenderer: ComponentRenderer = {\n html(instance: ResolvedComponent, instanceId: string): string {\n const settings = instance.settings;\n const blocks = instance.blocks.filter(b => b.type === 'field');\n const requiredStyle = str(settings, 'requiredStyle');\n const badge = str(settings, 'requiredBadgeText');\n const id = escAttr(instanceId);\n\n // 字段下标跨步骤连续 —— 它进 DOM id,重号会让 label[for] 指错控件。\n let seq = 0;\n const render = (block: ResolvedBlock) =>\n field(block, seq++, instanceId, requiredStyle, badge);\n\n const steps = bool(settings, 'multiStep') ? intoSteps(blocks) : [];\n const stepped = steps.length > 1;\n\n let nav = '';\n let body: string;\n if (stepped) {\n nav =\n '<div class=\"ptc-form-steps\">' +\n steps\n .map(\n (step, i) =>\n `<button type=\"button\" class=\"ptc-form-step-tab\" data-step-to=\"${i}\"` +\n ` aria-selected=\"${i === 0 ? 'true' : 'false'}\">${esc(step.title)}</button>`\n )\n .join('') +\n '</div>';\n body = steps\n .map(\n (step, i) =>\n `<div class=\"ptc-form-step\" data-step=\"${i}\"${i === 0 ? '' : ' hidden'}>` +\n step.fields.map(render).join('') +\n '</div>'\n )\n .join('');\n } else {\n body = blocks.map(render).join('');\n }\n\n const action = str(settings, 'formAction');\n const formName = str(settings, 'formName');\n const submit = bool(settings, 'showSubmit')\n ? '<div class=\"ptc-form-actions\"><button type=\"submit\" class=\"ptc-form-submit\">' +\n (SUBMIT_ICONS[str(settings, 'submitIcon')] ?? '') +\n `${esc(str(settings, 'submitText'))}</button></div>`\n : '';\n const footer = str(settings, 'footerText');\n const success = str(settings, 'successMessage');\n\n return (\n `<div class=\"ptc-form\" data-label-position=\"${escAttr(str(settings, 'labelPosition'))}\">` +\n nav +\n `<form class=\"ptc-form-body\" id=\"${id}-form\"` +\n (formName ? ` data-form-name=\"${escAttr(formName)}\"` : '') +\n (action ? ` action=\"${escAttr(action)}\" method=\"post\"` : '') +\n `>${body}${submit}</form>` +\n // richtext:原样插入(页脚正是隐私政策链接的所在)。\n (footer ? `<div class=\"ptc-form-footer\">${footer}</div>` : '') +\n `<div class=\"ptc-form-success\" role=\"status\" hidden>${esc(success)}</div>` +\n '</div>'\n );\n },\n\n css(): string {\n return [\n '.ptc-form{width:100%}',\n '.ptc-form-body{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*4)}',\n '.ptc-form-step{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*4);width:100%}',\n '.ptc-form-field{flex:1 1 100%;min-width:0;margin:0;padding:0;border:0}',\n '.ptc-form-field[data-width=\"half\"]{flex:1 1 calc(50% - var(--spacing)*2)}',\n '.ptc-form-label{display:block;margin-bottom:calc(var(--spacing)*1.5);font-weight:500}',\n '.ptc-form-note{width:100%}',\n '.ptc-form-input{width:100%;box-sizing:border-box;font:inherit;padding:calc(var(--spacing)*2.5) calc(var(--spacing)*3.5);border:1px solid var(--pt-form-field-border,color-mix(in oklab,currentColor 25%,transparent));border-radius:var(--radius-md);background:var(--pt-form-field-bg,transparent);color:var(--pt-form-field-fg,inherit)}',\n 'textarea.ptc-form-input{min-height:6em;resize:vertical}',\n '.ptc-form-choices{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*4)}',\n '.ptc-form-choice{display:inline-flex;align-items:center;gap:calc(var(--spacing)*1.5)}',\n '.ptc-form-star{color:var(--pt-form-required-fg,currentColor)}',\n '.ptc-form-badge{margin-left:calc(var(--spacing)*1.5);padding:0 calc(var(--spacing)*1.5);border-radius:var(--radius-xs);font-size:.75em;vertical-align:middle;background:var(--pt-form-required-fg,currentColor);color:var(--pt-form-on-accent,white)}',\n '.ptc-form-actions{width:100%}',\n // 手机满宽(拇指点击区),md 起自适应 —— submitFullWidth 那个开关的继任者。\n '.ptc-form-submit{width:100%;font:inherit;font-weight:600;cursor:pointer;padding:calc(var(--spacing)*3) calc(var(--spacing)*7);border:0;border-radius:var(--radius-md);background:var(--pt-form-accent,currentColor);color:var(--pt-form-on-accent,white)}',\n '@media (min-width:768px){.ptc-form-submit{width:auto}}',\n '.ptc-form-steps{display:flex;gap:calc(var(--spacing)*1.5);margin-bottom:calc(var(--spacing)*4)}',\n '.ptc-form-step-tab{flex:1;font:inherit;cursor:pointer;padding:calc(var(--spacing)*2) calc(var(--spacing)*1);border:0;border-radius:var(--radius-md);background:color-mix(in oklab,currentColor 10%,transparent)}',\n '.ptc-form-step-tab[aria-selected=\"true\"]{background:var(--pt-form-accent,currentColor);color:var(--pt-form-on-accent,white)}',\n '.ptc-form-footer{margin-top:calc(var(--spacing)*3);font-size:.875em;color:color-mix(in oklab,currentColor 65%,transparent)}',\n '.ptc-form-success{margin-top:calc(var(--spacing)*3)}',\n // labelPosition=inline:标签与控件并排。\n '[data-label-position=\"inline\"] .ptc-form-field{display:flex;align-items:center;gap:calc(var(--spacing)*3)}',\n '[data-label-position=\"inline\"] .ptc-form-label{flex:0 0 auto;margin-bottom:0}'\n ].join('');\n },\n\n js(): string {\n return componentScript(\n 'form',\n // 分步:与 tabs 同款,只翻 aria-selected / hidden。\n \"root.addEventListener('click',function(e){\" +\n 'var t=e.target,b=t&&t.closest?t.closest(\"[data-step-to]\"):null;' +\n 'if(!b||!root.contains(b))return;' +\n \"var i=b.getAttribute('data-step-to');\" +\n 'var tb=root.querySelectorAll(\"[data-step-to]\"),pn=root.querySelectorAll(\"[data-step]\");' +\n \"for(var k=0;k<tb.length;k++)tb[k].setAttribute('aria-selected',tb[k]===b?'true':'false');\" +\n 'for(var j=0;j<pn.length;j++){' +\n \"if(pn[j].getAttribute('data-step')===i)pn[j].removeAttribute('hidden');\" +\n \"else pn[j].setAttribute('hidden','');}});\" +\n // 提交:事件照发;没填 action 才拦下并显示成功态。\n \"root.addEventListener('submit',function(e){\" +\n 'var f=e.target;' +\n \"if(!f||f.tagName!=='FORM')return;\" +\n 'var d={};new FormData(f).forEach(function(v,k){d[k]=v;});' +\n \"f.dispatchEvent(new CustomEvent('pt-form-submit',{detail:d,bubbles:true,composed:true}));\" +\n \"if(!f.getAttribute('action')){e.preventDefault();\" +\n \"var s=root.querySelector('.ptc-form-success');if(s)s.removeAttribute('hidden');}});\"\n );\n }\n};\n","/**\n * 底部吸附条。五件里唯一没有 v2 原型的一件,主要功夫在 CSS。\n *\n * 三件要紧的事:\n *\n * **1. 底部留白。** 固定定位的条会盖住页面最底下的内容,所以必须有人替它腾地方。\n * 腾地方**只能由 `body` 做** —— 条是 `position:fixed`,脱离了文档流,谁也不知道它\n * 压住了什么;而组件自己所在的那个位置腾出来的空白,在页面中段毫无意义。\n * 所以这是 core 唯一一处写 `body` 规则的地方,用 `:has()` 收窄成「页面上真有这件\n * 组件时才生效」,并且**不写重置规则** —— 重置会连作者自己设的 `padding-bottom`\n * 一起清掉。PC 上隐藏的那一档,靠把规则放进 `@media` 而不是事后清零。\n *\n * **2. safe-area。** iOS 底部有 home indicator,条的内容要避开它(条自己 padding),\n * 留白也要把它算进去(body 的 reserve)。`env()` 在不支持的环境回落 0,写法里\n * 显式给了 fallback。\n *\n * **3. PC 隐藏是默认,不是写死。** `showOn: mobile | all` —— fixture\n * `02-vivaia-campaign-lp` 那页的 `hideOnPc:false` 说明「PC 上也要」是真实需求,\n * 所以不能把 PC 隐藏写进 CSS 了事。\n *\n * ---\n *\n * `showAfter > 0` 时条初始隐藏、滚够了才由脚本放出来。**无脚本时它不出现** ——\n * 这是 opt-in 行为,作者要的就是「滚到一定位置再出现」;不跑脚本时不出现,\n * 比先闪一下再被收走好。`showAfter` 为 0(默认)时整条脚本无事可做,条始终可见。\n */\n\nimport type { ComponentRenderer } from '../render.js';\nimport type { ResolvedComponent } from '../resolve.js';\nimport { componentScript, esc, escAttr, num, str } from './shared.js';\n\n/** 条高与留白用同一个表达式 —— 两处写不一样就会留出错误的空白。 */\nconst BAR_HEIGHT = 'var(--pt-sticky-cta-h,3.5rem)';\nconst RESERVE = `calc(${BAR_HEIGHT} + env(safe-area-inset-bottom,0px))`;\n\nexport const stickyCtaRenderer: ComponentRenderer = {\n html(instance: ResolvedComponent): string {\n const settings = instance.settings;\n const text = str(settings, 'text');\n const buttonText = str(settings, 'buttonText');\n const showAfter = num(settings, 'showAfter');\n\n return (\n '<div class=\"ptc-sticky\"' +\n ` data-sticky-on=\"${escAttr(str(settings, 'showOn'))}\"` +\n ` data-sticky-align=\"${escAttr(str(settings, 'align'))}\"` +\n ` data-show-after=\"${showAfter}\"` +\n // armed = 交给脚本管可见性。只有 showAfter > 0 才有这回事。\n (showAfter > 0 ? ' data-armed' : '') +\n '>' +\n (text ? `<span class=\"ptc-sticky-text\">${esc(text)}</span>` : '') +\n (buttonText\n ? `<a class=\"ptc-sticky-btn\" href=\"${escAttr(str(settings, 'buttonUrl'))}\">${esc(buttonText)}</a>`\n : '') +\n '</div>'\n );\n },\n\n css(): string {\n return [\n `.ptc-sticky{position:fixed;left:0;right:0;bottom:0;z-index:50;box-sizing:border-box;display:flex;align-items:center;gap:calc(var(--spacing)*3);min-height:${BAR_HEIGHT};padding:calc(var(--spacing)*2) calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*2 + env(safe-area-inset-bottom,0px));background:var(--pt-sticky-cta-bg,canvas);color:var(--pt-sticky-cta-fg,canvastext);border-top:1px solid var(--pt-sticky-cta-border,color-mix(in oklab,currentColor 15%,transparent))}`,\n '.ptc-sticky[data-sticky-align=\"center\"]{justify-content:center}',\n '.ptc-sticky[data-sticky-align=\"between\"]{justify-content:space-between}',\n '.ptc-sticky-text{min-width:0}',\n '.ptc-sticky-btn{flex:none;display:inline-block;padding:calc(var(--spacing)*2.5) calc(var(--spacing)*6);border-radius:var(--radius-lg);text-decoration:none;font-weight:600;background:var(--pt-sticky-cta-accent,currentColor);color:var(--pt-sticky-cta-on-accent,canvas)}',\n // 滚够了才出现:初始 armed,脚本摘掉它。\n '.ptc-sticky[data-armed]{display:none}',\n // PC 隐藏是 showOn=mobile 的默认档,不是写死的行为。\n '@media (min-width:768px){.ptc-sticky[data-sticky-on=\"mobile\"]{display:none}}',\n // 底部留白。见文件头:只能由 body 腾,且不写重置规则。\n `body:has(.ptc-sticky[data-sticky-on=\"all\"]){padding-bottom:${RESERVE}}`,\n `@media (max-width:767.98px){body:has(.ptc-sticky[data-sticky-on=\"mobile\"]){padding-bottom:${RESERVE}}}`\n ].join('');\n },\n\n js(): string {\n // showAfter 为 0(默认)时直接退出 —— 条本来就一直可见,没有可管的东西。\n return componentScript(\n 'sticky-cta',\n \"var b=root.querySelector('.ptc-sticky');if(!b)return;\" +\n \"var a=parseInt(b.getAttribute('data-show-after'),10);\" +\n 'if(!(a>0))return;' +\n 'function u(){' +\n \"if((window.pageYOffset||0)>=a)b.removeAttribute('data-armed');\" +\n \"else b.setAttribute('data-armed','');}\" +\n \"window.addEventListener('scroll',u,{passive:true});u();\"\n );\n }\n};\n","/**\n * 选项卡。从 v2 `componentRenderers.ts:renderTabs` 翻译。\n *\n * **状态切换从「改 style」换成「改属性」**,这是本件最实质的改动。v2 的脚本长这样:\n *\n * ```js\n * x.style.color='#888888'; b.style.color='#4f46e5';\n * if('underline'===...) b.style.borderBottomColor='#4f46e5';\n * ```\n *\n * 颜色被编进了脚本闭包,于是脚本**按实例一份**;一旦按类型去重,六个 tabs 就会共用\n * 第一个实例的颜色。v4 里脚本只翻 `aria-selected` / `hidden` / `tabindex` 三个属性,\n * 外观全部由属性选择器在那一份 CSS 里管,脚本里一个颜色字面量都没有。\n *\n * 顺带修掉 v2 的一条漂移:`tabStyle` 的 `boxed` 档**进不去** —— schema 的取值是\n * `'boxed'`,渲染器比的是 `'box'`(`componentRenderers.ts:142`),于是 boxed 静默落到\n * underline 分支。这里用契约的 `boxed`。\n *\n * ---\n *\n * **非激活面板带 `hidden`,因此无脚本时只看得到默认那一页。**\n *\n * 这是有意的:一个把四页内容竖着堆起来的 tabs 看着就是坏的,而预览链路(创意 tab /\n * 详情页那种 `sandbox=\"\"` 的 iframe)恰恰只渲染 html + css、一行脚本都不跑。\n * spec 那条「无脚本时内容可读」要的是「不是一块空白」(那说的是 shadow-DOM 组件\n * markup 全在 JS 里、预览里什么都没有的失败形态),默认页在场就不是空白。\n * tasks 6.3 的浏览器用例据此断言「默认页内容可见」,不是「全部内容可见」。\n */\n\nimport type { ComponentRenderer } from '../render.js';\nimport type { ResolvedComponent } from '../resolve.js';\nimport { componentScript, esc, escAttr, num, str } from './shared.js';\n\nexport const tabsRenderer: ComponentRenderer = {\n html(instance: ResolvedComponent, instanceId: string): string {\n const style = str(instance.settings, 'tabStyle');\n const title = str(instance.settings, 'title');\n const tabs = instance.blocks.filter(b => b.type === 'tab');\n\n // 越界的 defaultTab 回落到第一页 —— 删掉一个 tab 之后这个值很容易过期,\n // 而「点开是空的」比「点开是第一页」难查得多。\n const wanted = num(instance.settings, 'defaultTab');\n const active = Number.isInteger(wanted) && wanted >= 0 && wanted < tabs.length ? wanted : 0;\n const id = escAttr(instanceId);\n\n const nav = tabs\n .map((tab, i) => {\n const on = i === active;\n const icon = str(tab.settings, 'icon');\n const label = (icon ? `${esc(icon)} ` : '') + esc(str(tab.settings, 'title'));\n return (\n `<button type=\"button\" class=\"ptc-tabs-tab\" role=\"tab\"` +\n ` id=\"${id}-t${i}\" aria-controls=\"${id}-p${i}\"` +\n ` aria-selected=\"${on ? 'true' : 'false'}\" tabindex=\"${on ? '0' : '-1'}\">` +\n `${label}</button>`\n );\n })\n .join('');\n\n const panels = tabs\n .map(\n (tab, i) =>\n `<div class=\"ptc-tabs-panel\" role=\"tabpanel\"` +\n ` id=\"${id}-p${i}\" aria-labelledby=\"${id}-t${i}\"${i === active ? '' : ' hidden'}>` +\n // richtext:按契约原样插入。\n `${str(tab.settings, 'content')}</div>`\n )\n .join('');\n\n const head = title ? `<h3 class=\"ptc-tabs-title\">${esc(title)}</h3>` : '';\n return (\n `<div class=\"ptc-tabs\" data-tabs-style=\"${escAttr(style)}\">` +\n head +\n `<div class=\"ptc-tabs-nav\" role=\"tablist\">${nav}</div>` +\n `<div class=\"ptc-tabs-panels\">${panels}</div>` +\n '</div>'\n );\n },\n\n css(): string {\n return [\n '.ptc-tabs{width:100%}',\n '.ptc-tabs-title{margin:0 0 calc(var(--spacing)*4);font-size:1.25em;font-weight:700}',\n '.ptc-tabs-nav{display:flex;flex-wrap:wrap;gap:calc(var(--spacing)*1)}',\n '.ptc-tabs-tab{appearance:none;border:0;background:none;font:inherit;cursor:pointer;padding:calc(var(--spacing)*2) calc(var(--spacing)*4);color:color-mix(in oklab,currentColor 60%,transparent)}',\n // 激活态只由 aria-selected 决定 —— 脚本翻的就是它。\n '.ptc-tabs-tab[aria-selected=\"true\"]{color:var(--pt-tabs-accent,currentColor)}',\n '.ptc-tabs-panel{padding-block:calc(var(--spacing)*5)}',\n // underline\n '[data-tabs-style=\"underline\"] .ptc-tabs-nav{border-bottom:1px solid var(--pt-tabs-border,color-mix(in oklab,currentColor 15%,transparent))}',\n '[data-tabs-style=\"underline\"] .ptc-tabs-tab{border-bottom:2px solid transparent;margin-bottom:-1px}',\n '[data-tabs-style=\"underline\"] .ptc-tabs-tab[aria-selected=\"true\"]{border-bottom-color:var(--pt-tabs-accent,currentColor)}',\n // pill\n '[data-tabs-style=\"pill\"] .ptc-tabs-tab{border-radius:var(--radius-xl)}',\n '[data-tabs-style=\"pill\"] .ptc-tabs-tab[aria-selected=\"true\"]{background:var(--pt-tabs-accent,currentColor);color:var(--pt-tabs-on-accent,white)}',\n // boxed —— v2 的 'box' 是笔误,这一档在 v2 里根本进不去\n '[data-tabs-style=\"boxed\"] .ptc-tabs-tab{border:1px solid transparent;border-radius:var(--radius-md)}',\n '[data-tabs-style=\"boxed\"] .ptc-tabs-tab[aria-selected=\"true\"]{border-color:var(--pt-tabs-border,color-mix(in oklab,currentColor 15%,transparent))}'\n ].join('');\n },\n\n js(): string {\n // 只翻属性:aria-selected / tabindex / hidden。一个颜色字面量、一次 style 赋值都没有。\n // 事件委托绑在实例根上,所以后加的 tab 也能用,且一个实例只有一个监听器。\n return componentScript(\n 'tabs',\n \"root.addEventListener('click',function(e){\" +\n 'var t=e.target;' +\n \"var b=t&&t.closest?t.closest('[role=\\\"tab\\\"]'):null;\" +\n 'if(!b||!root.contains(b))return;' +\n \"var tb=root.querySelectorAll('[role=\\\"tab\\\"]'),pn=root.querySelectorAll('[role=\\\"tabpanel\\\"]');\" +\n 'for(var i=0;i<tb.length;i++){' +\n 'var on=tb[i]===b;' +\n \"tb[i].setAttribute('aria-selected',on?'true':'false');\" +\n \"tb[i].setAttribute('tabindex',on?'0':'-1');\" +\n \"if(pn[i]){if(on)pn[i].removeAttribute('hidden');else pn[i].setAttribute('hidden','');}\" +\n '}});'\n );\n }\n};\n","/**\n * 渲染注册表与三件产物的签名。\n *\n * ```\n * renderHtml(type, settings, instanceId): string // 看得到实例\n * renderCss(type): string // 看不到,类型上就看不到\n * renderJs(type): string // 同上\n * ```\n *\n * **`css` / `js` 不接设置,这是类型签名层面的保证,不是约定**(design D2)。\n * 同一类型的多个实例共用同一份样式与同一份脚本,去重按类型做;而 v2 的形态是\n * 「先按实例渲染、再想办法去重」—— 一旦某个渲染器把颜色写进了 CSS 规则,去重就悄悄\n * 失效,一页六个 tabs 又变回六份 CSS,**且没有任何报错**。签名里没有 settings,\n * 那种写法根本编译不过。\n *\n * 实例差异只有两条通道:标记上的 `data-*` 属性(给属性选择器与脚本读)、\n * `--pt-<comp>-<slot>` 变量(给样式取值)。\n *\n * 渲染是纯函数:进类型与设置,出字符串,**手里没有 Document**。源永远是空壳,\n * 展开只发生在画布注入与成品拼装那一刻。\n */\n\nimport { editorError, isErrorCode } from '../errors.js';\nimport { COMPONENT_CONTRACTS } from './contracts.js';\nimport { resolveComponent, type ResolvedComponent } from './resolve.js';\nimport type { ComponentSettings } from './settings.js';\nimport { carouselRenderer } from './renderers/carousel.js';\nimport { faqRenderer } from './renderers/faq.js';\nimport { formRenderer } from './renderers/form.js';\nimport { stickyCtaRenderer } from './renderers/stickyCta.js';\nimport { tabsRenderer } from './renderers/tabs.js';\n\n/**\n * 一件组件的渲染器。三个成员的入参边界就是 spec 里那条硬约束的落地:\n * `html` 拿得到解析完的实例与实例 id,`css` / `js` 什么都拿不到。\n *\n * 不导出给包外 —— 五件由 core 自己持有,注册表不对外开放扩展。放开的话,\n * 「一种类型一份 CSS」这条去重前提就由外部代码决定了。\n */\nexport interface ComponentRenderer {\n html(instance: ResolvedComponent, instanceId: string): string;\n css(): string;\n js(): string;\n}\n\n/**\n * 五件的渲染器。2.3–2.7 逐件填入。\n *\n * 注册表与契约(`COMPONENT_CONTRACTS`)必须一一对应:契约里没有的类型就是未知类型,\n * 不存在「渲染器有、契约没有」的中间态 —— 那正是 v2 烧过的「改了没反应、无报错」。\n * 这条由 `__tests__/render.spec.ts` 断言,**不在这里做模块级自检** —— 那会让每次\n * import 都去跑一遍只有 core 开发者能违反的检查,还要在发布包里留一句面向开发者的\n * 文案(与「core 不出文案」直接打架)。反方向(契约有、渲染器还没写)在五件补齐前\n * 是正常的,由 2.7 收尾时补上对称的那条断言。\n */\nconst RENDERERS: Readonly<Record<string, ComponentRenderer>> = {\n carousel: carouselRenderer,\n faq: faqRenderer,\n form: formRenderer,\n tabs: tabsRenderer,\n 'sticky-cta': stickyCtaRenderer\n};\n\nfunction rendererOf(type: string): ComponentRenderer {\n const renderer = RENDERERS[type];\n if (!renderer) throw editorError('COMPONENT_UNKNOWN', { params: { type } });\n return renderer;\n}\n\n/**\n * 一个实例的结构标记。\n *\n * `settings` 是**原始**设置(实例上 `data-pt-component-settings` 里写着的东西);\n * 契约默认值的合并在这里面做,调用方不必先解析。缺省字段取契约默认值,\n * 类型不符的字段回落默认值(指出问题是 `validate` 的事,不是渲染的)。\n */\nexport function renderHtml(\n type: string,\n settings: ComponentSettings,\n instanceId: string\n): string {\n const renderer = rendererOf(type);\n const contract = COMPONENT_CONTRACTS[type]!;\n try {\n return renderer.html(resolveComponent(contract, settings), instanceId);\n } catch (err) {\n asRenderError(type, err);\n }\n}\n\n/** 一种类型的样式,一份。**不接设置** —— 见文件头。 */\nexport function renderCss(type: string): string {\n const renderer = rendererOf(type);\n try {\n return renderer.css();\n } catch (err) {\n asRenderError(type, err);\n }\n}\n\n/** 一种类型的行为脚本,一份。**不接设置** —— 见文件头。 */\nexport function renderJs(type: string): string {\n const renderer = rendererOf(type);\n try {\n return renderer.js();\n } catch (err) {\n asRenderError(type, err);\n }\n}\n\n/**\n * 把渲染器抛出的东西收成结构化错误。\n *\n * 已经带着合法错误码的原样抛 —— 别把渲染器自己判定的 `COMPONENT_UNKNOWN`(或将来\n * 2.6 里「控件型字段拿到空 name」那种主动失败)包成一条笼统的 RENDER_FAILED,\n * 那会把可诊断的原因换成「反正是渲染挂了」。\n *\n * 判据用 `isErrorCode` 而不是 `'code' in err`:Node 的 fs / net 错误也带 `code`\n * (`ENOENT` 之类),只看键名在场会把一个真 bug 原样放出去、伪装成结构化错误。\n *\n * 导出是为了可测:注册表里全是 core 自己的渲染器,正常路径下这条兜底触发不到,\n * 而「触发不到」不等于「不用测」—— 它兜的恰恰是渲染器有 bug 的那天。\n */\nexport function asRenderError(type: string, err: unknown): never {\n if (typeof err === 'object' && err !== null && isErrorCode((err as { code?: unknown }).code)) {\n throw err;\n }\n throw editorError('COMPONENT_RENDER_FAILED', { params: { type } });\n}\n","/**\n * 内置组件的**字段契约形状**。这里只有类型,五件的契约数据在 `contracts.ts`。\n *\n * 契约里只放:字段 id / 取值类型 / 枚举取值 / 默认值 / 块定义(design D3)。\n *\n * **不放任何文案**,也不放任何面向界面的元信息 —— 显示名、分组、占位提示、预设留\n * apps/x 的面板,AI 语义提示留 mastra,两边按字段 id 引用。理由不是洁癖:core 是\n * 公开 npm 包,装进 UI 文案就得装三语,于是又多一份三语字典,与「core 只出结构、\n * 不出文案」的既有口径(见 `errors.ts`)直接冲突。\n *\n * 这条由 `__tests__/contract.spec.ts` 的属性名锁定测试兜住 —— 加一个 `label` 就红。\n *\n * ---\n *\n * **为什么是可辨识联合而不是一个带可选字段的接口**:`values` 只对枚举有意义,\n * `default` 的类型跟着 `type` 走。写成 `{ type: SettingType; values?: string[];\n * default?: unknown }` 的话,「number 字段配了一组 values」「boolean 字段的默认值是\n * 字符串」这类错误要等到 validate 运行时才发现,而它们本该在写契约那一刻就编译不过。\n *\n * **有意不含 `min` / `max`**:D3 枚举的五项里没有它,tasks 4.2 的三条校验\n * (未知字段 / 类型不符 / 枚举越界)也用不到。契约里放一个没有消费端的字段,\n * 正是 D3 要堵的那种「写了没反应」。\n *\n * **有意不含 `maxBlocks`**:同上,且它是面板的「还能不能再加一块」这类界面行为。\n * 若 1.3 落契约时发现确实需要,那是一次要被看见的契约扩张,不是顺手加。\n */\n\n/**\n * 取值类型词表。\n *\n * `text` 与 `richtext` 的区别是**转义行为**,不是界面控件:`text` 在 renderHtml 里\n * 必须转义,`richtext` 原样插入。v2 就是这么做的(问题转义、答案不转义),\n * 但那个区别只存在于渲染器代码里、没有进 schema —— 于是面板与 AI 都看不见它。\n * 它关乎注入安全,属于契约。\n *\n * `url` 与 `image` 都是字符串,分开是因为取值域不同(`image` 指向图片资源),\n * 消费端据此选控件、AI 据此知道该产出什么。这是取值类型,不是显示名。\n *\n * `list` 是字符串数组。v2 把「一行一项」的选项表存成换行分隔的字符串,渲染器得用\n * `/\\r?\\n|\\\\n/` 去拆 —— 那个 `\\\\n` 分支的存在本身就说明 AI 写出过字面量反斜杠 n。\n * 结构化成数组,这类歧义整类消失。\n */\nexport const SETTING_TYPES = [\n 'text',\n 'richtext',\n 'number',\n 'boolean',\n 'enum',\n 'url',\n 'image',\n 'list'\n] as const;\n\nexport type SettingType = (typeof SETTING_TYPES)[number];\n\n/** 一个设置项的合法取值。与 `SETTING_TYPES` 一一对应。 */\nexport type SettingValue = string | number | boolean | readonly string[];\n\nexport interface TextSettingSpec {\n readonly id: string;\n /** 纯文本。renderHtml **必须**转义。 */\n readonly type: 'text';\n readonly default: string;\n}\n\nexport interface RichTextSettingSpec {\n readonly id: string;\n /** 富文本(HTML 片段)。renderHtml 原样插入,**不**转义。 */\n readonly type: 'richtext';\n readonly default: string;\n}\n\nexport interface UrlSettingSpec {\n readonly id: string;\n readonly type: 'url';\n readonly default: string;\n}\n\nexport interface ImageSettingSpec {\n readonly id: string;\n readonly type: 'image';\n readonly default: string;\n}\n\nexport interface NumberSettingSpec {\n readonly id: string;\n readonly type: 'number';\n readonly default: number;\n}\n\nexport interface BooleanSettingSpec {\n readonly id: string;\n readonly type: 'boolean';\n readonly default: boolean;\n}\n\nexport interface EnumSettingSpec {\n readonly id: string;\n readonly type: 'enum';\n /** 允许的取值。`default` 必须是其中之一 —— 由契约的锁定测试断言。 */\n readonly values: readonly string[];\n readonly default: string;\n}\n\nexport interface ListSettingSpec {\n readonly id: string;\n readonly type: 'list';\n readonly default: readonly string[];\n}\n\n/** 一个设置项。按 `type` 辨识。 */\nexport type ComponentSettingSpec =\n | TextSettingSpec\n | RichTextSettingSpec\n | UrlSettingSpec\n | ImageSettingSpec\n | NumberSettingSpec\n | BooleanSettingSpec\n | EnumSettingSpec\n | ListSettingSpec;\n\n/**\n * 可重复块的定义(FAQ 的一问一答、轮播的一张、表单的一个字段、tabs 的一页)。\n *\n * `type` 是块的**类型 id**(`item` / `slide` / `field` / `tab`),落在实例设置的\n * `_blocks[].type` 上,不是显示名。\n */\nexport interface ComponentBlockSpec {\n readonly type: string;\n readonly fields: readonly ComponentSettingSpec[];\n}\n\n/** 一件组件的完整字段契约。 */\nexport interface ComponentContract {\n /** 组件类型 id,落在 `data-pt-component` 上。 */\n readonly type: string;\n readonly fields: readonly ComponentSettingSpec[];\n /** 没有可重复块的组件(如 sticky-cta)不给这一项。 */\n readonly blocks?: readonly ComponentBlockSpec[];\n}\n","/**\n * 收集文档里用到的全部 class。\n *\n * 接 `Document` 而不是 HTML 字串 —— 与其余 API 一致,也免得调用方为了收集 class\n * 再解析一遍(浏览器侧先 parse 即可)。\n *\n * 注意它扫的是**源文档**:内置组件在源里只是一个空壳,展开后才出现的类名不在\n * 这里。这正是「渲染器产出的 markup 不使用 Tailwind class」那条规则存在的原因 ——\n * 组件自带 CSS,不走这条编译管线。\n */\nexport function collectClasses(root: Document | DocumentFragment | Element): Set<string> {\n const out = new Set<string>();\n const add = (el: Element) => {\n const raw = el.getAttribute('class');\n if (!raw) return;\n for (const c of raw.split(/[\\t\\n\\f\\r ]+/)) if (c) out.add(c);\n };\n if ('getAttribute' in root && typeof (root as Element).getAttribute === 'function') {\n add(root as Element);\n }\n const nodes = root.querySelectorAll('[class]');\n for (let i = 0; i < nodes.length; i++) add(nodes[i]);\n return out;\n}\n","import { createParse } from './dom/parse.js';\nimport { parseFragment, fragmentElementRoots } from './dom/parseFragment.js';\nimport { serialize, normalizeClassValue } from './serialize/canonical.js';\nimport { rules } from './rules/index.js';\nimport { VERSION, COMPILER_VERSION } from './version.js';\nimport { normalize } from './normalize.js';\nimport { createWrap, unwrap } from './wrap.js';\nimport { validate } from './validate/index.js';\nimport { apply } from './ops/apply.js';\nimport * as guards from './ops/guards.js';\nimport * as compile from './compile/index.js';\nimport * as components from './components/index.js';\nimport { collectClasses } from './collectClasses.js';\nimport type { CoreOptions, DOMParserCtor, DOMParserLike } from './dom/types.js';\n\nexport type { CoreOptions, DOMParserCtor, DOMParserLike };\nexport type {\n ErrorCode,\n Issue,\n ValidateResult,\n EditorError\n} from './errors.js';\nexport type { Rules, DeviceVariant, StateVariant, PropertySlot, LayerName, LeafType, OpaqueMode } from './rules/index.js';\n\nexport { serialize, normalizeClassValue, parseFragment, fragmentElementRoots };\nexport { normalize } from './normalize.js';\nexport { unwrap, isWrapLayer } from './wrap.js';\nexport { validate } from './validate/index.js';\nexport { apply } from './ops/apply.js';\nexport { layerOf, canContain, containerDepth, deleteTarget, MAX_CONTAINER_DEPTH } from './validate/structure.js';\nexport type { StructureRejection } from './validate/structure.js';\nexport { checkVariants } from './validate/variants.js';\nexport { isNativePaletteClass } from './validate/palette.js';\nexport * as guards from './ops/guards.js';\nexport * as compile from './compile/index.js';\nexport * as components from './components/index.js';\nexport { collectClasses } from './collectClasses.js';\nexport { themeOf, themeFromSource, themeTokens, EMPTY_THEME } from './compile/theme.js';\nexport type { Theme, ThemeTokens } from './compile/theme.js';\nexport type { EditOp, SetOp, InsertOp, DeleteOp, MoveOp, ReplaceOp, Transaction } from './ops/types.js';\nexport type { ApplyResult } from './ops/apply.js';\nexport type { ValidateOptions } from './validate/index.js';\nexport type { NormalizeOptions } from './normalize.js';\nexport { rules } from './rules/index.js';\nexport { VERSION, COMPILER_VERSION } from './version.js';\nexport {\n ERROR_CODES,\n isErrorCode,\n PUBLISH_BLOCKING_RULES,\n isPublishBlocking,\n editorError\n} from './errors.js';\n\n/**\n * core 的入口。宿主注入 DOM 之后拿到一组行为。\n *\n * 只有 `parse` 真的需要注入(整文档解析)。其余能力都是纯函数,挂在这里只是给宿主\n * 一个单一入口;它们同时也是具名导出 —— golden 测试直接对着纯函数比对最省事,\n * 也省得两份设计文档里所有签名都写成 core.x(...)。\n */\nexport function createCore(options: CoreOptions) {\n if (!options || typeof options.DOMParser !== 'function') {\n throw new TypeError('createCore(): 必须注入 DOMParser 构造器');\n }\n const parse = createParse(options.DOMParser);\n return {\n parse,\n parseFragment,\n wrap: createWrap(parse),\n unwrap,\n serialize,\n normalize,\n validate,\n apply,\n guards,\n compile,\n components,\n collectClasses,\n rules,\n VERSION,\n COMPILER_VERSION\n };\n}\n\nexport type Core = ReturnType<typeof createCore>;\n"]}
|