@ptengine/lp-editor-core 1.0.0-alpha.2 → 1.0.0-alpha.3
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/README.md +28 -3
- package/dist/golden/fixtures/popup/README.md +9 -4
- package/dist/golden/manifest.json +114 -0
- package/dist/golden/verify.mjs +24 -2
- package/dist/index.d.ts +196 -206
- package/dist/index.js +244 -73
- 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/kinds.ts","../src/version.ts","../src/validate/tree.ts","../src/normalize.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/** 结构层级。弹窗没有 section 层。 */\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 * 两端差别的六个结构开关。面板与 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 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","import type { LayerName, LeafType } from './rules/index.js';\n\n/**\n * 两种文档类型的能力档。宿主把其中一档作为 `capabilities` 传给编辑器,\n * mastra 也读同一份来判断结构规则。\n */\n\n/** 组件运行时由谁提供。 */\nexport type ComponentRuntime =\n /** 渲染器自带脚本(落地页)。 */\n | 'self'\n /**\n * 只出声明式标记、零脚本,行为归 Engage SDK(弹窗的表单与倒计时)。\n * core 给弹窗表单出脚本会和 SDK 抢同一张表单。\n */\n | 'engage-sdk';\n\nexport interface KindProfile {\n /** 文档形态:完整文档(落地页)还是片段(弹窗)。 */\n root: 'document' | 'fragment';\n /** 结构层级。弹窗没有 section 层。 */\n layers: readonly LayerName[];\n /** 编译目标:完整文档 CSS,还是 Shadow DOM 内的 px 化 CSS。 */\n compile: 'document' | 'shadow-px';\n leafTypes: readonly LeafType[];\n /** 允许的内置组件 → 其运行时策略。 */\n components: Readonly<Record<string, ComponentRuntime>>;\n units: { vh: boolean };\n customCode: boolean;\n}\n\nexport const KIND_PROFILES = {\n page: {\n root: 'document',\n layers: ['section', 'container', 'leaf'],\n compile: 'document',\n leafTypes: ['text', 'media', 'button', 'shape'],\n components: {\n carousel: 'self',\n faq: 'self',\n tabs: 'self',\n 'sticky-cta': 'self',\n form: 'self'\n },\n units: { vh: true },\n customCode: true\n },\n popup: {\n root: 'fragment',\n // 弹窗无 section 层:root › children。\n layers: ['container', 'leaf'],\n compile: 'shadow-px',\n leafTypes: ['text', 'media', 'button', 'shape'],\n components: {\n form: 'engage-sdk',\n countdown: 'engage-sdk',\n carousel: 'self',\n faq: 'self',\n tabs: 'self'\n },\n units: { vh: false },\n customCode: false\n }\n} as const satisfies Record<string, KindProfile>;\n\nexport type KindName = keyof typeof KIND_PROFILES;\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.2';\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 { 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 type { KindProfile } from '../kinds.js';\nimport { shouldHaveId, tag } from './tree.js';\nimport { checkVariants } from './variants.js';\nimport { NATIVE_PALETTE_PREFIXES, isNativePaletteClass } from './palette.js';\n\nexport interface ValidateOptions {\n profile: KindProfile;\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\nexport function validate(\n root: Document | DocumentFragment | Element,\n options: ValidateOptions\n): ValidateResult {\n const issues: Issue[] = [];\n const isDocument = options.profile.root === 'document' && isDoc(root);\n\n if (isDocument) checkFormatMeta(root as Document, issues);\n checkIds(root, issues);\n checkElements(root, options, issues);\n\n return { ok: issues.length === 0, issues };\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 if (options.canCompileClass && !options.canCompileClass(cls)) {\n issues.push({ ptId, rule: 'CLASS_UNCOMPILABLE', params: { className: cls } });\n }\n }\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 /** 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 type { KindProfile } from '../kinds.js';\nimport { closestOpaque, tag } from './tree.js';\nimport type { LayerName } from '../rules/index.js';\n\n/**\n * 结构规则:section › container › leaf(弹窗无 section 层,为 root › children)。\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\nexport function layerOf(el: Element, profile: KindProfile): LayerName | null {\n const name = tag(el);\n if (NOT_A_LAYER.has(name)) return null;\n const hasSectionLayer = profile.layers.includes('section');\n\n if (hasSectionLayer && name === 'section') return 'section';\n\n const ptType = el.getAttribute('data-pt-type');\n if (ptType && (profile.leafTypes as readonly string[]).includes(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, profile: KindProfile): number {\n let depth = 0;\n let cur: Element | null = el;\n while (cur) {\n if (layerOf(cur, profile) === 'container') 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(\n parent: Element,\n childLayer: LayerName,\n profile: KindProfile\n): StructureRejection | null {\n // 不透明子树内部一律不开放结构编辑(两档都一样,text 档只放行文字)。\n const opaque = closestOpaque(parent);\n if (opaque) return 'opaque-subtree';\n\n const parentLayer = layerOf(parent, profile);\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, profile) + 1 > MAX_CONTAINER_DEPTH\n ? 'container-too-deep'\n : null;\n }\n // 弹窗没有 section 层,片段根下直接放 container。\n if (!profile.layers.includes('section') && parentLayer === null) return null;\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 if (!profile.layers.includes('section') && parentLayer === null) return null;\n return 'unknown-layer';\n}\n\n/**\n * 删除的级联语义。\n *\n * 删掉 container 的最后一个 leaf —— container 保留(用户还要往里放东西)。\n * 删掉 section 的最后一个 container —— 连 section 一起删(空区块没有意义)。\n *\n * 返回**真正要从树上摘掉的那个节点**。\n */\nexport function deleteTarget(el: Element, profile: KindProfile): Element {\n const layer = layerOf(el, profile);\n if (layer !== 'container') return el;\n\n const parent = el.parentElement;\n if (!parent || layerOf(parent, profile) !== 'section') return el;\n\n const siblingContainers = Array.from(parent.children).filter(\n c => c !== el && layerOf(c, profile) === '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 type { KindProfile } from '../kinds.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 {\n findById,\n requireCanonicalFragment,\n requireFragmentIds,\n requireIdHit,\n rejectScriptsAndHandlers,\n requireSingleRoot\n} from './guards.js';\n\nexport interface ApplyOptions {\n profile: KindProfile;\n}\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[], options: ApplyOptions): 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, options);\n if (!dry.ok) return dry;\n\n // 2. 真文档上跑。到这里不该再失败;万一失败(宿主在两次之间改了文档),\n // 仍然按失败返回,但此时文档可能已被部分修改 —— 这是宿主违反约定的后果,\n // 不是这里能兜的,所以不假装兜住。\n return run(doc, ops, options);\n}\n\nfunction run(doc: Document, ops: EditOp[], options: ApplyOptions): ApplyResult {\n const inverse: EditOp[] = [];\n for (let i = 0; i < ops.length; i++) {\n const result = applyOne(doc, ops[i], options);\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, options: ApplyOptions): OneResult {\n switch (op.op) {\n case 'set':\n return applySet(doc, op);\n case 'insert':\n return applyInsert(doc, op, options);\n case 'delete':\n return applyDelete(doc, op, options);\n case 'move':\n return applyMove(doc, op, options);\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// ---------------------------------------------------------------- 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 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, options: ApplyOptions): 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, options.profile);\n if (!childLayer) {\n return { ok: false, error: editorError('STRUCTURE', { params: { reason: 'unknown-layer' } }) };\n }\n const rejection = canContain(parent, childLayer, options.profile);\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 }, options: ApplyOptions): 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 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, options.profile);\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, options: ApplyOptions): 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 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, options.profile);\n if (!layer) {\n return { ok: false, error: editorError('STRUCTURE', { ptId: op.id, params: { reason: 'unknown-layer' } }) };\n }\n const rejection = canContain(parent, layer, options.profile);\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 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 { KIND_PROFILES } from './kinds.js';\nimport { VERSION, COMPILER_VERSION } from './version.js';\nimport { normalize } from './normalize.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 { KindProfile, KindName, ComponentRuntime } from './kinds.js';\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 { validate } from './validate/index.js';\nexport { apply } from './ops/apply.js';\nexport { layerOf, canContain, deleteTarget } 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 { ApplyOptions, 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 { KIND_PROFILES } from './kinds.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 serialize,\n normalize,\n validate,\n apply,\n guards,\n compile,\n collectClasses,\n rules,\n KIND_PROFILES,\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/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"]}
|