@jboltai/tokui 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokui.mjs","names":["TokUIEventBus","TokUITheme","TokUIClass"],"sources":["../src/core/event-bus.js","../src/core/color-generator.js","../src/core/theme.js","../src/core/parser.js","../src/core/renderer.js","../src/components/lightbox.js","../src/components/chart.js","../src/components/basic.js","../src/components/table.js","../src/components/form.js","../src/components/layout.js","../src/components/index.js","../src/index.js","../src/lib.js"],"sourcesContent":["/**\n * TokUI 事件总线模块\n * 提供事件处理函数的注册、移除和查询机制。\n * 用于解耦组件渲染与交互逻辑:渲染器通过事件总线调用用户注册的处理函数。\n *\n * 使用方式:\n * 1. TokUI.registerHandler('handleLogin', (data, event, element) => { ... })\n * 2. 在 TokUI DSL 中通过 clk:handleLogin 或 sub:handleLogin 绑定\n */\n'use strict';\n\n/** 危险属性名(防止原型污染) */\nconst DANGEROUS_NAMES = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * 事件总线对象(单例模式)\n * handlers 存储所有已注册的事件处理函数。\n */\nconst TokUIEventBus = {\n /** 已注册的事件处理函数映射表 */\n handlers: {},\n\n /**\n * 注册事件处理函数\n * @param {string} name - 处理函数名称(与 DSL 中 clk/sub 属性值对应)\n * @param {Function} fn - 处理函数 (data, event, element) => void\n */\n registerHandler(name, fn) {\n if (DANGEROUS_NAMES.has(name)) return;\n if (typeof fn !== 'function') {\n throw new TypeError('TokUI EventBUS: handler must be a function, got ' + typeof fn);\n }\n if (this.handlers[name]) {\n console.warn('TokUI EventBUS: handler \"' + name + '\" 已被覆盖');\n }\n this.handlers[name] = fn;\n },\n\n /**\n * 移除事件处理函数\n * @param {string} name - 要移除的处理函数名称\n */\n removeHandler(name) {\n delete this.handlers[name];\n },\n\n /**\n * 获取已注册的事件处理函数\n * @param {string} name - 处理函数名称\n * @returns {Function|null} 处理函数,未找到返回 null\n */\n getHandler(name) {\n return this.handlers[name] || null;\n },\n\n /**\n * 清除所有已注册的事件处理函数\n */\n clearAll() {\n this.handlers = {};\n },\n\n /**\n * 获取所有已注册的处理函数名称(只读)\n * @returns {string[]} 名称数组\n */\n getHandlerNames() {\n return Object.keys(this.handlers);\n }\n};\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.TokUIEventBus = TokUIEventBus;\n window.TokUI.registerHandler = TokUIEventBus.registerHandler.bind(TokUIEventBus);\n window.TokUI.removeHandler = TokUIEventBus.removeHandler.bind(TokUIEventBus);\n}\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = TokUIEventBus;\n}\n","/**\n * TokUI 色板生成器\n * 基于 HSB 算法,生成 10 级色阶。\n *\n * 使用方式:\n * - generatePalette('#1677ff') → 返回 10 个颜色的数组(亮色模式)\n * - generatePalette('#1677ff', {dark: true}) → 暗色模式色板\n * - generateThemeTokens({primary, danger, success, warning}) → CSS 变量映射\n */\n'use strict';\n\n// ===== 颜色转换工具 =====\n\n/**\n * Hex 转 RGB\n * @param {string} hex - #rrggbb 格式\n * @returns {Object} {r, g, b} 各分量 0-255\n */\nfunction hexToRgb(hex) {\n return {\n r: parseInt(hex.slice(1, 3), 16),\n g: parseInt(hex.slice(3, 5), 16),\n b: parseInt(hex.slice(5, 7), 16)\n };\n}\n\n/**\n * RGB 转 Hex\n * @param {Object} rgb - {r, g, b} 各分量 0-255\n * @returns {string} #rrggbb 格式\n */\nfunction rgbToHex(rgb) {\n var clamp = function(v) { return Math.max(0, Math.min(255, Math.round(v))); };\n return '#' + [clamp(rgb.r), clamp(rgb.g), clamp(rgb.b)]\n .map(function(v) { return v.toString(16).padStart(2, '0'); })\n .join('');\n}\n\n/**\n * RGB 转 HSV/HSB\n * @param {number} r - 0-255\n * @param {number} g - 0-255\n * @param {number} b - 0-255\n * @returns {Object} {h: 0-360, s: 0-1, v: 0-1}\n */\nfunction rgbToHsv(r, g, b) {\n r /= 255;\n g /= 255;\n b /= 255;\n\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var d = max - min;\n\n var h = 0;\n var s = max === 0 ? 0 : d / max;\n var v = max;\n\n if (d !== 0) {\n if (max === r) {\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n } else if (max === g) {\n h = ((b - r) / d + 2) / 6;\n } else {\n h = ((r - g) / d + 4) / 6;\n }\n }\n\n return { h: h * 360, s: s, v: v };\n}\n\n/**\n * HSV/HSB 转 RGB\n * @param {number} h - 0-360\n * @param {number} s - 0-1\n * @param {number} v - 0-1\n * @returns {Object} {r, g, b} 各分量 0-255\n */\nfunction hsvToRgb(h, s, v) {\n h = ((h % 360) + 360) % 360;\n s = Math.max(0, Math.min(1, s));\n v = Math.max(0, Math.min(1, v));\n\n var c = v * s;\n var x = c * (1 - Math.abs((h / 60) % 2 - 1));\n var m = v - c;\n\n var r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; b = 0; }\n else if (h < 120) { r = x; g = c; b = 0; }\n else if (h < 180) { r = 0; g = c; b = x; }\n else if (h < 240) { r = 0; g = x; b = c; }\n else if (h < 300) { r = x; g = 0; b = c; }\n else { r = c; g = 0; b = x; }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255)\n };\n}\n\n// ===== 色板算法参数 =====\n\nvar hueStep = 2;\nvar saturationStep = 0.16;\nvar saturationStep2 = 0.05;\nvar brightnessStep1 = 0.05;\nvar brightnessStep2 = 0.15;\nvar lightColorCount = 5;\nvar darkColorCount = 4;\n\n/**\n * 暗色模式映射表\n * 将亮色色板中的指定层级颜色与背景色按给定透明度混合\n */\nvar darkColorMap = [\n { index: 7, opacity: 0.15 },\n { index: 6, opacity: 0.25 },\n { index: 5, opacity: 0.3 },\n { index: 5, opacity: 0.45 },\n { index: 5, opacity: 0.65 },\n { index: 5, opacity: 0.85 },\n { index: 4, opacity: 0.9 },\n { index: 3, opacity: 0.95 },\n { index: 2, opacity: 0.97 },\n { index: 1, opacity: 0.98 }\n];\n\n// ===== 色板生成核心算法 =====\n\n/**\n * 计算色相\n * @param {Object} hsv - 种子色 HSV {h, s, v}\n * @param {number} i - 步数\n * @param {boolean} light - 是否为亮色方向\n * @returns {number} 色相值 0-360\n */\nfunction getHue(hsv, i, light) {\n var hue;\n if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {\n hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;\n } else {\n hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;\n }\n if (hue < 0) hue += 360;\n else if (hue >= 360) hue -= 360;\n return hue;\n}\n\n/**\n * 计算饱和度\n * @param {Object} hsv - 种子色 HSV {h, s, v}\n * @param {number} i - 步数\n * @param {boolean} light - 是否为亮色方向\n * @returns {number} 饱和度 0-1\n */\nfunction getSaturation(hsv, i, light) {\n if (hsv.h === 0 && hsv.s === 0) return hsv.s;\n var saturation;\n if (light) {\n saturation = hsv.s - saturationStep * i;\n } else if (i === darkColorCount) {\n saturation = hsv.s + saturationStep;\n } else {\n saturation = hsv.s + saturationStep2 * i;\n }\n if (saturation > 1) saturation = 1;\n if (light && i === lightColorCount && saturation > 0.1) saturation = 0.1;\n if (saturation < 0.06) saturation = 0.06;\n return Number(saturation.toFixed(2));\n}\n\n/**\n * 计算明度\n * @param {Object} hsv - 种子色 HSV {h, s, v}\n * @param {number} i - 步数\n * @param {boolean} light - 是否为亮色方向\n * @returns {number} 明度 0-1\n */\nfunction getValue(hsv, i, light) {\n var value;\n if (light) {\n value = hsv.v + brightnessStep1 * i;\n } else {\n value = hsv.v - brightnessStep2 * i;\n }\n if (value > 1) value = 1;\n return Number(value.toFixed(2));\n}\n\n/**\n * 颜色混合(用于暗色模式)\n * 将 rgb2 按比例 p 混合到 rgb1 上\n * @param {Object} rgb1 - 基色 {r, g, b}\n * @param {Object} rgb2 - 混合色 {r, g, b}\n * @param {number} amount - 混合比例 0-100\n * @returns {Object} {r, g, b}\n */\nfunction mix(rgb1, rgb2, amount) {\n var p = amount / 100;\n return {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b\n };\n}\n\n/**\n * 生成亮色模式色板\n *\n * @param {string} color - 种子色,#rrggbb 格式\n * @returns {string[]} 10 个 hex 颜色(level 1-10)\n */\nfunction generateLightPalette(color) {\n var patterns = [];\n var pColor = hexToRgb(color);\n var pColorHsv = rgbToHsv(pColor.r, pColor.g, pColor.b);\n\n // Level 1-5: 浅色,从种子色反向迭代\n for (var i = lightColorCount; i > 0; i -= 1) {\n var h = getHue(pColorHsv, i, true);\n var s = getSaturation(pColorHsv, i, true);\n var v = getValue(pColorHsv, i, true);\n patterns.push(rgbToHex(hsvToRgb(h, s, v)));\n }\n\n // Level 6: 种子色\n patterns.push(rgbToHex(pColor));\n\n // Level 7-10: 深色,从种子色正向迭代\n for (var j = 1; j <= darkColorCount; j += 1) {\n var h2 = getHue(pColorHsv, j, false);\n var s2 = getSaturation(pColorHsv, j, false);\n var v2 = getValue(pColorHsv, j, false);\n patterns.push(rgbToHex(hsvToRgb(h2, s2, v2)));\n }\n\n return patterns;\n}\n\n/**\n * 生成暗色模式色板\n * 将亮色色板的指定层级颜色与暗色背景按特定透明度混合\n *\n * @param {string} color - 种子色,#rrggbb 格式\n * @param {string} [bgColor='#141414'] - 背景色\n * @returns {string[]} 10 个 hex 颜色(level 1-10)\n */\nfunction generateDarkPalette(color, bgColor) {\n var lightPatterns = generateLightPalette(color);\n var bg = hexToRgb(bgColor || '#141414');\n\n return darkColorMap.map(function(item) {\n var darkColor = mix(bg, hexToRgb(lightPatterns[item.index - 1]), item.opacity * 100);\n return rgbToHex(darkColor);\n });\n}\n\n/**\n * 生成 10 级色阶\n *\n * @param {string} seedColor - 种子色,#rrggbb 格式\n * @param {Object} [options] - 选项\n * @param {boolean} [options.dark=false] - 是否为暗色模式\n * @returns {string[]} 10 个颜色值的数组,索引 0=level1, 9=level10\n */\nfunction generatePalette(seedColor, options) {\n var opts = options || {};\n if (opts.dark) {\n return generateDarkPalette(seedColor, opts.backgroundColor);\n }\n return generateLightPalette(seedColor);\n}\n\n// ===== 主题令牌生成 =====\n\n/**\n * 生成主题 CSS 变量映射\n *\n * @param {Object} seedColors - 种子色配置\n * @param {string} seedColors.primary - 主色\n * @param {string} seedColors.danger - 危险色\n * @param {string} seedColors.success - 成功色\n * @param {string} seedColors.warning - 警告色\n * @param {Object} [options] - 选项\n * @param {boolean} [options.dark=false] - 是否为暗色模式\n * @returns {Object} CSS 变量映射,如 {'--tokui-primary-1': '#e6f4ff', ...}\n */\nfunction generateThemeTokens(seedColors, options) {\n var opts = options || {};\n var tokens = {};\n\n var categories = ['primary', 'danger', 'success', 'warning'];\n\n for (var ci = 0; ci < categories.length; ci++) {\n var cat = categories[ci];\n var seed = seedColors[cat];\n if (!seed) continue;\n\n var palette = generatePalette(seed, { dark: opts.dark });\n\n for (var i = 0; i < 10; i++) {\n tokens['--tokui-' + cat + '-' + (i + 1)] = palette[i];\n }\n }\n\n return tokens;\n}\n\n// ===== 导出 =====\n\nvar ColorGenerator = {\n generatePalette: generatePalette,\n generateThemeTokens: generateThemeTokens\n};\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.generatePalette = generatePalette;\n window.TokUI._internal.generateThemeTokens = generateThemeTokens;\n window.TokUI._internal.ColorGenerator = ColorGenerator;\n}\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = ColorGenerator;\n}\n","/**\n * TokUI 主题管理模块\n * 通过 data-tokui-theme 属性控制容器的主题,\n * CSS 使用 [data-tokui-theme=\"xxx\"] 选择器匹配对应主题变量。\n *\n * 使用方式:\n * - 初始化时自动设置默认主题\n * - TokUI.setTheme('dark') 切换主题\n * - TokUI.getTheme() 获取当前主题\n */\n'use strict';\n\n/**\n * 主题管理对象(单例模式)\n */\nconst TokUITheme = {\n /** 当前关联的容器 DOM 元素 */\n container: null,\n /** 当前主题名称 */\n currentTheme: 'default',\n\n /**\n * 初始化主题,设置容器并应用默认主题\n * @param {HTMLElement|string} container - DOM 元素或 CSS 选择器\n */\n init(container) {\n this.container = typeof container === 'string'\n ? document.querySelector(container)\n : container;\n if (this.container) {\n this.container.setAttribute('data-tokui-theme', this.currentTheme);\n } else if (container) {\n console.warn('TokUI Theme: 容器未找到,主题不会生效');\n }\n },\n\n /**\n * 切换主题\n * 更新容器的 data-tokui-theme 属性,触发 CSS 变量切换\n * @param {string} themeName - 主题名称(如 'default', 'dark')\n */\n setTheme(themeName) {\n if (typeof themeName !== 'string' || !themeName) {\n console.warn('TokUI Theme: themeName 必须为非空字符串');\n return;\n }\n this.currentTheme = themeName;\n if (this.container) {\n this.container.setAttribute('data-tokui-theme', themeName);\n }\n },\n\n /**\n * 获取当前主题名称\n * @returns {string} 当前主题名称\n */\n getTheme() {\n return this.currentTheme;\n },\n\n /**\n * 动态生成色阶 CSS 变量并注入到页面\n * 允许运行时自定义颜色方案\n * @param {string} primary - 主色(hex 格式,如 '#1677ff')\n * @param {Object} [options] - 可选参数\n * @param {string} [options.danger] - 危险色种子\n * @param {string} [options.success] - 成功色种子\n * @param {string} [options.warning] - 警告色种子\n * @param {Document} [options._document] - 可选 document 对象(测试用)\n */\n setSeedColor(primary, options) {\n options = options || {};\n var doc = options._document || (typeof document !== 'undefined' ? document : null);\n if (!doc) return;\n\n // 输入校验:仅接受 #rrggbb 格式\n function isValidHex(c) { return /^#[0-9a-fA-F]{6}$/.test(c); }\n if (!isValidHex(primary)) return;\n if (options.danger && !isValidHex(options.danger)) return;\n if (options.success && !isValidHex(options.success)) return;\n if (options.warning && !isValidHex(options.warning)) return;\n\n var generateThemeTokens;\n if (typeof require === 'function') {\n generateThemeTokens = require('./color-generator').generateThemeTokens;\n } else {\n generateThemeTokens = window.TokUI._internal.generateThemeTokens;\n }\n\n var seeds = { primary: primary };\n if (options.danger) seeds.danger = options.danger;\n if (options.success) seeds.success = options.success;\n if (options.warning) seeds.warning = options.warning;\n\n var isDark = this.currentTheme === 'dark';\n var tokens = generateThemeTokens(seeds, { dark: isDark });\n\n var css = ':root, [data-tokui-theme=\"default\"], [data-tokui-theme=\"dark\"] {\\n';\n var keys = Object.keys(tokens);\n for (var i = 0; i < keys.length; i++) {\n var val = tokens[keys[i]];\n // 防御性校验:跳过含非法字符的 token 值\n if (typeof val !== 'string' || /[\\{\\}]/.test(val)) continue;\n css += ' ' + keys[i] + ': ' + val + ';\\n';\n }\n css += '}';\n\n // Remove old dynamic palette if exists\n var old = doc.querySelector('style[data-tokui-dynamic-palette]');\n if (old) old.parentNode.removeChild(old);\n\n var style = doc.createElement('style');\n style.setAttribute('data-tokui-dynamic-palette', '');\n style.innerHTML = css;\n doc.head.appendChild(style);\n }\n};\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.TokUITheme = TokUITheme;\n window.TokUI.setTheme = TokUITheme.setTheme.bind(TokUITheme);\n window.TokUI.getTheme = TokUITheme.getTheme.bind(TokUITheme);\n window.TokUI.initTheme = TokUITheme.init.bind(TokUITheme);\n window.TokUI.setSeedColor = TokUITheme.setSeedColor.bind(TokUITheme);\n}\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = TokUITheme;\n}\n","/**\n * TokUI 解析器模块\n * 将 TokUI DSL 文本(如 [h1 标题]、[card tt:信息]...[/card])解析为节点树。\n * 支持一次性解析和流式增量解析两种模式。\n *\n * 节点结构: { type, attrs, content, children }\n * - type: 标签名(如 h1, card, _text)\n * - attrs: 属性键值对(如 { tt: '信息', stripe: true })\n * - content: 文本内容\n * - children: 子节点数组\n */\n'use strict';\n\n/**\n * 查找字符串中不在引号内的闭合方括号位置\n * 用于正确处理包含空格的引号属性值(如 ph:\"请 输入\")\n *\n * @param {string} str - 待搜索的字符串\n * @returns {number} 闭合括号索引,未找到返回 -1\n */\nfunction findCloseBracket(str) {\n let inQuote = false;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\"') {\n inQuote = !inQuote;\n } else if (str[i] === ']' && !inQuote) {\n return i;\n }\n }\n return -1;\n}\n\n/**\n * 容器类型集合\n * 这些标签需要开闭标签配对(如 [card]...[/card]),\n * 解析时会将其子节点收集到 children 数组中。\n * 非容器标签为自闭合类型(如 [h1 标题]、[hr])。\n */\nconst CONTAINERS = new Set([\n 'form', 'table', 'thead', 'tbody',\n 'card', 'ft', 'row', 'col', 'list',\n 'select', 'radio', 'code', 'imgs', 'md',\n 'textarea', 'tabs', 'tab', 'accordion', 'collapse', 'dialog',\n 'btngroup', 'picker', 'timeline', 'steps', 'drawer',\n 'ol', 'ul', 'i', 'item', 'think', 'think-chain', 'think-step',\n 'bubble', 'toolbar', 'badge-box', 'dropdown', 'transfer', 'callout',\n 'cascader', 'tree', 'tn', 'desc', 'carousel',\n 'popover', 'input-tag', 'watermark', 'menu',\n 'chat-input', 'msg-actions',\n 'tool-call', 'diff', 'quick-reply',\n 'plan', 'file-tree', 'ft-folder',\n 'terminal', 'sandbox', 'test-result',\n 'quote', 'toggle-group',\n 'conversations',\n 'welcome', 'welcome-feature',\n 'suggestions',\n 'attachments',\n 'artifact', 'artifact-code', 'artifact-preview',\n 'scroll-area',\n 'sidebar', 'sidebar-content', 'sidebar-footer',\n 'command', 'command-group',\n 'hover-card', 'hover-trigger', 'hover-content',\n 'resizable',\n 'canvas', 'canvas-content',\n 'chart',\n 'p'\n]);\n\n// chart 自闭合内联数据判定 —— 须与 builder.chart 的 hasInline、renderer 容器判定三处同步:\n// d / tasks / rows / nodes+flows / gauge·progress 的 v 任一存在 → 自闭合;否则容器模式收子节点。\n// 不同步会导致:cols 误触发自闭合(容器写法 [/chart] 报错)、或自闭合图被误判容器丢失流式预览。\nfunction chartHasInline(node) {\n if (!node || node.type !== 'chart') return false;\n var a = node.attrs || {};\n return !!(a.d || a.tasks || a.rows || (a.nodes && a.flows) ||\n (a.v !== undefined && (a.t === 'gauge' || a.t === 'progress')));\n}\n\n// p 的内联子节点白名单:只有这些类型可作为 p 的子节点(其余兄弟到达时自动闭合 p,\n// 保 [p 文本] / [p a][p b] 的自闭合兄弟语义,对标 HTML <p>)。\nconst P_INLINE_CHILDREN = new Set([\n 'a', '_text', 'tag', 'b', 'i', 'code', 'spin', 'strong', 'em', 'mark', 'sub', 'sup'\n]);\n\n/**\n * 解析标签内部文本为节点对象\n * 处理流程:\n * 1. 提取引号内容并替换为占位符,避免空格分割破坏引号值\n * 2. 按空格分割为 token 数组\n * 3. 第一个 token 为标签类型\n * 4. 后续 token 按 key:value 解析为属性,布尔属性单独处理\n * 5. 非属性 token 拼接为文本内容\n *\n * @param {string} raw - 方括号内的原始文本(不含 [ ])\n * @returns {Object} 解析后的节点 { type, attrs, content, children }\n */\nconst BOOLEAN_ATTRS = new Set([\n 'stripe', 'dis', 'ro', 'req', 'chk', 'multi', 'disabled',\n 'readonly', 'required', 'checked', 'multiple', 'striped', 'auto', 'plain',\n 'round', 'closable', 'bordered', 'open', 'pill', 'dot', 'leaf',\n 'inline', 'rounded', 'container',\n 'copy', 'regenerate', 'like', 'dislike', 'visible', 'delete',\n 'controls', 'open',\n 'active',\n 'collapsible',\n 'toggle',\n 'search'\n]);\n\nfunction parseTag(raw) {\n if (!raw || !raw.trim()) {\n return { type: '_text', attrs: {}, content: '', children: [] };\n }\n const node = { type: '', attrs: {}, content: '', children: [] };\n\n // 提取引号段,替换为占位符 __QUOTE0__, __QUOTE1__ ...\n // 支持转义引号 \\\",避免嵌套引号场景(如 tr 含逗号的 cell 值)解析失败\n const quotes = [];\n let processed = raw.replace(/\"((?:[^\"\\\\]|\\\\.)*)\"/g, (match, content) => {\n quotes.push(content.replace(/\\\\\"/g, '\"'));\n return `__QUOTE${quotes.length - 1}__`;\n });\n\n // 按空格分割 token\n const tokens = processed.split(/\\s+/);\n\n // 第一个 token 始终是标签类型\n node.type = tokens[0];\n\n // 逐个解析后续 token\n const contentParts = [];\n for (let i = 1; i < tokens.length; i++) {\n const token = tokens[i];\n\n const colonIdx = token.indexOf(':');\n if (colonIdx > 0) {\n const key = token.slice(0, colonIdx);\n // 属性名须为英文标识符(tt/tx/clk/data-* 等);\n // 含中文等非 ASCII 的「标签:值」文本(如「框架:React」「语言:TypeScript」)按正文处理,不当属性\n if (/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(key)) {\n let val = token.slice(colonIdx + 1);\n // 还原引号占位符\n val = val.replace(/__QUOTE(\\d+)__/g, (_, idx) => quotes[parseInt(idx)]);\n node.attrs[key] = val;\n } else {\n const withQuotes = token.replace(/__QUOTE(\\d+)__/g, (_, idx) => `\"${quotes[parseInt(idx)]}\"`);\n contentParts.push(withQuotes);\n }\n } else {\n // 非属性 token\n const unquoted = token.replace(/__QUOTE(\\d+)__/g, (_, idx) => quotes[parseInt(idx)]);\n // 布尔属性(如 stripe、disabled 等,出现即为 true)\n if (BOOLEAN_ATTRS.has(unquoted)) {\n node.attrs[unquoted] = true;\n } else {\n // 还原引号后作为文本内容\n const fullQuote = token.match(/^__QUOTE(\\d+)__$/);\n if (fullQuote) {\n // 整段被引号包裹(如 [p \"含冒号:的正文\"]):引号仅作分组语法,剥离后取内部文本\n contentParts.push(quotes[parseInt(fullQuote[1])]);\n } else {\n const withQuotes = token.replace(/__QUOTE(\\d+)__/g, (_, idx) => `\"${quotes[parseInt(idx)]}\"`);\n contentParts.push(withQuotes);\n }\n }\n }\n }\n\n // 拼接所有非属性 token 为节点文本内容\n node.content = contentParts.join(' ');\n\n // 别名映射:ol/ul → list, i → item\n const ALIASES = { ol: 'list', ul: 'list', i: 'item' };\n if (ALIASES[node.type]) {\n if (node.type === 'ol' || node.type === 'ul') {\n node.attrs.t = node.type;\n }\n node.type = ALIASES[node.type];\n }\n\n return node;\n}\n\n/**\n * TokUI 解析器类\n * 基于状态机(TEXT / TAG_OPEN / TAG_CLOSE)实现,\n * 支持一次性解析(parse)和流式增量解析(feed)两种模式。\n *\n * 流式模式下,容器节点会带上 _stream 标记:\n * - 'open': 容器开始,渲染器应创建 DOM 并入栈\n * - 'close': 容器结束,渲染器应弹出栈顶并绑定事件\n */\nclass TokUIParser {\n /**\n * @param {Function} onNode - 节点回调函数,每解析出一个节点时调用\n * @param {Object} [options] - 配置选项\n * @param {boolean} [options.streaming=true] - 是否启用流式模式\n */\n constructor(onNode, options) {\n this.onNode = onNode || (() => {});\n this.streaming = (options && options.streaming !== false);\n this.maxBuffer = (options && options.maxBuffer) || 1048576; // 1MB\n this.maxDepth = (options && options.maxDepth) || 100;\n this.buffer = ''; // 待解析的文本缓冲区\n this.stack = []; // 容器节点栈,用于嵌套层级管理\n this.state = 'TEXT'; // 当前状态机状态\n this._totalOffset = 0; // 全局字符偏移计数器(追踪 DSL 位置)\n this._dslText = ''; // 累积的完整 DSL 文本(用于切片)\n this._tagStartPos = -1; // 当前标签在 _dslText 中的起始位置(跨 feed 持久化)\n }\n\n /** 重置解析器状态 */\n reset() {\n this.buffer = '';\n this.stack = [];\n this.state = 'TEXT';\n this._totalOffset = 0;\n this._dslText = '';\n this._tagStartPos = -1;\n }\n\n /**\n * 流式输入数据\n * 追加文本到缓冲区并尝试解析。\n * 流式模式下,容器内的文本会立即作为 _text 节点输出。\n *\n * @param {string} chunk - 新输入的文本片段\n */\n feed(chunk) {\n if (this.buffer.length + chunk.length > this.maxBuffer) {\n console.warn('TokUI Parser: buffer 超过 maxBuffer (' + this.maxBuffer + '),截断输入');\n chunk = chunk.slice(0, this.maxBuffer - this.buffer.length);\n }\n this._dslText += chunk;\n this.buffer += chunk;\n this._tryParse();\n // 流式模式:立即输出容器内的文本节点(实现逐字渲染效果)\n // 原始内容模式(code/md/diff 等)跳过:buffer 可能包含半截 [/type] 标签,\n // 必须等 _tryParse() 的 raw content handler 统一处理,否则会吞掉闭合标签导致容器永不关闭\n if (this.streaming && this.state === 'TEXT' && this.stack.length > 0\n && !this._isRawContent() && !this.buffer.startsWith('[')) {\n const text = this.buffer.trim();\n if (text) {\n const textNode = { type: '_text', attrs: {}, content: text, children: [] };\n this.stack[this.stack.length - 1].children.push(textNode);\n this.onNode(textNode);\n this._totalOffset += this.buffer.length;\n this.buffer = '';\n }\n }\n // 原始内容模式(code/md/diff/terminal/sandbox/artifact-code)流式逐字渲染:\n // 旧实现在 closeIdx===-1 时 break、此处又跳过 raw,导致代码块流式期间正文完全空白,\n // 直到 [/type] 到达才一次性吐出(非真流式)。改为:按已发偏移(top._rawEmittedLen)\n // 增量 emit 缓冲区安全尾部(排除末尾可能是半截 [/type] 的部分),renderer 边收边重绘。\n // 闭标签到达时由 _tryParse 的 close 分支 / 结束时由 _flush 只补发剩余部分,避免重复。\n if (this.streaming && this.state === 'TEXT' && this.stack.length > 0 && this._isRawContent()) {\n const top = this.stack[this.stack.length - 1];\n const closeTag = '[/' + top.type + ']';\n // 计算末尾是 closeTag 多长前缀(如 \"[/cod\"),回持这部分不发,防止半截闭标签当正文漏出\n let hold = 0;\n const maxN = Math.min(this.buffer.length, closeTag.length);\n for (let n = maxN; n > 0; n--) {\n if (closeTag.startsWith(this.buffer.slice(this.buffer.length - n))) { hold = n; break; }\n }\n const safeEnd0 = this.buffer.length - hold;\n // 防止转义序列被 chunk 边界劈开(AI 流式常吐字面 \\n / \\t;SSE 分块可能把 \\ 和 n 劈到两块):\n // 若安全尾部以奇数个反斜杠结尾(未配对,疑似 \\n/\\t/\\r/\\\\ 起始),回持最后一个 \\,等下一块到齐再解码。\n let bs = 0;\n for (let k = safeEnd0 - 1; k >= 0 && this.buffer[k] === '\\\\'; k--) bs++;\n const safeEnd = (bs % 2 === 1) ? safeEnd0 - 1 : safeEnd0;\n const already = top._rawEmittedLen || 0;\n if (safeEnd > already) {\n const textContent = this._unescapeRaw(this.buffer.slice(already, safeEnd));\n if (textContent) {\n const textNode = { type: '_text', attrs: {}, content: textContent, children: [] };\n top.children.push(textNode);\n this.onNode(textNode);\n }\n top._rawEmittedLen = safeEnd;\n }\n }\n // chart 自闭合标签流式预览:TAG_OPEN 累积 chart 标签时,数据属性(d/tasks)每增长即 emit 半成品,\n // renderer 边收数据边重绘(柱/饼逐点、gantt 任务条逐条增长),无需等整个 ] 闭合。\n // 引号处理分两种:\n // - 颜色等属性(c:\"#16... 残缺)未闭合时不放行,避免半成品色值 → 黑/乱色;\n // - d/tasks 的长引号值(如 tasks:\"A,1,3|B,3,5|...\")闭引号到达前【必须】放行半成品预览,\n // 否则数据全齐才一次性 emit(gantt/bar/line 流式卡顿根因:原条件要求引号配对,\n // 长数据值闭引号到得很晚)。做法:末尾正处 d/tasks 未闭合引号值时临时补一个闭引号,\n // 让 parseTag 正确 strip 出半截值;chart.js 会跳过未长全的段,已长全的逐条渲染。\n if (this.streaming && this.state === 'TAG_OPEN'\n && /^chart\\s/.test(this.buffer)\n && /\\b(d|tasks|rows|nodes|flows)\\s*:/.test(this.buffer)\n && this.buffer !== this._lastChartPreview) {\n let probe = this.buffer;\n if ((probe.match(/\"/g) || []).length % 2 === 1) {\n // 引号未配对:仅末尾未闭合段属于 d/tasks 才补闭引号放行;颜色等残缺属性仍等待闭合\n if (/\\b(d|tasks|rows|nodes|flows)\\s*:\\s*\"[^\"]*$/.test(probe)) {\n probe = probe + '\"';\n } else {\n probe = null;\n }\n }\n if (probe !== null) {\n this._lastChartPreview = this.buffer;\n const preview = parseTag(probe);\n if (preview.type === 'chart' && chartHasInline(preview)) {\n preview._streamPreview = true;\n preview._previewKey = this._tagStartPos;\n this.onNode(preview);\n }\n }\n }\n // hrow/flow 子节点碎片化预览:chart 容器内 v 值渐增即 emit 半成品(_kidPreview),\n // renderer chartAppendChild 据此更新末行去重 → 容器 hrow/flow 也逐 cell/逐条填,不等完整标签。\n // 用 _kidPreview 而非 _streamPreview,避免被 mountStreaming(244) 当 chart 预览拦截。\n if (this.streaming && this.state === 'TAG_OPEN'\n && /^(hrow|flow)\\s/.test(this.buffer)\n && /\\bv\\s*:/.test(this.buffer)\n && this.buffer !== this._lastKidPreview) {\n let kprobe = this.buffer;\n if ((kprobe.match(/\"/g) || []).length % 2 === 1) {\n if (/\\bv\\s*:\\s*\"[^\"]*$/.test(kprobe)) kprobe += '\"';\n else kprobe = null;\n }\n if (kprobe !== null) {\n this._lastKidPreview = this.buffer;\n const kid = parseTag(kprobe);\n if (kid.type === 'hrow' || kid.type === 'flow') {\n kid._kidPreview = true;\n this.onNode(kid);\n }\n }\n }\n }\n\n /**\n * 一次性解析完整字符串\n *\n * @param {string} fullString - 完整的 TokUI DSL 文本\n */\n parse(fullString) {\n this.reset();\n this._dslText = fullString;\n this.buffer = fullString;\n this._tryParse();\n this._flush();\n }\n\n /**\n * 刷新缓冲区,输出剩余文本和未关闭的容器\n * 在解析结束时调用,确保所有数据都被处理。\n */\n _flush() {\n // 先尝试解析缓冲区中剩余的完整标签\n if (this.buffer.trim()) {\n this._tryParse();\n }\n // 输出缓冲区中剩余的文本\n if (this.buffer.trim()) {\n let leftover;\n if (this._isRawContent()) {\n // 流式 raw 已按 top._rawEmittedLen 增量发过:此处只 flush 剩余(如回持的半截闭标签残部 / 未闭合容器正文)\n const top = this.stack[this.stack.length - 1];\n const already = (this.streaming && top && top._rawEmittedLen) ? top._rawEmittedLen : 0;\n leftover = this._unescapeRaw(this.buffer.slice(already).trim());\n } else {\n leftover = this.buffer.trim();\n }\n if (leftover) {\n const textNode = { type: '_text', attrs: {}, content: leftover, children: [] };\n if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(textNode);\n } else {\n this.onNode(textNode);\n }\n }\n this._totalOffset += this.buffer.length;\n this.buffer = '';\n }\n // 关闭所有未关闭的容器(从内到外)\n while (this.stack.length) {\n const node = this.stack.pop();\n node._dslEnd = this._dslText.length;\n node._dsl = this._dslText.slice(node._dslStart);\n if (this.streaming) {\n node._stream = 'close';\n this.onNode(node);\n } else {\n this.onNode(node);\n }\n }\n }\n\n /**\n * 检查当前是否处于 code 块内部\n * code 块内的内容为原始文本,只识别 [/code] 闭合标签\n */\n _isRawContent() {\n for (let i = this.stack.length - 1; i >= 0; i--) {\n var t = this.stack[i].type;\n if (t === 'code' || t === 'md' || t === 'diff' || t === 'terminal' || t === 'sandbox' || t === 'artifact-code') return true;\n }\n return false;\n }\n\n /**\n * 原始内容块(code/md/diff/terminal/sandbox/artifact-code)的 C 风格转义解码\n * AI 流式输出几乎必在代码块里吐字面 \\n(反斜杠+n 两字符),renderer 的 wrapLines\n * 按真换行(0x0A)切行,字面 \\n 不触发 → 整段塌成一行。此处把 \\n→\\n \\t→\\t \\r→\\r \\\\→\\\n * 仅认这四种转义;其余(如正则 \\d、路径 \\w)保留字面反斜杠,不误伤代码字面量。\n * 仅在原始内容块调用,普通文本/属性值不动。\n */\n _unescapeRaw(s) {\n if (typeof s !== 'string' || s.indexOf('\\\\') === -1) return s;\n return s.replace(/\\\\(.)/g, function (_, ch) {\n if (ch === 'n') return '\\n';\n if (ch === 't') return '\\t';\n if (ch === 'r') return '\\r';\n if (ch === '\\\\') return '\\\\';\n return '\\\\' + ch;\n });\n }\n\n /**\n * 核心解析循环(状态机)\n * 三种状态:\n * - TEXT: 普通文本模式,等待遇到 [ 符号\n * - TAG_OPEN: 遇到 [ 后解析开标签\n * - TAG_CLOSE: 遇到 [/ 后解析闭标签\n *\n * 特殊处理:code 块内部为原始内容模式,\n * 所有 [ 均视为文本,只识别 [/code] 闭合。\n */\n _tryParse() {\n let maxIter = 50000; // 防止死循环的安全阈值\n while (maxIter-- > 0) {\n if (this.state === 'TEXT') {\n // === 原始内容模式(code/md 块内部)===\n if (this._isRawContent()) {\n const top = this.stack[this.stack.length - 1];\n const topType = top.type;\n const closeTag = `[/${topType}]`;\n const closeIdx = this.buffer.indexOf(closeTag);\n if (closeIdx === -1) break;\n if (closeIdx > 0) {\n // 流式期间已按 top._rawEmittedLen 增量发过;此处只补发剩余未发部分,避免重复 emit\n const already = (this.streaming && top._rawEmittedLen) ? top._rawEmittedLen : 0;\n if (closeIdx > already) {\n const textContent = this._unescapeRaw(this.buffer.slice(already, closeIdx));\n if (textContent) {\n const textNode = { type: '_text', attrs: {}, content: textContent, children: [] };\n if (this.streaming && this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(textNode);\n this.onNode(textNode);\n } else if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(textNode);\n } else {\n this.onNode(textNode);\n }\n }\n }\n // 消费文本部分,保留 [/type] 交给正常 [ 检测流程\n this._totalOffset += closeIdx;\n this.buffer = this.buffer.slice(closeIdx);\n continue;\n }\n // closeIdx === 0:缓冲区以 [/type] 开头,fall through 到正常流程处理\n }\n\n // === 普通文本模式 ===\n // 隐式开标签的 deferred ] 关闭:容器经「嵌套 [ 隐式补 ]」开标签时,其真实 ] 被 deferred\n // (_implicitOpen=true)。子节点解析完后 buffer 残留 \"文本]\" 形式,此 ] 应关闭该隐式容器。\n // 否则 ] 漏进正文([item [tag t:success tx:完成] 项目初始化配置] 末尾 ] 被当 _text 渲染)。\n const topNode = this.stack.length > 0 ? this.stack[this.stack.length - 1] : null;\n if (topNode && topNode._implicitOpen && !this._isRawContent()) {\n // 孤立闭合引号剥离:[item \"[tag ...]\"] 模式下,隐式开标签在嵌套 [ 处截断,\n // 开标签的闭合 \" 被遗留在缓冲区 ] 之前(buffer 形如 `\"]`)。findCloseBracket 会把该 \"\n // 当成未闭合引号起点,导致 ] 被判在引号内而找不到。此 \" 实为被截断的闭合引号(语法),\n // 剥离后再找 ],避免 `\"]` 漏进 _flush 渲染成可见乱字。\n let probeBuf = this.buffer;\n let stripOffset = 0;\n if (probeBuf[0] === '\"' && probeBuf.indexOf(']') !== -1) {\n probeBuf = probeBuf.slice(1);\n stripOffset = 1;\n }\n const defClose = findCloseBracket(probeBuf);\n const nextOpen = probeBuf.indexOf('[');\n // ] 必须先于任何 [(避免吞掉后续子标签的开标签),buffer 以 [/ 开标签时 nextOpen=0 自然跳过\n if (defClose !== -1 && (nextOpen === -1 || defClose < nextOpen)) {\n // ] 前文本作为隐式容器内容输出\n if (defClose > 0) {\n const textContent = probeBuf.slice(0, defClose).trim();\n if (textContent) {\n const textNode = { type: '_text', attrs: {}, content: textContent, children: [] };\n if (this.streaming) {\n topNode.children.push(textNode);\n this.onNode(textNode);\n } else {\n topNode.children.push(textNode);\n }\n }\n }\n // 关闭隐式容器(等价显式 [/type])。defClose 基于 probeBuf,还原到 this.buffer 需加 stripOffset。\n const realClose = stripOffset + defClose;\n const closeEndPos = this._totalOffset + realClose + 1;\n const closed = this.stack.pop();\n closed._dslEnd = closeEndPos;\n closed._dsl = this._dslText.slice(closed._dslStart, closeEndPos);\n this._totalOffset = closeEndPos;\n this.buffer = this.buffer.slice(realClose + 1);\n if (this.streaming) {\n closed._stream = 'close';\n this.onNode(closed);\n } else if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(closed);\n } else {\n this.onNode(closed);\n }\n continue;\n }\n }\n\n const idx = this.buffer.indexOf('[');\n if (idx === -1) break; // 没有标签,等待更多数据\n\n // 记录标签起始位置([ 的位置)\n this._tagStartPos = this._totalOffset + idx;\n\n // 输出 [ 前的文本内容\n if (idx > 0) {\n const textContent = this.buffer.slice(0, idx);\n if (textContent.trim()) {\n const textNode = { type: '_text', attrs: {}, content: textContent, children: [] };\n if (this.streaming && this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(textNode);\n this.onNode(textNode);\n } else if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(textNode);\n } else {\n this.onNode(textNode);\n }\n }\n }\n this.buffer = this.buffer.slice(idx + 1);\n this._totalOffset = this._tagStartPos + 1; // 跳过 [\n this.state = 'TAG_OPEN';\n }\n\n if (this.state === 'TAG_OPEN') {\n if (this.buffer.length === 0) break;\n // 原始内容模式下,只允许 [/type] 闭标签通过\n if (this._isRawContent()) {\n const topType = this.stack[this.stack.length - 1].type;\n if (!this.buffer.startsWith('/' + topType)) {\n this.buffer = '[' + this.buffer;\n this._totalOffset -= 1;\n this.state = 'TEXT';\n continue;\n }\n }\n // 检测是否为闭标签 [/...]\n if (this.buffer[0] === '/') {\n this.buffer = this.buffer.slice(1);\n this._totalOffset += 1;\n this.state = 'TAG_CLOSE';\n continue;\n }\n // 查找闭合 ] 并解析标签\n const closeIdx = findCloseBracket(this.buffer);\n if (closeIdx === -1) break; // 标签不完整,等待更多数据\n // 容错:容器开标签跨行漏写 ]、直接接子标签(AI 习惯 HTML <li> 裸开),\n // 例 [item 文本\\n[list] —— closeIdx 命中的其实是子标签的 ],父标签头被吞进 content。\n // 检测 raw 内嵌套 [:若 [ 前是容器类型,在该 [ 处自动闭合父标签(隐式补 ])。\n let endIdx = closeIdx;\n let consumeClose = true; // true=跳过 ];自动闭合时 false=保留 [ 下轮重解析\n const rawProbe = this.buffer.slice(0, closeIdx);\n // 引号感知的嵌套 [ 检测:跳过引号内的字面 [(如 [item \"生成 [0,1) 浮点数\"]),\n // 否则引号里的 [ 被误判为子标签 → 父标签被截断、引号残留、内容错乱。\n // 规则:item/card 等内容含字面 [ ] 时,须用双引号包整个内容;此处保证引号内 [ 不触发隐式闭合。\n let nestedBracket = -1;\n {\n let inQ = false;\n for (let k = 0; k < rawProbe.length; k++) {\n const ch = rawProbe[k];\n if (ch === '\"') inQ = !inQ;\n else if (ch === '[' && !inQ) { nestedBracket = k; break; }\n }\n }\n if (nestedBracket > 0 && !this._isRawContent()) {\n const probe = parseTag(rawProbe.slice(0, nestedBracket).trim());\n if (CONTAINERS.has(probe.type)) {\n endIdx = nestedBracket; // 在 [ 处截断,等价父标签在此闭合\n consumeClose = false; // 保留 [,交回 TEXT 重新解析为子标签\n }\n }\n const raw = this.buffer.slice(0, endIdx);\n this.buffer = this.buffer.slice(endIdx + (consumeClose ? 1 : 0));\n const node = parseTag(raw);\n // 隐式开标签(consumeClose=false,见上方嵌套 [ 容错):父标签的真实 ] 被 deferred,\n // 标记后由 TEXT 状态消费首个裸 ] 关闭。否则该 ] 会漏进正文\n // ([item [tag t:success tx:完成] 文本] 末尾 ] 被当 _text 渲染)\n if (!consumeClose) node._implicitOpen = true;\n // 记录 DSL 偏移量:从 [ 到 ] 的位置\n node._dslStart = this._tagStartPos;\n node._dslEnd = this._totalOffset + endIdx + (consumeClose ? 1 : 0);\n node._dsl = this._dslText.slice(node._dslStart, node._dslEnd);\n this._totalOffset = node._dslEnd;\n\n // 根据模式分发节点\n if (this.streaming) {\n this._emitStreaming(node);\n } else {\n this._emitBuffered(node);\n }\n this.state = 'TEXT';\n if (!consumeClose) continue; // buffer 以 [ 开头,回 TEXT 处理子标签\n }\n\n if (this.state === 'TAG_CLOSE') {\n const closeIdx = this.buffer.indexOf(']');\n if (closeIdx === -1) break; // 闭标签不完整\n let tagName = this.buffer.slice(0, closeIdx).trim();\n this.buffer = this.buffer.slice(closeIdx + 1);\n // 别名映射:闭标签也需要匹配别名后的类型\n const CLOSE_ALIASES = { ol: 'list', ul: 'list', i: 'item' };\n if (CLOSE_ALIASES[tagName]) {\n tagName = CLOSE_ALIASES[tagName];\n }\n // 闭标签结束位置:[/tagName]\n const closeEndPos = this._totalOffset + closeIdx + 1;\n this._totalOffset = closeEndPos;\n\n if (this.streaming) {\n // 流式模式:在栈中查找匹配的容器,逐层关闭\n for (let i = this.stack.length - 1; i >= 0; i--) {\n if (this.stack[i].type === tagName) {\n // 先关闭内层未关闭的容器\n while (this.stack.length > i + 1) {\n const inner = this.stack.pop();\n inner._stream = 'close';\n inner._dslEnd = closeEndPos;\n inner._dsl = this._dslText.slice(inner._dslStart, closeEndPos);\n this.onNode(inner);\n }\n // 关闭匹配的容器\n const container = this.stack.pop();\n container._dslEnd = closeEndPos;\n container._dsl = this._dslText.slice(container._dslStart, closeEndPos);\n this.onNode({ type: tagName, _stream: 'close' });\n break;\n }\n }\n } else {\n // 缓冲模式:在栈中查找匹配容器,收集子节点\n let found = false;\n for (let i = this.stack.length - 1; i >= 0; i--) {\n if (this.stack[i].type === tagName) {\n // 收集内层节点作为子节点\n const stackChildren = [];\n while (this.stack.length > i + 1) {\n const inner = this.stack.pop();\n inner._dslEnd = closeEndPos;\n inner._dsl = this._dslText.slice(inner._dslStart, closeEndPos);\n stackChildren.unshift(inner);\n }\n const node = this.stack.pop();\n node._dslEnd = closeEndPos;\n node._dsl = this._dslText.slice(node._dslStart, closeEndPos);\n // node.children 已含兄弟隐式闭合 push 的前序 item(正序),\n // stackChildren 是栈里最后未关的内层;正确顺序 = 已有 + 内层\n node.children = node.children.concat(stackChildren);\n if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(node);\n } else {\n this.onNode(node);\n }\n found = true;\n break;\n }\n }\n if (!found) {\n console.warn('TokUI Parser: 未匹配的闭合标签 [/' + tagName + ']');\n }\n }\n this.state = 'TEXT';\n }\n }\n }\n\n /**\n * 流式模式分发节点\n * 容器节点标记为 _stream:'open' 并压入栈,\n * 子节点追加到栈顶容器的 children 中。\n */\n _emitStreaming(node) {\n // 兄弟 item 隐式闭合:新 [item] 开时若栈顶已是未闭合的 item(AI 习惯 HTML <li> 裸标签,\n // 不写 [/item]),先把上一个关掉,避免流式下各 li 互相嵌套成空壳。\n // item 现为容器语义([item 文本] 文本当 <li> 首段,可直接嵌套子 list),有 content 也走隐式关,\n // 故不再区分「带 content 自闭合」——靠下个 item / 父闭标签 / [/item] 关闭。对齐 HTML <li> 语义。\n if (node.type === 'item') {\n while (this.stack.length > 0 && this.stack[this.stack.length - 1].type === 'item') {\n const prevItem = this.stack.pop();\n prevItem._stream = 'close';\n this.onNode(prevItem);\n }\n }\n // p 自动闭合:仅对「有文本的叶 p」([p 文本],content 非空)在遇到块级兄弟时闭合,\n // 保 [p 文本] / [p a][p b] 的自闭合兄弟语义(对标 HTML <p>)。\n // 显式容器 [p] / [p v:x](content 为空)不闭合 —— 收所有子节点(btn/a/tag 等),由 [/p] 关闭。\n const topP = this.stack.length > 0 && this.stack[this.stack.length - 1].type === 'p'\n ? this.stack[this.stack.length - 1] : null;\n if (topP && topP.content && !P_INLINE_CHILDREN.has(node.type)) {\n const prevP = this.stack.pop();\n prevP._stream = 'close';\n this.onNode(prevP);\n }\n // tx on popover/input-tag means trigger/label text, not self-closing body content\n const TX_CONTAINER_EXCLUDE = new Set(['tn', 'popover', 'input-tag', 'watermark']);\n const isTxSelfClosing = CONTAINERS.has(node.type) && !TX_CONTAINER_EXCLUDE.has(node.type) && node.attrs.tx;\n const isLeafSelfClosing = node.type === 'tn' && node.attrs.leaf !== undefined;\n // input-tag 带 tags 属性 → 自闭合(与 builder.inputTag() 的 _selfClosing 分支对齐);\n // 否则按容器打开收子节点。\n const isTagsSelfClosing = node.type === 'input-tag' && node.attrs.tags;\n const isSelfClosing = isTxSelfClosing || isLeafSelfClosing || isTagsSelfClosing;\n // desc/suggestions use cols as layout attribute, not as self-closing trigger\n // chart 的 cols 是数据列标签(heatmap),非布局自闭合触发,须豁免(否则容器写法 [/chart] 报错)\n const hasColsTrigger = node.attrs.cols && node.type !== 'desc' && node.type !== 'suggestions' && node.type !== 'chart';\n // chart 带 d/tasks 内联数据 → 自闭合(旧用法);无内联数据 → 容器模式收 pt/task/ms 子节点(流式)\n const hasInlineData = chartHasInline(node);\n // 自闭合 chart 带 preview key,与流式预览配对(renderer finalize 复用 pending wrapper)\n if (hasInlineData) node._previewKey = node._dslStart;\n if (CONTAINERS.has(node.type) && !hasColsTrigger && !isSelfClosing && !hasInlineData) {\n if (this.stack.length >= this.maxDepth) {\n console.warn('TokUI Parser: 嵌套深度超过 maxDepth (' + this.maxDepth + '),按自闭合处理');\n if (this.stack.length > 0) { this.stack[this.stack.length - 1].children.push(node); }\n this.onNode(node);\n } else {\n node._stream = 'open';\n this.stack.push(node);\n this.onNode(node);\n }\n } else if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(node);\n this.onNode(node);\n } else {\n this.onNode(node);\n }\n }\n\n /**\n * 缓冲模式分发节点\n * 容器节点压入栈,等待闭标签时再组装完整的节点树。\n */\n _emitBuffered(node) {\n // 兄弟 item 隐式闭合(与 _emitStreaming 对齐):新 [item] 开时先关栈顶连续 item,\n // 把已组装的 item 挂到父容器 children,避免兄弟 item 互相嵌套成空壳。\n if (node.type === 'item') {\n while (this.stack.length > 0 && this.stack[this.stack.length - 1].type === 'item') {\n const prevItem = this.stack.pop();\n if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(prevItem);\n }\n }\n }\n // p 自动闭合:仅对「有文本的叶 p」(content 非空)在遇到块级兄弟时闭合并挂回父级;\n // 显式容器 [p] / [p v:x](content 空)不闭合,收所有子节点。\n const topP = this.stack.length > 0 && this.stack[this.stack.length - 1].type === 'p'\n ? this.stack[this.stack.length - 1] : null;\n if (topP && topP.content && !P_INLINE_CHILDREN.has(node.type)) {\n const prevP = this.stack.pop();\n if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(prevP);\n } else {\n this.onNode(prevP); // 根级兄弟:无父可挂,直接 emit(否则丢失)\n }\n }\n const TX_CONTAINER_EXCLUDE = new Set(['tn', 'popover', 'input-tag', 'watermark']);\n const isTxSelfClosing = CONTAINERS.has(node.type) && !TX_CONTAINER_EXCLUDE.has(node.type) && node.attrs.tx;\n const isLeafSelfClosing = node.type === 'tn' && node.attrs.leaf !== undefined;\n const isTagsSelfClosing = node.type === 'input-tag' && node.attrs.tags;\n const isSelfClosing = isTxSelfClosing || isLeafSelfClosing || isTagsSelfClosing;\n // desc/suggestions use cols as layout attribute, not as self-closing trigger\n // chart 的 cols 是数据列标签(heatmap),非布局自闭合触发,须豁免(否则容器写法 [/chart] 报错)\n const hasColsTrigger = node.attrs.cols && node.type !== 'desc' && node.type !== 'suggestions' && node.type !== 'chart';\n // chart 带 d/tasks 内联数据 → 自闭合(旧用法);无内联数据 → 容器模式收 pt/task/ms 子节点(流式)\n const hasInlineData = chartHasInline(node);\n // 自闭合 chart 带 preview key,与流式预览配对(renderer finalize 复用 pending wrapper)\n if (hasInlineData) node._previewKey = node._dslStart;\n if (CONTAINERS.has(node.type) && !hasColsTrigger && !isSelfClosing && !hasInlineData) {\n if (this.stack.length >= this.maxDepth) {\n console.warn('TokUI Parser: 嵌套深度超过 maxDepth (' + this.maxDepth + '),按自闭合处理');\n if (this.stack.length > 0) { this.stack[this.stack.length - 1].children.push(node); }\n else { this.onNode(node); }\n } else {\n this.stack.push(node);\n }\n } else if (this.stack.length > 0) {\n this.stack[this.stack.length - 1].children.push(node);\n } else {\n this.onNode(node);\n }\n }\n\n /** 开始流式解析(重置状态) */\n startStream() {\n this.reset();\n }\n\n /** 结束流式解析(刷新缓冲区) */\n endStream() {\n this._flush();\n }\n}\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.TokUIParser = TokUIParser;\n window.TokUI._internal.parseTag = parseTag;\n window.TokUI._internal.CONTAINERS = CONTAINERS;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { TokUIParser, parseTag, CONTAINERS };\n}\n","/**\n * TokUI 渲染器模块\n * 将解析器输出的节点树渲染为 DOM 元素。\n * 支持一次性挂载(mount)和流式挂载(mountStreaming)两种模式。\n * 通过组件注册机制,每种标签类型对应一个渲染函数。\n */\n'use strict';\n\n/**\n * 创建 DOM 元素的快捷方法\n *\n * @param {string} tag - HTML 标签名\n * @param {Object} [attrs] - 属性键值对(值为 true 时设置空属性,false 时跳过)\n * @param {string} [textContent] - 元素文本内容\n * @returns {HTMLElement} 创建的 DOM 元素\n */\nfunction el(tag, attrs, textContent) {\n const element = document.createElement(tag);\n\n if (attrs) {\n Object.entries(attrs).forEach(([key, value]) => {\n if (value === undefined || value === null) return;\n // 过滤危险属性名,防止 XSS 和 CSS 注入\n if (key.startsWith('on') || key === 'formaction') return;\n if (key === 'style') { element.style.cssText = String(value); return; }\n if (value === true) {\n element.setAttribute(key, '');\n } else if (value === false) {\n // 布尔值为 false 时不设置属性\n } else {\n element.setAttribute(key, String(value));\n }\n });\n }\n\n if (textContent !== undefined && textContent !== null) {\n element.textContent = textContent;\n }\n\n return element;\n}\n\n/**\n * 组件变体白名单\n * key = 组件类型, value = 允许的变体名 Set\n * DSL: v:variant1,variant2 → CSS: tokui-{type}--{variant}\n */\nconst VARIANTS = {\n img: new Set(['avatar', 'rounded', 'bordered']),\n card: new Set(['highlight', 'flat', 'bordered', 'center', 'right']),\n btn: new Set(['primary', 'danger', 'success', 'warning', 'ghost', 'sm', 'lg', 'pill', 'square', 'block']),\n btngroup: new Set(['vertical', 'pill']),\n table: new Set(['bordered', 'compact']),\n input: new Set(['error', 'success', 'sm', 'lg', 'underline', 'pill']),\n pwd: new Set(['error', 'success', 'sm', 'lg', 'underline', 'pill']),\n select: new Set(['error', 'success']),\n picker: new Set(['error', 'success']),\n h1: new Set(['left', 'center', 'right', 'ribbon', 'underline', 'badge', 'pill']),\n h2: new Set(['left', 'center', 'right', 'ribbon', 'underline', 'badge', 'pill']),\n h3: new Set(['left', 'center', 'right', 'ribbon', 'underline', 'badge', 'pill']),\n h4: new Set(['left', 'center', 'right', 'ribbon', 'underline', 'badge', 'pill']),\n h5: new Set(['left', 'center', 'right', 'ribbon', 'underline', 'badge', 'pill']),\n h6: new Set(['left', 'center', 'right', 'ribbon', 'underline', 'badge', 'pill']),\n p: new Set(['left', 'center', 'right', 'muted', 'bold', 'sm', 'lg']),\n a: new Set(['muted', 'danger', 'success', 'underline']),\n ft: new Set(['left', 'center', 'right']),\n row: new Set(['left', 'center', 'right', 'inline']),\n dv: new Set(['dashed', 'dotted', 'sm', 'md', 'lg', 'vert', 'plain']),\n dot: new Set(['sm', 'lg']),\n avatar: new Set(['sm', 'md', 'lg', 'xl']),\n tooltip: new Set(['top', 'bottom', 'left', 'right']),\n pagination: new Set(['sm', 'lg']),\n switch: new Set(['sm', 'lg']),\n drawer: new Set(['left', 'right', 'top', 'bottom']),\n breadcrumb: new Set(['arrow']),\n slider: new Set(['sm', 'lg']),\n rate: new Set(['sm', 'lg']),\n transfer: new Set(['sm', 'lg']),\n cascader: new Set(['error', 'success']),\n upload: new Set(['sm', 'lg']),\n tree: new Set(['sm', 'lg']),\n};\n\n/**\n * TokUI 渲染器类\n * 通过 register() 注册各类组件的渲染函数,\n * 通过 render() 将节点树转换为 DOM 元素。\n *\n * 流式渲染使用 slotStack(插槽栈)管理容器嵌套:\n * 每个容器 DOM 上标记 _slot(内容插入点)和 _tokuiType(组件类型),\n * 新元素挂载到栈顶容器的 _slot 中。\n */\nclass TokUIRenderer {\n /**\n * @param {Object} eventBus - 事件总线,用于绑定组件交互事件\n */\n constructor(eventBus) {\n this.registry = {}; // 组件渲染函数注册表\n this.eventBus = eventBus;\n this.slotStack = []; // 流式渲染时的插槽栈\n this._boundElements = []; // 记录绑定过事件的元素,用于 destroy\n this._onError = null; // 全局错误回调\n }\n\n /**\n * 注册组件渲染函数\n *\n * @param {string} type - 标签类型名\n * @param {Function} renderFn - 渲染函数 (node, rc, parentType) => HTMLElement\n * - node: 当前节点\n * - rc: 递归渲染子节点的函数\n * - parentType: 父节点类型(用于特殊处理如 opt 在 radio 中的行为)\n */\n register(type, renderFn) {\n this.registry[type] = renderFn;\n }\n\n /**\n * 注册全局错误回调\n * 组件渲染异常时调用,用于日志上报或自定义错误处理。\n *\n * @param {Function} fn - 错误回调 (type, error, node) => void\n */\n onError(fn) {\n this._onError = fn;\n }\n\n /**\n * 渲染单个节点为 DOM 元素\n * 文本节点创建文本节点,其他节点查找注册的渲染函数处理,\n * 未注册的类型渲染为带警告样式的 div。\n *\n * @param {Object} node - 解析器输出的节点\n * @param {string} [parentType] - 父节点类型\n * @returns {HTMLElement|Text} 渲染后的 DOM 元素\n */\n render(node, parentType, depth) {\n // 渲染深度限制,防止栈溢出\n if ((depth || 0) > 50) {\n console.warn('TokUI Renderer: 渲染深度超过 50,可能存在循环嵌套');\n return document.createTextNode('');\n }\n\n // 文本节点直接创建 Text 节点\n if (node.type === '_text') {\n return document.createTextNode(node.content);\n }\n\n // 查找已注册的渲染函数\n const handler = this.registry[node.type];\n if (!handler) {\n // 未注册类型渲染为警告样式的 div\n const div = el('div', { class: 'tokui-unknown', 'data-tokui-type': node.type });\n if (node.content) div.textContent = node.content;\n return div;\n }\n\n var self = this;\n var currentDepth = depth || 0;\n // 子节点递归渲染函数\n const rc = (children) => {\n return children.map(child => self.render(child, node.type, currentDepth + 1));\n };\n\n var dom;\n try {\n dom = handler(node, rc, parentType);\n } catch (err) {\n console.warn('TokUI Renderer: 组件渲染异常', node.type, err);\n if (self._onError) {\n try { self._onError(node.type, err, node); } catch (_) { /* ignore callback errors */ }\n }\n var details = el('details', { class: 'tokui-error', 'data-tokui-type': node.type });\n var summary = el('summary', { class: 'tokui-error__summary' });\n summary.textContent = '[' + node.type + '] 渲染失败';\n details.appendChild(summary);\n var errMsg = el('div', { class: 'tokui-error__detail' });\n errMsg.textContent = String(err.message || err);\n details.appendChild(errMsg);\n dom = details;\n }\n this._applyVariants(dom, node);\n // 在每个组件根元素盖 data-tokui-tag 源标签印章(文档 Playground / E2E 定位用)。\n // 只盖普通元素(nodeType===1),文本节点 / fragment / null 跳过。\n if (dom && dom.nodeType === 1 && node.type && node.type !== '_text') {\n dom.setAttribute('data-tokui-tag', node.type);\n }\n return dom;\n }\n\n /**\n * 为 DOM 元素应用组件变体修饰符类\n * 读取 node.attrs.v,按白名单添加 tokui-{type}--{variant} 类。\n * 支持 _variantTarget 委托(用于 input/pwd/select 等有包装器的组件)。\n *\n * @param {HTMLElement} dom - 渲染函数返回的 DOM 元素\n * @param {Object} node - 解析器输出的节点\n */\n _applyVariants(dom, node) {\n var v = node.attrs && node.attrs.v;\n if (!v || !dom || dom.nodeType !== 1) return;\n var allowed = VARIANTS[node.type];\n if (!allowed) return;\n var target = dom._variantTarget || dom;\n v.split(',').map(function (s) { return s.trim(); }).filter(Boolean).forEach(function (name) {\n if (allowed.has(name)) {\n target.classList.add('tokui-' + node.type + '--' + name);\n }\n });\n }\n\n /**\n * 一次性挂载:渲染节点并添加到容器\n * 为元素添加淡入动画,并绑定事件。\n *\n * @param {Object} node - 要渲染的节点\n * @param {HTMLElement} targetContainer - 目标容器\n * @returns {HTMLElement} 挂载的 DOM 元素\n */\n mount(node, targetContainer) {\n const dom = this.render(node);\n if (dom.nodeType === 1) {\n dom.style.animation = 'tokuiFadeIn 0.3s ease';\n }\n targetContainer.appendChild(dom);\n this.bindEvents(dom);\n // 触发容器的延迟初始化 hook(如 picker 的交互绑定)\n if (dom._streamCloseHook) dom._streamCloseHook();\n return dom;\n }\n\n /**\n * 流式挂载:根据节点的 _stream 标记分发处理\n * - 'open': 容器开始,创建 DOM 并压入插槽栈\n * - 'close': 容器结束,弹出栈并绑定事件\n * - 其他: 普通子节点,挂载到栈顶容器\n *\n * @param {Object} node - 解析器输出的节点(带 _stream 标记)\n * @param {HTMLElement} rootContainer - 根容器\n * @returns {HTMLElement|null} 挂载的 DOM 元素\n */\n mountStreaming(node, rootContainer) {\n // chart 自闭合流式预览:半成品 attrs 到达即更新 pending wrapper(渐增重绘)\n if (node._streamPreview) {\n return this._streamChartPreview(node, rootContainer);\n }\n if (node._stream === 'open') {\n return this._streamOpen(node, rootContainer);\n }\n if (node._stream === 'close') {\n return this._streamClose(node);\n }\n // 自闭合 chart 最终到达:复用 pending wrapper(避免与预览重复渲染)\n if (node.type === 'chart' && node._previewKey !== undefined) {\n return this._streamChartFinalize(node, rootContainer);\n }\n return this._streamChild(node, rootContainer);\n }\n\n // chart 自闭合流式预览:首次创建 pending wrapper 挂到当前 slot,后续用新 attrs 重绘\n _streamChartPreview(node, rootContainer) {\n this._pendingCharts = this._pendingCharts || {};\n const key = node._previewKey;\n const pending = this._pendingCharts[key];\n if (pending) {\n if (pending._tokuiChartUpdate) pending._tokuiChartUpdate(node.attrs);\n return pending;\n }\n const dom = this.render(node);\n const parentEntry = this.slotStack.length > 0 ? this.slotStack[this.slotStack.length - 1] : null;\n const target = parentEntry ? parentEntry.slot : rootContainer;\n if (dom.nodeType === 1) dom.style.animation = 'tokuiFadeIn 0.3s ease';\n target.appendChild(dom);\n this._pendingCharts[key] = dom;\n return dom;\n }\n\n // chart 自闭合最终到达(] 闭合):复用 pending 用最终 attrs 更新一次,清理登记\n _streamChartFinalize(node, rootContainer) {\n this._pendingCharts = this._pendingCharts || {};\n const key = node._previewKey;\n const pending = this._pendingCharts[key];\n if (pending) {\n if (pending._tokuiChartUpdate) pending._tokuiChartUpdate(node.attrs);\n delete this._pendingCharts[key];\n return pending;\n }\n // 无 pending(预览未触发,如 buffer 极短直接到 ]):按普通子节点渲染\n return this._streamChild(node, rootContainer);\n }\n\n /**\n * 流式渲染:打开容器\n * 渲染容器 DOM,添加淡入动画,挂载到栈顶的插槽位置,\n * 然后将自身压入插槽栈(使用 _slot 作为新的插入点)。\n */\n _streamOpen(node, rootContainer) {\n const dom = this.render(node);\n // 跳过隐藏元素的 fadeIn 动画(如 hover-content 临时容器)\n if (dom.nodeType === 1 && !dom.classList.contains('tokui-hover-card__content-temp')) {\n dom.style.animation = 'tokuiFadeIn 0.3s ease';\n }\n // 确定父级插槽:栈顶的 slot 或根容器\n let parentSlot = this.slotStack.length > 0\n ? this.slotStack[this.slotStack.length - 1].slot\n : rootContainer;\n // ft 在 card / dialog / drawer 内时,直接追加到容器元素而非 body 插槽(作页脚)\n if (node.type === 'ft' && this.slotStack.length > 0) {\n const parentEntry = this.slotStack[this.slotStack.length - 1];\n if (parentEntry.containerType === 'card' || parentEntry.containerType === 'dialog' || parentEntry.containerType === 'drawer') {\n parentSlot = parentEntry.el;\n }\n }\n // tab 在 tabs 内时:在 tabs 容器上插入 input + label,panel 追加到 tabs 本身\n if (node.type === 'tab' && dom._isTab && this.slotStack.length > 0) {\n const parentEntry = this.slotStack[this.slotStack.length - 1];\n if (parentEntry.containerType === 'tabs' && parentEntry.el._tabId) {\n const tabsEl = parentEntry.el;\n const tabId = tabsEl._tabId;\n const idx = tabsEl._tabCount || 0;\n // 创建 radio input\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = tabId;\n input.className = 'tokui-tabs-input';\n input.id = tabId + '-' + idx;\n input.setAttribute('data-index', String(idx));\n if (idx === 0) input.checked = true;\n tabsEl.appendChild(input);\n // 创建 label\n const label = document.createElement('label');\n label.className = 'tokui-tabs-label';\n label.setAttribute('for', tabId + '-' + idx);\n label.setAttribute('data-index', String(idx));\n label.setAttribute('data-tokui-tag', 'tab');\n label.textContent = dom._tabTitle || ('Tab ' + (idx + 1));\n tabsEl.appendChild(label);\n // 面板追加到 tabs 容器\n dom.setAttribute('data-index', String(idx));\n tabsEl.appendChild(dom);\n tabsEl._tabCount = idx + 1;\n // panel 的 slot 是自身,子内容追加到 panel 内\n this.slotStack.push({ slot: dom._slot || dom, el: dom, containerType: node.type });\n return dom;\n }\n }\n parentSlot.appendChild(dom);\n // 记录插槽信息:_slot 为内容插入点,_tokuiType 为组件类型\n const slot = dom._slot || dom;\n this.slotStack.push({ slot: slot, el: dom, containerType: node.type });\n return dom;\n }\n\n /**\n * 流式渲染:关闭容器\n * 从栈顶向下查找匹配的容器,逐层弹出并绑定事件。\n * 事件绑定延迟到容器关闭时执行,确保内部元素已全部就绪。\n */\n _streamClose(node) {\n while (this.slotStack.length > 0) {\n const entry = this.slotStack.pop();\n this.bindEvents(entry.el);\n // 容器关闭回调(用于流式模式下延迟初始化)\n if (entry.el._streamCloseHook) {\n entry.el._streamCloseHook();\n }\n // 匹配到对应类型的容器时停止\n if (entry.el._tokuiType === node.type || this._getNodeType(entry.el) === node.type) {\n break;\n }\n }\n return null;\n }\n\n /**\n * 流式渲染:处理子节点\n * 将节点渲染为 DOM 并挂载到栈顶容器的插槽位置。\n * 特殊处理:opt 在 radio 容器内时,渲染为 radio 选项项。\n */\n _streamChild(node, rootContainer) {\n var parentEntry = this.slotStack.length > 0 ? this.slotStack[this.slotStack.length - 1] : null;\n var parentType = parentEntry ? parentEntry.containerType : undefined;\n var target = parentEntry ? parentEntry.slot : rootContainer;\n\n // chart 容器内的 pt/task/ms 子节点 → 喂给图表增量重绘,不渲染为 DOM\n if (parentEntry && parentEntry.containerType === 'chart' && parentEntry.el._tokuiChartAppend) {\n parentEntry.el._tokuiChartAppend(node);\n return null;\n }\n\n // ft 自闭合节点(tx 纯文字页脚)在 card / dialog / drawer 内时,挂到容器元素而非 body 插槽。\n // 与 _streamOpen 的 ft 特殊处理对称:容器模式 ft 走 _streamOpen,\n // parser 对带 tx 的 ft 触发容器自闭合逃逸使其走 _streamChild,此处补齐兜底。\n if (node.type === 'ft' && parentEntry && (parentEntry.containerType === 'card' || parentEntry.containerType === 'dialog' || parentEntry.containerType === 'drawer')) {\n target = parentEntry.el;\n }\n\n // 特殊处理:opt 在 radio 内 → 渲染为 radio 选项\n if (node.type === 'opt' && parentEntry && parentEntry.el._slot && parentEntry.el._slot._radioName) {\n var radioName = parentEntry.el._slot._radioName;\n var radioLabel = this.render(node, 'radio');\n if (radioName && radioLabel.querySelector) {\n var radioInput = radioLabel.querySelector('input[type=radio]');\n if (radioInput) radioInput.name = radioName;\n }\n if (radioLabel.nodeType === 1) radioLabel.style.animation = 'tokuiFadeIn 0.3s ease';\n target.appendChild(radioLabel);\n return radioLabel;\n }\n\n // 特殊处理:opt 在 picker 内 → 渲染为 li 并追加到 dropdown\n if (node.type === 'opt' && parentEntry && parentEntry.containerType === 'picker') {\n var pickerDropdown = parentEntry.slot;\n var optLi = this.render(node, 'picker');\n if (optLi.nodeType === 1) optLi.style.animation = 'tokuiFadeIn 0.3s ease';\n var emptyTip = pickerDropdown.querySelector('.tokui-picker-empty');\n if (emptyTip) {\n pickerDropdown.insertBefore(optLi, emptyTip);\n } else {\n pickerDropdown.appendChild(optLi);\n }\n return optLi;\n }\n\n // 特殊处理:opt 在 transfer 内 → 立即追加为穿梭项到对应栏(真流式,边收边显)\n if (node.type === 'opt' && parentEntry && parentEntry.containerType === 'transfer' && parentEntry.el._tokuiTransferAppend) {\n var transferItem = parentEntry.el._tokuiTransferAppend(node);\n if (transferItem && transferItem.nodeType === 1) transferItem.style.animation = 'tokuiFadeIn 0.3s ease';\n return null; // 不进 staging,避免重复\n }\n\n var dom = this.render(node, parentType);\n if (dom.nodeType === 1) {\n dom.style.animation = 'tokuiFadeIn 0.3s ease';\n }\n target.appendChild(dom);\n // 原始内容容器(code 等)流式逐字追加子文本时,同步触发增量重绘 hook\n // (代码块边收边重新高亮 + 重排行号),实现真流式而非等到闭合才渲染。\n if (parentEntry && parentEntry.el && parentEntry.el._streamAppendHook) {\n parentEntry.el._streamAppendHook(node);\n }\n // 容器内的子元素延迟到容器关闭时统一绑定事件,确保能感知完整 DOM 结构\n if (this.slotStack.length === 0) {\n this.bindEvents(dom);\n }\n return dom;\n }\n\n /**\n * 收集表单数据,支持多值字段(如 checkbox 组)\n * 同名字段自动转为数组,单值字段保持字符串\n */\n _collectFormData(form) {\n const data = {};\n for (const [key, value] of new FormData(form)) {\n if (data[key] !== undefined) {\n if (!Array.isArray(data[key])) data[key] = [data[key]];\n data[key].push(value);\n } else {\n data[key] = value;\n }\n }\n return data;\n }\n\n /**\n * 从 DOM 元素获取其 TokUI 组件类型\n * 优先读取 _tokuiType 标记,其次从 CSS 类名中提取。\n */\n _getNodeType(el) {\n if (el._tokuiType) return el._tokuiType;\n const m = el.className && el.className.match && el.className.match(/tokui-(\\w+)/);\n return m ? m[1] : '';\n }\n\n /**\n * 销毁渲染器,清理所有事件绑定和状态\n * 移除已绑定元素的 DOM 事件监听器,清空插槽栈。\n */\n destroy() {\n // 清理绑定过事件的元素\n this._boundElements.forEach(function (entry) {\n entry.listeners.forEach(function (listener) {\n entry.element.removeEventListener(listener.type, listener.fn);\n });\n delete entry.element._tokuiBound;\n delete entry.element._tokuiClickBound;\n });\n this._boundElements = [];\n this.slotStack = [];\n }\n\n /**\n * 重置插槽栈\n * 流式解析结束时调用,为栈中所有未关闭的容器绑定事件。\n */\n resetSlotStack() {\n while (this.slotStack.length > 0) {\n const entry = this.slotStack.pop();\n this.bindEvents(entry.el);\n }\n }\n\n /**\n * 为 DOM 元素及其子元素绑定 TokUI 事件\n * 处理两种事件:\n * 1. 点击事件(data-tokui-clk):查找元素上的 clk 属性,调用事件总线中注册的处理函数\n * 2. 表单提交事件(data-tokui-sub):拦截表单提交,收集表单数据后调用处理函数\n *\n * 使用 _tokuiBound 标记避免重复绑定。\n *\n * @param {HTMLElement} dom - 需要绑定事件的 DOM 元素\n */\n bindEvents(dom) {\n if (!this.eventBus || dom.nodeType !== 1) return;\n if (dom._tokuiBound) return;\n dom._tokuiBound = true;\n\n var self = this;\n\n // 绑定所有带 data-tokui-clk 属性的元素的点击事件\n const clickElements = dom.querySelectorAll('[data-tokui-clk]');\n clickElements.forEach((element) => {\n if (element._tokuiBound) return;\n element._tokuiBound = true;\n const handlerName = element.getAttribute('data-tokui-clk');\n if (!handlerName) return;\n // 提交按钮在 form 外时,click 中自动查找并收集附近 form 数据\n var nearbyFormForSubmit = null;\n if (element.getAttribute('type') === 'submit' && !element.closest('form')) {\n var ancestor = element.parentElement;\n while (ancestor && ancestor !== dom.parentElement) {\n var found = ancestor.querySelector('form[data-tokui-sub]');\n if (found) { nearbyFormForSubmit = found; break; }\n ancestor = ancestor.parentElement;\n }\n }\n var clickFn = function (e) {\n e.preventDefault();\n // 提交按钮在 form 外:用附近 form 的 sub handler 处理\n if (nearbyFormForSubmit) {\n const subName = nearbyFormForSubmit.getAttribute('data-tokui-sub');\n const handler = subName ? self.eventBus.getHandler(subName) : null;\n if (handler) {\n handler(self._collectFormData(nearbyFormForSubmit), e, nearbyFormForSubmit);\n }\n return;\n }\n const handler = self.eventBus.getHandler(handlerName);\n if (handler) {\n // 如果在表单内,自动收集表单数据\n const form = element.closest('form');\n const data = form ? self._collectFormData(form) : null;\n handler(data, e, element);\n }\n };\n element.addEventListener('click', clickFn);\n self._boundElements.push({ element: element, listeners: [{ type: 'click', fn: clickFn }] });\n });\n\n // 绑定表单提交事件\n const formList = [];\n if (dom.tagName === 'FORM' && (dom.hasAttribute('data-tokui-sub') || dom.hasAttribute('data-tokui-clk'))) formList.push(dom);\n dom.querySelectorAll('form[data-tokui-sub], form[data-tokui-clk]').forEach(f => formList.push(f));\n formList.forEach((form) => {\n if (form._tokuiFormBound) return;\n form._tokuiFormBound = true;\n const handlerName = form.getAttribute('data-tokui-sub') || form.getAttribute('data-tokui-clk');\n if (!handlerName) return;\n var submitFn = function (e) {\n e.preventDefault();\n const handler = self.eventBus.getHandler(handlerName);\n if (handler) {\n const data = self._collectFormData(form);\n handler(data, e, form);\n }\n };\n form.addEventListener('submit', submitFn);\n self._boundElements.push({ element: form, listeners: [{ type: 'submit', fn: submitFn }] });\n });\n\n // 处理根元素自身的点击事件(当根元素本身带 data-tokui-clk 时)\n if (dom.hasAttribute && dom.hasAttribute('data-tokui-clk') && !dom._tokuiClickBound) {\n dom._tokuiClickBound = true;\n const handlerName = dom.getAttribute('data-tokui-clk');\n if (handlerName) {\n var domClickFn = function (e) {\n e.preventDefault();\n const handler = self.eventBus.getHandler(handlerName);\n if (handler) {\n const form = dom.closest('form');\n const data = form ? self._collectFormData(form) : null;\n handler(data, e, dom);\n }\n };\n dom.addEventListener('click', domClickFn);\n self._boundElements.push({ element: dom, listeners: [{ type: 'click', fn: domClickFn }] });\n }\n }\n }\n}\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.el = el;\n window.TokUI._internal.VARIANTS = VARIANTS;\n window.TokUI._internal.TokUIRenderer = TokUIRenderer;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { el, TokUIRenderer, VARIANTS };\n}\n","/**\n * TokUI 灯箱预览模块\n * 点击图片弹出全屏灯箱大图预览。\n * 支持:左右切换、ESC 关闭、点击遮罩关闭、文件名显示、缩放、旋转、翻转。\n * 灯箱 DOM 首次打开时动态创建,关闭时移除。\n */\n'use strict';\n\n/**\n * 从图片 URL 中提取文件名\n * @param {string} src - 图片 URL\n * @returns {string} 文件名\n */\nfunction extractFileName(src) {\n try {\n var path = src.split('?')[0];\n var parts = path.split('/');\n var name = parts[parts.length - 1];\n if (name && name.length < 60) return decodeURIComponent(name);\n return '';\n } catch (e) {\n return '';\n }\n}\n\n/**\n * 创建灯箱模块实例\n * @param {Document} doc - document 对象(支持 SSR 传入 mock)\n * @returns {{ open: Function, destroy: Function }}\n */\nfunction createLightbox(doc) {\n var overlay = null;\n var currentIndex = 0;\n var images = [];\n var onKeyHandler = null;\n var triggerElement = null;\n\n // 图片变换状态\n var scale = 1;\n var rotation = 0;\n var flipH = false;\n var flipV = false;\n\n function resetTransform() {\n scale = 1;\n rotation = 0;\n flipH = false;\n flipV = false;\n }\n\n function applyTransform() {\n var img = overlay.querySelector('.tokui-lightbox__img');\n var transforms = [];\n transforms.push('scale(' + scale + ')');\n transforms.push('rotate(' + rotation + 'deg)');\n if (flipH) transforms.push('scaleX(-1)');\n if (flipV) transforms.push('scaleY(-1)');\n img.style.transform = transforms.join(' ');\n // 缩放时切换拖拽光标\n img.style.cursor = scale > 1 ? 'grab' : '';\n // 更新工具栏按钮状态\n updateToolbarState();\n }\n\n function updateToolbarState() {\n if (!overlay) return;\n var scaleDisplay = overlay.querySelector('.tokui-lightbox__scale');\n if (scaleDisplay) scaleDisplay.textContent = Math.round(scale * 100) + '%';\n }\n\n function buildDOM() {\n overlay = doc.createElement('div');\n overlay.className = 'tokui-lightbox';\n overlay.setAttribute('role', 'dialog');\n overlay.setAttribute('aria-modal', 'true');\n overlay.setAttribute('aria-label', '图片预览');\n\n var img = doc.createElement('img');\n img.className = 'tokui-lightbox__img';\n overlay.appendChild(img);\n\n // 工具栏\n var toolbar = doc.createElement('div');\n toolbar.className = 'tokui-lightbox__toolbar';\n\n var btnZoomIn = doc.createElement('button');\n btnZoomIn.className = 'tokui-lightbox__tool';\n btnZoomIn.setAttribute('aria-label', '放大');\n btnZoomIn.innerHTML = '&#43;';\n btnZoomIn.addEventListener('click', function (e) { e.stopPropagation(); zoomIn(); });\n\n var scaleDisplay = doc.createElement('span');\n scaleDisplay.className = 'tokui-lightbox__scale';\n scaleDisplay.textContent = '100%';\n\n var btnZoomOut = doc.createElement('button');\n btnZoomOut.className = 'tokui-lightbox__tool';\n btnZoomOut.setAttribute('aria-label', '缩小');\n btnZoomOut.innerHTML = '&#8722;';\n btnZoomOut.addEventListener('click', function (e) { e.stopPropagation(); zoomOut(); });\n\n var btnReset = doc.createElement('button');\n btnReset.className = 'tokui-lightbox__tool';\n btnReset.setAttribute('aria-label', '重置');\n btnReset.innerHTML = '&#8634;';\n btnReset.addEventListener('click', function (e) { e.stopPropagation(); resetAll(); });\n\n var btnRotateL = doc.createElement('button');\n btnRotateL.className = 'tokui-lightbox__tool';\n btnRotateL.setAttribute('aria-label', '左旋90°');\n btnRotateL.innerHTML = '&#8634;L';\n btnRotateL.addEventListener('click', function (e) { e.stopPropagation(); rotate(-90); });\n\n var btnRotateR = doc.createElement('button');\n btnRotateR.className = 'tokui-lightbox__tool';\n btnRotateR.setAttribute('aria-label', '右旋90°');\n btnRotateR.innerHTML = '&#8635;R';\n btnRotateR.addEventListener('click', function (e) { e.stopPropagation(); rotate(90); });\n\n var btnFlipH = doc.createElement('button');\n btnFlipH.className = 'tokui-lightbox__tool';\n btnFlipH.setAttribute('aria-label', '水平翻转');\n btnFlipH.innerHTML = '&#8596;';\n btnFlipH.addEventListener('click', function (e) { e.stopPropagation(); flip('h'); });\n\n var btnFlipV = doc.createElement('button');\n btnFlipV.className = 'tokui-lightbox__tool';\n btnFlipV.setAttribute('aria-label', '垂直翻转');\n btnFlipV.innerHTML = '&#8597;';\n btnFlipV.addEventListener('click', function (e) { e.stopPropagation(); flip('v'); });\n\n // 分隔线 + 计数器(多图时显示)\n var sep = doc.createElement('span');\n sep.className = 'tokui-lightbox__sep';\n\n var counter = doc.createElement('span');\n counter.className = 'tokui-lightbox__counter';\n\n toolbar.appendChild(btnZoomOut);\n toolbar.appendChild(scaleDisplay);\n toolbar.appendChild(btnZoomIn);\n toolbar.appendChild(btnReset);\n toolbar.appendChild(sep);\n toolbar.appendChild(btnRotateL);\n toolbar.appendChild(btnRotateR);\n toolbar.appendChild(btnFlipH);\n toolbar.appendChild(btnFlipV);\n toolbar.appendChild(sep.cloneNode());\n toolbar.appendChild(counter);\n overlay.appendChild(toolbar);\n\n // 文件名\n var fileName = doc.createElement('div');\n fileName.className = 'tokui-lightbox__filename';\n overlay.appendChild(fileName);\n\n // 左右切换按钮\n var prevBtn = doc.createElement('button');\n prevBtn.className = 'tokui-lightbox__prev';\n prevBtn.textContent = '‹';\n prevBtn.setAttribute('aria-label', 'Previous');\n overlay.appendChild(prevBtn);\n\n var nextBtn = doc.createElement('button');\n nextBtn.className = 'tokui-lightbox__next';\n nextBtn.textContent = '›';\n nextBtn.setAttribute('aria-label', 'Next');\n overlay.appendChild(nextBtn);\n\n // 关闭按钮\n var closeBtn = doc.createElement('button');\n closeBtn.className = 'tokui-lightbox__close';\n closeBtn.innerHTML = '&times;';\n closeBtn.setAttribute('aria-label', '关闭');\n closeBtn.addEventListener('click', function (e) { e.stopPropagation(); close(); });\n overlay.appendChild(closeBtn);\n\n // 鼠标滚轮缩放\n overlay.addEventListener('wheel', function (e) {\n e.preventDefault();\n if (e.deltaY < 0) zoomIn();\n else zoomOut();\n });\n\n overlay.addEventListener('click', function (e) {\n if (e.target === overlay) close();\n });\n prevBtn.addEventListener('click', function (e) {\n e.stopPropagation();\n navigate(-1);\n });\n nextBtn.addEventListener('click', function (e) {\n e.stopPropagation();\n navigate(1);\n });\n\n return overlay;\n }\n\n function zoomIn() {\n scale = Math.min(scale + 0.25, 5);\n applyTransform();\n }\n\n function zoomOut() {\n scale = Math.max(scale - 0.25, 0.25);\n applyTransform();\n }\n\n function rotate(deg) {\n rotation = (rotation + deg) % 360;\n applyTransform();\n }\n\n function flip(axis) {\n if (axis === 'h') flipH = !flipH;\n else flipV = !flipV;\n applyTransform();\n }\n\n function resetAll() {\n resetTransform();\n applyTransform();\n }\n\n function updateView() {\n var img = overlay.querySelector('.tokui-lightbox__img');\n var counter = overlay.querySelector('.tokui-lightbox__counter');\n var prevBtn = overlay.querySelector('.tokui-lightbox__prev');\n var nextBtn = overlay.querySelector('.tokui-lightbox__next');\n var fileName = overlay.querySelector('.tokui-lightbox__filename');\n\n img.src = images[currentIndex];\n counter.textContent = images.length > 1\n ? (currentIndex + 1) + '/' + images.length\n : '';\n prevBtn.style.display = images.length > 1 ? '' : 'none';\n nextBtn.style.display = images.length > 1 ? '' : 'none';\n\n // 文件名\n var name = extractFileName(images[currentIndex]);\n fileName.textContent = name;\n fileName.style.display = name ? '' : 'none';\n\n // 重置变换\n resetTransform();\n img.style.transform = '';\n img.style.cursor = '';\n updateToolbarState();\n }\n\n function navigate(delta) {\n currentIndex = (currentIndex + delta + images.length) % images.length;\n updateView();\n }\n\n function onKeyDown(e) {\n if (e.key === 'Escape') close();\n if (e.key === 'ArrowLeft') navigate(-1);\n if (e.key === 'ArrowRight') navigate(1);\n if (e.key === '+' || e.key === '=') zoomIn();\n if (e.key === '-') zoomOut();\n if (e.key === 'r' || e.key === 'R') rotate(e.shiftKey ? -90 : 90);\n if (e.key === 'h' || e.key === 'H') flip('h');\n if (e.key === 'v' || e.key === 'V') flip('v');\n if (e.key === '0') resetAll();\n // Tab 键 focus trap\n if (e.key === 'Tab' && overlay) {\n var focusable = overlay.querySelectorAll('button, [tabindex]');\n if (focusable.length === 0) return;\n var first = focusable[0];\n var last = focusable[focusable.length - 1];\n if (e.shiftKey && doc.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && doc.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n function open(src, imageList) {\n triggerElement = doc.activeElement;\n images = imageList || [src];\n currentIndex = images.indexOf(src);\n if (currentIndex < 0) currentIndex = 0;\n if (!overlay) buildDOM();\n doc.body.appendChild(overlay);\n updateView();\n doc.addEventListener('keydown', onKeyDown);\n onKeyHandler = onKeyDown;\n var closeBtn = overlay.querySelector('.tokui-lightbox__close');\n if (closeBtn) closeBtn.focus();\n }\n\n function close() {\n if (overlay && overlay.parentNode) {\n overlay.parentNode.removeChild(overlay);\n }\n if (onKeyHandler) {\n doc.removeEventListener('keydown', onKeyHandler);\n onKeyHandler = null;\n }\n if (triggerElement && triggerElement.focus) {\n triggerElement.focus();\n triggerElement = null;\n }\n }\n\n return { open: open, destroy: close };\n}\n\nvar _lightbox = null;\nfunction getLightbox(doc) {\n if (!_lightbox) _lightbox = createLightbox(doc || document);\n return _lightbox;\n}\n\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.createLightbox = createLightbox;\n window.TokUI._internal.getLightbox = getLightbox;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { createLightbox, getLightbox };\n}\n","/**\n * TokUI 图表组件模块\n * 纯 SVG 零依赖实现 9 种图表:bar / line / pie / donut / radar / scatter / gantt / funnel / gauge\n * 内置渲染器注册表,支持外部图表库扩展或覆盖。\n */\n'use strict';\n\nvar chartRenderers = {};\nvar SVG_NS = 'http://www.w3.org/2000/svg';\nvar DEFAULT_COLORS = [\n '#1677ff', '#52c41a', '#faad14', '#f5222d', '#722ed1',\n '#13c2c2', '#eb2f96', '#fa8c16', '#2f54eb', '#a0d911'\n];\nvar LEGEND_H = 22;\n\n// === 工具函数 ===\n\nfunction svgEl(tag, attrs) {\n var el = document.createElementNS(SVG_NS, tag);\n if (attrs) {\n Object.keys(attrs).forEach(function (k) {\n el.setAttribute(k, String(attrs[k]));\n });\n }\n return el;\n}\n\nfunction parseData(d) {\n if (!d) return [];\n return String(d).split(',').map(function (v) { return parseFloat(v.trim()) || 0; });\n}\n\nfunction parseLabels(l) {\n if (!l) return [];\n return String(l).split(',').map(function (v) { return v.trim(); });\n}\n\nfunction parseMultiSeries(d) {\n if (!d) return [];\n return String(d).split('|').map(function (s) {\n return s.split(',').map(function (v) { return parseFloat(v.trim()) || 0; });\n });\n}\n\nfunction parseScatterData(d) {\n if (!d) return [];\n return String(d).split(';').map(function (pair) {\n var parts = pair.split(',').map(function (v) { return parseFloat(v.trim()) || 0; });\n return { x: parts[0] || 0, y: parts[1] || 0 };\n });\n}\n\n// 逗号分隔数值列表(gauge zones 阈值等)\nfunction parseNumList(s) {\n if (!s) return [];\n return String(s).split(',').map(function (x) { return parseFloat(x.trim()); }).filter(function (n) { return !isNaN(n); });\n}\n\n// 逗号分隔颜色列表(gauge zc 段色等);流式半成品自动过滤\nfunction parseColorList(s) {\n if (!s) return [];\n return String(s).split(',').map(function (x) { return x.trim().replace(/^[\"']|[\"']$/g, ''); }).filter(isValidColor);\n}\n\nfunction isValidColor(v) {\n if (!v) return false;\n v = v.trim();\n if (!v) return false;\n // #RGB / #RGBA / #RRGGBB / #RRGGBBAA\n if (/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(v)) return true;\n if (/^var\\(--[^)]+\\)$/.test(v)) return true;\n if (/^(rgba?|hsla?)\\([^)]*\\)$/i.test(v)) return true;\n return false;\n}\n\nfunction getColors(attrs) {\n if (attrs.c) {\n // 去引号 + 校验每个色值;流式半成品(c:\"#16、c:\" 等)会被过滤掉\n var list = String(attrs.c).split(',').map(function (v) {\n return v.trim().replace(/^[\"']|[\"']$/g, '');\n });\n var valid = list.filter(isValidColor);\n if (valid.length) return valid;\n }\n return DEFAULT_COLORS;\n}\n\nfunction maxOf(arr) {\n return Math.max.apply(null, arr);\n}\n\nfunction minOf(arr) {\n return Math.min.apply(null, arr);\n}\n\n// 数值夹取(lo/hi 闭区间)—— 提前定义,全局复用(原 gantt 区 line ~983 的 clamp 已移此)。\nfunction clamp(v, lo, hi) { return Math.max(lo, Math.min(hi, v)); }\n\n// 按数据点数动态算 viewBox 尺寸(宽或高):每点保最小可读 slot,随 n 线性增长封顶;用户显式值优先。\n// Dynamic viewBox size (width or height) by data-point count — each point keeps a\n// min-readable slot, grows linearly with n up to cap; explicit attrs[key] wins.\n// key 'w' 或 'h'(读取用户显式覆盖)\n// n 数据点数\n// padX 该轴内边距之和(轴标签等)\n// minSlot 每点最小可读 viewBox 单位\n// floor 下限(少数据时不致过小)\n// cap 上限(与 CSS max-width/max-height 协同,防超大 n 画布失控)\nfunction autoSize(attrs, key, n, padX, minSlot, floor, cap) {\n if (attrs[key] !== undefined && attrs[key] !== '') {\n var ex = parseInt(attrs[key], 10);\n if (!isNaN(ex) && ex > 0) return ex;\n }\n return clamp(Math.round(padX + Math.max(0, n) * minSlot), floor, cap);\n}\n\n// 宽高比带:w/h 超 maxRatio 则抬高 h(封顶 hCap),使大图纵向同步撑开、\n// 配合 preserveAspectRatio=\"meet\" 不产生上下 letterbox;显式 attrs.h 为基准(仍受 band/cap 约束)。\n// Ratio-band height — widen h when w/h exceeds maxRatio (capped by hCap), so large\n// charts grow vertically too and meet never letterboxes top/bottom.\nfunction bandHeight(w, h, maxRatio, hCap) {\n if (w / h > maxRatio) h = Math.round(w / maxRatio);\n return Math.min(h, hCap);\n}\n\n// === Tooltip 顶层系统 ===\n\n/**\n * 创建 tooltip 管理器(所有 tooltip 放独立层,渲染在 SVG 最上层)\n * svgW/svgH: SVG 尺寸,用于边界 clamp\n */\nfunction createTipMgr(svgW, svgH) {\n var idx = 0;\n var layer = svgEl('g', { class: 'tokui-chart-tips-layer' });\n function lineW(str) {\n var w = 0;\n for (var i = 0; i < str.length; i++) {\n w += (str.charCodeAt(i) > 127) ? 10 : 5.5;\n }\n return w;\n }\n return {\n layer: layer,\n add: function (group, text, x, y) {\n var id = String(idx++);\n group.setAttribute('data-tip-id', id);\n var lines = text.split(' ');\n var lineH = 14, padX = 8, padY = 4;\n var maxLW = 0;\n lines.forEach(function (l) { maxLW = Math.max(maxLW, lineW(l)); });\n var tw = maxLW + padX * 2;\n var th = lines.length * lineH + padY * 2;\n var rx = x - tw / 2;\n var ry = y - th - 6;\n if (rx < 2) rx = 2;\n if (rx + tw > svgW - 2) rx = svgW - tw - 2;\n if (ry < 2) ry = y + 10;\n if (ry + th > svgH - 2) ry = svgH - th - 2;\n var tipG = svgEl('g', { class: 'tokui-chart-tip', 'data-tip-id': id });\n tipG.appendChild(svgEl('rect', {\n x: rx, y: ry, width: tw, height: th,\n rx: 4, fill: 'rgba(0,0,0,0.78)'\n }));\n lines.forEach(function (line, li) {\n var t = svgEl('text', {\n x: rx + tw / 2, y: ry + padY + (li + 0.5) * lineH,\n 'text-anchor': 'middle', 'dominant-baseline': 'central',\n fill: '#fff', 'font-size': '10'\n });\n t.textContent = line;\n tipG.appendChild(t);\n });\n layer.appendChild(tipG);\n }\n };\n}\n\n/**\n * 绑定 hover 事件:tip-group enter/leave → 控制顶层 tooltip 显隐\n */\nfunction bindTooltips(svg) {\n var groups = svg.querySelectorAll('.tokui-chart-tip-group');\n groups.forEach(function (g) {\n g.addEventListener('mouseenter', function () {\n var id = g.getAttribute('data-tip-id');\n var tip = svg.querySelector('.tokui-chart-tips-layer [data-tip-id=\"' + id + '\"]');\n if (tip) tip.style.opacity = '1';\n });\n g.addEventListener('mouseleave', function () {\n var id = g.getAttribute('data-tip-id');\n var tip = svg.querySelector('.tokui-chart-tips-layer [data-tip-id=\"' + id + '\"]');\n if (tip) tip.style.opacity = '';\n });\n });\n}\n\n/**\n * 通用图例渲染:在 SVG 底部绘制水平居中的图例\n */\nfunction appendLegend(svg, entries, w, y) {\n if (!entries || !entries.length) return;\n var totalW = 0;\n entries.forEach(function (e) { totalW += 12 + e.text.length * 5 + 14; });\n totalW -= 14;\n var x = Math.max(4, (w - totalW) / 2);\n entries.forEach(function (e) {\n svg.appendChild(svgEl('rect', { x: x, y: y + 1, width: 8, height: 8, fill: e.color, rx: 1.5 }));\n var t = svgEl('text', { x: x + 11, y: y + 7, fill: 'var(--tokui-chart-text, #999)', 'font-size': '7' });\n t.textContent = e.text;\n svg.appendChild(t);\n x += 12 + e.text.length * 5 + 14;\n });\n}\n\n// === 共用渲染 helper(缺陷修复 + 新图复用) ===\n\n// 空数据占位:返回带提示文字的 svg(bar/line/pie/donut/radar/funnel 空数据兜底)\n// Empty-state placeholder svg with a hint message.\nfunction emptyChartSvg(w, h, msg) {\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg tokui-chart__svg--empty', preserveAspectRatio: 'xMidYMid meet' });\n var t = svgEl('text', { x: w / 2, y: h / 2, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #bbb)', 'font-size': '11' });\n t.textContent = msg || '暂无数据';\n svg.appendChild(t);\n return svg;\n}\n\n// 估算文本像素宽(CJK 双倍计宽)— for label collision detection.\nfunction estTextW(str) {\n var w = 0;\n for (var i = 0; i < str.length; i++) w += (str.charCodeAt(i) > 127) ? 8 : 4.5;\n return w;\n}\n\n// Nice number:把任意值量化到 1/2/5×10^k 的\"漂亮刻度\"。\n// niceBounds:lo/hi 向 nice 刻度对齐、给 y 轴留缓冲带 → 小幅数据波动不改变轴范围(流式重绘稳定)。\nfunction niceNum(x, round) {\n if (!(x > 0) || !isFinite(x)) x = 1;\n var exp = Math.floor(Math.log10(x));\n var f = x / Math.pow(10, exp);\n var nf;\n if (round) nf = f < 1.5 ? 1 : f < 3 ? 2 : f < 7 ? 5 : 10;\n else nf = f <= 1 ? 1 : f <= 2 ? 2 : f <= 5 ? 5 : 10;\n return nf * Math.pow(10, exp);\n}\nfunction niceBounds(lo, hi) {\n if (!isFinite(lo) || !isFinite(hi)) return [0, 1];\n if (lo === hi) { lo -= 1; hi += 1; }\n var span = niceNum(hi - lo, false);\n var step = niceNum(span / 5, true) || 1;\n return [Math.floor(lo / step) * step, Math.ceil(hi / step) * step];\n}\n\n// 轴边界三级优先:显式 attrs.{xmin/xmax/ymin/ymax}(用户/后端锁定,绝对稳定)>\n// 流式缓存 attrs._{_xMin/...}(只扩不缩 + nice 量化)> 当前数据 min/max。\n// Axis bound priority — explicit attrs.{axis} (locked, jitter-free even on extrema expand) >\n// streaming cache (expand-only) > current data min/max. Used by scatter/bubble.\nfunction axisBound(attrs, explicit, cachedKey, fallback) {\n if (attrs[explicit] !== undefined && attrs[explicit] !== '') {\n var ex = parseFloat(attrs[explicit]);\n if (!isNaN(ex)) return ex;\n }\n if (attrs[cachedKey] !== undefined) return +attrs[cachedKey];\n return fallback;\n}\n\n// x 轴标签:标签估算宽 > slotW*0.9 → 自动 -45° 旋转避让(主流图表角度,中文长标签防重叠)。\n// Auto-rotate x-axis labels when estimated width exceeds slot threshold.\n// positions:每个 label 的 x 坐标数组;slotW:单标签可用宽度阈值。\nfunction appendXLabels(svg, labels, positions, baseY, slotW) {\n var threshold = (slotW || 40) * 0.9;\n labels.forEach(function (lb, i) {\n if (lb === undefined || lb === null || lb === '') return;\n var lx = positions[i];\n var needRotate = estTextW(String(lb)) > threshold;\n var t = svgEl('text', {\n x: lx, y: baseY,\n 'text-anchor': needRotate ? 'end' : 'middle',\n fill: 'var(--tokui-chart-text, #999)', 'font-size': '9'\n });\n if (needRotate) t.setAttribute('transform', 'rotate(-45 ' + lx + ' ' + baseY + ')');\n t.textContent = lb;\n svg.appendChild(t);\n });\n}\n\n// 轴单位:vertical=true 时 y 轴单位竖排(-90°),否则 x 轴单位横排。\n// Axis unit label, vertical for y-axis (rotated -90°).\nfunction appendAxisUnit(svg, label, x, y, vertical) {\n var t = svgEl('text', { x: x, y: y, 'text-anchor': 'middle', fill: 'var(--tokui-chart-text, #666)', 'font-size': '9' });\n if (vertical) t.setAttribute('transform', 'rotate(-90 ' + x + ' ' + y + ')');\n t.textContent = label;\n svg.appendChild(t);\n}\n\n// 通用数值动画(easeOutCubic + rAF;无 rAF 或 prefers-reduced-motion 直接落终态)。gauge/progress 共用。\n// Generic value animation; degrades to final state without rAF or under reduced-motion.\nfunction animateValue(fromV, toV, animMs, onTick) {\n var hasRAF = typeof window !== 'undefined' && typeof window.requestAnimationFrame === 'function';\n var reduceMotion = hasRAF && window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (!(animMs > 0) || !hasRAF || reduceMotion) { onTick(toV); return; }\n var startT = null;\n function frame(ts) {\n if (startT === null) startT = ts;\n var p = Math.min(1, (ts - startT) / animMs);\n var eased = 1 - Math.pow(1 - p, 3); // easeOutCubic\n onTick(fromV + (toV - fromV) * eased);\n if (p < 1) window.requestAnimationFrame(frame);\n }\n window.requestAnimationFrame(frame);\n}\n\n// 16 进制颜色混合(a/b 为 #RGB/#RRGGBB,f∈[0,1] a→b)— for gradient stops.\nfunction hexToRgb(h) {\n h = String(h).replace('#', '');\n if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];\n if (!/^[0-9a-fA-F]{6}$/.test(h)) return null;\n return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];\n}\n\nfunction mixHex(a, b, f) {\n var pa = hexToRgb(a), pb = hexToRgb(b);\n if (!pa || !pb) return a;\n var r = Math.round(pa[0] + (pb[0] - pa[0]) * f);\n var g = Math.round(pa[1] + (pb[1] - pa[1]) * f);\n var bl = Math.round(pa[2] + (pb[2] - pa[2]) * f);\n return 'rgb(' + r + ',' + g + ',' + bl + ')';\n}\n\n// 线性插值色阶(t ∈ [0,1] → stops 间过渡),heatmap/treemap 色阶用。\n// Linear-interpolate across a list of color stops.\nfunction lerpColor(stops, t) {\n t = clamp(t, 0, 1);\n if (stops.length === 1) return stops[0];\n var seg = t * (stops.length - 1);\n var i = Math.min(stops.length - 2, Math.floor(seg));\n return mixHex(stops[i], stops[i + 1], seg - i);\n}\n\n// === Bar 柱状图 ===\n\nfunction renderBar(data, labels, colors, attrs) {\n var horizontal = attrs.orient === 'h' || attrs.orientation === 'h';\n var stack = attrs.stack !== undefined || attrs.stacked !== undefined;\n var series = parseMultiSeries(attrs.d);\n if (!series.length) series = [data];\n // 空数据占位(缺陷修复)\n if (series.every(function (s) { return !s.length; })) return emptyChartSvg(parseInt(attrs.w) || 400, parseInt(attrs.h) || 200);\n var n = Math.max.apply(null, series.map(function (s) { return s.length; })); // 取最大长度(缺陷修复:原取 series[0].length 致短系列越界)\n // 宽/高按数据量动态计算(每点保最小可读 slot,随 n 线性增长封顶;显式 w/h 优先)。\n // 横向柱类别在 y 轴 → 高度随 n 增;纵向柱宽度随 n 增,并经 bandHeight 防过扁。\n var w, h;\n if (horizontal) {\n w = parseInt(attrs.w) || 480; // 宽由值域决定,非点数\n h = autoSize(attrs, 'h', n, 36, 26, 200, 1200); // padTop+padBot≈36,每类一行\n } else {\n w = autoSize(attrs, 'w', n, 52, 26, 360, 2400);\n h = bandHeight(w, parseInt(attrs.h) || 200, 4, 560);\n }\n var hasLegend = series.length > 1;\n var totalH = h + (hasLegend ? LEGEND_H : 0);\n\n // 数值范围(堆叠按列累加;分组取各值极值;支持负值)\n var valMax = 0, valMin = 0;\n if (stack) {\n for (var ci = 0; ci < n; ci++) {\n var cp = 0, cn = 0;\n series.forEach(function (s) { var v = s[ci] || 0; if (v >= 0) cp += v; else cn += v; });\n if (cp > valMax) valMax = cp; if (cn < valMin) valMin = cn;\n }\n } else {\n series.forEach(function (s) { s.forEach(function (v) { if (v > valMax) valMax = v; if (v < valMin) valMin = v; }); });\n }\n valMax = axisBound(attrs, 'ymax', '_yMax', valMax || 1); // y 锁:显式 ymax > 流式缓存 _yMax(只扩)> 裸算\n var range = valMax - valMin || 1;\n\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n\n function segRange(si, i, val) { // 返回柱值域 [segMin, segMax],并更新 stack 累计\n var base = stack ? (val >= 0 ? (accPos[i] || 0) : (accNeg[i] || 0)) : 0;\n var segMax = val >= 0 ? base + val : base;\n var segMin = val >= 0 ? base : base + val;\n if (stack) { if (val >= 0) accPos[i] = segMax; else accNeg[i] = segMin; }\n return [segMin, segMax];\n }\n var accPos = [], accNeg = [];\n\n if (horizontal) {\n // 横向柱:类别在 y 轴自上而下,数值在 x 轴\n var padLh = 70, padBh = attrs.xl ? 30 : 22, padTh = 14, padRh = attrs.yl ? 30 : 16;\n var cwh = w - padLh - padRh;\n var chh = h - padTh - padBh;\n var groupH = chh / n;\n var barH = Math.max(3, stack ? groupH * 0.6 : groupH * 0.6 / series.length);\n function xOf(v) { return padLh + cwh * (v - valMin) / range; }\n for (var g = 0; g <= 4; g++) {\n var gv = valMin + range * g / 4;\n var gx = xOf(gv);\n svg.appendChild(svgEl('line', { x1: gx, y1: padTh, x2: gx, y2: padTh + chh, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: gx, y: padTh + chh + 10, 'text-anchor': 'middle', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(gv);\n }\n series.forEach(function (s, si) {\n s.forEach(function (val, i) {\n if (val === undefined || val === null) return;\n var seg = segRange(si, i, val);\n var bx = xOf(seg[0]);\n var bw = Math.max(0, xOf(seg[1]) - bx);\n var by = padTh + i * groupH + groupH * 0.2 + (stack ? 0 : si * barH);\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('rect', { x: bx, y: by, width: bw, height: barH - 1, fill: colors[si % colors.length], rx: 2, class: 'tokui-chart-bar' }));\n tips.add(grp, (labels[i] || '') + ': ' + val + (series.length > 1 ? ' (系列' + (si + 1) + ')' : ''), bx + bw / 2, by);\n svg.appendChild(grp);\n if (attrs.vals !== undefined) {\n var vt = svgEl('text', { x: bx + bw + 3, y: by + barH / 2 + 2, 'text-anchor': 'start', fill: 'var(--tokui-chart-text, #666)', 'font-size': '8' });\n vt.textContent = val;\n svg.appendChild(vt);\n }\n });\n });\n // 类别标签(左侧 y 轴,每行右对齐)\n labels.slice(0, n).forEach(function (lb, i) {\n if (lb === undefined || lb === null || lb === '') return;\n var ly = padTh + i * groupH + groupH / 2;\n svg.appendChild(svgEl('text', { x: padLh - 6, y: ly + 3, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = lb;\n });\n if (attrs.xl) appendAxisUnit(svg, attrs.xl, padLh + cwh / 2, padTh + chh + 22, false);\n if (attrs.yl) appendAxisUnit(svg, attrs.yl, 12, padTh + chh / 2, true);\n } else {\n // 纵向(默认)\n var padL = attrs.yl ? 46 : 40, padR = 12;\n var padB = attrs.xl ? 38 : 28, padT = 18;\n var cw = w - padL - padR;\n var ch = h - padT - padB;\n function yOf(v) { return padT + ch * (1 - (v - valMin) / range); }\n for (var g2 = 0; g2 <= 4; g2++) {\n var gv2 = valMin + range * g2 / 4;\n var gy = yOf(gv2);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(gv2);\n }\n if (valMin < 0) { // 零基线\n var zy = yOf(0);\n svg.appendChild(svgEl('line', { x1: padL, y1: zy, x2: w - padR, y2: zy, stroke: 'var(--tokui-chart-axis, #bbb)', 'stroke-width': 1 }));\n }\n var groupW = cw / n;\n var barW = Math.max(4, stack ? groupW * 0.6 : groupW * 0.6 / series.length);\n series.forEach(function (s, si) {\n s.forEach(function (val, i) {\n if (val === undefined || val === null) return; // 短系列缺位跳过(缺陷修复)\n var seg = segRange(si, i, val);\n var by = yOf(seg[1]);\n var bh = Math.max(0, (seg[1] - seg[0]) / range * ch);\n var bx = padL + i * groupW + groupW * 0.2 + (stack ? 0 : si * barW);\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('rect', { x: bx, y: by, width: barW - 1, height: bh, fill: colors[si % colors.length], rx: 2, class: 'tokui-chart-bar' }));\n tips.add(grp, (labels[i] || '') + ': ' + val + (series.length > 1 ? ' (系列' + (si + 1) + ')' : ''), bx + (barW - 1) / 2, by);\n svg.appendChild(grp);\n if (attrs.vals !== undefined) {\n var vt2 = svgEl('text', { x: bx + (barW - 1) / 2, y: by - 3, 'text-anchor': 'middle', fill: 'var(--tokui-chart-text, #666)', 'font-size': '8' });\n vt2.textContent = val;\n svg.appendChild(vt2);\n }\n });\n });\n // x 轴标签(自动旋转,缺陷修复)\n var positions = [];\n for (var k = 0; k < n; k++) positions.push(padL + k * groupW + groupW / 2);\n appendXLabels(svg, labels.slice(0, n), positions, h - 8, groupW);\n if (attrs.xl) appendAxisUnit(svg, attrs.xl, padL + cw / 2, h - 8 + (estTextW(String(labels[0] || '')) > groupW * 0.9 ? 26 : 12), false);\n if (attrs.yl) appendAxisUnit(svg, attrs.yl, 12, padT + ch / 2, true);\n }\n // legend\n if (hasLegend) {\n var legendEntries = series.map(function (s, i) { return { color: colors[i % colors.length], text: '系列' + (i + 1) }; });\n appendLegend(svg, legendEntries, w, h + 6);\n }\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Line 折线图 ===\n\nfunction renderLine(data, labels, colors, attrs) {\n var stack = attrs.stack !== undefined || attrs.stacked !== undefined;\n var smooth = attrs.smooth !== undefined;\n var series = parseMultiSeries(attrs.d);\n if (!series.length) series = [data];\n if (series.every(function (s) { return !s.length; })) return emptyChartSvg(parseInt(attrs.w) || 400, parseInt(attrs.h) || 200); // 空数据占位\n var n = Math.max.apply(null, series.map(function (s) { return s.length; }));\n // 宽按点数动态(每点最小 slot 24),高度经 bandHeight 防过扁;显式 w/h 优先。\n var w = autoSize(attrs, 'w', n, 52, 24, 360, 2400);\n var h = bandHeight(w, parseInt(attrs.h) || 200, 4, 560);\n var hasLegend = series.length > 1;\n var totalH = h + (hasLegend ? LEGEND_H : 0);\n // 堆叠:累计值(后系列叠加前系列),用累计值画线/面,tooltip 显示原始值\n var stacked = series.map(function (s) { return s.slice(); });\n if (stack) {\n for (var si0 = 1; si0 < stacked.length; si0++) {\n for (var j = 0; j < n; j++) stacked[si0][j] = (stacked[si0][j] || 0) + (stacked[si0 - 1][j] || 0);\n }\n }\n var flatMax = 0, flatMin = Infinity;\n stacked.forEach(function (s) { s.forEach(function (v) { if (v > flatMax) flatMax = v; if (v < flatMin) flatMin = v; }); });\n if (flatMin === Infinity) flatMin = 0;\n if (flatMin > 0 && !stack) flatMin = 0;\n var range = flatMax - flatMin || 1;\n\n var padL = attrs.yl ? 46 : 40, padR = 12;\n var padB = attrs.xl ? 38 : 28, padT = 18;\n var cw = w - padL - padR;\n var ch = h - padT - padB;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n function xOf(i) { return padL + (n > 1 ? i * cw / (n - 1) : cw / 2); }\n function yOf(v) { return padT + ch * (1 - (v - flatMin) / range); }\n\n // grid\n for (var g = 0; g <= 4; g++) {\n var gv = flatMin + range * g / 4;\n var gy = yOf(gv);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(gv * 10) / 10;\n }\n\n // 平滑曲线(Catmull-Rom → 三次贝塞尔)\n function smoothPath(pts) {\n if (pts.length < 2) return pts.length ? ('M' + pts[0].x + ',' + pts[0].y) : '';\n if (pts.length === 2) return 'M' + pts[0].x + ',' + pts[0].y + ' L' + pts[1].x + ',' + pts[1].y;\n var d = 'M' + pts[0].x + ',' + pts[0].y;\n for (var i = 0; i < pts.length - 1; i++) {\n var p0 = pts[i - 1] || pts[i], p1 = pts[i], p2 = pts[i + 1], p3 = pts[i + 2] || p2;\n d += ' C' + (p1.x + (p2.x - p0.x) / 6) + ',' + (p1.y + (p2.y - p0.y) / 6) + ' ' +\n (p2.x - (p3.x - p1.x) / 6) + ',' + (p2.y - (p3.y - p1.y) / 6) + ' ' + p2.x + ',' + p2.y;\n }\n return d;\n }\n\n stacked.forEach(function (s, si) {\n var pts = [];\n for (var i = 0; i < s.length; i++) {\n var v = s[i];\n if (v === undefined || v === null) continue; // 短系列缺位跳过(缺陷修复)\n pts.push({ x: xOf(i), y: yOf(v), idx: i });\n }\n if (!pts.length) return;\n // area(含堆叠面积,底贴前系列轮廓)\n if (attrs.area !== undefined || stack) {\n if (stack && si > 0) {\n var prev = [];\n for (var k = 0; k < stacked[si - 1].length; k++) {\n if (stacked[si - 1][k] === undefined) continue;\n prev.push({ x: xOf(k), y: yOf(stacked[si - 1][k]) });\n }\n var ap = 'M' + pts[0].x + ',' + pts[0].y;\n pts.forEach(function (p) { ap += ' L' + p.x + ',' + p.y; });\n for (var ri = prev.length - 1; ri >= 0; ri--) ap += ' L' + prev[ri].x + ',' + prev[ri].y;\n ap += ' Z';\n svg.appendChild(svgEl('path', { d: ap, fill: colors[si % colors.length], opacity: '0.4' }));\n } else {\n var baseY = yOf(Math.max(0, flatMin));\n var ap2 = 'M' + pts[0].x + ',' + baseY;\n pts.forEach(function (p) { ap2 += ' L' + p.x + ',' + p.y; });\n ap2 += ' L' + pts[pts.length - 1].x + ',' + baseY + ' Z';\n svg.appendChild(svgEl('path', { d: ap2, fill: colors[si % colors.length], opacity: '0.15' }));\n }\n }\n // 折线(smooth 用贝塞尔 path,否则 polyline 直线)\n if (smooth) {\n svg.appendChild(svgEl('path', { d: smoothPath(pts), fill: 'none', stroke: colors[si % colors.length], 'stroke-width': 2, 'stroke-linejoin': 'round', 'stroke-linecap': 'round' }));\n } else {\n svg.appendChild(svgEl('polyline', { points: pts.map(function (p) { return p.x + ',' + p.y; }).join(' '), fill: 'none', stroke: colors[si % colors.length], 'stroke-width': 2, 'stroke-linejoin': 'round' }));\n }\n // dots\n var orig = series[si];\n pts.forEach(function (p) {\n var og = svgEl('g', { class: 'tokui-chart-tip-group' });\n og.appendChild(svgEl('circle', { cx: p.x, cy: p.y, r: 8, fill: 'transparent' }));\n og.appendChild(svgEl('circle', { cx: p.x, cy: p.y, r: 3, fill: '#fff', stroke: colors[si % colors.length], 'stroke-width': 2, class: 'tokui-chart-dot' }));\n tips.add(og, (labels[p.idx] || '') + ': ' + (orig[p.idx] !== undefined ? orig[p.idx] : s[p.idx]) + (series.length > 1 ? ' (系列' + (si + 1) + ')' : ''), p.x, p.y);\n svg.appendChild(og);\n if (attrs.vals !== undefined) {\n svg.appendChild(svgEl('text', { x: p.x, y: p.y - 6, 'text-anchor': 'middle', fill: colors[si % colors.length], 'font-size': '8' })).textContent = (orig[p.idx] !== undefined ? orig[p.idx] : s[p.idx]);\n }\n });\n });\n\n // x 轴标签(自动旋转,缺陷修复)\n var positions = [];\n for (var k2 = 0; k2 < n; k2++) positions.push(xOf(k2));\n appendXLabels(svg, labels.slice(0, n), positions, h - 8, n > 1 ? cw / (n - 1) : cw);\n var slotW = n > 1 ? cw / (n - 1) : cw;\n if (attrs.xl) appendAxisUnit(svg, attrs.xl, padL + cw / 2, h - 8 + (estTextW(String(labels[0] || '')) > slotW * 0.9 ? 26 : 12), false);\n if (attrs.yl) appendAxisUnit(svg, attrs.yl, 12, padT + ch / 2, true);\n if (hasLegend) {\n appendLegend(svg, series.map(function (s, i) { return { color: colors[i % colors.length], text: '系列' + (i + 1) }; }), w, h + 6);\n }\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Pie 饼图 ===\n\nfunction renderPie(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 280;\n var h = parseInt(attrs.h) || 280;\n var totalH = h + LEGEND_H;\n var cx = w / 2, cy = h / 2;\n if (!data.length) return emptyChartSvg(w, h + LEGEND_H);\n var pad = Math.max(50, w * 0.18);\n var r = Math.min(cx, cy) - pad;\n var total = data.reduce(function (a, b) { return a + b; }, 0) || 1;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n\n var slices = [];\n var angle = -Math.PI / 2;\n data.forEach(function (val, i) {\n var sliceAngle = (val / total) * 2 * Math.PI;\n slices.push({ val: val, idx: i, start: angle, end: angle + sliceAngle, mid: angle + sliceAngle / 2 });\n angle += sliceAngle;\n });\n\n // 切片\n slices.forEach(function (s) {\n var i = s.idx;\n var sliceAngle = s.end - s.start;\n var x1 = cx + r * Math.cos(s.start);\n var y1 = cy + r * Math.sin(s.start);\n var x2 = cx + r * Math.cos(s.end);\n var y2 = cy + r * Math.sin(s.end);\n var largeArc = sliceAngle > Math.PI ? 1 : 0;\n var d = 'M' + cx + ',' + cy + ' L' + x1 + ',' + y1 + ' A' + r + ',' + r + ' 0 ' + largeArc + ' 1 ' + x2 + ',' + y2 + ' Z';\n var pct = Math.round(s.val / total * 100);\n var g = svgEl('g', { class: 'tokui-chart-tip-group' });\n g.appendChild(svgEl('path', { d: d, fill: colors[i % colors.length], stroke: 'var(--tokui-chart-slice-stroke, #fff)', 'stroke-width': 2, class: 'tokui-chart-slice' }));\n var tipX = cx + r * 0.6 * Math.cos(s.mid);\n var tipY = cy + r * 0.6 * Math.sin(s.mid);\n tips.add(g, (labels[i] || '项目' + (i + 1)) + ': ' + s.val + ' (' + pct + '%)', tipX, tipY);\n svg.appendChild(g);\n });\n\n // 引导线 + 文字\n slices.forEach(function (s) {\n var i = s.idx;\n if (!labels[i]) return;\n var midA = s.mid;\n var pct = Math.round(s.val / total * 100);\n var isRight = Math.cos(midA) >= 0;\n var ex = cx + r * Math.cos(midA);\n var ey = cy + r * Math.sin(midA);\n var leadLen = 10;\n var lx = cx + (r + leadLen) * Math.cos(midA);\n var ly = cy + (r + leadLen) * Math.sin(midA);\n var tailLen = 12;\n var tx = lx + (isRight ? tailLen : -tailLen);\n svg.appendChild(svgEl('polyline', { points: ex + ',' + ey + ' ' + lx + ',' + ly + ' ' + tx + ',' + ly, fill: 'none', stroke: colors[i % colors.length], 'stroke-width': 1 }));\n var textX = tx + (isRight ? 4 : -4);\n var anchor = isRight ? 'start' : 'end';\n var txt = svgEl('text', { x: textX, y: ly + 1, 'text-anchor': anchor, 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #666)', 'font-size': '7' });\n txt.textContent = labels[i] + ' ' + s.val + '(' + pct + '%)';\n svg.appendChild(txt);\n });\n\n // legend\n var legendEntries = data.map(function (val, i) {\n return { color: colors[i % colors.length], text: labels[i] || ('项目' + (i + 1)) };\n });\n appendLegend(svg, legendEntries, w, h + 6);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Donut 环形图 ===\n\nfunction renderDonut(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 240;\n var h = parseInt(attrs.h) || 240;\n var totalH = h + LEGEND_H;\n var cx = w / 2, cy = h / 2;\n var series = parseMultiSeries(attrs.d);\n if (!series.length) series = [data];\n if (series.every(function (s) { return !s.length; })) return emptyChartSvg(w, h + LEGEND_H); // 空数据占位\n var multi = series.length > 1;\n var r = Math.min(cx, cy) - 16;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n // 环宽:多环等分(外→内),单环内径 60%\n var ringBand = multi ? (r * 0.82 / series.length) : r * 0.4;\n var ringGap = multi ? 2.5 : 0;\n series.forEach(function (sdata, ri) {\n var outerR = r - ri * (ringBand + ringGap);\n var innerR = multi ? (outerR - ringBand + ringGap) : r * 0.6;\n var total = sdata.reduce(function (a, b) { return a + b; }, 0) || 1;\n var angle = -Math.PI / 2;\n sdata.forEach(function (val, i) {\n var sliceAngle = (val / total) * 2 * Math.PI;\n var midA = angle + sliceAngle / 2;\n var x1o = cx + outerR * Math.cos(angle), y1o = cy + outerR * Math.sin(angle);\n var x2o = cx + outerR * Math.cos(angle + sliceAngle), y2o = cy + outerR * Math.sin(angle + sliceAngle);\n var x1i = cx + innerR * Math.cos(angle + sliceAngle), y1i = cy + innerR * Math.sin(angle + sliceAngle);\n var x2i = cx + innerR * Math.cos(angle), y2i = cy + innerR * Math.sin(angle);\n var largeArc = sliceAngle > Math.PI ? 1 : 0;\n var d = 'M' + x1o + ',' + y1o + ' A' + outerR + ',' + outerR + ' 0 ' + largeArc + ' 1 ' + x2o + ',' + y2o +\n ' L' + x1i + ',' + y1i + ' A' + innerR + ',' + innerR + ' 0 ' + largeArc + ' 0 ' + x2i + ',' + y2i + ' Z';\n var g = svgEl('g', { class: 'tokui-chart-tip-group' });\n g.appendChild(svgEl('path', { d: d, fill: colors[i % colors.length], stroke: 'var(--tokui-chart-slice-stroke, #fff)', 'stroke-width': 2, class: 'tokui-chart-slice' }));\n var midR = (outerR + innerR) / 2;\n tips.add(g, (labels[i] || ('项目' + (i + 1))) + ': ' + val + (multi ? ' (环' + (ri + 1) + ')' : ''), cx + midR * Math.cos(midA), cy + midR * Math.sin(midA));\n svg.appendChild(g);\n angle += sliceAngle;\n });\n });\n // center text(仅单环 + v)\n if (!multi && attrs.v !== undefined) {\n svg.appendChild(svgEl('text', { x: cx, y: cy, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-text, #333)', 'font-size': '16', 'font-weight': '700' })).textContent = attrs.v + '%';\n }\n // legend(多环时标签一致,取一组)\n var legendEntries = series[0].map(function (val, i) {\n return { color: colors[i % colors.length], text: (labels[i] || ('项目' + (i + 1))) + ' ' + val };\n });\n appendLegend(svg, legendEntries, w, h + 6);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Funnel 漏斗图 ===\n// 销售/转化漏斗:自上而下逐层收窄的梯形堆叠,宽度 ∝ 数值,建议数据降序(首层=漏斗口最大)。\n// 数值居中显示在梯形内(过窄层自动改放右侧),名称经 leader 引线置于右侧。\n// 不设内联 max-width,跟随 .tokui-chart__svg 的 width:100% 撑满容器(与 bar/line/pie 一致),\n// 文字以 viewBox 单位随容器等比放大,避免窄卡片里被钉死成小图、文字看不清。\nfunction renderFunnel(data, labels, colors, attrs) {\n var n = data.length;\n var w = parseInt(attrs.w) || 480;\n var h = parseInt(attrs.h) || 320;\n if (!n) return emptyChartSvg(w, h);\n var padT = 14, padB = 12, padL = 14;\n var ch = h - padT - padB;\n var rowH = n ? ch / n : ch;\n var firstVal = data[0] || 0;\n var maxVal = maxOf(data) || 1; // 缩放基准,首层(最大值)撑满图表宽\n var splitX = Math.round(w * 0.6); // 图表区/标注区分界:左 60% 梯形,右 40% 名称(中文标签需更宽)\n var fullW = splitX - padL - 6;\n var cx = padL + fullW / 2; // 梯形水平中心\n var labelX = splitX + 10; // 右侧名称起点\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg tokui-chart__svg--funnel', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n data.forEach(function (val, i) {\n var yTop = padT + i * rowH;\n var yBot = yTop + rowH;\n var topW = (i === 0 ? maxVal : data[i - 1]) / maxVal * fullW; // 顶边=上一层底边,层间共享边\n var botW = val / maxVal * fullW;\n var tHalf = topW / 2, bHalf = botW / 2;\n var pts = (cx - tHalf) + ',' + yTop + ' ' + (cx + tHalf) + ',' + yTop + ' ' +\n (cx + bHalf) + ',' + yBot + ' ' + (cx - bHalf) + ',' + yBot;\n var midY = (yTop + yBot) / 2;\n var pct = firstVal ? Math.round(val / firstVal * 100) : 0; // 相对首层的转化率\n var name = labels[i] || ('阶段' + (i + 1));\n var color = colors[i % colors.length];\n var edgeX = cx + (tHalf + bHalf) / 2; // 梯形右沿\n var g = svgEl('g', { class: 'tokui-chart-tip-group' });\n g.appendChild(svgEl('polygon', { points: pts, fill: color, stroke: 'var(--tokui-chart-slice-stroke, #fff)', 'stroke-width': 2, class: 'tokui-chart-funnel' }));\n // 数值居中显示在梯形内(足够宽时);过窄则改放右侧名称下方,避免白字溢出到白底\n if (botW >= 40) {\n var vTxt = svgEl('text', { x: cx, y: midY - 2, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: '#fff', 'font-size': '14', 'font-weight': '700' });\n vTxt.textContent = val;\n g.appendChild(vTxt);\n if (botW >= 60) { // 较宽时再补一行转化率\n var pTxt = svgEl('text', { x: cx, y: midY + 13, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: '#fff', 'font-size': '11', opacity: '0.88' });\n pTxt.textContent = pct + '%';\n g.appendChild(pTxt);\n }\n }\n // 右侧 leader 引线 + 名称(窄层再补数值与转化率)\n g.appendChild(svgEl('line', { x1: edgeX, y1: midY, x2: labelX - 4, y2: midY, stroke: color, 'stroke-width': 1.2, opacity: '0.5' }));\n var nameTxt = svgEl('text', { x: labelX, y: midY - 2, 'text-anchor': 'start', 'dominant-baseline': 'central', fill: 'var(--tokui-text, #333)', 'font-size': '13', 'font-weight': '600' });\n nameTxt.textContent = name;\n g.appendChild(nameTxt);\n if (botW < 40) {\n var altTxt = svgEl('text', { x: labelX, y: midY + 12, 'text-anchor': 'start', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #999)', 'font-size': '11' });\n altTxt.textContent = val + ' (' + pct + '%)';\n g.appendChild(altTxt);\n }\n tips.add(g, name + ': ' + val + ' (转化 ' + pct + '%)', cx, midY);\n svg.appendChild(g);\n });\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Gauge 仪表盘 ===\n// 单值仪表盘/KPI 速度表:上半圆轨道 + 数值弧 + 指针 + 中心大字 + 刻度。\n// 进阶:zones 阶段分布色带、anim 数字/弧/指针动画、ticks 刻度密度、sub 副标题、dec 小数位。\nfunction renderGauge(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 280;\n var h = parseInt(attrs.h) || 200;\n var cx = w / 2;\n // range 扫掠角:180(默认上半圆)/270/360;以顶部为中心对称\n // Sweep angle: 180 (default top half) / 270 / 360, symmetric about the top.\n var rangeDeg = parseInt(attrs.range, 10);\n if (isNaN(rangeDeg) || (rangeDeg !== 180 && rangeDeg !== 270 && rangeDeg !== 360)) rangeDeg = 180;\n var sweep = rangeDeg * Math.PI / 180;\n var A_CENTER = 1.5 * Math.PI; // 顶部(sin=-1)\n var A0 = A_CENTER - sweep / 2;\n var A1 = A_CENTER + sweep / 2;\n var cy = rangeDeg === 180 ? (h - 34) : (h / 2); // 180 坐底线;270/360 弧居中\n var baseY = cy; // 兼容旧名(指针轴心 y)\n var endSin = Math.max(0, Math.sin(A0)); // 端点低于中心线的量\n var r = rangeDeg === 180\n ? Math.max(40, Math.min(cx - 34, cy - 24))\n : Math.max(36, Math.min(cx - 30, (h - 28) / (1 + endSin + 0.35)));\n var min = parseFloat(attrs.min); if (isNaN(min)) min = 0;\n var max = parseFloat(attrs.max); if (isNaN(max)) max = 100;\n var span = max - min || 1;\n // v 缺省时回退 data[0](容器模式 pt v:N → data=[N])\n var val = parseFloat(attrs.v); if (isNaN(val) && data.length) val = data[0]; if (isNaN(val)) val = 0;\n val = clamp(val, min, max);\n var unit = attrs.u !== undefined ? attrs.u : ((min === 0 && max === 100) ? '%' : '');\n var dec = parseInt(attrs.dec, 10); if (isNaN(dec)) dec = (span <= 10 ? 1 : 0);\n\n var STATUS_COLORS = {\n success: 'var(--tokui-success, #52c41a)',\n warning: 'var(--tokui-warning, #faad14)',\n danger: 'var(--tokui-danger, #f5222d)',\n info: 'var(--tokui-info, #1677ff)',\n primary: 'var(--tokui-primary, #1677ff)'\n };\n var STATUS_LABEL = { success: '良好', warning: '注意', danger: '告警', info: '正常' };\n\n // zones 阶段分布:阈值 \"60,85\" → 升序边界 [min,60,85,max] → 多色带;zc 覆盖段色(low→high)\n var zones = parseNumList(attrs.zones).filter(function (t) { return t > min && t < max; })\n .sort(function (a, b) { return a - b; });\n var zc = parseColorList(attrs.zc);\n if (!zc.length) zc = ['#52c41a', '#faad14', '#f5222d']; // 默认 low→high:安全→注意→告警\n var bandEdges = [min].concat(zones, [max]);\n function bandColorFor(v) {\n for (var i = 0; i < bandEdges.length - 1; i++) {\n if (v >= bandEdges[i] && v <= bandEdges[i + 1]) return zc[i % zc.length];\n }\n return zc[0];\n }\n // 当前值颜色:有 zones → 命中段色;否则 status > c > 默认\n var arcColor = zones.length ? bandColorFor(val)\n : (STATUS_COLORS[attrs.status] || (isValidColor(attrs.c) ? attrs.c : null) || colors[0] || STATUS_COLORS.primary);\n\n function polar(a, rad) { return [cx + rad * Math.cos(a), baseY + rad * Math.sin(a)]; }\n function arcPath(a1, a2, rad) {\n var p1 = polar(a1, rad), p2 = polar(a2, rad);\n var large = (a2 - a1) > Math.PI ? 1 : 0;\n return 'M' + p1[0] + ',' + p1[1] + ' A' + rad + ',' + rad + ' 0 ' + large + ' 1 ' + p2[0] + ',' + p2[1];\n }\n function angOf(vv) { return A0 + clamp((vv - min) / span, 0, 1) * (A1 - A0); }\n function fmtNum(vv) { return dec > 0 ? vv.toFixed(dec) : String(Math.round(vv)); }\n\n var BAND = 14;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg tokui-chart__svg--gauge', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n\n // 轨道:有 zones → 多色段带(阶段分布);否则灰底单轨\n if (zones.length) {\n for (var bi = 0; bi < bandEdges.length - 1; bi++) {\n svg.appendChild(svgEl('path', { d: arcPath(angOf(bandEdges[bi]), angOf(bandEdges[bi + 1]), r), fill: 'none', stroke: zc[bi % zc.length], 'stroke-width': BAND, 'stroke-linecap': 'butt', opacity: '0.28', class: 'tokui-chart-gauge-track' }));\n }\n } else {\n svg.appendChild(svgEl('path', { d: arcPath(A0, A1, r), fill: 'none', stroke: 'var(--tokui-chart-grid, #ececec)', 'stroke-width': BAND, 'stroke-linecap': 'round', class: 'tokui-chart-gauge-track' }));\n }\n\n // 刻度:ticks 控制密度;端点 + zones 阈值处标数值\n var tickCount = parseInt(attrs.ticks, 10); if (isNaN(tickCount)) tickCount = 6;\n var labelSet = {}; [min, max].concat(zones).forEach(function (e) { labelSet[Math.round(e * 100) / 100] = true; });\n for (var i = 0; i <= tickCount; i++) {\n var ta = A0 + (i / tickCount) * (A1 - A0);\n var isMajor = (i === 0 || i === tickCount);\n var inner = polar(ta, r - BAND / 2 - 1);\n var outer = polar(ta, r + BAND / 2 + 2);\n svg.appendChild(svgEl('line', { x1: inner[0], y1: inner[1], x2: outer[0], y2: outer[1], stroke: 'var(--tokui-chart-text, #bbb)', 'stroke-width': isMajor ? 1.2 : 0.6, opacity: isMajor ? 0.8 : 0.35 }));\n var ev = min + (i / tickCount) * span;\n var evR = Math.round(ev * 100) / 100;\n if (isMajor || labelSet[evR]) {\n var lb = polar(ta, r + BAND / 2 + 12);\n var lbTxt = svgEl('text', { x: lb[0], y: lb[1], 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #999)', 'font-size': '8' });\n lbTxt.textContent = (dec > 0 ? ev.toFixed(dec) : Math.round(ev));\n svg.appendChild(lbTxt);\n }\n }\n\n // 数值弧(可被 setValue 更新)\n var valG = svgEl('g', { class: 'tokui-chart-tip-group' });\n var arc = svgEl('path', { fill: 'none', stroke: arcColor, 'stroke-width': BAND, 'stroke-linecap': 'round', class: 'tokui-chart-gauge-arc' });\n valG.appendChild(arc);\n tips.add(valG, (attrs.l || '当前值') + ': ' + fmtNum(val) + unit + ' (' + Math.round(clamp((val - min) / span, 0, 1) * 100) + '%)', cx, baseY - r);\n svg.appendChild(valG);\n\n // 指针 + 轴心\n var needle = svgEl('line', { stroke: arcColor, 'stroke-width': 2.5, 'stroke-linecap': 'round', class: 'tokui-chart-gauge-needle' });\n svg.appendChild(needle);\n svg.appendChild(svgEl('circle', { cx: cx, cy: baseY, r: 5, fill: arcColor, stroke: '#fff', 'stroke-width': 1.5, class: 'tokui-chart-gauge-hub' }));\n\n // 中心数值 + 指标名 + status 角标 + 底部副标题(多标题)\n var midY = baseY - r * (rangeDeg === 180 ? 0.40 : (rangeDeg === 270 ? 0.12 : 0));\n var vTxt = svgEl('text', { x: cx, y: midY, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-text, #333)', 'font-size': '24', 'font-weight': '700', class: 'tokui-chart-gauge-value tokui-chart-gauge-label' });\n svg.appendChild(vTxt);\n var capY = midY + 17;\n if (attrs.l) {\n var lab = svgEl('text', { x: cx, y: capY, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #999)', 'font-size': '10', class: 'tokui-chart-gauge-label' });\n lab.textContent = attrs.l;\n svg.appendChild(lab);\n capY += 13;\n }\n if (attrs.status && STATUS_LABEL[attrs.status]) {\n var cap = svgEl('text', { x: cx, y: capY, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: STATUS_COLORS[attrs.status], 'font-size': '9', 'font-weight': '600', class: 'tokui-chart-gauge-label' });\n cap.textContent = STATUS_LABEL[attrs.status];\n svg.appendChild(cap);\n }\n if (attrs.sub) {\n // 副标题:180 置于直径线下方死角;270/360 置于弧外底部\n var subY = rangeDeg === 180 ? (baseY + 14) : (h - 8);\n var sub = svgEl('text', { x: cx, y: subY, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #aaa)', 'font-size': '9', class: 'tokui-chart-gauge-label' });\n sub.textContent = attrs.sub;\n svg.appendChild(sub);\n }\n\n svg.appendChild(tips.layer);\n\n // setValue:同步弧路径 / 指针端点 / 中心数字(初绘与动画共用)\n function setValue(vv) {\n var a = angOf(vv);\n arc.setAttribute('d', arcPath(A0, a, r));\n var np = polar(a, r - BAND / 2 - 3);\n needle.setAttribute('x1', cx); needle.setAttribute('y1', baseY);\n needle.setAttribute('x2', np[0]); needle.setAttribute('y2', np[1]);\n vTxt.textContent = fmtNum(vv) + unit;\n }\n bindTooltips(svg);\n\n // 数字 + 弧 + 指针动画(复用 animateValue:easeOutCubic + rAF;尊重 prefers-reduced-motion)\n animateValue(min, val, parseInt(attrs.anim, 10) || 0, setValue);\n return svg;\n}\n\n// === Radar 雷达图 ===\n\nfunction renderRadar(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 240;\n var h = parseInt(attrs.h) || 240;\n var cx = w / 2, cy = h / 2;\n var series = parseMultiSeries(attrs.d);\n if (!series.length) series = [data];\n if (series.every(function (s) { return !s.length; })) return emptyChartSvg(w, h); // 空数据占位\n var hasLegend = series.length > 1;\n var totalH = h + (hasLegend ? LEGEND_H : 0);\n var r = Math.min(cx, cy) - 30;\n var n = Math.max(labels.length, series[0].length, 3);\n var maxVal = 0;\n series.forEach(function (s) { s.forEach(function (v) { if (v > maxVal) maxVal = v; }); });\n maxVal = maxVal || 100;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n // grid rings\n for (var ring = 1; ring <= 4; ring++) {\n var rr = r * ring / 4;\n var pts = [];\n for (var i = 0; i < n; i++) {\n var a = (2 * Math.PI * i / n) - Math.PI / 2;\n pts.push((cx + rr * Math.cos(a)) + ',' + (cy + rr * Math.sin(a)));\n }\n svg.appendChild(svgEl('polygon', { points: pts.join(' '), fill: 'none', stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n }\n // axes + labels\n for (var i = 0; i < n; i++) {\n var a = (2 * Math.PI * i / n) - Math.PI / 2;\n svg.appendChild(svgEl('line', { x1: cx, y1: cy, x2: cx + r * Math.cos(a), y2: cy + r * Math.sin(a), stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n if (labels[i]) {\n svg.appendChild(svgEl('text', { x: cx + (r + 14) * Math.cos(a), y: cy + (r + 14) * Math.sin(a), 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #999)', 'font-size': '7' })).textContent = labels[i];\n }\n }\n // 每个系列一个数据多边形(缺陷修复:原仅单系列)\n series.forEach(function (sdata, si) {\n var color = colors[si % colors.length];\n var dataPts = [];\n sdata.forEach(function (val, i) {\n var a = (2 * Math.PI * i / n) - Math.PI / 2;\n var vr = (val / maxVal) * r;\n dataPts.push({ x: cx + vr * Math.cos(a), y: cy + vr * Math.sin(a), idx: i });\n });\n svg.appendChild(svgEl('polygon', { points: dataPts.map(function (p) { return p.x + ',' + p.y; }).join(' '), fill: color, 'fill-opacity': '0.2', stroke: color, 'stroke-width': 2 }));\n dataPts.forEach(function (p) {\n var g = svgEl('g', { class: 'tokui-chart-tip-group' });\n g.appendChild(svgEl('circle', { cx: p.x, cy: p.y, r: 8, fill: 'transparent' }));\n g.appendChild(svgEl('circle', { cx: p.x, cy: p.y, r: 3, fill: color, class: 'tokui-chart-point' }));\n tips.add(g, (labels[p.idx] || ('维度' + (p.idx + 1))) + ': ' + sdata[p.idx] + (series.length > 1 ? ' (系列' + (si + 1) + ')' : ''), p.x, p.y);\n svg.appendChild(g);\n });\n });\n if (hasLegend) {\n appendLegend(svg, series.map(function (s, i) { return { color: colors[i % colors.length], text: '系列' + (i + 1) }; }), w, h + 6);\n }\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Scatter 散点图 ===\n\nfunction renderScatter(data, labels, colors, attrs) {\n var points = parseScatterData(attrs.d);\n if (!points.length) return emptyChartSvg(parseInt(attrs.w) || 400, parseInt(attrs.h) || 200);\n // 宽按点数动态(每点最小 slot 22),高度经 bandHeight 防过扁;显式 w/h 优先。\n var w = autoSize(attrs, 'w', points.length, 50, 22, 360, 2400);\n var h = bandHeight(w, parseInt(attrs.h) || 200, 4, 560);\n var totalH = h;\n var padL = 40, padB = 30, padT = 18, padR = 10;\n var cw = w - padL - padR;\n var ch = h - padT - padB;\n var xLabel = attrs.xl || 'X';\n var yLabel = attrs.yl || 'Y';\n // 轴范围三级优先:显式 xmin/xmax/ymin/ymax(锁轴,绝对稳定)> 流式缓存(只扩不缩)> 当前点 min/max。\n var xMin = axisBound(attrs, 'xmin', '_xMin', minOf(points.map(function (p) { return p.x; })));\n var xMax = axisBound(attrs, 'xmax', '_xMax', maxOf(points.map(function (p) { return p.x; })));\n var yMin = axisBound(attrs, 'ymin', '_yMin', minOf(points.map(function (p) { return p.y; })));\n var yMax = axisBound(attrs, 'ymax', '_yMax', maxOf(points.map(function (p) { return p.y; })));\n var xRange = xMax - xMin || 1;\n var yRange = yMax - yMin || 1;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n // grid\n for (var g = 0; g <= 4; g++) {\n var gy = padT + ch * (1 - g / 4);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(yMin + yRange * g / 4);\n }\n // dots + values\n points.forEach(function (p, i) {\n var px = padL + ((p.x - xMin) / xRange) * cw;\n var py = padT + ch * (1 - (p.y - yMin) / yRange);\n var g = svgEl('g', { class: 'tokui-chart-tip-group' });\n g.appendChild(svgEl('circle', { cx: px, cy: py, r: 8, fill: 'transparent', stroke: 'none' }));\n g.appendChild(svgEl('circle', { cx: px, cy: py, r: 5, fill: colors[i % colors.length], opacity: '0.7', class: 'tokui-chart-point' }));\n tips.add(g, xLabel + ': ' + p.x + ' ' + yLabel + ': ' + p.y, px, py);\n svg.appendChild(g);\n var valTxt = svgEl('text', { x: px + 6, y: py - 4, fill: 'var(--tokui-chart-text, #666)', 'font-size': '7' });\n valTxt.textContent = p.x + ',' + p.y;\n svg.appendChild(valTxt);\n });\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Gantt 甘特图 ===\n\nfunction isDateStr(s) { return /[-/]/.test(String(s)); }\n\nfunction toTimeNum(raw, mode) {\n if (raw === undefined || raw === '') return NaN;\n if (mode === 'dates') {\n var d = new Date(raw);\n return isNaN(d.getTime()) ? NaN : d.getTime();\n }\n var n = parseFloat(raw);\n return isNaN(n) ? NaN : n;\n}\n\nfunction parseRawTasks(str) {\n if (!str) return [];\n return String(str).split('|').map(function (seg) {\n return seg.split(',').map(function (x) { return x.trim(); });\n });\n}\n\nfunction parseDeps(str) {\n if (!str) return [];\n return String(str).split(',').map(function (s) {\n var m = s.trim().split('->');\n return [parseInt(m[0], 10), parseInt(m[1], 10)];\n }).filter(function (d) { return !isNaN(d[0]) && !isNaN(d[1]); });\n}\n\nfunction parseMilestones(str, mode) {\n if (!str) return [];\n return String(str).split('|').map(function (seg) {\n var p = seg.split(',').map(function (x) { return x.trim(); });\n return { name: p[0] || '', time: toTimeNum(p[1], mode), group: parseInt(p[2], 10) || 0 };\n });\n}\n\n// 组名(按 group 索引映射):gnames 形如 \"架构设计|开发|上线\"\n// Group names indexed by group number — overrides the default \"组N\" legend label\nfunction parseGanttGroupNames(str) {\n if (!str) return [];\n return String(str).split('|').map(function (s) { return s.trim(); }).filter(function (x) { return x !== ''; });\n}\n\nfunction buildGanttCtx(attrs) {\n var w = parseInt(attrs.w) || 1080;\n var rawTasks = parseRawTasks(attrs.tasks);\n if (!rawTasks.length) return { empty: true };\n var mode = (attrs.mode === 'days' || attrs.mode === 'dates') ? attrs.mode : (isDateStr(rawTasks[0][1]) ? 'dates' : 'days');\n var tasks = [];\n var skipped = 0;\n rawTasks.forEach(function (rt, i) {\n var start = toTimeNum(rt[1], mode);\n var end = toTimeNum(rt[2], mode);\n if (isNaN(start) || isNaN(end)) { skipped++; return; }\n if (end < start) { var tmp = start; start = end; end = tmp; }\n tasks.push({\n name: rt[0] || ('任务' + (tasks.length + 1)),\n start: start, end: end,\n progress: clamp(parseFloat(rt[3]) || 0, 0, 100),\n group: parseInt(rt[4], 10) || 0\n });\n });\n if (!tasks.length) return { empty: true };\n var tMin, tMax;\n if (mode === 'dates') {\n tMin = Math.min.apply(null, tasks.map(function (t) { return t.start; }));\n tMax = Math.max.apply(null, tasks.map(function (t) { return t.end; }));\n } else {\n tMin = 0;\n tMax = Math.ceil(Math.max.apply(null, tasks.map(function (t) { return t.end; })));\n }\n if (!isFinite(tMax)) tMax = 1;\n var range = (tMax - tMin) || 1;\n var ms = parseMilestones(attrs.ms, mode).filter(function (m) { return !isNaN(m.time); });\n var gnames = parseGanttGroupNames(attrs.gnames);\n var prev = {}, next = {};\n parseDeps(attrs.deps).forEach(function (d) {\n var s = d[0], e = d[1];\n if (s < 0 || s >= tasks.length || e < 0 || e >= tasks.length) return;\n (next[s] = next[s] || []).push(e);\n (prev[e] = prev[e] || []).push(s);\n });\n var groupSet = {};\n tasks.forEach(function (t) { groupSet[t.group] = true; });\n ms.forEach(function (m) { groupSet[m.group] = true; });\n var hasLeg = Object.keys(groupSet).length > 1;\n var hasMs = ms.length > 0;\n var LABEL_W = 110, PAD_T = 28, PAD_R = 16, ROW_H = 26, BAR_H = 14, MS_STRIP = 24;\n var totalH = PAD_T + (hasMs ? MS_STRIP : 0) + tasks.length * ROW_H + (hasLeg ? LEGEND_H : 6);\n var axisW = w - LABEL_W - PAD_R;\n function scale(t) { return LABEL_W + (t - tMin) / range * axisW; }\n function rowY(i) { return PAD_T + (hasMs ? MS_STRIP : 0) + i * ROW_H + ROW_H / 2; }\n return {\n empty: false, w: w, totalH: totalH, mode: mode,\n tasks: tasks, ms: ms, gnames: gnames, prev: prev, next: next,\n tMin: tMin, tMax: tMax, range: range,\n skipped: skipped, hasLeg: hasLeg, hasMs: hasMs,\n LABEL_W: LABEL_W, PAD_T: PAD_T, ROW_H: ROW_H, BAR_H: BAR_H, MS_STRIP: MS_STRIP,\n scale: scale, rowY: rowY, msY: function () { return PAD_T + MS_STRIP / 2; }\n };\n}\n\nfunction fmtT(t, mode) {\n if (mode === 'dates') { var d = new Date(t); return (d.getMonth() + 1) + '/' + d.getDate(); }\n return 'D' + t;\n}\n\nfunction ganttTicks(ctx) {\n var ticks = [];\n if (ctx.mode === 'days') {\n var step = ctx.tMax <= 10 ? 1 : (ctx.tMax <= 30 ? 5 : 10);\n for (var d = 0; d <= ctx.tMax; d += step) ticks.push({ label: 'D' + d, t: d });\n } else {\n var DAY = 86400000;\n var unit = ctx.range <= 14 * DAY ? 'day' : (ctx.range <= 90 * DAY ? 'week' : 'month');\n var start = new Date(ctx.tMin), end = new Date(ctx.tMax);\n if (unit === 'day') {\n for (var dt = new Date(start); dt <= end; dt.setDate(dt.getDate() + 1)) {\n ticks.push({ label: (dt.getMonth() + 1) + '/' + dt.getDate(), t: dt.getTime() });\n }\n } else if (unit === 'week') {\n for (var dw = new Date(start); dw <= end; dw.setDate(dw.getDate() + 7)) {\n ticks.push({ label: (dw.getMonth() + 1) + '/' + dw.getDate(), t: dw.getTime() });\n }\n } else {\n for (var dm = new Date(start.getFullYear(), start.getMonth(), 1); dm <= end; dm.setMonth(dm.getMonth() + 1)) {\n ticks.push({ label: (dm.getMonth() + 1) + '月', t: dm.getTime() });\n }\n }\n }\n return ticks;\n}\n\nfunction appendGanttAxis(svg, ctx) {\n var bottomY = ctx.totalH - (ctx.hasLeg ? LEGEND_H : 6);\n ganttTicks(ctx).forEach(function (tk) {\n var x = ctx.scale(tk.t);\n svg.appendChild(svgEl('line', { x1: x, y1: ctx.PAD_T, x2: x, y2: bottomY, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n var t = svgEl('text', { x: x, y: ctx.PAD_T - 6, 'text-anchor': 'middle', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9', class: 'tokui-chart-axis-time' });\n t.textContent = tk.label;\n svg.appendChild(t);\n });\n}\n\nfunction diamond(cx, cy, r) {\n return cx + ',' + (cy - r) + ' ' + (cx + r) + ',' + cy + ' ' + cx + ',' + (cy + r) + ' ' + (cx - r) + ',' + cy;\n}\n\nfunction appendGanttMilestones(svg, ctx, colors, tips) {\n // 按 x 排序后做相邻避让:横向间距不足时标签交替下沉一行,防止互相重叠\n var ordered = ctx.ms.map(function (m) {\n return { m: m, x: ctx.scale(m.time) };\n }).sort(function (a, b) { return a.x - b.x; });\n var lastX = -Infinity, stagger = false;\n ordered.forEach(function (o) {\n var m = o.m, x = o.x;\n if (x - lastX < 32) stagger = !stagger; else stagger = false;\n lastX = x;\n var color = colors[m.group % colors.length];\n var cy = ctx.msY();\n var g = svgEl('g', { class: 'tokui-chart-tip-group' });\n g.appendChild(svgEl('polygon', { points: diamond(x, cy, 6), fill: color, stroke: 'var(--tokui-chart-slice-stroke, #fff)', 'stroke-width': 1, class: 'tokui-chart-task-ms' }));\n tips.add(g, m.name + ' ' + fmtT(m.time, ctx.mode), x, cy);\n svg.appendChild(g);\n // 标签置于菱形下方(留出顶部给时间轴刻度),相邻过近时再下沉一行避让\n var lb = svgEl('text', { x: x, y: cy + 11 + (stagger ? 9 : 0), 'text-anchor': 'middle', fill: 'var(--tokui-text, #333)', 'font-size': '8' });\n lb.textContent = m.name;\n svg.appendChild(lb);\n });\n}\n\n// 依赖箭头路径(finish→start)。两种形态:\n// (1) dst.start 明显晚于 src.end(留出 nub+余量):中点 L 形,箭头从左侧水平进入目标任务(向右)。\n// 中点垂直段落在两 bar 之间的水平空隙,少压 bar 主体。\n// (2) dst.start 紧贴或早于 src.end(相邻/重叠):箭头从顶部垂直进入目标任务(向下),避免最后一段反向。\nfunction ganttDepPath(sx, sy, dx, dy, barH) {\n var nub = 8;\n if (dx - 3 > sx + nub) {\n var target = dx - 3;\n var vx = (sx + target) / 2;\n return 'M' + sx + ',' + sy + ' L' + vx + ',' + sy + ' L' + vx + ',' + dy + ' L' + target + ',' + dy;\n }\n var tipY = dy - barH / 2;\n return 'M' + sx + ',' + sy\n + ' L' + (sx + nub) + ',' + sy\n + ' L' + (sx + nub) + ',' + (tipY - 9)\n + ' L' + dx + ',' + (tipY - 9)\n + ' L' + dx + ',' + tipY;\n}\n\nfunction appendGanttDeps(svg, ctx) {\n var defs = svgEl('defs');\n // markerUnits=userSpaceOnUse:箭头尺寸为绝对 px,不随 stroke-width 放大;7px 配 14px bar 更协调\n var marker = svgEl('marker', { id: 'gantt-arrow', markerUnits: 'userSpaceOnUse', markerWidth: '7', markerHeight: '7', refX: '6', refY: '3.5', orient: 'auto' });\n marker.appendChild(svgEl('path', { d: 'M0,0 L7,3.5 L0,7 Z', fill: 'var(--tokui-chart-task-dep, #bbb)' }));\n defs.appendChild(marker);\n svg.appendChild(defs);\n Object.keys(ctx.next).forEach(function (s) {\n var si = parseInt(s, 10);\n var srcX = ctx.scale(ctx.tasks[si].end);\n var srcY = ctx.rowY(si);\n ctx.next[s].forEach(function (ei) {\n var dstX = ctx.scale(ctx.tasks[ei].start);\n var dstY = ctx.rowY(ei);\n svg.appendChild(svgEl('path', {\n d: ganttDepPath(srcX, srcY, dstX, dstY, ctx.BAR_H), fill: 'none',\n stroke: 'var(--tokui-chart-task-dep, #bbb)', 'stroke-width': '1',\n 'marker-end': 'url(#gantt-arrow)', class: 'tokui-chart-task-dep',\n 'data-dep-from': si, 'data-dep-to': ei\n }));\n });\n });\n}\n\nfunction appendGanttToday(svg, ctx) {\n var now = Date.now();\n if (now < ctx.tMin || now > ctx.tMax) return;\n var x = ctx.scale(now);\n var bottomY = ctx.totalH - (ctx.hasLeg ? LEGEND_H : 6);\n svg.appendChild(svgEl('line', { x1: x, y1: ctx.PAD_T, x2: x, y2: bottomY, stroke: 'var(--tokui-chart-today-line, #fa541c)', 'stroke-width': '1.5', 'stroke-dasharray': '4,3', class: 'tokui-chart-today' }));\n // 「今天」标签上移,避开与同列日期刻度的横向重叠\n var lb = svgEl('text', { x: x, y: ctx.PAD_T - 14, 'text-anchor': 'middle', fill: 'var(--tokui-chart-today-line, #fa541c)', 'font-size': '8' });\n lb.textContent = '今天';\n svg.appendChild(lb);\n}\n\nfunction appendGanttSkipWarn(svg, ctx) {\n var t = svgEl('text', { x: ctx.w - 6, y: 12, 'text-anchor': 'end', fill: '#faad14', 'font-size': '8' });\n t.textContent = '⚠ 跳过 ' + ctx.skipped + ' 条无效任务';\n svg.appendChild(t);\n}\n\n// 点击任务条高亮其依赖传递闭包(上游+下游+自身)\n// Click a task bar to highlight its dependency transitive closure (upstream + downstream + self)\nfunction bindGanttClick(svg, ctx) {\n function closure(start, adj) {\n var seen = {}, q = [start], out = {};\n while (q.length) {\n var n = q.shift();\n if (seen[n]) continue;\n seen[n] = 1;\n out[n] = 1;\n var nb = adj[n];\n if (nb) nb.forEach(function (x) { if (!seen[x]) q.push(x); });\n }\n return out;\n }\n var groups = svg.querySelectorAll('.tokui-chart-task-tip-group');\n var active = null;\n groups.forEach(function (g) {\n g.addEventListener('click', function () {\n var idx = parseInt(g.getAttribute('data-task-idx'), 10);\n if (isNaN(idx)) return;\n var all = svg.querySelectorAll('.tokui-chart-task-tip-group');\n var deps = svg.querySelectorAll('.tokui-chart-task-dep');\n if (active === idx) {\n svg.classList.remove('has-active');\n all.forEach(function (x) { x.classList.remove('is-active'); });\n deps.forEach(function (d) { d.classList.remove('is-active'); });\n active = null;\n return;\n }\n active = idx;\n var inClosure = {};\n inClosure[idx] = 1;\n Object.keys(closure(idx, ctx.prev)).forEach(function (k) { inClosure[k] = 1; });\n Object.keys(closure(idx, ctx.next)).forEach(function (k) { inClosure[k] = 1; });\n svg.classList.add('has-active');\n all.forEach(function (x) {\n var xi = parseInt(x.getAttribute('data-task-idx'), 10);\n if (isNaN(xi)) return;\n if (inClosure[xi]) x.classList.add('is-active'); else x.classList.remove('is-active');\n });\n deps.forEach(function (d) {\n var f = parseInt(d.getAttribute('data-dep-from'), 10);\n var tt = parseInt(d.getAttribute('data-dep-to'), 10);\n if (inClosure[f] && inClosure[tt]) d.classList.add('is-active'); else d.classList.remove('is-active');\n });\n });\n });\n}\n\nfunction appendGanttTasks(svg, ctx, colors, tips) {\n ctx.tasks.forEach(function (task, i) {\n var color = colors[task.group % colors.length];\n var x = ctx.scale(task.start);\n var xEnd = ctx.scale(task.end);\n var barW = Math.max(2, xEnd - x);\n var y = ctx.rowY(i) - ctx.BAR_H / 2;\n var g = svgEl('g', { class: 'tokui-chart-tip-group tokui-chart-task-tip-group', 'data-task-idx': i });\n g.appendChild(svgEl('rect', { x: x, y: y, width: barW, height: ctx.BAR_H, rx: 3, fill: color, opacity: '0.35', class: 'tokui-chart-task-bar' }));\n if (task.progress > 0) {\n g.appendChild(svgEl('rect', { x: x, y: y, width: Math.max(0, barW * task.progress / 100), height: ctx.BAR_H, rx: 3, fill: color, class: 'tokui-chart-task-prog' }));\n }\n tips.add(g, task.name + ' ' + fmtT(task.start, ctx.mode) + '→' + fmtT(task.end, ctx.mode) + ' 进度:' + task.progress + '%', x + barW / 2, y);\n svg.appendChild(g);\n var nm = svgEl('text', { x: ctx.LABEL_W - 6, y: ctx.rowY(i) + 3, 'text-anchor': 'end', fill: 'var(--tokui-text, #333)', 'font-size': '9', class: 'tokui-chart-task-name' });\n nm.textContent = task.name;\n svg.appendChild(nm);\n });\n}\n\nfunction renderGantt(data, labels, colors, attrs) {\n var ctx = buildGanttCtx(attrs);\n var w = ctx.w;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + ctx.totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n if (ctx.empty) {\n var fb = svgEl('text', { x: w / 2, y: 20, 'text-anchor': 'middle', fill: 'var(--tokui-chart-text, #999)', 'font-size': '10' });\n fb.textContent = '无任务数据';\n svg.appendChild(fb);\n return svg;\n }\n var tips = createTipMgr(w, ctx.totalH);\n appendGanttAxis(svg, ctx);\n if (ctx.hasMs) appendGanttMilestones(svg, ctx, colors, tips);\n appendGanttTasks(svg, ctx, colors, tips);\n appendGanttDeps(svg, ctx);\n if (ctx.mode === 'dates') appendGanttToday(svg, ctx);\n if (ctx.skipped > 0) appendGanttSkipWarn(svg, ctx);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n bindGanttClick(svg, ctx);\n if (ctx.hasLeg) {\n var gs = Object.keys(ctx.tasks.reduce(function (a, t) { a[t.group] = 1; return a; }, {})).map(function (g) { return parseInt(g, 10); });\n gs.sort(function (a, b) { return a - b; });\n var legendEntries = gs.map(function (g) { return { color: colors[g % colors.length], text: ctx.gnames[g] || ('组' + (g + 1)) }; });\n appendLegend(svg, legendEntries, w, ctx.totalH - LEGEND_H + 6);\n }\n return svg;\n}\n\n// === Area 面积图(= line + area 默认 true,支持 stack 堆叠面积)===\nfunction renderArea(data, labels, colors, attrs) {\n var a = {};\n Object.keys(attrs).forEach(function (k) { a[k] = attrs[k]; });\n a.area = true; // 强制填充\n return renderLine(data, labels, colors, a);\n}\n\n// === Progress 进度条(横向轨道 + 填充 + 百分比,复用 animateValue)===\nfunction renderProgress(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 400;\n var h = parseInt(attrs.h) || 80;\n var max = parseFloat(attrs.max); if (isNaN(max)) max = 100;\n var min = parseFloat(attrs.min); if (isNaN(min)) min = 0;\n var span = max - min || 1;\n var val = parseFloat(attrs.v); if (isNaN(val) && data.length) val = data[0]; if (isNaN(val)) val = 0;\n val = clamp(val, min, max);\n var unit = attrs.u !== undefined ? attrs.u : ((min === 0 && max === 100) ? '%' : '');\n var color = isValidColor(attrs.c) ? attrs.c : (colors[0] || 'var(--tokui-primary, #1677ff)');\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg tokui-chart__svg--progress', preserveAspectRatio: 'xMidYMid meet' });\n var trackY = h / 2 - 8, trackH = 16;\n svg.appendChild(svgEl('rect', { x: 2, y: trackY, width: w - 4, height: trackH, rx: trackH / 2, fill: 'var(--tokui-chart-grid, #ececec)', class: 'tokui-chart-track' }));\n var fill = svgEl('rect', { y: trackY, height: trackH, rx: trackH / 2, fill: color, class: 'tokui-chart-fill' });\n svg.appendChild(fill);\n var label = attrs.l || '';\n var txt = svgEl('text', { x: w - 8, y: h / 2, 'text-anchor': 'end', 'dominant-baseline': 'central', fill: 'var(--tokui-text, #333)', 'font-size': '13', 'font-weight': '700' });\n svg.appendChild(txt);\n function setState(vv) {\n var p = clamp((vv - min) / span, 0, 1);\n fill.setAttribute('x', 2);\n fill.setAttribute('width', Math.max(0, (w - 4) * p));\n txt.textContent = (label ? label + ' ' : '') + Math.round(p * 100) + unit;\n }\n animateValue(min, val, parseInt(attrs.anim, 10) || 0, setState);\n return svg;\n}\n\n// === Bubble 气泡图(scatter + 第三维 size)===\nfunction parseBubbleData(d) {\n if (!d) return [];\n return String(d).split(';').map(function (pair) {\n var p = pair.split(',').map(function (v) { return parseFloat(v.trim()) || 0; });\n return { x: p[0] || 0, y: p[1] || 0, s: p[2] || 0 };\n });\n}\nfunction renderBubble(data, labels, colors, attrs) {\n var points = parseBubbleData(attrs.d);\n if (!points.length) return emptyChartSvg(parseInt(attrs.w) || 400, parseInt(attrs.h) || 200);\n // 宽按点数动态(每点最小 slot 22),高度经 bandHeight 防过扁;显式 w/h 优先。\n var w = autoSize(attrs, 'w', points.length, 50, 22, 360, 2400), h = bandHeight(w, parseInt(attrs.h) || 200, 4, 560);\n var padL = 40, padB = 30, padT = 18, padR = 10;\n var cw = w - padL - padR, ch = h - padT - padB;\n // 同 scatter 三级优先:显式轴(锁轴)> 流式缓存(只扩不缩)> 当前点 min/max。\n var xMin = axisBound(attrs, 'xmin', '_xMin', minOf(points.map(function (p) { return p.x; })));\n var xMax = axisBound(attrs, 'xmax', '_xMax', maxOf(points.map(function (p) { return p.x; })));\n var yMin = axisBound(attrs, 'ymin', '_yMin', minOf(points.map(function (p) { return p.y; })));\n var yMax = axisBound(attrs, 'ymax', '_yMax', maxOf(points.map(function (p) { return p.y; })));\n // 同 x/y:流式期读 redrawChart 注入的 _sMax(只扩不缩),自闭合全量回退裸 maxOf。\n var sMax = attrs._sMax !== undefined ? +attrs._sMax : (maxOf(points.map(function (p) { return p.s; })) || 1);\n var xRange = xMax - xMin || 1, yRange = yMax - yMin || 1;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n for (var g = 0; g <= 4; g++) {\n var gy = padT + ch * (1 - g / 4);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(yMin + yRange * g / 4);\n }\n points.forEach(function (p, i) {\n var px = padL + ((p.x - xMin) / xRange) * cw;\n var py = padT + ch * (1 - (p.y - yMin) / yRange);\n var r = 4 + (p.s / sMax) * 16;\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('circle', { cx: px, cy: py, r: 8, fill: 'transparent' }));\n grp.appendChild(svgEl('circle', { cx: px, cy: py, r: r, fill: colors[i % colors.length], opacity: '0.5', stroke: colors[i % colors.length], 'stroke-width': 1.5, class: 'tokui-chart-point' }));\n tips.add(grp, (attrs.xl || 'X') + ': ' + p.x + ' ' + (attrs.yl || 'Y') + ': ' + p.y + ' ' + (attrs.sl || 'size') + ': ' + p.s, px, py);\n svg.appendChild(grp);\n });\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Heatmap 热力图(网格 cells + 色阶插值)===\nfunction parseMatrix(str) {\n if (!str) return [];\n return String(str).split('|').map(function (row) {\n return row.split(',').map(function (v) { return parseFloat(v.trim()); }).filter(function (n) { return !isNaN(n); });\n });\n}\n\n// 解析直方图范围段标签 \"40-50,50-60,...,90-100\" → {lo, hi, bins}。\n// 用于从用户已给的 l 推断值域 + 箱数 → 锁定 → 流式渲染所见即所得(width 恒、分箱恒)。\n// 非范围段(普通标签 \"A,B,C\" 或无法解析)→ 返回 null。\nfunction parseRangeLabels(l) {\n if (!l) return null;\n var segs = String(l).split(',');\n var lo = Infinity, hi = -Infinity, n = 0;\n segs.forEach(function (s) {\n var m = String(s).trim().match(/^(-?[\\d.]+)\\s*[-~到至]\\s*(-?[\\d.]+)$/);\n if (m) { var a = +m[1], b = +m[2]; if (a < b && isFinite(a) && isFinite(b)) { lo = Math.min(lo, a); hi = Math.max(hi, b); n++; } }\n });\n if (!n || !isFinite(lo) || !isFinite(hi) || lo >= hi) return null;\n return { lo: lo, hi: hi, bins: n };\n}\n\n// 直方图分箱(renderHistogram 渲染 + redrawChart y 锁共用)。\n// bins/lo/hi 优先级:显式 bins/min/max > l 范围段推 > 流式缓存 _bins/_lo/_hi > 当前数据。\n// 锁定后 width 恒 → 分箱恒 → 新值仅增对应箱 counts(x 维稳);y 维(max counts)由 redrawChart 另缓存。\nfunction histogramParams(attrs, data) {\n var rl = parseRangeLabels(attrs.l);\n var bins = parseInt(attrs.bins, 10);\n if (isNaN(bins)) bins = rl ? rl.bins : (attrs._bins !== undefined ? +attrs._bins : Math.min(20, Math.max(5, Math.ceil(Math.sqrt(data.length)))));\n var lo = axisBound(attrs, 'min', '_lo', rl ? rl.lo : minOf(data));\n var hi = axisBound(attrs, 'max', '_hi', rl ? rl.hi : maxOf(data));\n if (lo === hi) { lo -= 1; hi += 1; }\n var width = (hi - lo) / bins;\n var counts = [];\n for (var i = 0; i < bins; i++) counts.push(0);\n data.forEach(function (v) {\n counts[Math.max(0, Math.min(bins - 1, Math.floor((v - lo) / width)))]++; // 超 lo/hi 归边界箱\n });\n return { bins: bins, lo: lo, hi: hi, width: width, counts: counts };\n}\nfunction renderHeatmap(data, labels, colors, attrs) {\n var matrix = parseMatrix(attrs.rows || attrs.d);\n var w = parseInt(attrs.w) || 400, h = parseInt(attrs.h) || 320;\n var colLabels = parseLabels(attrs.cols);\n var rowLabels = labels;\n // 骨架维度:行/列标签决定(流式开标签即可画占位网格),数据补足到标签数。\n // 即无 hrow 数据但有 l+cols → 先画 l×cols 单色骨架;数据逐行到 → 该行染色,未到行保持骨架。\n var colsN = Math.max(colLabels.length, matrix[0] ? matrix[0].length : 0);\n var rowsN = Math.max(rowLabels.length, matrix.length);\n if (!rowsN || !colsN) return emptyChartSvg(w, h); // 无标签无数据 → 占位\n var padL = rowLabels.length ? 64 : 30, padT = colLabels.length ? 36 : 16, padR = 16, padB = 16;\n var cw = w - padL - padR, ch = h - padT - padB;\n var cellW = cw / colsN, cellH = ch / rowsN;\n // 已填值 → vRange(优先级:显式 vmin/vmax > 流式缓存 _vMin/_vMax 只扩不缩 > 当前 vals)\n var vals = [];\n matrix.forEach(function (r) { r.forEach(function (v) { if (!isNaN(v)) vals.push(v); }); });\n var hasRange = vals.length > 0;\n var vMin = hasRange ? axisBound(attrs, 'vmin', '_vMin', minOf(vals)) : 0;\n var vMax = hasRange ? axisBound(attrs, 'vmax', '_vMax', maxOf(vals)) : 1;\n var vRange = vMax - vMin || 1;\n var stops = parseColorList(attrs.c).length ? parseColorList(attrs.c) : ['#bae0ff', '#1677ff', '#0958d9'];\n var skelFill = 'var(--tokui-chart-grid, #f0f0f0)';\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n for (var ri = 0; ri < rowsN; ri++) {\n for (var ci = 0; ci < colsN; ci++) {\n var v = matrix[ri] ? matrix[ri][ci] : undefined;\n var filled = v !== undefined && !isNaN(v);\n var t = filled && hasRange ? (v - vMin) / vRange : 0;\n var color = filled ? lerpColor(stops, t) : skelFill;\n var x = padL + ci * cellW, y = padT + ri * cellH;\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('rect', { x: x + 1, y: y + 1, width: cellW - 2, height: cellH - 2, rx: 2, fill: color, opacity: filled ? '1' : '0.5', class: 'tokui-chart-cell' + (filled ? '' : ' tokui-chart-cell--skeleton') }));\n if (filled) tips.add(grp, (rowLabels[ri] || ('R' + (ri + 1))) + ' / ' + (colLabels[ci] || ('C' + (ci + 1))) + ': ' + v, x + cellW / 2, y + cellH / 2);\n svg.appendChild(grp);\n }\n }\n colLabels.forEach(function (lb, ci) {\n svg.appendChild(svgEl('text', { x: padL + ci * cellW + cellW / 2, y: padT - 8, 'text-anchor': 'middle', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = lb;\n });\n rowLabels.forEach(function (lb, ri) {\n svg.appendChild(svgEl('text', { x: padL - 6, y: padT + ri * cellH + cellH / 2 + 3, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = lb;\n });\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Rose 玫瑰图(pie 变体,半径 ∝ 值)===\nfunction renderRose(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 280, h = parseInt(attrs.h) || 280;\n var totalH = h + LEGEND_H;\n if (!data.length) return emptyChartSvg(w, totalH);\n var cx = w / 2, cy = h / 2;\n var r = Math.min(cx, cy) - 24;\n var maxVal = maxOf(data) || 1;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + totalH, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, totalH);\n var angle = -Math.PI / 2;\n var sliceAngle = 2 * Math.PI / data.length;\n data.forEach(function (val, i) {\n var rr = (val / maxVal) * r;\n var x1 = cx + rr * Math.cos(angle), y1 = cy + rr * Math.sin(angle);\n var x2 = cx + rr * Math.cos(angle + sliceAngle), y2 = cy + rr * Math.sin(angle + sliceAngle);\n var largeArc = sliceAngle > Math.PI ? 1 : 0;\n var d = 'M' + cx + ',' + cy + ' L' + x1 + ',' + y1 + ' A' + rr + ',' + rr + ' 0 ' + largeArc + ' 1 ' + x2 + ',' + y2 + ' Z';\n var pct = Math.round(val / maxVal * 100);\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('path', { d: d, fill: colors[i % colors.length], stroke: 'var(--tokui-chart-slice-stroke, #fff)', 'stroke-width': 2, class: 'tokui-chart-slice' }));\n var midA = angle + sliceAngle / 2;\n tips.add(grp, (labels[i] || ('项' + (i + 1))) + ': ' + val + ' (' + pct + '%)', cx + rr * 0.6 * Math.cos(midA), cy + rr * 0.6 * Math.sin(midA));\n svg.appendChild(grp);\n svg.appendChild(svgEl('text', { x: cx + (r + 12) * Math.cos(midA), y: cy + (r + 12) * Math.sin(midA), 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: 'var(--tokui-chart-text, #999)', 'font-size': '8' })).textContent = labels[i] || '';\n angle += sliceAngle;\n });\n appendLegend(svg, data.map(function (v, i) { return { color: colors[i % colors.length], text: labels[i] || ('项' + (i + 1)) }; }), w, h + 6);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Histogram 直方图(原始值 + 前端分箱,复用 bar 渲染)===\nfunction renderHistogram(data, labels, colors, attrs) {\n var w = parseInt(attrs.w) || 400, h = parseInt(attrs.h) || 200;\n if (!data.length) return emptyChartSvg(w, h);\n var p = histogramParams(attrs, data);\n var binLabels = [];\n for (var j = 0; j < p.bins; j++) binLabels.push((p.lo + j * p.width).toFixed(1));\n var a = {};\n Object.keys(attrs).forEach(function (k) { a[k] = attrs[k]; });\n a.d = p.counts.join(',');\n a.l = binLabels.join(',');\n a.vals = '';\n delete a.bins;\n return renderBar(p.counts, binLabels, colors, a);\n}\n\n// === Waterfall 瀑布图(增减累计浮动 + 连接虚线)===\nfunction renderWaterfall(data, labels, colors, attrs) {\n if (!data.length) return emptyChartSvg(parseInt(attrs.w) || 400, parseInt(attrs.h) || 200);\n // 宽按项数动态(每项最小 slot 26),高度经 bandHeight 防过扁;显式 w/h 优先。\n var w = autoSize(attrs, 'w', data.length, 56, 26, 360, 2400), h = bandHeight(w, parseInt(attrs.h) || 200, 4, 560);\n var running = 0, bars = [];\n data.forEach(function (v) {\n var base = running, top = running + v;\n bars.push({ base: Math.min(base, top), top: Math.max(base, top), val: v, isPos: v >= 0 });\n running = top;\n });\n var maxTop = maxOf(bars.map(function (b) { return b.top; }));\n var minBase = minOf(bars.map(function (b) { return b.base; }));\n if (minBase > 0) minBase = 0;\n var range = (maxTop - minBase) || 1;\n var padL = 44, padB = 30, padT = 18, padR = 12;\n var cw = w - padL - padR, ch = h - padT - padB;\n var groupW = cw / data.length, barW = Math.max(4, groupW * 0.6);\n var posColor = colors[0] || '#52c41a', negColor = colors[1] || '#f5222d';\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n function yOf(v) { return padT + ch * (1 - (v - minBase) / range); }\n for (var g = 0; g <= 4; g++) {\n var gy = yOf(minBase + range * g / 4);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(minBase + range * g / 4);\n }\n bars.forEach(function (b, i) {\n var bx = padL + i * groupW + groupW * 0.2;\n var by = yOf(b.top);\n var bh = Math.max(0, (b.top - b.base) / range * ch);\n var col = b.isPos ? posColor : negColor;\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('rect', { x: bx, y: by, width: barW - 1, height: bh, fill: col, rx: 2, class: 'tokui-chart-bar' }));\n tips.add(grp, (labels[i] || ('项' + (i + 1))) + ': ' + b.val + ' (累计 ' + Math.round(b.top) + ')', bx + barW / 2, by);\n svg.appendChild(grp);\n if (i < bars.length - 1) {\n svg.appendChild(svgEl('line', { x1: bx + barW - 1, y1: by, x2: bx + groupW, y2: by, stroke: col, 'stroke-width': 1, 'stroke-dasharray': '3,2', opacity: '0.45' }));\n }\n });\n var positions = [];\n for (var k = 0; k < data.length; k++) positions.push(padL + k * groupW + groupW / 2);\n appendXLabels(svg, labels.slice(0, data.length), positions, h - 8, groupW);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Boxplot 箱线图(五数 min/Q1/中位/Q3/max,多组并列)===\nfunction parseBoxData(d) {\n if (!d) return [];\n return String(d).split(';').map(function (seg) {\n var p = seg.split(',').map(function (v) { return parseFloat(v.trim()) || 0; });\n return { min: p[0], q1: p[1], med: p[2], q3: p[3], max: p[4] };\n });\n}\nfunction renderBoxplot(data, labels, colors, attrs) {\n var boxes = parseBoxData(attrs.d);\n if (!boxes.length) return emptyChartSvg(parseInt(attrs.w) || 400, parseInt(attrs.h) || 240);\n // 宽按组数动态(每组箱体需更宽 slot 44),高度经 bandHeight 防过扁;显式 w/h 优先。\n var w = autoSize(attrs, 'w', boxes.length, 56, 44, 360, 2400), h = bandHeight(w, parseInt(attrs.h) || 240, 4, 560);\n var allVals = [];\n boxes.forEach(function (b) { allVals.push(b.min, b.max); });\n var lo = minOf(allVals), hi = maxOf(allVals);\n if (lo === hi) { lo -= 1; hi += 1; }\n var range = hi - lo || 1;\n var padL = 44, padB = 30, padT = 18, padR = 12;\n var cw = w - padL - padR, ch = h - padT - padB;\n var groupW = cw / boxes.length, boxW = Math.max(20, groupW * 0.5);\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n function yOf(v) { return padT + ch * (1 - (v - lo) / range); }\n for (var g = 0; g <= 4; g++) {\n var gy = yOf(lo + range * g / 4);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(lo + range * g / 4);\n }\n boxes.forEach(function (b, i) {\n var cx = padL + i * groupW + groupW / 2;\n var color = colors[i % colors.length];\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('line', { x1: cx, y1: yOf(b.max), x2: cx, y2: yOf(b.q3), stroke: color, 'stroke-width': 1.5, class: 'tokui-chart-whisker' }));\n grp.appendChild(svgEl('line', { x1: cx, y1: yOf(b.q1), x2: cx, y2: yOf(b.min), stroke: color, 'stroke-width': 1.5, class: 'tokui-chart-whisker' }));\n grp.appendChild(svgEl('line', { x1: cx - 6, y1: yOf(b.max), x2: cx + 6, y2: yOf(b.max), stroke: color, 'stroke-width': 1.5 }));\n grp.appendChild(svgEl('line', { x1: cx - 6, y1: yOf(b.min), x2: cx + 6, y2: yOf(b.min), stroke: color, 'stroke-width': 1.5 }));\n var boxY = yOf(b.q3), boxH = Math.max(0, yOf(b.q1) - yOf(b.q3));\n grp.appendChild(svgEl('rect', { x: cx - boxW / 2, y: boxY, width: boxW, height: boxH, fill: color, opacity: '0.4', stroke: color, 'stroke-width': 1.5, class: 'tokui-chart-box' }));\n grp.appendChild(svgEl('line', { x1: cx - boxW / 2, y1: yOf(b.med), x2: cx + boxW / 2, y2: yOf(b.med), stroke: color, 'stroke-width': 2 }));\n tips.add(grp, (labels[i] || ('组' + (i + 1))) + ' min:' + b.min + ' Q1:' + b.q1 + ' 中位:' + b.med + ' Q3:' + b.q3 + ' max:' + b.max, cx, yOf(b.med));\n svg.appendChild(grp);\n });\n var positions = [];\n for (var k = 0; k < boxes.length; k++) positions.push(padL + k * groupW + groupW / 2);\n appendXLabels(svg, labels.slice(0, boxes.length), positions, h - 8, groupW);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Treemap 矩形树图(占比,slice-and-dice 切分)===\n// d: \"A:100,B:60,C:40\"(name:size)\nfunction parseTreemapData(d) {\n if (!d) return [];\n return String(d).split(',').map(function (seg) {\n var p = seg.split(':');\n return { name: (p[0] || '').trim(), value: parseFloat(p[1]) || 0 };\n }).filter(function (it) { return it.value > 0; });\n}\nfunction renderTreemap(data, labels, colors, attrs) {\n var items = parseTreemapData(attrs.d);\n var w = parseInt(attrs.w) || 480, h = parseInt(attrs.h) || 320;\n if (!items.length) return emptyChartSvg(w, h);\n items.sort(function (a, b) { return b.value - a.value; });\n var total = items.reduce(function (a, b) { return a + b.value; }, 0) || 1;\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n var pad = 2, tileIdx = 0;\n function drawTile(item, x, y, ww, hh) {\n var color = colors[tileIdx % colors.length]; tileIdx++;\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('rect', { x: x, y: y, width: Math.max(0, ww - pad), height: Math.max(0, hh - pad), rx: 3, fill: color, opacity: '0.85', class: 'tokui-chart-tile' }));\n if (ww > 44 && hh > 26) {\n svg.appendChild(svgEl('text', { x: x + 6, y: y + 14, fill: '#fff', 'font-size': '11', 'font-weight': '600' })).textContent = item.name;\n svg.appendChild(svgEl('text', { x: x + 6, y: y + 27, fill: '#fff', 'font-size': '9', opacity: '0.85' })).textContent = item.value + ' (' + Math.round(item.value / total * 100) + '%)';\n }\n tips.add(grp, item.name + ': ' + item.value + ' (' + Math.round(item.value / total * 100) + '%)', x + ww / 2, y + hh / 2);\n svg.appendChild(grp);\n }\n function layout(arr, x, y, ww, hh) {\n if (!arr.length) return;\n if (arr.length === 1) { drawTile(arr[0], x, y, ww, hh); return; }\n var horiz = ww > hh;\n var firstVal = arr[0].value;\n var restVal = arr.slice(1).reduce(function (a, b) { return a + b.value; }, 0) || 1;\n var firstRatio = firstVal / (firstVal + restVal);\n if (horiz) {\n var fw = ww * firstRatio;\n drawTile(arr[0], x, y, fw, hh);\n layout(arr.slice(1), x + fw + pad, y, ww - fw - pad, hh);\n } else {\n var fh = hh * firstRatio;\n drawTile(arr[0], x, y, ww, fh);\n layout(arr.slice(1), x, y + fh + pad, ww, hh - fh - pad);\n }\n }\n layout(items, 0, 0, w, h);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Sankey 桑基图(左右两列节点 + 流向 path,宽度 ∝ 流量)===\n// nodes: \"A,B,C\"(可选);flows: \"A->B:10,B->C:5\"\nfunction renderSankey(data, labels, colors, attrs) {\n var allNodes = parseLabels(attrs.nodes);\n var flows = String(attrs.flows || '').split(',').map(function (seg) {\n var m = seg.split('->');\n if (m.length !== 2) return null;\n var source = m[0].trim();\n var rest = m[1], colon = rest.lastIndexOf(':');\n var target = colon > 0 ? rest.slice(0, colon).trim() : rest.trim();\n var value = colon > 0 ? (parseFloat(rest.slice(colon + 1)) || 0) : 1;\n return { source: source, target: target, value: value };\n }).filter(function (f) { return f && f.value > 0; });\n var w = parseInt(attrs.w) || 480, h = parseInt(attrs.h) || 320;\n if (!flows.length) return emptyChartSvg(w, h);\n var leftNodes = [], rightNodes = [];\n flows.forEach(function (f) {\n if (leftNodes.indexOf(f.source) < 0) leftNodes.push(f.source);\n if (rightNodes.indexOf(f.target) < 0) rightNodes.push(f.target);\n });\n if (allNodes.length && !rightNodes.length) leftNodes = allNodes;\n var totalFlow = flows.reduce(function (a, b) { return a + b.value; }, 0) || 1;\n var padL = 70, padR = 70, padT = 20, padB = 16, nodeW = 14;\n var leftX = padL, rightX = w - padR - nodeW;\n var ch = h - padT - padB;\n function nodeY(arr, name) {\n var idx = arr.indexOf(name);\n return padT + (arr.length ? ch * (idx + 0.5) / arr.length : ch / 2);\n }\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n flows.forEach(function (f, i) {\n var color = colors[i % colors.length];\n var sy = nodeY(leftNodes, f.source), ty = nodeY(rightNodes, f.target);\n var thickness = Math.max(1, (f.value / totalFlow) * 44);\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n var midX = (leftX + nodeW + rightX) / 2;\n var path = 'M' + (leftX + nodeW) + ',' + sy + ' C' + midX + ',' + sy + ' ' + midX + ',' + ty + ' ' + rightX + ',' + ty;\n grp.appendChild(svgEl('path', { d: path, fill: 'none', stroke: color, 'stroke-width': thickness, opacity: '0.4', class: 'tokui-chart-flow' }));\n tips.add(grp, f.source + ' → ' + f.target + ': ' + f.value, midX, (sy + ty) / 2);\n svg.appendChild(grp);\n });\n leftNodes.forEach(function (n, i) {\n svg.appendChild(svgEl('rect', { x: leftX, y: nodeY(leftNodes, n) - 12, width: nodeW, height: 24, rx: 2, fill: colors[i % colors.length] }));\n svg.appendChild(svgEl('text', { x: leftX - 6, y: nodeY(leftNodes, n) + 3, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #666)', 'font-size': '10' })).textContent = n;\n });\n rightNodes.forEach(function (n, i) {\n svg.appendChild(svgEl('rect', { x: rightX, y: nodeY(rightNodes, n) - 12, width: nodeW, height: 24, rx: 2, fill: colors[(i + 3) % colors.length] }));\n svg.appendChild(svgEl('text', { x: rightX + nodeW + 6, y: nodeY(rightNodes, n) + 3, 'text-anchor': 'start', fill: 'var(--tokui-chart-text, #666)', 'font-size': '10' })).textContent = n;\n });\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === Candlestick K 线图(OHLC,涨跌色 + 影线实体)===\n// d: \"o,h,l,c;o,h,l,c\";l: 日期标签\nfunction parseCandleData(d) {\n if (!d) return [];\n return String(d).split(';').map(function (seg) {\n var p = seg.split(',').map(function (v) { return parseFloat(v.trim()); });\n // 跳过不完整组:流式半成品 OHLC(少于4个有效数)不入列。\n // 否则缺位 NaN 经 ||0 变 0 → 该根 l=0 → y 轴 range 被拉到 0 → 柱子挤画布上半(流式错、刷新对的根因)。\n if (p.length < 4 || p.some(function (v) { return !isFinite(v); })) return null;\n return { o: p[0], h: p[1], l: p[2], c: p[3] };\n }).filter(Boolean);\n}\nfunction renderCandlestick(data, labels, colors, attrs) {\n var candles = parseCandleData(attrs.d);\n if (!candles.length) return emptyChartSvg(parseInt(attrs.w) || 480, parseInt(attrs.h) || 280);\n // 固定 viewBox 宽高(attrs.w/h 优先):流式逐根喂入时画布尺寸恒定,\n // 避免 width:100% 下 viewBox 随根数变化 → 显示高度跳动/闪烁(跳动根因)。\n var w = parseInt(attrs.w) || 800, h = parseInt(attrs.h) || 320;\n // y 轴范围:优先用外部缓存的 _yMin/_yMax(流式期 redrawChart 单调扩张+nice,稳定不跳);\n // 无缓存时自算并 nice 化(独立调用也稳)。\n var lo, hi;\n if (attrs._yMin !== undefined && attrs._yMax !== undefined && isFinite(+attrs._yMin)) {\n lo = +attrs._yMin; hi = +attrs._yMax;\n } else {\n var allVals = [];\n candles.forEach(function (c) { allVals.push(c.h, c.l); });\n lo = minOf(allVals); hi = maxOf(allVals);\n var nb = niceBounds(lo, hi); lo = nb[0]; hi = nb[1];\n }\n if (lo === hi) { lo -= 1; hi += 1; }\n var range = hi - lo || 1;\n var padL = 44, padB = 30, padT = 18, padR = 12;\n var cw = w - padL - padR, ch = h - padT - padB;\n var groupW = cw / candles.length, bodyW = Math.max(3, groupW * 0.6);\n var customColors = parseColorList(attrs.c);\n // 中国惯例:阳线(收≥开=涨)红、阴线(跌)绿。c[0]=阳色 c[1]=阴色(与默认一致)。\n var upColor = customColors[0] || '#f5222d';\n var downColor = customColors[1] || '#52c41a';\n var svg = svgEl('svg', { viewBox: '0 0 ' + w + ' ' + h, class: 'tokui-chart__svg', preserveAspectRatio: 'xMidYMid meet' });\n var tips = createTipMgr(w, h);\n function yOf(v) { return padT + ch * (1 - (v - lo) / range); }\n for (var g = 0; g <= 4; g++) {\n var gy = yOf(lo + range * g / 4);\n svg.appendChild(svgEl('line', { x1: padL, y1: gy, x2: w - padR, y2: gy, stroke: 'var(--tokui-chart-grid, #e8e8e8)', 'stroke-width': 1 }));\n svg.appendChild(svgEl('text', { x: padL - 4, y: gy + 4, 'text-anchor': 'end', fill: 'var(--tokui-chart-text, #999)', 'font-size': '9' })).textContent = Math.round(lo + range * g / 4);\n }\n candles.forEach(function (c, i) {\n var cx = padL + i * groupW + groupW / 2;\n var isUp = c.c >= c.o;\n var col = isUp ? upColor : downColor;\n var grp = svgEl('g', { class: 'tokui-chart-tip-group' });\n grp.appendChild(svgEl('line', { x1: cx, y1: yOf(c.h), x2: cx, y2: yOf(c.l), stroke: col, 'stroke-width': 1, class: 'tokui-chart-wick' }));\n var bodyTop = yOf(Math.max(c.o, c.c)), bodyBot = yOf(Math.min(c.o, c.c));\n grp.appendChild(svgEl('rect', { x: cx - bodyW / 2, y: bodyTop, width: bodyW, height: Math.max(1, bodyBot - bodyTop), fill: col, class: 'tokui-chart-candle' }));\n tips.add(grp, (labels[i] || ('D' + (i + 1))) + ' O:' + c.o + ' H:' + c.h + ' L:' + c.l + ' C:' + c.c + (isUp ? ' ↑' : ' ↓'), cx, bodyTop);\n svg.appendChild(grp);\n });\n var positions = [];\n for (var k = 0; k < candles.length; k++) positions.push(padL + k * groupW + groupW / 2);\n appendXLabels(svg, labels.slice(0, candles.length), positions, h - 8, groupW);\n svg.appendChild(tips.layer);\n bindTooltips(svg);\n return svg;\n}\n\n// === 注册表 + 入口 ===\n\nfunction registerChartRenderer(type, fn) {\n chartRenderers[type] = fn;\n}\n\nfunction registerChartComponents(renderer) {\n registerChartRenderer('bar', renderBar);\n registerChartRenderer('line', renderLine);\n registerChartRenderer('pie', renderPie);\n registerChartRenderer('donut', renderDonut);\n registerChartRenderer('radar', renderRadar);\n registerChartRenderer('scatter', renderScatter);\n registerChartRenderer('gantt', renderGantt);\n registerChartRenderer('funnel', renderFunnel);\n registerChartRenderer('gauge', renderGauge);\n registerChartRenderer('area', renderArea);\n registerChartRenderer('progress', renderProgress);\n registerChartRenderer('bubble', renderBubble);\n registerChartRenderer('heatmap', renderHeatmap);\n registerChartRenderer('rose', renderRose);\n registerChartRenderer('histogram', renderHistogram);\n registerChartRenderer('waterfall', renderWaterfall);\n registerChartRenderer('boxplot', renderBoxplot);\n registerChartRenderer('treemap', renderTreemap);\n registerChartRenderer('sankey', renderSankey);\n registerChartRenderer('candlestick', renderCandlestick);\n\n // === 容器模式:图表流式增量重绘 ===\n // chart 容器无内联数据时,子节点 pt/task/ms 逐个喂入累积,每次 rebuild 整张 SVG。\n // 复用现有 renderXxx 纯函数,把 _chartState 拼回 attrs 重画,坐标随点数自然重算。\n // chartAppendChild:解析子节点累积到 wrapper._chartState\n function chartAppendChild(wrapper, childNode) {\n var state = wrapper._chartState;\n if (!state || !childNode) return;\n var t = childNode.type;\n var a = childNode.attrs || {};\n if (t === 'pt') {\n if (state.type === 'scatter' || state.type === 'bubble' || state.type === 'treemap') {\n // scatter/bubble \"x,y[,size]\" / treemap \"名:值\" 整段保留(非纯数字,parseFloat 会丢)\n state.points.push(String(a.v !== undefined ? a.v : (childNode.content || '')));\n } else {\n var v = parseFloat(a.v !== undefined ? a.v : childNode.content);\n if (!isNaN(v)) state.points.push(v);\n }\n } else if (t === 'hrow') {\n // heatmap 行 \"v,v,v\"(hrow 避让布局 row 容器)。元素存 {v,_p}:\n // _kidPreview(v 碎片半成品)→ 更新末行去重;完整 → 固化末行或 append。\n var hv = String(a.v !== undefined ? a.v : (childNode.content || ''));\n var hlast = state.rows[state.rows.length - 1];\n if (childNode._kidPreview) {\n if (hlast && hlast._p) hlast.v = hv; else state.rows.push({ v: hv, _p: true });\n } else if (hlast && hlast._p) { hlast.v = hv; hlast._p = false; }\n else state.rows.push({ v: hv, _p: false });\n } else if (t === 'flow') {\n // sankey 流 \"源->目标:值\"。同 hrow 去重逻辑(_kidPreview 碎片 → 更新末行)。\n var fv = String(a.v !== undefined ? a.v : (childNode.content || ''));\n var flast = state.flows[state.flows.length - 1];\n if (childNode._kidPreview) {\n if (flast && flast._p) flast.v = fv; else state.flows.push({ v: fv, _p: true });\n } else if (flast && flast._p) { flast.v = fv; flast._p = false; }\n else state.flows.push({ v: fv, _p: false });\n } else if (t === 'task') {\n // task: \"name,start,end,progress,group\" 单段(strip 首尾引号,兼容含空格 name 的引号包裹)\n var seg = String(childNode.content || '').replace(/^[\"']|[\"']$/g, '').split(',').map(function (x) { return x.trim(); });\n state.tasks.push(seg);\n } else if (t === 'ms') {\n // ms: \"name,time,group\" 单段\n var p = String(childNode.content || '').replace(/^[\"']|[\"']$/g, '').split(',').map(function (x) { return x.trim(); });\n state.ms.push(p);\n }\n }\n\n // redrawChart:清空旧 svg(保留 title div),用 attrs 重画整张图(容器/自闭合共用)\n function redrawChart(wrapper, attrs) {\n var olds = [];\n for (var i = 0; i < wrapper.childNodes.length; i++) {\n var c = wrapper.childNodes[i];\n if ((c.tagName || '').toLowerCase() === 'svg') olds.push(c);\n }\n olds.forEach(function (s) { wrapper.removeChild(s); });\n var type = attrs.t || 'bar';\n var data = parseData(attrs.d);\n var labels = parseLabels(attrs.l);\n var colors = getColors(attrs);\n var fn = chartRenderers[type];\n if (fn) {\n // candlestick:缓存 y 轴范围于 wrapper,流式期单调扩张 + nice 刻度量化。\n // 避免每根新数据重算 lo/hi → 已画柱 y 坐标全跳(闪烁根因)。只扩不缩 → 极值回收后已画柱稳定。\n if (type === 'candlestick') {\n var cs = parseCandleData(attrs.d);\n // 仅在有完整 K 线且 range 有效时扩张缓存,避免空/半成品数据污染(→ 流式与全量不一致)\n if (cs.length) {\n var avs = [];\n cs.forEach(function (c) { avs.push(c.h, c.l); });\n var rLo = minOf(avs), rHi = maxOf(avs);\n if (isFinite(rLo) && isFinite(rHi) && rLo !== rHi) {\n var eLo = wrapper._yRange ? Math.min(wrapper._yRange.lo, rLo) : rLo;\n var eHi = wrapper._yRange ? Math.max(wrapper._yRange.hi, rHi) : rHi;\n var cnb = niceBounds(eLo, eHi);\n wrapper._yRange = { lo: cnb[0], hi: cnb[1] };\n }\n }\n if (wrapper._yRange) { attrs._yMin = wrapper._yRange.lo; attrs._yMax = wrapper._yRange.hi; }\n }\n // scatter/bubble:缓存 x/y 轴范围于 wrapper,流式期只扩不缩 + nice 量化。\n // 同 candlestick 思路:避免每来新点重算 min/max → 已画点 px/py 全跳(闪烁根因)。\n // x 轴同病同治(x 也是数据值非索引)。极值回收后不缩 → 留白换稳定。\n if (type === 'scatter' || type === 'bubble') {\n var sPts = type === 'bubble' ? parseBubbleData(attrs.d) : parseScatterData(attrs.d);\n if (sPts.length) {\n var sxs = sPts.map(function (p) { return p.x; });\n var sys = sPts.map(function (p) { return p.y; });\n var rxLo = minOf(sxs), rxHi = maxOf(sxs), ryLo = minOf(sys), ryHi = maxOf(sys);\n if (isFinite(rxLo) && isFinite(rxHi) && rxLo !== rxHi) {\n var exLo = wrapper._xRange ? Math.min(wrapper._xRange.lo, rxLo) : rxLo;\n var exHi = wrapper._xRange ? Math.max(wrapper._xRange.hi, rxHi) : rxHi;\n var xnb = niceBounds(exLo, exHi);\n wrapper._xRange = { lo: xnb[0], hi: xnb[1] };\n }\n if (isFinite(ryLo) && isFinite(ryHi) && ryLo !== ryHi) {\n var eyLo = wrapper._yRange ? Math.min(wrapper._yRange.lo, ryLo) : ryLo;\n var eyHi = wrapper._yRange ? Math.max(wrapper._yRange.hi, ryHi) : ryHi;\n var ynb = niceBounds(eyLo, eyHi);\n wrapper._yRange = { lo: ynb[0], hi: ynb[1] };\n }\n // bubble 半径维度 s:只扩不缩(半径非坐标轴,无需 nice 量化)。\n // 防已画点半径随新点 sMax 重算跳变。\n if (type === 'bubble') {\n var rSMax = maxOf(sPts.map(function (p) { return p.s; }));\n if (isFinite(rSMax)) {\n wrapper._sMax = wrapper._sMax ? Math.max(wrapper._sMax, rSMax) : rSMax;\n }\n }\n }\n if (wrapper._xRange) { attrs._xMin = wrapper._xRange.lo; attrs._xMax = wrapper._xRange.hi; }\n if (wrapper._yRange) { attrs._yMin = wrapper._yRange.lo; attrs._yMax = wrapper._yRange.hi; }\n if (wrapper._sMax) { attrs._sMax = wrapper._sMax; }\n }\n // heatmap:缓存值域 vMin/vMax 于 wrapper,流式期只扩不缩(色阶连续插值,无需 nice 量化)。\n // 防每来新 hrow 重算极值 → 已填 cell 颜色全跳。\n if (type === 'heatmap') {\n var hmRows = parseMatrix(attrs.rows || attrs.d);\n if (hmRows.length) {\n var hmVals = [];\n hmRows.forEach(function (r) { r.forEach(function (vv) { if (!isNaN(vv)) hmVals.push(vv); }); });\n if (hmVals.length) {\n var rvLo = minOf(hmVals), rvHi = maxOf(hmVals);\n if (isFinite(rvLo) && isFinite(rvHi)) {\n var hvLo = wrapper._vRange ? Math.min(wrapper._vRange.lo, rvLo) : rvLo;\n var hvHi = wrapper._vRange ? Math.max(wrapper._vRange.hi, rvHi) : rvHi;\n wrapper._vRange = { lo: hvLo, hi: hvHi };\n }\n }\n }\n if (wrapper._vRange) { attrs._vMin = wrapper._vRange.lo; attrs._vMax = wrapper._vRange.hi; }\n }\n // histogram:bins 首帧定不扩(防柱数结构跳);值域 lo/hi 只扩不缩(极值回收稳)。\n // 注:lo/hi 扩张时 width 变会重分箱(柱高跳一次)—— 直方图范围未知时无法既零跳又准确,\n // 故缺省只扩不缩(非扩张期稳),绝对零跳靠显式 min/max(axisBound 优先)。\n if (type === 'histogram') {\n var hd = parseData(attrs.d);\n var hrl = parseRangeLabels(attrs.l);\n if (hrl) {\n // l 范围段标签 → 锁定 lo/hi/bins(不扩不缩 → width 恒 → 流式=全量所见即所得)\n wrapper._hRange = { lo: hrl.lo, hi: hrl.hi };\n if (attrs.bins === undefined) wrapper._hBins = hrl.bins;\n } else if (hd.length) {\n // 无 l 推 → bins 首帧定 + lo/hi 只扩不缩(缺省;极值扩张瞬间柱高跳一次)\n if (wrapper._hBins === undefined && attrs.bins === undefined) {\n wrapper._hBins = Math.min(20, Math.max(5, Math.ceil(Math.sqrt(hd.length))));\n }\n var hLo = minOf(hd), hHi = maxOf(hd);\n if (isFinite(hLo) && isFinite(hHi)) {\n var eHLo = wrapper._hRange ? Math.min(wrapper._hRange.lo, hLo) : hLo;\n var eHHi = wrapper._hRange ? Math.max(wrapper._hRange.hi, hHi) : hHi;\n wrapper._hRange = { lo: eHLo, hi: eHHi };\n }\n }\n if (wrapper._hBins !== undefined) attrs._bins = wrapper._hBins;\n if (wrapper._hRange) { attrs._lo = wrapper._hRange.lo; attrs._hi = wrapper._hRange.hi; }\n // y 锁:分箱算 counts → max → _yMax 只扩不缩(防柱高缩放跳;非扩期柱高稳)\n if (hd.length) {\n var hp = histogramParams(attrs, hd);\n var yM = maxOf(hp.counts) || 1;\n wrapper._yMax = wrapper._yMax ? Math.max(wrapper._yMax, yM) : yM;\n attrs._yMax = wrapper._yMax;\n }\n }\n var svg = fn(data, labels, colors, attrs);\n // 打类型标记:CSS 据此设各类型最佳实践响应式尺寸 + 最大高度(防宽容器里高度爆炸)\n if (svg && svg.setAttribute && (svg.tagName || '').toLowerCase() === 'svg') {\n svg.setAttribute('data-chart-type', type);\n // 横向柱(orient:h)类别在 y 轴、高度随类别数线性增长(autoSize 封顶 1200),\n // 需比纵向更高的 max-height,否则多类别被压扁。打 data-orient 供 CSS 定向放宽。\n if (type === 'bar' && (attrs.orient === 'h' || attrs.orientation === 'h')) {\n svg.setAttribute('data-orient', 'h');\n }\n }\n wrapper.appendChild(svg);\n } else {\n var fb = document.createElement('div');\n fb.className = 'tokui-chart__fallback';\n fb.textContent = '不支持的图表类型: ' + type;\n wrapper.appendChild(fb);\n }\n }\n\n // chartRebuild:容器模式拼出当前 attrs 后重画(基于 _chartState)\n function chartRebuild(wrapper) {\n var state = wrapper._chartState;\n if (!state) return;\n var merged = {};\n Object.keys(state.base).forEach(function (k) { merged[k] = state.base[k]; });\n var type = state.type;\n if (type === 'gantt') {\n merged.tasks = state.tasks.map(function (seg) { return seg.join(','); }).join('|');\n merged.ms = state.ms.map(function (seg) { return seg.join(','); }).join('|');\n merged.d = '';\n } else if (type === 'heatmap') {\n // heatmap 矩阵:流式喂 hrow 才拼 rows 覆盖;自闭合内联 base.rows 时 state.rows 为空,保留 base\n if (state.rows.length) { merged.rows = state.rows.map(function (r) { return r.v; }).join('|'); merged.d = ''; }\n } else if (type === 'sankey') {\n // sankey 流:流式喂 flow 才拼 flows 覆盖;自闭合内联 base.flows 时 state.flows 为空,保留 base\n if (state.flows.length) { merged.flows = state.flows.map(function (f) { return f.v; }).join(','); merged.d = ''; }\n } else {\n var sep = (type === 'scatter' || type === 'bubble') ? ';' : ',';\n merged.d = state.points.join(sep);\n }\n redrawChart(wrapper, merged);\n }\n\n // scheduleRebuild:rAF 合并同帧多次 rebuild(无 rAF 环境 → 同步兜底,如 dom-mock)\n function scheduleRebuild(wrapper) {\n if (wrapper._rafScheduled) return;\n wrapper._rafScheduled = true;\n var run = (typeof window !== 'undefined' && window.requestAnimationFrame)\n ? function (fn) { window.requestAnimationFrame(fn); }\n : function (fn) { fn(); };\n run(function () {\n wrapper._rafScheduled = false;\n chartRebuild(wrapper);\n });\n }\n\n // ===== 图表悬浮工具条:hover 出\"复制/下载\"按钮,导出高清 PNG =====\n // 内联 getComputedStyle 实际色:SVG 用 var(--tokui-...) 变量,独立转图片时无 CSS 上下文会失效变黑。\n function exportChartImage(svg, scale, cb) {\n if (!svg || typeof document === 'undefined' || typeof window === 'undefined') { cb(null); return; }\n var vb = svg.viewBox && svg.viewBox.baseVal;\n var w = (vb && vb.width) || svg.clientWidth || 600;\n var h = (vb && vb.height) || svg.clientHeight || 300;\n var clone = svg.cloneNode(true);\n var srcs = svg.querySelectorAll('*');\n var dsts = clone.querySelectorAll('*');\n var props = ['fill', 'stroke', 'color'];\n for (var i = 0; i < srcs.length; i++) {\n var cs = null;\n try { cs = getComputedStyle(srcs[i]); } catch (e) { cs = null; }\n if (!cs) continue;\n for (var p = 0; p < props.length; p++) {\n var v = cs.getPropertyValue(props[p]);\n if (v) dsts[i].setAttribute(props[p], v);\n }\n }\n // 移除 tooltip 浮层(hover 才显示的提示框),导出纯净图表不含交互层(放内联之后、序列化之前,保 srcs/dsts 索引不错位)\n var tipLayers = clone.querySelectorAll('.tokui-chart-tips-layer');\n for (var j = tipLayers.length - 1; j >= 0; j--) {\n if (tipLayers[j].parentNode) tipLayers[j].parentNode.removeChild(tipLayers[j]);\n }\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n clone.setAttribute('width', w);\n clone.setAttribute('height', h);\n clone.setAttribute('style', 'background:#fff');\n var xml;\n try { xml = new XMLSerializer().serializeToString(clone); } catch (e) { cb(null); return; }\n var url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(xml);\n var img = new Image();\n img.onload = function () {\n var canvas = document.createElement('canvas');\n canvas.width = Math.round(w * scale);\n canvas.height = Math.round(h * scale);\n var ctx = canvas.getContext('2d');\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n if (canvas.toBlob) canvas.toBlob(function (blob) { cb(blob); }, 'image/png');\n else cb(null);\n };\n img.onerror = function () { cb(null); };\n img.src = url;\n }\n function downloadBlob(blob, name) {\n if (!blob) return;\n var a = document.createElement('a');\n var url = URL.createObjectURL(blob);\n a.href = url; a.download = name;\n document.body.appendChild(a); a.click(); a.remove();\n setTimeout(function () { URL.revokeObjectURL(url); }, 2000);\n }\n function copyBlob(blob, btn) {\n if (!blob) return;\n var ok = navigator.clipboard && navigator.clipboard.write && window.ClipboardItem;\n if (ok) {\n navigator.clipboard.write([new window.ClipboardItem({ 'image/png': blob })])\n .then(function () { flashChartAct(btn, '已复制'); })\n .catch(function () { flashChartAct(btn, '复制失败'); });\n } else { flashChartAct(btn, '不支持'); }\n }\n function flashChartAct(btn, text) {\n if (!btn) return;\n var t = document.createElement('span');\n t.className = 'tokui-chart__tip'; t.textContent = text;\n btn.appendChild(t);\n setTimeout(function () { if (t.parentNode) t.remove(); }, 1200);\n }\n var ICON_COPY = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>';\n var ICON_DOWNLOAD = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/></svg>';\n function createChartToolbar(wrapper) {\n var bar = document.createElement('div');\n bar.className = 'tokui-chart__toolbar';\n var mk = function (act, title, icon) {\n var b = document.createElement('button');\n b.type = 'button'; b.className = 'tokui-chart__act';\n b.setAttribute('data-act', act);\n b.title = title; b.setAttribute('aria-label', title);\n b.innerHTML = icon;\n return b;\n };\n bar.appendChild(mk('copy', '复制图片', ICON_COPY));\n bar.appendChild(mk('download', '下载图片', ICON_DOWNLOAD));\n bar.addEventListener('click', function (e) {\n var btn = e.target.closest('[data-act]');\n if (!btn) return;\n e.preventDefault();\n var svg = wrapper.querySelector('svg.tokui-chart__svg');\n if (!svg || btn.disabled) return;\n var act = btn.getAttribute('data-act');\n btn.disabled = true;\n exportChartImage(svg, act === 'copy' ? 2 : 3, function (blob) {\n btn.disabled = false;\n if (!blob) return;\n if (act === 'download') downloadBlob(blob, 'tokui-chart.png');\n else copyBlob(blob, btn);\n });\n });\n return bar;\n }\n renderer.register('chart', function (node) {\n var attrs = node.attrs || {};\n var type = attrs.t || 'bar';\n var wrapper = document.createElement('div');\n wrapper.className = 'tokui-chart';\n if (attrs.tt) {\n var title = document.createElement('div');\n title.className = 'tokui-chart__title';\n title.textContent = attrs.tt;\n wrapper.appendChild(title);\n }\n // 悬浮工具条(复制/下载高清 PNG):默认隐藏,hover .tokui-chart 时 CSS 显出;流式 rebuild 只换 svg 不动它。\n wrapper.appendChild(createChartToolbar(wrapper));\n // 容器模式:无任何内联数据载体 → 流式收 pt/task/ms/hrow/flow 子节点(兼容全量 parse 带 children)。\n // 判定须与 builder.chart 的 hasInline 一致:rows / nodes+flows / gauge·progress 的 v 也算内联,\n // 否则 heatmap/sankey/gauge 自闭合被误判容器、丢失流式预览钩子 _tokuiChartUpdate(不流式)。\n var _ct = attrs.t;\n var _hasInline = attrs.d || attrs.tasks || attrs.rows ||\n (attrs.nodes && attrs.flows) ||\n (attrs.v !== undefined && (_ct === 'gauge' || _ct === 'progress'));\n if (!_hasInline) {\n wrapper._chartState = { type: type, base: attrs, points: [], tasks: [], ms: [], rows: [], flows: [] };\n wrapper._tokuiChartAppend = function (childNode) {\n chartAppendChild(wrapper, childNode);\n scheduleRebuild(wrapper);\n };\n // 流式关闭时强制刷出最终态(防 rAF 漏最后一批)\n wrapper._streamCloseHook = function () {\n if (wrapper._rafScheduled) {\n wrapper._rafScheduled = false;\n chartRebuild(wrapper);\n }\n };\n // 全量 parse:children 已就绪,一次性收集渲染\n if (node.children && node.children.length) {\n node.children.forEach(function (c) { chartAppendChild(wrapper, c); });\n }\n chartRebuild(wrapper);\n return wrapper;\n }\n // 自闭合旧路径(有 d/tasks 内联数据)\n redrawChart(wrapper, attrs);\n // 挂流式更新钩子:parser 自闭合 chart 预览时,半成品 attrs 到达即 rebuild 渐增\n wrapper._tokuiChartUpdate = function (newAttrs) { redrawChart(wrapper, newAttrs); };\n return wrapper;\n });\n}\n\n// UMD 导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.registerChartComponents = registerChartComponents;\n window.TokUI._internal.registerChartRenderer = registerChartRenderer;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { registerChartComponents, registerChartRenderer };\n}\n","/**\n * TokUI 基础组件模块\n * 注册文本展示类组件:标题(h1-h6)、段落(p)、链接(a)、\n * 图片(img)、分割线(hr)、Markdown(md)、代码块(code)。\n */\n'use strict';\n\n/**\n * 颜色解析函数\n * 支持语义命名(primary/success/warning/danger/info/dark/light)\n * 和 6 位 hex 格式(不带 #,如 FF0000)。\n *\n * @param {string} value - 颜色值\n * @returns {string|null} 解析后的 CSS 颜色值,无效返回 null\n */\nfunction resolveColor(value) {\n if (!value) return null;\n const COLOR_MAP = {\n primary: 'var(--tokui-primary)',\n success: 'var(--tokui-success)',\n warning: 'var(--tokui-warning)',\n danger: 'var(--tokui-danger)',\n info: 'var(--tokui-primary)',\n dark: 'var(--tokui-dark)',\n light: 'var(--tokui-light)',\n };\n if (COLOR_MAP[value]) return COLOR_MAP[value];\n if (/^[0-9a-fA-F]{6}$/.test(value)) return '#' + value;\n return null;\n}\n\n/**\n * 语法高亮语言定义\n */\nvar HL_LANGS = {\n js: {\n keywords: /\\b(abstract|arguments|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|eval|export|extends|finally|for|from|function|if|implements|import|in|instanceof|interface|let|new|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/g,\n types: /\\b(Array|Boolean|Date|Error|Function|Infinity|JSON|Map|Math|NaN|Number|Object|Promise|RegExp|Set|String|Symbol|WeakMap|WeakSet|console|document|window|undefined|null|true|false|parseInt|parseFloat|isNaN|isFinite|require|module|exports|process|Buffer)\\b/g\n },\n javascript: null,\n jsx: null,\n ts: {\n keywords: /\\b(abstract|any|as|async|await|bigint|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|if|implements|import|in|instanceof|interface|keyof|let|module|namespace|new|never|null|number|object|of|package|private|protected|public|readonly|require|return|set|static|string|super|switch|symbol|this|throw|try|type|typeof|undefined|unique|unknown|var|void|while|with|yield)\\b/g,\n types: /\\b(Array|Boolean|Date|Error|Function|Map|Number|Object|Promise|Record|RegExp|Set|String|Symbol|console|Partial|Required|Readonly|Pick|Omit|ReturnType|InstanceType)\\b/g\n },\n typescript: null,\n tsx: null,\n python: {\n keywords: /\\b(and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\\b/g,\n types: /\\b(True|False|None|int|float|str|list|dict|tuple|set|bool|bytes|range|len|print|input|type|isinstance|self|super|map|filter|zip|enumerate|sorted|reversed|any|all|min|max|sum|abs|round|open|iter|next|id|hash|callable|hasattr|getattr|setattr|delattr|property|staticmethod|classmethod)\\b/g\n },\n py: null,\n html: {\n keywords: /\\b(html|head|body|div|span|p|a|img|ul|ol|li|h1|h2|h3|h4|h5|h6|table|tr|td|th|thead|tbody|form|input|button|select|option|textarea|label|section|article|header|footer|nav|main|aside|details|summary|video|audio|source|canvas|svg|iframe|link|meta|script|style|title|br|hr|pre|code|blockquote)\\b/g,\n types: /\\b(class|id|style|href|src|alt|type|name|value|placeholder|action|method|target|rel|width|height|disabled|required|checked|selected|readonly|hidden)\\b/g\n },\n css: {\n keywords: /\\b(align-items|align-self|animation|background|background-color|background-image|border|border-color|border-radius|border-style|border-width|bottom|box-shadow|box-sizing|color|content|cursor|display|filter|flex|flex-direction|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-weight|gap|grid|height|justify-content|left|letter-spacing|line-height|margin|max-height|max-width|min-height|min-width|opacity|order|outline|overflow|padding|position|resize|right|text-align|text-decoration|text-overflow|text-transform|top|transform|transition|user-select|vertical-align|visibility|white-space|width|word-break|z-index)\\b/g,\n types: /\\b(inherit|initial|auto|none|block|inline|inline-block|flex|grid|absolute|relative|fixed|sticky|center|left|right|top|bottom|baseline|stretch|column|row|wrap|nowrap|visible|hidden|scroll|solid|dashed|dotted|transparent|bold|normal|italic|uppercase|lowercase|underline|pointer|default|cover|contain|ease|linear|important|var|calc|rgb|rgba|hsl)\\b/g\n },\n json: {\n keywords: /\\b(true|false|null)\\b/g,\n types: /\\b[A-Za-z_]\\w*(?=\\s*:)/g\n },\n sql: {\n keywords: /\\b(SELECT|FROM|WHERE|INSERT|INTO|VALUES|UPDATE|SET|DELETE|CREATE|TABLE|ALTER|DROP|INDEX|VIEW|JOIN|INNER|LEFT|RIGHT|OUTER|ON|AND|OR|NOT|IN|BETWEEN|LIKE|IS|NULL|AS|ORDER|BY|GROUP|HAVING|LIMIT|UNION|ALL|EXISTS|DISTINCT|COUNT|SUM|AVG|MIN|MAX|CASE|WHEN|THEN|ELSE|END|PRIMARY|KEY|FOREIGN|REFERENCES|DEFAULT|CHECK|UNIQUE|IF|DESC|ASC)\\b/gi,\n types: /\\b(INT|INTEGER|BIGINT|FLOAT|DOUBLE|DECIMAL|VARCHAR|CHAR|TEXT|BLOB|DATE|DATETIME|TIMESTAMP|BOOLEAN|ENUM|JSON|SERIAL)\\b/gi\n },\n java: {\n keywords: /\\b(abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while|yield|record|sealed|var)\\b/g,\n types: /\\b(String|Integer|Long|Double|Float|Boolean|Object|Class|Thread|Exception|Error|List|Map|Set|Queue|ArrayList|HashMap|HashSet|TreeMap|TreeSet|Arrays|Collections|Stream|Optional|System|Math|null|true|false)\\b/g\n },\n go: {\n keywords: /\\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go|goto|if|import|interface|map|package|range|return|select|struct|switch|type|var)\\b/g,\n types: /\\b(bool|byte|error|float32|float64|int|int8|int16|int32|int64|rune|string|uint|uint8|uint16|uint32|uint64|uintptr|true|false|nil|iota|append|cap|close|copy|delete|len|make|new|panic|print|println|recover|fmt|err)\\b/g\n },\n rust: {\n keywords: /\\b(as|async|await|break|const|continue|crate|dyn|else|enum|extern|fn|for|if|impl|in|let|loop|match|mod|move|mut|pub|ref|return|self|Self|static|struct|super|trait|type|unsafe|use|where|while|yield)\\b/g,\n types: /\\b(i8|i16|i32|i64|i128|isize|u8|u16|u32|u64|u128|usize|f32|f64|bool|char|str|String|Vec|Box|Option|Result|Some|None|Ok|Err|true|false|println|format|panic|assert)\\b/g\n },\n bash: {\n keywords: /\\b(if|then|else|elif|fi|case|esac|for|while|until|do|done|in|function|select|return|exit|break|continue|declare|export|local|readonly|unset|source|set|shift|eval|echo|printf|test|true|false|cd|pwd|ls|mkdir|cp|mv|rm|cat|head|tail|grep|sed|awk|find|sort|uniq|wc|cut|xargs|chmod|touch|df|du|ps|kill|nohup|ssh|curl|wget|npm|pip|git|docker)\\b/g,\n types: null\n },\n sh: null,\n shell: null,\n zsh: null\n};\n\n// 为别名指向主语言定义\nObject.keys(HL_LANGS).forEach(function(k) {\n if (HL_LANGS[k] === null) {\n var aliasMap = { javascript: 'js', jsx: 'js', tsx: 'ts', typescript: 'ts', py: 'python', sh: 'bash', shell: 'bash', zsh: 'bash' };\n var alias = aliasMap[k];\n if (alias && HL_LANGS[alias]) HL_LANGS[k] = HL_LANGS[alias];\n }\n});\n\n/**\n * 零依赖语法高亮函数\n * 将代码文本按 token 类型着色为 HTML span 元素。\n *\n * @param {string} code - 源代码文本\n * @param {string} lang - 语言标识(如 js, python)\n * @returns {string} 包含着色 span 的 HTML 字符串\n */\nfunction highlightCode(code, lang) {\n if (!code) return '';\n var src = String(code);\n\n var langDef = HL_LANGS[lang];\n if (!langDef) {\n // Unknown language: just escape HTML\n return src.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n\n var placeholders = [];\n // Use a placeholder format that won't be matched by any highlighting regex\n // Format: \\x00PH_N\\x00 where N is zero-padded index\n var PH_PRE = '\\x00PH_';\n var PH_SUF = '\\x00';\n var PH_RE = /\\x00PH_(\\d+)\\x00/g;\n\n function nextPh() {\n return PH_PRE + String(placeholders.length).padStart(5, '0') + PH_SUF;\n }\n\n // Placeholder for raw source tokens (strings/comments) - escapes HTML before storing\n function phRaw(match, cls) {\n var ph = nextPh();\n var escaped = match.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n placeholders.push('<span class=\"tok-' + cls + '\">' + escaped + '</span>');\n return ph;\n }\n // Placeholder for already-escaped text tokens (keywords/numbers/types/fns) - no double-escape\n function phEscaped(match, cls) {\n var ph = nextPh();\n placeholders.push('<span class=\"tok-' + cls + '\">' + match + '</span>');\n return ph;\n }\n\n // Work on raw source, extract tokens before HTML escaping\n // 0. JSON keys (quoted strings followed by colon) - before general strings\n if (lang === 'json') {\n src = src.replace(/([\"'])(?:(?!\\1|\\\\).|\\\\.)*\\1(?=\\s*:)/g, function(m) { return phRaw(m, 'type'); });\n }\n\n // 1. Strings\n src = src.replace(/([\"'])(?:(?!\\1|\\\\).|\\\\.)*\\1/g, function(m) { return phRaw(m, 'str'); });\n src = src.replace(/`(?:[^`\\\\]|\\\\.)*`/g, function(m) { return phRaw(m, 'str'); });\n\n // 2. Comments\n src = src.replace(/\\/\\/.*$/gm, function(m) { return phRaw(m, 'cmt'); });\n // SQL 行注释 -- (须限 sql:否则 JS/Rust 的 i-- 自减会被误判为注释)\n if (lang === 'sql') {\n src = src.replace(/--.*$/gm, function(m) { return phRaw(m, 'cmt'); });\n }\n if (lang !== 'css' && lang !== 'html') {\n src = src.replace(/#.*$/gm, function(m) { return phRaw(m, 'cmt'); });\n }\n src = src.replace(/\\/\\*[\\s\\S]*?\\*\\//g, function(m) {\n // 多行块注释(含 JSDoc /** */):按行切,每行独立 tok-cmt span,\\n 留 span 外。\n // 否则整块注释被包进单个 span 内含字面 \\n,wrapLines 按 \\n 切行后 span 被拆散\n // (首行未闭合、中间行裸文本无色、末行悬空 </span>)→ 仅首行着色,行号虽对但结构错乱。\n var escaped = m.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n return escaped.split('\\n').map(function(line) {\n var ph = nextPh();\n placeholders.push('<span class=\"tok-cmt\">' + line + '</span>');\n return ph;\n }).join('\\n');\n });\n\n // Now escape the remaining (non-placeholder) text for HTML\n var html = src.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n // 3. Numbers\n html = html.replace(/\\b(\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b/gi, function(m) { return phEscaped(m, 'num'); });\n\n // 4. Keywords\n if (langDef.keywords) {\n html = html.replace(langDef.keywords, function(m) { return phEscaped(m, 'kw'); });\n }\n\n // 5. Types/builtins\n if (langDef.types) {\n html = html.replace(langDef.types, function(m) { return phEscaped(m, 'type'); });\n }\n\n // 6. Function calls\n html = html.replace(/\\b([a-zA-Z_]\\w*)\\s*(?=\\()/g, function(m) { return phEscaped(m, 'fn'); });\n\n // 7. Operators (work on escaped text)\n html = html.replace(/(&amp;&amp;|\\|\\||===|!==|=&gt;|\\.\\.\\.|\\+\\+|--|[+\\-*/%=!|^~?:]+)/g, function(m) {\n return phEscaped(m, 'op');\n });\n\n // Restore placeholders\n html = html.replace(PH_RE, function(_, idx) { return placeholders[parseInt(idx)]; });\n\n return html;\n}\n\n/**\n * 注册基础组件到渲染器\n * @param {TokUIRenderer} renderer - 渲染器实例\n */\nfunction registerBasicComponents(renderer) {\n const { el } = (typeof require === 'function')\n ? require('../core/renderer')\n : window.TokUI._internal;\n\n // === 标题组件 h1 ~ h6 ===\n ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].forEach((tag) => {\n renderer.register(tag, (node) => {\n const dom = el(tag, { class: `tokui-${tag}` }, node.content);\n const bgColor = resolveColor(node.attrs.bg);\n const textColor = resolveColor(node.attrs.fc);\n const variant = node.attrs.v || '';\n if (bgColor) {\n // underline 用 CSS 变量传色给 ::after,不设父元素背景\n if (variant.includes('underline')) {\n dom.style.setProperty('--tokui-title-bg', bgColor);\n } else {\n dom.style.background = bgColor;\n }\n }\n if (textColor) dom.style.color = textColor;\n return dom;\n });\n });\n\n // === 段落组件 ===\n renderer.register('p', (node, rc) => {\n // p 现为容器:支持 [p 文本](content 自闭合)与 [p [a] · [a]][/p](嵌套内联子节点)。\n // content 作为前导文本,children(a/tag/text 等)追加其后。\n var pAttrs = { class: 'tokui-p' };\n if (node.attrs && node.attrs.id) pAttrs.id = node.attrs.id; // 透传 id(copy 等需 getElementById 定位)\n var p = el('p', pAttrs);\n if (node.content) {\n p.appendChild(document.createTextNode(node.content));\n }\n if (node.children && node.children.length) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) p.appendChild(child);\n });\n }\n return p;\n });\n\n // === 链接组件 ===\n // attrs.u = URL, attrs.tx = 显示文本\n // attrs.tt = title 提示, attrs.target = 打开方式(默认 _blank)\n // attrs.dis = 禁用, attrs.v = 变体(muted/danger/success/underline)\n renderer.register('a', (node) => {\n var isDisabled = node.attrs.dis !== undefined;\n var href = node.attrs.u || '#';\n if (!/^(https?:\\/\\/|mailto:|\\/|#|tel:)/i.test(href)) href = '#';\n const aAttrs = {\n class: 'tokui-link' + (isDisabled ? ' tokui-a--disabled' : ''),\n href: isDisabled ? 'javascript:void(0)' : href,\n target: node.attrs.target || '_blank',\n rel: 'noopener noreferrer'\n };\n if (node.attrs.tt) aAttrs.title = node.attrs.tt;\n if (isDisabled) {\n aAttrs.tabindex = '-1';\n aAttrs['aria-disabled'] = 'true';\n }\n const a = el('a', aAttrs);\n a.textContent = node.attrs.tx || node.content || '';\n return a;\n });\n\n // === 图片组件 ===\n // DSL属性: s(源地址), alt(替代文本), w(宽度), h(高度), tt(提示文字)\n // 点击触发灯箱预览\n renderer.register('img', (node) => {\n const attrs = {\n class: 'tokui-img'\n };\n if (node.attrs.s) attrs.src = node.attrs.s;\n attrs.alt = node.attrs.alt || '';\n if (node.attrs.w) attrs.width = node.attrs.w;\n if (node.attrs.h) attrs.height = node.attrs.h;\n if (node.attrs.tt) attrs.title = node.attrs.tt;\n const img = el('img', attrs);\n img.style.cursor = 'pointer';\n img.addEventListener('click', function () {\n const { getLightbox } = (typeof require === 'function')\n ? require('./lightbox')\n : window.TokUI._internal;\n const lb = getLightbox(typeof document !== 'undefined' ? document : undefined);\n lb.open(attrs.src);\n });\n return img;\n });\n\n // === 分割线组件 ===\n renderer.register('hr', () => {\n return el('hr', { class: 'tokui-hr' });\n });\n\n // === 行内格式组件(b/strong/em/mark/del/sub/sup)===\n // 用于 item/p 等容器内对关键词加粗/斜体/高亮/删除线/上下标。\n // 渲染为原生 HTML 行内元素(<strong>/<em>/<mark>/<del>/<sub>/<sup>),浏览器默认样式,无需额外 CSS。\n // 例: [item]普通文本 [b 关键词] 普通文本[/item]\n const INLINE_FORMAT_TAGS = {\n b: 'strong', // 加粗(别名)\n strong: 'strong', // 加粗\n em: 'em', // 斜体\n i_text: 'em', // 占位(i 已被 parser 别名为 item,此处不触发)\n mark: 'mark', // 高亮\n del: 'del', // 删除线\n sub: 'sub', // 下标\n sup: 'sup' // 上标\n };\n Object.keys(INLINE_FORMAT_TAGS).forEach((type) => {\n if (type === 'i_text') return;\n renderer.register(type, (node, rc) => {\n const htmlTag = INLINE_FORMAT_TAGS[type];\n const dom = el(htmlTag, { class: 'tokui-' + type });\n const text = node.content || (node.attrs && node.attrs.tx) || '';\n if (text) dom.textContent = text;\n // 支持嵌套行内子节点(如 [b]文本 [em 内嵌][/b],b 须当容器用)\n if (node.children && node.children.length && typeof rc === 'function') {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) dom.appendChild(child);\n });\n }\n return dom;\n });\n });\n\n // === Tag 标签组件 ===\n // 属性: t(type), s(size), round, closable, bordered, dis, bg, fc\n renderer.register('tag', (node) => {\n const attrs = node.attrs || {};\n const content = attrs.tx || node.content || '';\n const classes = ['tokui-tag'];\n const tagType = attrs.t || '';\n if (tagType && tagType !== 'default') classes.push('tokui-tag--' + tagType);\n const size = attrs.s || '';\n if (size && size !== 'medium') classes.push('tokui-tag--' + size);\n if (attrs.round !== undefined) classes.push('tokui-tag--round');\n if (attrs.bordered !== undefined) classes.push('tokui-tag--bordered');\n if (attrs.dis !== undefined) classes.push('tokui-tag--disabled');\n\n const span = el('span', { class: classes.join(' ') });\n\n // 自定义颜色\n const bgColor = resolveColor(attrs.bg);\n const textColor = resolveColor(attrs.fc);\n if (bgColor) span.style.background = bgColor;\n if (textColor) span.style.color = textColor;\n\n // 文本内容\n const contentSpan = el('span', { class: 'tokui-tag__content' });\n contentSpan.textContent = content;\n span.appendChild(contentSpan);\n\n // 关闭按钮\n if (attrs.closable !== undefined) {\n classes.push('tokui-tag--closable');\n span.className = classes.join(' ');\n const closeBtn = el('span', { class: 'tokui-tag__close' });\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', function () {\n span.style.display = 'none';\n });\n span.appendChild(closeBtn);\n }\n\n // 动态更新方法:供 [upd id:xxx tx:新文字 act:close] 调用\n span._update = function (uAttrs) {\n if (uAttrs.tx !== undefined) {\n var contentEl = span.querySelector('.tokui-tag__content');\n if (contentEl) contentEl.textContent = uAttrs.tx;\n }\n if (uAttrs.act === 'close') {\n span.style.transition = 'opacity 0.25s, transform 0.25s';\n span.style.opacity = '0';\n span.style.transform = 'scale(0.8)';\n setTimeout(function () { span.style.display = 'none'; }, 260);\n }\n };\n\n return span;\n });\n\n // === Toggle 切换按钮(自闭合)===\n // attrs.tx = 文字, attrs.chk = 初始选中, attrs.clk = 点击事件\n // attrs.s = 尺寸(sm/lg), attrs.dis = 禁用\n renderer.register('toggle', (node) => {\n const attrs = node.attrs || {};\n const text = attrs.tx || node.content || '';\n const isChecked = attrs.chk === true;\n const size = attrs.s || '';\n const isDisabled = attrs.dis !== undefined;\n const classes = ['tokui-toggle'];\n if (isChecked) classes.push('tokui-toggle--pressed');\n if (size === 'sm') classes.push('tokui-toggle--sm');\n else if (size === 'lg') classes.push('tokui-toggle--lg');\n if (isDisabled) classes.push('tokui-toggle--disabled');\n\n const btnAttrs = {\n class: classes.join(' '),\n type: 'button',\n role: 'switch',\n 'aria-pressed': String(isChecked)\n };\n if (isDisabled) btnAttrs['aria-disabled'] = 'true';\n if (attrs.clk) btnAttrs['data-tokui-clk'] = attrs.clk;\n\n const btn = el('button', btnAttrs);\n btn.textContent = text;\n\n // Click toggles pressed state.\n // In a single-select toggle-group, the group-level listener handles selection;\n // in multi-select mode or standalone, the button toggles itself.\n btn.addEventListener('click', function (e) {\n if (isDisabled) return;\n const group = btn.closest('.tokui-toggle-group');\n if (group && !group.classList.contains('tokui-toggle-group--multi')) return;\n const current = btn.getAttribute('aria-pressed') === 'true';\n const next = !current;\n btn.setAttribute('aria-pressed', String(next));\n btn.classList.toggle('tokui-toggle--pressed', next);\n });\n\n if (isDisabled) btn.disabled = true;\n\n // 动态更新方法:供 [upd id:xxx chk:true dis:true] 调用\n btn._update = function (uAttrs) {\n if (uAttrs.chk === true || uAttrs.chk === 'true') {\n btn.setAttribute('aria-pressed', 'true');\n btn.classList.add('tokui-toggle--pressed');\n } else if (uAttrs.chk === false || uAttrs.chk === 'false') {\n btn.setAttribute('aria-pressed', 'false');\n btn.classList.remove('tokui-toggle--pressed');\n }\n if (uAttrs.dis === true || uAttrs.dis === 'true') {\n btn.disabled = true;\n btn.classList.add('tokui-toggle--disabled');\n btn.setAttribute('aria-disabled', 'true');\n } else if (uAttrs.dis === false || uAttrs.dis === 'false') {\n btn.disabled = false;\n btn.classList.remove('tokui-toggle--disabled');\n btn.removeAttribute('aria-disabled');\n }\n };\n\n return btn;\n });\n\n // === Toggle Group 切换按钮组(容器)===\n // attrs.multi = 多选模式, attrs.clk = 组事件\n // attrs.s = 尺寸(sm/lg)\n // 单选模式: 同组内互斥(点击一个取消其他)\n // 多选模式: 各按钮独立切换\n renderer.register('toggle-group', (node, rc) => {\n const attrs = node.attrs || {};\n const isMulti = attrs.multi === true;\n const size = attrs.s || '';\n const classes = ['tokui-toggle-group'];\n if (isMulti) classes.push('tokui-toggle-group--multi');\n if (size === 'sm') classes.push('tokui-toggle-group--sm');\n else if (size === 'lg') classes.push('tokui-toggle-group--lg');\n\n const groupAttrs = {\n class: classes.join(' '),\n role: 'group'\n };\n if (attrs.clk) groupAttrs['data-tokui-clk'] = attrs.clk;\n\n const group = el('div', groupAttrs);\n\n // Render children\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) group.appendChild(child);\n });\n\n // Single-select: click one -> deselect others\n if (!isMulti) {\n group.addEventListener('click', function (e) {\n const btn = e.target.closest('.tokui-toggle');\n if (!btn || btn.disabled || btn.getAttribute('aria-disabled') === 'true') return;\n const wasPressed = btn.getAttribute('aria-pressed') === 'true';\n\n // Deselect all siblings\n const siblings = group.querySelectorAll('.tokui-toggle');\n siblings.forEach(function (s) {\n s.setAttribute('aria-pressed', 'false');\n s.classList.remove('tokui-toggle--pressed');\n });\n\n // If was not pressed, select it (toggle behavior)\n if (!wasPressed) {\n btn.setAttribute('aria-pressed', 'true');\n btn.classList.add('tokui-toggle--pressed');\n }\n });\n }\n\n group._slot = group;\n group._tokuiType = 'toggle-group';\n return group;\n });\n\n // === Divider 分割线组件 ===\n renderer.register('dv', (node) => {\n const attrs = node.attrs || {};\n const text = attrs.tx || node.content || '';\n const isVert = attrs.vert !== undefined;\n const tag = isVert ? 'span' : 'div';\n const classes = ['tokui-dv'];\n if (attrs.v) classes.push('tokui-dv--' + attrs.v);\n if (attrs.size) classes.push('tokui-dv--' + attrs.size);\n if (isVert) classes.push('tokui-dv--vert');\n if (attrs.plain !== undefined) classes.push('tokui-dv--plain');\n\n if (isVert) {\n return el(tag, { class: classes.join(' ') });\n }\n\n if (text) {\n classes.push('tokui-dv--text');\n const align = attrs.align || 'center';\n if (align !== 'center') classes.push('tokui-dv--' + align);\n const wrapper = el(tag, { class: classes.join(' ') });\n const style = {};\n const color = resolveColor(attrs.bg);\n if (color) style.borderColor = color;\n if (attrs.th) style.borderWidth = attrs.th;\n if (Object.keys(style).length) {\n if (style.borderColor) wrapper.style.borderColor = style.borderColor;\n if (style.borderWidth) wrapper.style.borderWidth = style.borderWidth;\n }\n const span = el('span', { class: 'tokui-dv-text' });\n span.textContent = text;\n wrapper.appendChild(span);\n return wrapper;\n }\n\n const dv = el(tag, { class: classes.join(' ') });\n const style = {};\n const color = resolveColor(attrs.bg);\n if (color) style.borderColor = color;\n if (attrs.th) style.borderWidth = attrs.th;\n if (Object.keys(style).length) {\n if (style.borderColor) dv.style.borderColor = style.borderColor;\n if (style.borderWidth) dv.style.borderWidth = style.borderWidth;\n }\n return dv;\n });\n\n // === Progress 进度条组件 ===\n // attrs.v = 百分比(0-100), attrs.t = 形态(line/circle/span), attrs.l = 标签\n // attrs.s = 尺寸(sm/lg), attrs.stripe = 条纹动画, attrs.status = 状态(success/error)\n renderer.register('progress', (node) => {\n const attrs = node.attrs || {};\n const value = Math.min(100, Math.max(0, parseInt(attrs.v) || 0));\n const label = attrs.l || '';\n const variant = attrs.t || 'line';\n const size = attrs.s || '';\n const status = attrs.status || '';\n const hasStripe = attrs.stripe !== undefined;\n\n // Color class\n let colorClass = '';\n if (status === 'success') colorClass = ' tokui-progress--success';\n else if (status === 'error') colorClass = ' tokui-progress--error';\n\n // Size class\n let sizeClass = '';\n if (size === 'sm' || size === 'small') sizeClass = ' tokui-progress--sm';\n else if (size === 'lg' || size === 'large') sizeClass = ' tokui-progress--lg';\n\n let dom;\n\n // Circle variant — SVG\n if (variant === 'circle') {\n const r = 42;\n const circumference = 2 * Math.PI * r;\n const offset = circumference * (1 - value / 100);\n const wrapperAttrs = { class: 'tokui-progress tokui-progress--circle' + colorClass + sizeClass };\n if (attrs.id) wrapperAttrs.id = attrs.id;\n const wrapper = el('div', wrapperAttrs);\n const svgContainer = el('div', { class: 'tokui-progress__circle-wrap' });\n svgContainer.innerHTML = '<svg viewBox=\"0 0 100 100\" class=\"tokui-progress__svg\">' +\n '<circle class=\"tokui-progress__circle-bg\" cx=\"50\" cy=\"50\" r=\"' + r + '\" fill=\"none\" stroke-width=\"6\"/>' +\n '<circle class=\"tokui-progress__circle-bar\" cx=\"50\" cy=\"50\" r=\"' + r + '\" fill=\"none\" stroke-width=\"6\" ' +\n 'stroke-dasharray=\"' + circumference.toFixed(1) + '\" stroke-dashoffset=\"' + offset.toFixed(1) + '\" ' +\n 'stroke-linecap=\"round\" transform=\"rotate(-90 50 50)\"/>' +\n '<text class=\"tokui-progress__circle-text\" x=\"50\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\">' +\n value + '%</text></svg>';\n wrapper.appendChild(svgContainer);\n if (label) {\n const labelEl = el('div', { class: 'tokui-progress__label tokui-progress__label--center' });\n labelEl.textContent = label;\n wrapper.appendChild(labelEl);\n }\n dom = wrapper;\n }\n\n // Span variant — inline mini\n else if (variant === 'span') {\n const spanAttrs = { class: 'tokui-progress tokui-progress--span' + colorClass };\n if (attrs.id) spanAttrs.id = attrs.id;\n const span = el('span', spanAttrs);\n const miniBar = el('span', { class: 'tokui-progress__mini-bar' });\n const miniFill = el('span', { class: 'tokui-progress__mini-fill' });\n miniFill.style.width = value + '%';\n miniBar.appendChild(miniFill);\n span.appendChild(miniBar);\n const text = el('span', { class: 'tokui-progress__span-text' });\n text.textContent = value + '%';\n span.appendChild(text);\n dom = span;\n }\n\n // Default: Line variant\n else {\n const classes = 'tokui-progress tokui-progress--line' + colorClass + sizeClass + (hasStripe ? ' tokui-progress--stripe' : '');\n const wrapperAttrs = { class: classes };\n if (attrs.id) wrapperAttrs.id = attrs.id;\n const wrapper = el('div', wrapperAttrs);\n if (label) {\n const labelEl = el('div', { class: 'tokui-progress__header' });\n const labelSpan = el('span', { class: 'tokui-progress__label' });\n labelSpan.textContent = label;\n labelEl.appendChild(labelSpan);\n const pct = el('span', { class: 'tokui-progress__pct' });\n pct.textContent = value + '%';\n labelEl.appendChild(pct);\n wrapper.appendChild(labelEl);\n }\n const track = el('div', { class: 'tokui-progress__track' });\n const bar = el('div', { class: 'tokui-progress__bar' });\n bar.style.width = value + '%';\n track.appendChild(bar);\n wrapper.appendChild(track);\n dom = wrapper;\n }\n\n dom._tokuiType = 'progress';\n dom._progressVariant = variant;\n dom._progressCircumference = 2 * Math.PI * 42;\n dom.setAttribute('role', 'progressbar');\n dom.setAttribute('aria-valuenow', String(value));\n dom.setAttribute('aria-valuemin', '0');\n dom.setAttribute('aria-valuemax', '100');\n\n // 动态更新方法:供 [upd id:xxx v:75] 调用\n dom._update = function (uAttrs) {\n // 仅在提供 v 时更新进度值\n if (uAttrs.v !== undefined) {\n var newVal = Math.min(100, Math.max(0, parseInt(uAttrs.v) || 0));\n dom.setAttribute('aria-valuenow', String(newVal));\n if (dom._progressVariant === 'circle') {\n var offset = dom._progressCircumference * (1 - newVal / 100);\n var circleBar = dom.querySelector('.tokui-progress__circle-bar');\n var circleText = dom.querySelector('.tokui-progress__circle-text');\n if (circleBar) circleBar.setAttribute('stroke-dashoffset', offset.toFixed(1));\n if (circleText) circleText.textContent = newVal + '%';\n } else if (dom._progressVariant === 'span') {\n var miniFill = dom.querySelector('.tokui-progress__mini-fill');\n var spanText = dom.querySelector('.tokui-progress__span-text');\n if (miniFill) miniFill.style.width = newVal + '%';\n if (spanText) spanText.textContent = newVal + '%';\n } else {\n var bar = dom.querySelector('.tokui-progress__bar');\n var pct = dom.querySelector('.tokui-progress__pct');\n if (bar) bar.style.width = newVal + '%';\n if (pct) pct.textContent = newVal + '%';\n }\n }\n // 仅在提供 status 时更新状态\n if (uAttrs.status !== undefined) {\n dom.classList.remove('tokui-progress--success', 'tokui-progress--error');\n if (uAttrs.status === 'success') dom.classList.add('tokui-progress--success');\n else if (uAttrs.status === 'error') dom.classList.add('tokui-progress--error');\n }\n };\n\n return dom;\n });\n\n // === Upd 动态更新指令 ===\n // [upd id:my-progress v:75] — 查找已有 DOM 元素并调用其 _update 方法\n // 用于后端异步推送组件状态更新(如进度变化、步骤切换)\n renderer.register('upd', (node) => {\n var attrs = node.attrs || {};\n var id = attrs.id;\n if (id && typeof document !== 'undefined') {\n var target = document.getElementById(id);\n if (target && typeof target._update === 'function') {\n target._update(attrs);\n }\n }\n return document.createTextNode('');\n });\n\n // === Markdown 组件 ===\n // 容器模式:内容从 children 拼接获取(保留原始换行)\n // 流式模式下,子节点作为 Text 节点追加;关闭时统一重新渲染\n renderer.register('md', (node) => {\n const div = el('div', { class: 'tokui-md' });\n let text = '';\n if (node.children && node.children.length > 0) {\n text = node.children.map(c => c.content || '').join('');\n } else {\n text = node.content || '';\n }\n if (text) {\n div.innerHTML = simpleMarkdown(text);\n bindMdLightbox(div);\n }\n // 流式模式关闭钩子:收集所有子文本节点,重新用 Markdown 渲染。\n // 仅在有文本节点(流式累积)时重渲;一次性渲染后 div 已是 HTML 元素(无文本节点),\n // 此时 raw 为空,跳过 —— 否则会用空串覆盖已渲染内容(mount 也会调此 hook)。\n div._streamCloseHook = function () {\n let raw = '';\n for (const child of Array.from(div.childNodes)) {\n if (child.nodeType === 3) { // Text node\n raw += child.textContent;\n }\n }\n if (raw) {\n div.innerHTML = simpleMarkdown(raw);\n bindMdLightbox(div);\n }\n };\n div._tokuiType = 'md';\n return div;\n });\n\n // === 代码块组件 ===\n // attrs.lang = 语言类型(如 js, python)\n // 内容支持子节点拼接(流式模式)或直接 content(一次性模式)\n function escapeHtml(s) {\n return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n\n function wrapLines(html) {\n var lines = html.split('\\n');\n return lines.map(function(line) {\n return '<span class=\"code-line\">' + (line || ' ') + '</span>';\n }).join('');\n }\n\n renderer.register('code', (node) => {\n const pre = el('pre', { class: 'tokui-code' });\n const lang = node.attrs.lang || 'text';\n const code = el('code', { class: `language-${lang}` });\n // 初始文本:一次性渲染取 children/content;流式 open 时为空,靠 _streamAppendHook 累积。\n var rawAcc = '';\n if (node.children && node.children.length > 0) {\n rawAcc = node.children.map(c => c.content || '').join('');\n } else {\n rawAcc = node.content || '';\n }\n // 语法高亮 + 行号包裹。raw 取自闭包累积变量 rawAcc,【不】从 DOM childNodes 反读——\n // wrapLines 会把 \\n 去掉(join('')),DOM round-trip 会丢换行 → 多块流式后塌成一行。\n function applyHighlight() {\n if (lang !== 'text' && HL_LANGS[lang]) {\n code.innerHTML = wrapLines(highlightCode(rawAcc, lang));\n } else {\n code.innerHTML = wrapLines(escapeHtml(rawAcc));\n }\n }\n applyHighlight();\n pre.appendChild(code);\n pre._slot = code; // 插槽指向 code 元素(流式内容追加目标)\n pre._tokuiType = 'code'; // 标记组件类型\n // 复制按钮:复制原始累积文本(含换行),不用 textContent(已被 wrapLines 去换行)\n var copyBtn = el('button', { class: 'tokui-code__copy', type: 'button' });\n copyBtn.textContent = '复制';\n copyBtn.addEventListener('click', function () {\n if (rawAcc && navigator.clipboard) {\n navigator.clipboard.writeText(rawAcc);\n }\n copyBtn.textContent = '已复制';\n copyBtn.classList.add('tokui-code__copy--done');\n setTimeout(function () {\n copyBtn.textContent = '复制';\n copyBtn.classList.remove('tokui-code__copy--done');\n }, 2000);\n });\n pre.appendChild(copyBtn);\n // 真流式:每块 _text 到达即累积到 rawAcc 并整体重高亮 + 重排行号。\n // 行号 / 语法色随 AI 输出逐块增长,不再等到 [/code] 才渲染。\n pre._streamAppendHook = function (childNode) {\n if (childNode && childNode.type === '_text' && childNode.content) {\n rawAcc += childNode.content;\n applyHighlight();\n }\n };\n pre._streamCloseHook = applyHighlight;\n return pre;\n });\n\n // === Callout 提示框组件 ===\n // attrs.t = 类型(info/success/warning/error/tip), attrs.tt = 标题, content/tx = 内容\n renderer.register('callout', (node, rc) => {\n var attrs = node.attrs || {};\n var type = attrs.t || 'info';\n var title = attrs.tt || '';\n var CALLOUT_ICONS = { info: 'ℹ', success: '✓', warning: '⚠', error: '✕', tip: '💡' };\n var wrapper = el('div', { class: 'tokui-callout tokui-callout--' + type, role: 'alert' });\n var iconEl = el('span', { class: 'tokui-callout__icon', 'aria-hidden': 'true' });\n iconEl.textContent = CALLOUT_ICONS[type] || CALLOUT_ICONS.info;\n wrapper.appendChild(iconEl);\n var body = el('div', { class: 'tokui-callout__body' });\n if (title) {\n var titleEl = el('div', { class: 'tokui-callout__title' });\n titleEl.textContent = title;\n body.appendChild(titleEl);\n }\n // 内容容器:始终创建,作为流式 _slot 挂载点(流式子节点不再落到 wrapper 外)\n var contentEl = el('div', { class: 'tokui-callout__content' });\n var hasChildren = node.children && node.children.length;\n var textContent = attrs.tx || node.content || '';\n if (hasChildren) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) contentEl.appendChild(child);\n });\n } else if (textContent) {\n contentEl.textContent = textContent;\n }\n body.appendChild(contentEl);\n wrapper.appendChild(body);\n // 流式插槽:子节点挂到 body 内的 contentEl,而非 wrapper(否则 p 等会落到 body 外)\n wrapper._slot = contentEl;\n return wrapper;\n });\n\n // === Think 思考块组件(容器)===\n // attrs.tt = 标题, attrs.open = 默认展开\n // 子节点递归渲染\n renderer.register('think', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '思考过程';\n var details = el('details', { class: 'tokui-think' });\n if (attrs.open !== undefined) details.setAttribute('open', '');\n var summary = el('summary', { class: 'tokui-think__summary' });\n var icon = el('span', { class: 'tokui-think__icon' });\n icon.textContent = '💭';\n summary.appendChild(icon);\n var titleSpan = el('span', { class: 'tokui-think__title' });\n titleSpan.textContent = title;\n summary.appendChild(titleSpan);\n details.appendChild(summary);\n var body = el('div', { class: 'tokui-think__body' });\n if (node.content) body.textContent = node.content;\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n details.appendChild(body);\n details._slot = body;\n details._tokuiType = 'think';\n return details;\n });\n\n // === ThinkChain 推理链容器(容器) ===\n // attrs.tt = 标题, attrs.status = 整体状态(running/done), attrs.open = 默认展开\n // 子节点为 think-step\n renderer.register('think-chain', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '推理过程';\n var status = attrs.status || '';\n var classes = ['tokui-think-chain'];\n if (status) classes.push('tokui-think-chain--' + status);\n var details = el('details', { class: classes.join(' ') });\n if (attrs.open !== undefined) details.setAttribute('open', '');\n var summary = el('summary', { class: 'tokui-think-chain__summary' });\n var icon = el('span', { class: 'tokui-think-chain__icon' });\n icon.textContent = '\\u{1F9E0}';\n summary.appendChild(icon);\n var titleSpan = el('span', { class: 'tokui-think-chain__title' });\n titleSpan.textContent = title;\n summary.appendChild(titleSpan);\n details.appendChild(summary);\n var stepsBody = el('div', { class: 'tokui-think-chain__steps' });\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) stepsBody.appendChild(child);\n });\n details.appendChild(stepsBody);\n details._slot = stepsBody;\n details._tokuiType = 'think-chain';\n return details;\n });\n\n // === ThinkStep 推理步骤(容器) ===\n // attrs.status = 状态(done/running/pending/error), attrs.tt = 标题\n // attrs.dur = 耗时, 子节点为步骤内容\n renderer.register('think-step', (node, rc) => {\n var attrs = node.attrs || {};\n var status = attrs.status || 'pending';\n var title = attrs.tt || '';\n var dur = attrs.dur || '';\n var classes = ['tokui-think-step', 'tokui-think-step--' + status];\n var wrapper = el('div', { class: classes.join(' ') });\n\n // Header row: icon + title + duration\n var header = el('div', { class: 'tokui-think-step__header' });\n\n if (status === 'done') {\n var icon = el('span', { class: 'tokui-think-step__icon' });\n icon.textContent = '✓';\n header.appendChild(icon);\n } else if (status === 'running') {\n var spinner = el('span', { class: 'tokui-think-step__spinner' });\n header.appendChild(spinner);\n } else if (status === 'error') {\n var errIcon = el('span', { class: 'tokui-think-step__icon tokui-think-step__icon--error' });\n errIcon.textContent = '✗';\n header.appendChild(errIcon);\n } else {\n var pendingDot = el('span', { class: 'tokui-think-step__dot' });\n header.appendChild(pendingDot);\n }\n\n if (title) {\n var titleEl = el('span', { class: 'tokui-think-step__title' });\n titleEl.textContent = title;\n header.appendChild(titleEl);\n }\n\n if (dur) {\n var durEl = el('span', { class: 'tokui-think-step__dur' });\n durEl.textContent = dur;\n header.appendChild(durEl);\n }\n\n wrapper.appendChild(header);\n\n // Content body\n var body = el('div', { class: 'tokui-think-step__body' });\n if (node.content) body.textContent = node.content;\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n wrapper.appendChild(body);\n\n // Connector line\n var line = el('div', { class: 'tokui-think-step__line' });\n wrapper.appendChild(line);\n\n wrapper._slot = body;\n wrapper._tokuiType = 'think-step';\n return wrapper;\n });\n\n // === Copy 复制按钮组件 ===\n // attrs.id = 目标元素 id, attrs.tx = 按钮文字, attrs.tt = 成功提示\n renderer.register('copy', (node) => {\n var attrs = node.attrs || {};\n var btnText = attrs.tx || '复制';\n var successText = attrs.tt || '已复制!';\n var btn = el('button', { class: 'tokui-copy', type: 'button' });\n btn.textContent = btnText;\n btn.addEventListener('click', function () {\n var text = '';\n if (attrs.id && typeof document !== 'undefined') {\n var target = document.getElementById(attrs.id);\n if (target) text = target.textContent || '';\n }\n if (navigator.clipboard && text) {\n navigator.clipboard.writeText(text);\n }\n btn.textContent = successText;\n btn.classList.add('tokui-copy--done');\n setTimeout(function () {\n btn.textContent = btnText;\n btn.classList.remove('tokui-copy--done');\n }, 2000);\n });\n return btn;\n });\n\n // === Spin 加载指示器 ===\n // attrs.t = 形态(spinner/dots/pulse), attrs.s = 尺寸(sm/lg), attrs.tx = 提示文字\n renderer.register('spin', (node) => {\n var attrs = node.attrs || {};\n var variant = attrs.t || 'spinner';\n var size = attrs.s || '';\n var text = attrs.tx || '';\n var classes = ['tokui-spin', 'tokui-spin--' + variant];\n if (size === 'sm' || size === 'small') classes.push('tokui-spin--sm');\n else if (size === 'lg' || size === 'large') classes.push('tokui-spin--lg');\n var wrapper = el('div', { class: classes.join(' ') });\n\n if (variant === 'dots') {\n var dotWrap = el('span', { class: 'tokui-spin__dots' });\n dotWrap.appendChild(el('span', { class: 'tokui-spin__dot' }));\n dotWrap.appendChild(el('span', { class: 'tokui-spin__dot' }));\n dotWrap.appendChild(el('span', { class: 'tokui-spin__dot' }));\n wrapper.appendChild(dotWrap);\n } else if (variant === 'pulse') {\n wrapper.appendChild(el('span', { class: 'tokui-spin__pulse' }));\n } else {\n wrapper.appendChild(el('span', { class: 'tokui-spin__spinner' }));\n }\n\n if (text) {\n var textEl = el('span', { class: 'tokui-spin__text' });\n textEl.textContent = text;\n wrapper.appendChild(textEl);\n }\n return wrapper;\n });\n\n // === Thumb 点赞/点踩组件 ===\n // attrs.t = 方向(up/down), attrs.s = 尺寸(sm/lg), attrs.clk = 点击事件名, attrs.v = active\n renderer.register('thumb', (node) => {\n var attrs = node.attrs || {};\n var direction = attrs.t || 'up';\n var isActive = attrs.v === 'active';\n var size = attrs.s || '';\n var sizeClass = '';\n if (size === 'sm' || size === 'small') sizeClass = ' tokui-thumb--sm';\n else if (size === 'lg' || size === 'large') sizeClass = ' tokui-thumb--lg';\n var btn = el('button', {\n class: 'tokui-thumb tokui-thumb--' + direction + (isActive ? ' tokui-thumb--active' : '') + sizeClass,\n type: 'button',\n 'aria-label': direction === 'up' ? '点赞' : '点踩'\n });\n var svgSize = size === 'lg' || size === 'large' ? 22 : size === 'sm' || size === 'small' ? 14 : 18;\n var svg = direction === 'up'\n ? '<svg viewBox=\"0 0 24 24\" width=\"' + svgSize + '\" height=\"' + svgSize + '\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"/></svg>'\n : '<svg viewBox=\"0 0 24 24\" width=\"' + svgSize + '\" height=\"' + svgSize + '\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"/></svg>';\n var iconWrap = el('span', { class: 'tokui-thumb__icon' });\n iconWrap.innerHTML = svg;\n btn.appendChild(iconWrap);\n // 点击切换\n btn.addEventListener('click', function () {\n btn.classList.toggle('tokui-thumb--active');\n if (attrs.clk) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(attrs.clk, { direction: direction, active: btn.classList.contains('tokui-thumb--active') });\n }\n }\n });\n if (attrs.clk) btn.setAttribute('data-tokui-clk', attrs.clk);\n return btn;\n });\n\n // === File 文件卡片组件 ===\n // attrs.n = 文件名, attrs.s = 大小, attrs.t = 类型(pdf/word/excel/ppt/image/zip/code)\n // attrs.u = 下载链接, attrs.tt = 描述\n renderer.register('file', (node) => {\n var attrs = node.attrs || {};\n var fileName = attrs.n || '未知文件';\n var fileSize = attrs.s || '';\n var fileType = attrs.t || 'default';\n var url = attrs.u || '';\n var desc = attrs.tt || '';\n var FILE_ICONS = {\n pdf: { icon: 'PDF', color: '#f5222d' },\n word: { icon: 'W', color: '#1677ff' },\n excel: { icon: 'XLS', color: '#52c41a' },\n ppt: { icon: 'PPT', color: '#fa8c16' },\n image: { icon: 'IMG', color: '#eb2f96' },\n zip: { icon: 'ZIP', color: '#722ed1' },\n code: { icon: '</>', color: '#13c2c2' },\n default: { icon: 'FILE', color: '#8c8c8c' }\n };\n var iconInfo = FILE_ICONS[fileType] || FILE_ICONS.default;\n var wrapper = el('div', { class: 'tokui-file' });\n // 文件类型 icon\n var iconEl = el('div', { class: 'tokui-file__icon' });\n iconEl.style.background = iconInfo.color;\n iconEl.textContent = iconInfo.icon;\n wrapper.appendChild(iconEl);\n // 文件信息\n var info = el('div', { class: 'tokui-file__info' });\n var nameEl = el('div', { class: 'tokui-file__name' });\n nameEl.textContent = fileName;\n if (url) {\n nameEl.style.cursor = 'pointer';\n nameEl.style.color = 'var(--tokui-primary)';\n nameEl.addEventListener('click', function () { window.open(url, '_blank'); });\n }\n info.appendChild(nameEl);\n if (desc || fileSize) {\n var meta = el('div', { class: 'tokui-file__meta' });\n meta.textContent = [desc, fileSize].filter(Boolean).join(' · ');\n info.appendChild(meta);\n }\n wrapper.appendChild(info);\n // 下载按钮\n if (url) {\n var dl = el('a', {\n class: 'tokui-file__download',\n href: url,\n target: '_blank',\n rel: 'noopener noreferrer',\n download: ''\n });\n dl.textContent = '↓';\n wrapper.appendChild(dl);\n }\n return wrapper;\n });\n\n // === Bubble 聊天气泡(容器) ===\n // attrs.role = user/ai/system, attrs.model = 模型名, attrs.time = 时间戳\n renderer.register('bubble', (node, rc) => {\n var attrs = node.attrs || {};\n var role = attrs.role || 'ai';\n var model = attrs.model || '';\n var time = attrs.time || '';\n var wrapper = el('div', { class: 'tokui-bubble tokui-bubble--' + role });\n\n // row: avatar + content\n var row = el('div', { class: 'tokui-bubble__row' });\n var avatar = el('span', { class: 'tokui-bubble__avatar' });\n avatar.textContent = role === 'user' ? 'You' : 'AI';\n row.appendChild(avatar);\n\n var content = el('div', { class: 'tokui-bubble__content' });\n // header\n var header = el('div', { class: 'tokui-bubble__header' });\n var nameSpan = el('span', {});\n nameSpan.textContent = role === 'user' ? 'You' : role === 'system' ? 'System' : 'Assistant';\n header.appendChild(nameSpan);\n if (model) {\n var modelBadge = el('span', { class: 'tokui-badge tokui-badge--info tokui-badge--pill' });\n modelBadge.textContent = model;\n header.appendChild(modelBadge);\n }\n content.appendChild(header);\n\n // body\n var body = el('div', { class: 'tokui-bubble__body' });\n (rc(node.children || [])).forEach(function (child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n content.appendChild(body);\n\n // time\n if (time) {\n var timeEl = el('div', { class: 'tokui-bubble__time' });\n timeEl.textContent = time;\n content.appendChild(timeEl);\n }\n\n row.appendChild(content);\n wrapper.appendChild(row);\n\n body._slot = body;\n body._tokuiType = 'bubble';\n wrapper._slot = body;\n wrapper._tokuiType = 'bubble';\n return wrapper;\n });\n\n // === Toolbar 操作栏(容器) ===\n // attrs.pos = top/bottom, attrs.align = left/center/right\n renderer.register('toolbar', (node, rc) => {\n var attrs = node.attrs || {};\n var pos = attrs.pos || 'bottom';\n var align = attrs.align || 'right';\n var wrapper = el('div', {\n class: 'tokui-toolbar tokui-toolbar--' + pos + ' tokui-toolbar--' + align\n });\n (rc(node.children || [])).forEach(function (child) {\n if (child && child.nodeType) wrapper.appendChild(child);\n });\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'toolbar';\n return wrapper;\n });\n\n // === Badge 徽标数(自闭合) ===\n // attrs:\n // count — 数字 (0~999)\n // overflow — 超过显示阈值 (默认99)\n // dot — 小红点模式\n // t/status — 颜色: default/primary/success/warning/error/info\n // tx — 自定义文本(与 count 二选一)\n // pill — 胶囊圆角\n // size — 尺寸: sm/default/lg\n // title — hover 提示\n renderer.register('badge', (node) => {\n var attrs = node.attrs || {};\n var status = attrs.t || attrs.status || 'default';\n var text = attrs.tx || node.content || '';\n var count = attrs.count || '';\n var overflow = parseInt(attrs.overflow, 10) || 99;\n var size = attrs.size || '';\n var title = attrs.title || '';\n var classes = ['tokui-badge', 'tokui-badge--' + status];\n if (attrs.pill) classes.push('tokui-badge--pill');\n if (size) classes.push('tokui-badge--' + size);\n\n // 小红点模式\n if (attrs.dot) {\n var dotWrapper = el('span', { class: 'tokui-badge tokui-badge--dot' + (size ? ' tokui-badge--' + size : '') });\n if (title) dotWrapper.setAttribute('title', title);\n return dotWrapper;\n }\n\n var wrapper = el('span', { class: classes.join(' ') });\n if (title) wrapper.setAttribute('title', title);\n\n // 数字模式\n if (count !== '' && !text) {\n var num = parseInt(count, 10);\n if (isNaN(num) || num < 0) num = 0;\n var display = num > overflow ? overflow + '+' : String(num);\n var countEl = el('span', { class: 'tokui-badge__count' });\n countEl.textContent = display;\n wrapper.appendChild(countEl);\n\n // 动态更新方法:供 [upd id:xxx tx:新文字 act:hide] 调用\n wrapper._update = function (uAttrs) {\n if (uAttrs.tx !== undefined) {\n countEl.textContent = uAttrs.tx;\n }\n if (uAttrs.count !== undefined) {\n var newNum = parseInt(uAttrs.count, 10);\n if (isNaN(newNum) || newNum < 0) newNum = 0;\n var ov = parseInt(uAttrs.overflow, 10) || overflow;\n countEl.textContent = newNum > ov ? ov + '+' : String(newNum);\n }\n if (uAttrs.act === 'hide') {\n wrapper.style.display = 'none';\n }\n };\n\n return wrapper;\n }\n\n // 文本模式\n var span = el('span', { class: 'tokui-badge__text' });\n span.textContent = text;\n wrapper.appendChild(span);\n\n // 动态更新方法:供 [upd id:xxx tx:新文字 act:hide] 调用\n wrapper._update = function (uAttrs) {\n if (uAttrs.tx !== undefined) {\n span.textContent = uAttrs.tx;\n }\n if (uAttrs.act === 'hide') {\n wrapper.style.display = 'none';\n }\n };\n\n return wrapper;\n });\n\n // === BadgeBox 徽标数包裹(容器) ===\n // 包裹子组件,在右上角显示数字/小红点/文本徽标\n // attrs: count/dot/tx/t/status/overflow/size\n renderer.register('badge-box', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapper = el('span', { class: 'tokui-badge-box' });\n\n // 渲染子节点\n if (node.children && node.children.length) {\n node.children.forEach(function (child) {\n var rendered = rc(child);\n if (rendered) wrapper.appendChild(rendered);\n });\n }\n\n // 构建徽标指示器\n var status = attrs.t || attrs.status || 'error';\n var bgColor = status === 'primary' ? 'var(--tokui-primary)' :\n status === 'success' ? 'var(--tokui-success)' :\n status === 'warning' ? 'var(--tokui-warning)' :\n status === 'info' ? 'var(--tokui-info)' : 'var(--tokui-danger)';\n var indicator;\n\n if (attrs.dot) {\n indicator = el('sup', { class: 'tokui-badge-box__dot' });\n indicator.style.background = bgColor;\n } else if (attrs.count !== undefined && attrs.count !== '' && !attrs.tx) {\n var overflow = parseInt(attrs.overflow, 10) || 99;\n var num = parseInt(attrs.count, 10);\n if (isNaN(num) || num < 0) num = 0;\n var display = num > overflow ? overflow + '+' : String(num);\n indicator = el('sup', { class: 'tokui-badge-box__count' });\n indicator.textContent = display;\n indicator.style.background = bgColor;\n } else if (attrs.label) {\n indicator = el('sup', { class: 'tokui-badge-box__text' });\n indicator.textContent = attrs.label;\n if (status === 'default') {\n indicator.style.background = 'var(--tokui-stripe, #f5f5f5)';\n indicator.style.color = 'var(--tokui-text-secondary, #666)';\n } else {\n indicator.style.background = bgColor;\n }\n }\n\n if (indicator) wrapper.appendChild(indicator);\n\n return wrapper;\n });\n\n // === Skeleton 骨架屏(自闭合) ===\n // attrs.t = text/card/avatar/image, attrs.rows = 行数, attrs.w = 宽, attrs.h = 高\n renderer.register('skeleton', (node) => {\n var attrs = node.attrs || {};\n var type = attrs.t || 'text';\n var rows = parseInt(attrs.rows, 10) || 3;\n var width = attrs.w || '';\n var height = attrs.h || '';\n var classes = ['tokui-skeleton', 'tokui-skeleton--' + type];\n var wrapper = el('div', { class: classes.join(' '), role: 'status', 'aria-live': 'polite' });\n if (width) wrapper.style.width = width;\n if (height) wrapper.style.height = height;\n if (type === 'text') {\n for (var i = 0; i < rows; i++) {\n var row = el('div', { class: 'tokui-skeleton__row' });\n if (i === rows - 1) row.style.width = '60%';\n wrapper.appendChild(row);\n }\n } else if (type === 'card') {\n var circle = el('div', { class: 'tokui-skeleton__circle' });\n wrapper.appendChild(circle);\n var cardBody = el('div', {});\n cardBody.style.flex = '1';\n cardBody.style.display = 'flex';\n cardBody.style.flexDirection = 'column';\n cardBody.style.gap = '8px';\n var titleRow = el('div', { class: 'tokui-skeleton__row' });\n titleRow.style.width = '40%';\n cardBody.appendChild(titleRow);\n for (var j = 0; j < Math.max(1, rows - 1); j++) {\n var contentRow = el('div', { class: 'tokui-skeleton__row' });\n cardBody.appendChild(contentRow);\n }\n wrapper.appendChild(cardBody);\n } else if (type === 'avatar') {\n var avatarCircle = el('div', { class: 'tokui-skeleton__circle' });\n wrapper.appendChild(avatarCircle);\n } else if (type === 'image') {\n var rect = el('div', { class: 'tokui-skeleton__rect' });\n wrapper.appendChild(rect);\n }\n return wrapper;\n });\n\n // === Toast 轻提示(自闭合) ===\n // attrs.id = 标识, attrs.t = success/error/warning/info\n // attrs.tx = 文本, attrs.duration = 持续时间(ms), attrs.pos = top/bottom\n renderer.register('toast', (node) => {\n var attrs = node.attrs || {};\n var id = attrs.id || '';\n var type = attrs.t || 'info';\n var text = attrs.tx || '';\n var duration = parseInt(attrs.duration, 10) || 2000;\n var pos = attrs.pos || 'top';\n // 确保全局容器存在\n var container = document.querySelector('.tokui-toast-container');\n if (!container) {\n container = el('div', { class: 'tokui-toast-container' });\n document.body.appendChild(container);\n }\n var toastEl = el('div', {\n class: 'tokui-toast tokui-toast--' + type + (pos === 'bottom' ? ' tokui-toast--bottom' : ''),\n role: 'alert',\n 'aria-live': 'polite'\n });\n if (id) toastEl.setAttribute('data-toast-id', id);\n var ICONS = { success: '✓', error: '✕', warning: '!', info: 'ℹ' };\n var icon = el('span', { class: 'tokui-toast__icon' });\n icon.textContent = ICONS[type] || ICONS.info;\n toastEl.appendChild(icon);\n var span = el('span');\n span.textContent = text;\n toastEl.appendChild(span);\n toastEl._toastDuration = duration;\n toastEl._toastShown = false;\n container.appendChild(toastEl);\n // 隐藏初始状态\n toastEl.style.display = 'none';\n // 注册全局 showToast 方法\n if (!window.TokUI) window.TokUI = {};\n if (!window.TokUI._toastMap) window.TokUI._toastMap = {};\n if (id) window.TokUI._toastMap[id] = toastEl;\n if (!window.TokUI.showToast) {\n window.TokUI.showToast = function (toastId, msg) {\n var map = window.TokUI._toastMap || {};\n var target = map[toastId];\n if (!target) return;\n if (msg) {\n var txt = target.querySelector('span:last-child');\n if (txt) txt.textContent = msg;\n }\n target.style.display = '';\n target.classList.remove('tokui-toast--hide');\n target._toastShown = true;\n var dur = target._toastDuration || 2000;\n clearTimeout(target._toastTimer);\n target._toastTimer = setTimeout(function () {\n target.classList.add('tokui-toast--hide');\n setTimeout(function () {\n target.style.display = 'none';\n target._toastShown = false;\n }, 250);\n }, dur);\n };\n }\n return toastEl;\n });\n\n // === Dot 状态指示点(自闭合) ===\n // attrs.t = 类型(success/warning/error/info/primary/default)\n // attrs.tx = 标签文本, attrs.s = 尺寸(sm/lg), attrs.pulse = 脉冲动画\n renderer.register('dot', (node) => {\n var attrs = node.attrs || {};\n var type = attrs.t || 'default';\n var text = attrs.tx || '';\n var size = attrs.s || '';\n var classes = ['tokui-dot', 'tokui-dot--' + type];\n if (size === 'sm') classes.push('tokui-dot--sm');\n else if (size === 'lg') classes.push('tokui-dot--lg');\n if (attrs.pulse !== undefined) classes.push('tokui-dot--pulse');\n var wrapper = el('span', { class: classes.join(' ') });\n var circle = el('span', { class: 'tokui-dot__circle' });\n wrapper.appendChild(circle);\n if (text) {\n var label = el('span', { class: 'tokui-dot__text' });\n label.textContent = text;\n wrapper.appendChild(label);\n }\n return wrapper;\n });\n\n // === Avatar 头像(自闭合) ===\n // attrs.s = 图片URL, attrs.tx = 文字回退, attrs.size = 尺寸(sm/md/lg/xl)\n // attrs.bg = 背景色, attrs.fc = 字色\n renderer.register('avatar', (node) => {\n var attrs = node.attrs || {};\n var src = attrs.s || '';\n var text = attrs.tx || '';\n var size = attrs.size || 'md';\n var classes = ['tokui-avatar'];\n if (src) {\n var img = el('img', { class: classes.join(' '), src: src, alt: text });\n img.classList.add('tokui-avatar--' + size);\n return img;\n }\n classes.push('tokui-avatar--text', 'tokui-avatar--' + size);\n var wrapper = el('span', { class: classes.join(' ') });\n wrapper.textContent = text.slice(0, 2);\n var bg = attrs.bg;\n if (bg) {\n var bgVal = resolveColor(bg);\n if (bgVal) wrapper.style.backgroundColor = bgVal;\n } else if (text) {\n var PALETTE = ['#1677ff', '#52c41a', '#faad14', '#f5222d', '#722ed1', '#13c2c2', '#eb2f96', '#fa8c16'];\n var hash = 0;\n for (var i = 0; i < text.length; i++) hash += text.charCodeAt(i);\n wrapper.style.backgroundColor = PALETTE[hash % PALETTE.length];\n }\n var fc = attrs.fc;\n if (fc) {\n var fcVal = resolveColor(fc);\n if (fcVal) wrapper.style.color = fcVal;\n }\n return wrapper;\n });\n\n // === Tooltip 悬浮提示(自闭合) ===\n // attrs.tt = 提示内容, attrs.pos = 位置(top/bottom/left/right)\n // content / attrs.tx = 触发文字\n // JS 动态定位,position:fixed 避免被父容器裁剪\n renderer.register('tooltip', (node) => {\n var attrs = node.attrs || {};\n var tipText = attrs.tt || '';\n var pos = attrs.pos || 'top';\n var triggerText = attrs.tx || node.content || '';\n var wrapper = el('span', {\n class: 'tokui-tooltip',\n tabindex: '0',\n role: 'tooltip'\n });\n wrapper.textContent = triggerText;\n\n wrapper.addEventListener('mouseenter', function () {\n if (!tipText) return;\n var tip = document.createElement('div');\n tip.className = 'tokui-tooltip__popup tokui-tooltip__popup--' + pos;\n tip.setAttribute('role', 'tooltip');\n tip.textContent = tipText;\n document.body.appendChild(tip);\n\n var rect = wrapper.getBoundingClientRect();\n var tipRect = tip.getBoundingClientRect();\n var gap = 8;\n\n if (pos === 'top') {\n tip.style.left = (rect.left + rect.width / 2 - tipRect.width / 2) + 'px';\n tip.style.top = (rect.top - tipRect.height - gap) + 'px';\n } else if (pos === 'bottom') {\n tip.style.left = (rect.left + rect.width / 2 - tipRect.width / 2) + 'px';\n tip.style.top = (rect.bottom + gap) + 'px';\n } else if (pos === 'left') {\n tip.style.left = (rect.left - tipRect.width - gap) + 'px';\n tip.style.top = (rect.top + rect.height / 2 - tipRect.height / 2) + 'px';\n } else if (pos === 'right') {\n tip.style.left = (rect.right + gap) + 'px';\n tip.style.top = (rect.top + rect.height / 2 - tipRect.height / 2) + 'px';\n }\n\n // 视口边界修正\n var finalRect = tip.getBoundingClientRect();\n if (finalRect.left < 4) tip.style.left = '4px';\n if (finalRect.right > window.innerWidth - 4) tip.style.left = (window.innerWidth - finalRect.width - 4) + 'px';\n if (finalRect.top < 4) tip.style.top = (rect.bottom + gap) + 'px';\n\n tip.classList.add('tokui-tooltip__popup--visible');\n wrapper._tooltipEl = tip;\n });\n\n function hideTip() {\n if (wrapper._tooltipEl) {\n wrapper._tooltipEl.classList.remove('tokui-tooltip__popup--visible');\n var ref = wrapper._tooltipEl;\n setTimeout(function () { if (ref.parentNode) ref.parentNode.removeChild(ref); }, 150);\n wrapper._tooltipEl = null;\n }\n }\n wrapper.addEventListener('mouseleave', hideTip);\n wrapper.addEventListener('blur', hideTip);\n wrapper.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') hideTip();\n });\n\n return wrapper;\n });\n\n // === Pagination 分页(自闭合) ===\n // attrs.page = 当前页, attrs.total = 总页数, attrs.clk = 点击处理\n // attrs.s = 尺寸(sm/lg), attrs.show-total = 显示总数, attrs.count = 总条目数\n // 支持内部切换:点击页码/上一页/下一页自动更新 UI 状态\n renderer.register('pagination', (node) => {\n var attrs = node.attrs || {};\n var total = parseInt(attrs.total, 10) || 1;\n var handlerName = attrs.clk || '';\n var size = attrs.s || '';\n var showTotal = attrs['show-total'] !== undefined;\n var count = attrs.count || '';\n var _current = parseInt(attrs.page, 10) || 1;\n\n var classes = ['tokui-pagination'];\n if (size === 'sm') classes.push('tokui-pagination--sm');\n else if (size === 'lg') classes.push('tokui-pagination--lg');\n var nav = el('nav', { class: classes.join(' '), role: 'navigation', 'aria-label': '分页' });\n\n // 总数显示(固定不刷新)\n if (showTotal) {\n var totalEl = el('span', { class: 'tokui-pagination__total' });\n totalEl.textContent = count ? ('共 ' + count + ' 条') : ('共 ' + total + ' 页');\n nav.appendChild(totalEl);\n }\n\n // 动态区域容器\n var pagesWrap = el('div', { class: 'tokui-pagination__pages' });\n nav.appendChild(pagesWrap);\n\n function renderPages(cur) {\n pagesWrap.innerHTML = '';\n\n // 上一页\n var prevBtn = el('button', {\n class: 'tokui-pagination__btn tokui-pagination__prev' + (cur <= 1 ? ' tokui-pagination__btn--disabled' : ''),\n 'data-page': String(cur - 1),\n disabled: cur <= 1 ? true : false\n });\n prevBtn.textContent = '‹';\n pagesWrap.appendChild(prevBtn);\n\n // 页码\n var pages = generatePages(cur, total);\n pages.forEach(function (p) {\n if (p === '...') {\n var ell = el('span', { class: 'tokui-pagination__ellipsis' });\n ell.textContent = '...';\n pagesWrap.appendChild(ell);\n } else {\n var pBtn = el('button', {\n class: 'tokui-pagination__item' + (p === cur ? ' tokui-pagination__item--active' : ''),\n 'data-page': String(p)\n });\n pBtn.textContent = String(p);\n pagesWrap.appendChild(pBtn);\n }\n });\n\n // 下一页\n var nextBtn = el('button', {\n class: 'tokui-pagination__btn tokui-pagination__next' + (cur >= total ? ' tokui-pagination__btn--disabled' : ''),\n 'data-page': String(cur + 1),\n disabled: cur >= total ? true : false\n });\n nextBtn.textContent = '›';\n pagesWrap.appendChild(nextBtn);\n }\n\n renderPages(_current);\n\n // 点击事件:更新 UI + 分发外部回调\n nav.addEventListener('click', function (e) {\n var btn = e.target.closest('[data-page]');\n if (!btn || btn.disabled) return;\n var pageNum = parseInt(btn.getAttribute('data-page'), 10);\n if (isNaN(pageNum) || pageNum < 1 || pageNum > total) return;\n _current = pageNum;\n renderPages(_current);\n if (handlerName) {\n var handler = renderer.eventBus && renderer.eventBus.getHandler(handlerName);\n if (handler) handler({ page: pageNum }, e, btn);\n }\n });\n\n return nav;\n });\n\n // === Breadcrumb 面包屑 ===\n // attrs.items = 逗号分隔路径, attrs.sep = 分隔符(默认 /)\n // attrs.clk = 点击处理器\n renderer.register('breadcrumb', (node) => {\n var attrs = node.attrs || {};\n var itemsStr = attrs.items || '';\n var items = itemsStr.split(',').map(function (s) { return s.trim(); }).filter(Boolean);\n var sep = attrs.sep || '/';\n var handlerName = attrs.clk || '';\n var isArrow = attrs.v && attrs.v.indexOf('arrow') !== -1;\n\n var classes = ['tokui-breadcrumb'];\n if (isArrow) classes.push('tokui-breadcrumb--arrow');\n\n var nav = el('nav', { class: classes.join(' '), 'aria-label': 'breadcrumb' });\n\n items.forEach(function (text, idx) {\n var isLast = idx === items.length - 1;\n var item = el('span', {\n class: 'tokui-breadcrumb__item' + (isLast ? ' tokui-breadcrumb__item--active' : ''),\n 'data-index': String(idx)\n });\n item.textContent = text;\n if (handlerName && !isLast) {\n item.style.cursor = 'pointer';\n item.addEventListener('click', function (e) {\n var handler = renderer.eventBus && renderer.eventBus.getHandler(handlerName);\n if (handler) handler({ index: idx, text: text }, e, item);\n });\n }\n nav.appendChild(item);\n\n if (!isLast) {\n var sepEl = el('span', { class: 'tokui-breadcrumb__sep' });\n sepEl.textContent = isArrow ? '›' : sep;\n nav.appendChild(sepEl);\n }\n });\n\n return nav;\n });\n\n // === Dropdown 下拉菜单(容器) ===\n // attrs.tx = 触发按钮文字, attrs.v = 按钮变体(primary/danger/success/warning/ghost)\n renderer.register('dropdown', (node, rc) => {\n var attrs = node.attrs || {};\n var triggerText = attrs.tt || attrs.tx || '菜单';\n var variant = attrs.v || '';\n\n var wrapper = el('div', { class: 'tokui-dropdown' });\n\n // 触发按钮\n var triggerClasses = 'tokui-dropdown__trigger';\n if (variant) triggerClasses += ' tokui-dropdown__trigger--' + variant;\n var trigger = el('button', { class: triggerClasses });\n trigger.textContent = triggerText;\n trigger.setAttribute('aria-haspopup', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n wrapper.appendChild(trigger);\n\n // 下拉面板\n var panel = el('div', { class: 'tokui-dropdown__panel' });\n panel.setAttribute('role', 'menu');\n\n // 渲染子节点(dd-item 等)\n (node.children || []).forEach(function (child) {\n var rendered = rc([child]);\n rendered.forEach(function (el) {\n if (el && el.nodeType) panel.appendChild(el);\n });\n });\n\n wrapper.appendChild(panel);\n\n // 点击触发按钮切换展开\n trigger.addEventListener('click', function (e) {\n e.stopPropagation();\n var isOpen = panel.classList.contains('tokui-dropdown__panel--open');\n closeAllDropdowns();\n if (!isOpen) {\n var rect = trigger.getBoundingClientRect();\n panel.style.top = (rect.bottom + 4) + 'px';\n panel.style.left = rect.left + 'px';\n panel.classList.add('tokui-dropdown__panel--open');\n trigger.setAttribute('aria-expanded', 'true');\n }\n });\n\n // panel 内点击 item 后自动关闭\n panel.addEventListener('click', function (e) {\n var item = e.target.closest('.tokui-dropdown__item');\n if (item && !item.classList.contains('tokui-dropdown__item--disabled')) {\n panel.classList.remove('tokui-dropdown__panel--open');\n trigger.setAttribute('aria-expanded', 'false');\n }\n });\n\n wrapper._slot = panel;\n wrapper._tokuiType = 'dropdown';\n // 键盘导航\n trigger.addEventListener('keydown', function(e) {\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n e.preventDefault();\n if (!panel.classList.contains('tokui-dropdown__panel--open')) {\n closeAllDropdowns();\n panel.classList.add('tokui-dropdown__panel--open');\n trigger.setAttribute('aria-expanded', 'true');\n }\n var items = panel.querySelectorAll('.tokui-dropdown__item:not(.tokui-dropdown__item--disabled)');\n if (items.length > 0) items[0].focus();\n }\n if (e.key === 'Escape') {\n panel.classList.remove('tokui-dropdown__panel--open');\n trigger.setAttribute('aria-expanded', 'false');\n }\n });\n panel.addEventListener('keydown', function(e) {\n var items = Array.from(panel.querySelectorAll('.tokui-dropdown__item:not(.tokui-dropdown__item--disabled)'));\n var idx = items.indexOf(e.target);\n if (e.key === 'ArrowDown' && idx < items.length - 1) { e.preventDefault(); items[idx + 1].focus(); }\n if (e.key === 'ArrowUp') { e.preventDefault(); idx > 0 ? items[idx - 1].focus() : trigger.focus(); }\n if (e.key === 'Escape') { panel.classList.remove('tokui-dropdown__panel--open'); trigger.setAttribute('aria-expanded', 'false'); trigger.focus(); }\n });\n return wrapper;\n });\n\n // === Empty 空状态组件(自闭合)===\n // attrs.tx = 描述文本, attrs.icon = 图标类型(default/box/folder/search), attrs.s = 图片源\n // 居中展示空状态插图 + 描述文字\n renderer.register('empty', (node) => {\n var attrs = node.attrs || {};\n var text = attrs.tx || '';\n var iconType = attrs.icon || 'default';\n var src = attrs.s || '';\n\n var ICONS = {\n default: '<svg viewBox=\"0 0 64 41\" fill=\"none\"><g transform=\"translate(0 1)\" fill-rule=\"evenodd\"><ellipse fill=\"var(--tokui-stripe)\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\"/><g fill-rule=\"nonzero\" stroke=\"var(--tokui-border)\"><path d=\"M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z\"/><path d=\"M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35h-40.1C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z\" fill=\"var(--tokui-stripe)\"/></g></g></svg>',\n box: '<svg viewBox=\"0 0 64 41\" fill=\"none\"><g transform=\"translate(0 1)\" fill-rule=\"evenodd\"><ellipse fill=\"var(--tokui-stripe)\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\"/><rect x=\"13\" y=\"6\" width=\"38\" height=\"24\" rx=\"3\" fill=\"var(--tokui-stripe)\" stroke=\"var(--tokui-border)\" stroke-width=\"2\"/><path d=\"M13 14h38\" stroke=\"var(--tokui-border)\" stroke-width=\"2\"/></g></svg>',\n folder: '<svg viewBox=\"0 0 64 41\" fill=\"none\"><g transform=\"translate(0 1)\" fill-rule=\"evenodd\"><ellipse fill=\"var(--tokui-stripe)\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\"/><path d=\"M10 12V9a2 2 0 012-2h12l4 5h24a2 2 0 012 2v16a2 2 0 01-2 2H12a2 2 0 01-2-2V12z\" fill=\"var(--tokui-stripe)\" stroke=\"var(--tokui-border)\" stroke-width=\"2\"/></g></svg>',\n search: '<svg viewBox=\"0 0 64 41\" fill=\"none\"><g transform=\"translate(0 1)\" fill-rule=\"evenodd\"><ellipse fill=\"var(--tokui-stripe)\" cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\"/><circle cx=\"28\" cy=\"18\" r=\"10\" stroke=\"var(--tokui-border)\" stroke-width=\"2\" fill=\"var(--tokui-stripe)\"/><path d=\"M35 25l8 7\" stroke=\"var(--tokui-border)\" stroke-width=\"2\" stroke-linecap=\"round\"/></g></svg>'\n };\n\n var wrapper = el('div', { class: 'tokui-empty' });\n\n // 图片或图标\n if (src) {\n var imgEl = el('img', { class: 'tokui-empty__img', src: src, alt: text });\n wrapper.appendChild(imgEl);\n } else {\n var iconEl = el('div', { class: 'tokui-empty__icon' });\n iconEl.innerHTML = ICONS[iconType] || ICONS.default;\n wrapper.appendChild(iconEl);\n }\n\n // 描述文字\n if (text) {\n var textEl = el('div', { class: 'tokui-empty__text' });\n textEl.textContent = text;\n wrapper.appendChild(textEl);\n }\n\n return wrapper;\n });\n\n // === Result 结果页组件(自闭合)===\n // attrs.t = 类型(success/error/warning/info), attrs.tt = 标题, attrs.tx = 描述\n // 大图标 + 标题 + 描述的结果反馈\n renderer.register('result', (node) => {\n var attrs = node.attrs || {};\n var type = attrs.t || 'info';\n var title = attrs.tt || '';\n var desc = attrs.tx || '';\n\n var ICONS = {\n success: '<svg viewBox=\"0 0 64 64\" fill=\"none\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"var(--tokui-success-1, rgba(34,197,94,0.1))\" stroke=\"var(--tokui-success)\" stroke-width=\"2\"/><path d=\"M20 32l8 8 16-16\" stroke=\"var(--tokui-success)\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n error: '<svg viewBox=\"0 0 64 64\" fill=\"none\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"var(--tokui-danger-1, rgba(239,68,68,0.1))\" stroke=\"var(--tokui-danger)\" stroke-width=\"2\"/><path d=\"M24 24l16 16M40 24l-16 16\" stroke=\"var(--tokui-danger)\" stroke-width=\"3\" stroke-linecap=\"round\"/></svg>',\n warning: '<svg viewBox=\"0 0 64 64\" fill=\"none\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"var(--tokui-warning-1, rgba(245,158,11,0.1))\" stroke=\"var(--tokui-warning)\" stroke-width=\"2\"/><path d=\"M32 22v14M32 42v2\" stroke=\"var(--tokui-warning)\" stroke-width=\"3\" stroke-linecap=\"round\"/></svg>',\n info: '<svg viewBox=\"0 0 64 64\" fill=\"none\"><circle cx=\"32\" cy=\"32\" r=\"30\" fill=\"var(--tokui-primary-1, rgba(79,70,229,0.1))\" stroke=\"var(--tokui-primary)\" stroke-width=\"2\"/><path d=\"M32 22v2M32 30v14\" stroke=\"var(--tokui-primary)\" stroke-width=\"3\" stroke-linecap=\"round\"/></svg>'\n };\n\n var wrapper = el('div', { class: 'tokui-result tokui-result--' + type });\n\n var iconEl = el('div', { class: 'tokui-result__icon' });\n iconEl.innerHTML = ICONS[type] || ICONS.info;\n wrapper.appendChild(iconEl);\n\n if (title) {\n var titleEl = el('div', { class: 'tokui-result__title' });\n titleEl.textContent = title;\n wrapper.appendChild(titleEl);\n }\n\n if (desc) {\n var descEl = el('div', { class: 'tokui-result__desc' });\n descEl.textContent = desc;\n wrapper.appendChild(descEl);\n }\n\n return wrapper;\n });\n\n // === Stat 统计数值组件(自闭合)===\n // attrs.tt = 标签/标题, attrs.v = 值, attrs.pre = 前缀(如¥), attrs.suf = 后缀(如%)\n // attrs.trend = 趋势(up/down), attrs.anim = 动画时长(ms, 如 2000), attrs.dec = 小数位数\n renderer.register('stat', (node) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n var rawValue = attrs.v || '0';\n var prefix = attrs.pre || '';\n var suffix = attrs.suf || '';\n var trend = attrs.trend || '';\n var animDuration = parseInt(attrs.anim) || 0;\n var decimals = parseInt(attrs.dec) || 0;\n\n var wrapper = el('div', { class: 'tokui-stat' });\n\n if (title) {\n var titleEl = el('div', { class: 'tokui-stat__title' });\n titleEl.textContent = title;\n wrapper.appendChild(titleEl);\n }\n\n var valueWrap = el('div', { class: 'tokui-stat__value' });\n\n if (prefix) {\n var preEl = el('span', { class: 'tokui-stat__prefix' });\n preEl.textContent = prefix;\n valueWrap.appendChild(preEl);\n }\n\n var valEl = el('span', { class: 'tokui-stat__number' });\n valueWrap.appendChild(valEl);\n\n if (suffix) {\n var sufEl = el('span', { class: 'tokui-stat__suffix' });\n sufEl.textContent = suffix;\n valueWrap.appendChild(sufEl);\n }\n\n if (trend) {\n var trendCls = 'tokui-stat__trend' + (trend === 'up' ? ' tokui-stat__trend--up' : ' tokui-stat__trend--down');\n var trendEl = el('span', { class: trendCls });\n trendEl.textContent = trend === 'up' ? '↑' : '↓';\n valueWrap.appendChild(trendEl);\n }\n\n // 数值滚动动画\n if (animDuration > 0) {\n // 解析数值:提取纯数字部分\n var numStr = rawValue.replace(/[^\\d.\\-]/g, '');\n var targetNum = parseFloat(numStr);\n if (!isNaN(targetNum) && targetNum !== 0) {\n var hasComma = rawValue.indexOf(',') !== -1;\n valEl.textContent = '0';\n var startTime = null;\n function animate(timestamp) {\n if (!startTime) startTime = timestamp;\n var progress = Math.min((timestamp - startTime) / animDuration, 1);\n // easeOutExpo 缓动\n var eased = progress === 1 ? 1 : 1 - Math.pow(2, -10 * progress);\n var current = targetNum * eased;\n var display = decimals > 0 ? current.toFixed(decimals) : Math.round(current);\n if (hasComma) {\n display = Number(display).toLocaleString('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals\n });\n } else if (decimals > 0) {\n display = current.toFixed(decimals);\n }\n valEl.textContent = display;\n if (progress < 1) {\n requestAnimationFrame(animate);\n } else {\n valEl.textContent = rawValue.replace(/[^\\d.,\\-]/g, function() { return ''; });\n // 还原原始格式\n valEl.textContent = rawValue;\n }\n }\n requestAnimationFrame(animate);\n } else {\n valEl.textContent = rawValue;\n }\n } else {\n valEl.textContent = rawValue;\n }\n\n wrapper.appendChild(valueWrap);\n\n // 动态更新方法:供 [upd id:xxx v:新值 trend:up] 调用\n wrapper._update = function (uAttrs) {\n if (uAttrs.v !== undefined) {\n var numEl = wrapper.querySelector('.tokui-stat__number');\n if (numEl) numEl.textContent = uAttrs.v;\n }\n if (uAttrs.trend !== undefined) {\n var existingTrend = wrapper.querySelector('.tokui-stat__trend');\n if (existingTrend) {\n existingTrend.className = 'tokui-stat__trend' + (uAttrs.trend === 'up' ? ' tokui-stat__trend--up' : ' tokui-stat__trend--down');\n existingTrend.textContent = uAttrs.trend === 'up' ? '↑' : '↓';\n }\n }\n };\n\n return wrapper;\n });\n\n // === Dropdown Item(自闭合) ===\n // attrs.tx = 文字, attrs.clk = 点击事件, attrs.dis = 禁用, attrs.v = 变体(danger)\n renderer.register('dd-item', (node) => {\n var attrs = node.attrs || {};\n var text = attrs.tx || '';\n var classes = ['tokui-dropdown__item'];\n if (attrs.v) classes.push('tokui-dropdown__item--' + attrs.v);\n if (attrs.dis !== undefined) classes.push('tokui-dropdown__item--disabled');\n var itemAttrs = { class: classes.join(' '), role: 'menuitem', tabindex: '0' };\n if (attrs.clk) itemAttrs['data-tokui-clk'] = attrs.clk;\n if (attrs.dis !== undefined) itemAttrs['aria-disabled'] = 'true';\n var item = el('div', itemAttrs);\n item.textContent = text;\n return item;\n });\n\n // === Popover 气泡卡片(容器)===\n // attrs.tt = 标题, attrs.tx = 触发文字, attrs.pos = 位置(top/bottom/left/right)\n // attrs.w = 宽度, attrs.trig = 触发方式(click/hover,默认click)\n // 子节点作为气泡内容\n renderer.register('popover', (node, rc) => {\n var attrs = node.attrs || {};\n var triggerText = attrs.tx || '点击';\n var pos = attrs.pos || 'top';\n var title = attrs.tt || '';\n var width = attrs.w || '';\n var trigMode = attrs.trig || 'click';\n\n var wrapper = el('span', { class: 'tokui-popover' });\n\n // 触发元素\n var trigger = el('span', {\n class: 'tokui-popover__trigger',\n tabindex: '0',\n role: 'button',\n 'aria-haspopup': 'true',\n 'aria-expanded': 'false'\n });\n trigger.textContent = triggerText;\n wrapper.appendChild(trigger);\n\n // 气泡面板\n var panel = el('div', {\n class: 'tokui-popover__panel tokui-popover__panel--' + pos,\n role: 'dialog'\n });\n if (width) panel.style.width = width;\n\n // 箭头\n var arrow = el('div', { class: 'tokui-popover__arrow' });\n panel.appendChild(arrow);\n\n if (title) {\n var header = el('div', { class: 'tokui-popover__title' });\n header.textContent = title;\n panel.appendChild(header);\n }\n\n var body = el('div', { class: 'tokui-popover__body' });\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n panel.appendChild(body);\n wrapper.appendChild(panel);\n\n // 定位逻辑\n function positionPanel() {\n var rect = trigger.getBoundingClientRect();\n var panelRect = panel.getBoundingClientRect();\n var gap = 10;\n\n if (pos === 'top') {\n panel.style.left = (rect.left + rect.width / 2 - panelRect.width / 2) + 'px';\n panel.style.top = (rect.top - panelRect.height - gap) + 'px';\n } else if (pos === 'bottom') {\n panel.style.left = (rect.left + rect.width / 2 - panelRect.width / 2) + 'px';\n panel.style.top = (rect.bottom + gap) + 'px';\n } else if (pos === 'left') {\n panel.style.left = (rect.left - panelRect.width - gap) + 'px';\n panel.style.top = (rect.top + rect.height / 2 - panelRect.height / 2) + 'px';\n } else if (pos === 'right') {\n panel.style.left = (rect.right + gap) + 'px';\n panel.style.top = (rect.top + rect.height / 2 - panelRect.height / 2) + 'px';\n }\n\n // 视口边界修正\n var finalRect = panel.getBoundingClientRect();\n if (finalRect.left < 4) panel.style.left = '4px';\n if (finalRect.right > window.innerWidth - 4) panel.style.left = (window.innerWidth - finalRect.width - 4) + 'px';\n if (finalRect.top < 4) panel.style.top = (rect.bottom + gap) + 'px';\n }\n\n function openPanel() {\n panel.classList.add('tokui-popover__panel--visible');\n trigger.setAttribute('aria-expanded', 'true');\n positionPanel();\n }\n\n function closePanel() {\n panel.classList.remove('tokui-popover__panel--visible');\n trigger.setAttribute('aria-expanded', 'false');\n }\n\n function togglePanel() {\n if (panel.classList.contains('tokui-popover__panel--visible')) {\n closePanel();\n } else {\n openPanel();\n }\n }\n\n if (trigMode === 'hover') {\n wrapper.addEventListener('mouseenter', openPanel);\n wrapper.addEventListener('mouseleave', closePanel);\n } else {\n trigger.addEventListener('click', function(e) {\n e.stopPropagation();\n togglePanel();\n });\n panel.addEventListener('click', function(e) {\n e.stopPropagation();\n });\n // 外部点击关闭\n document.addEventListener('click', function(e) {\n if (!wrapper.contains(e.target)) closePanel();\n });\n // Escape 关闭\n wrapper.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') closePanel();\n });\n }\n // 页面滚动时关闭\n if (typeof window !== 'undefined') {\n window.addEventListener('scroll', closePanel, true);\n }\n\n wrapper._slot = body;\n wrapper._tokuiType = 'popover';\n return wrapper;\n });\n\n // === Hover Card 悬浮卡片(容器)===\n // attrs.pos = 位置(top/bottom/left/right, 默认bottom)\n // attrs.w = 宽度(px), attrs.delay = 显示延迟(ms, 默认300)\n // 子节点: hover-trigger(触发区) + hover-content(弹出内容)\n // content 使用 position:fixed 定位,避免被父级 overflow 裁切\n renderer.register('hover-card', (node, rc) => {\n var attrs = node.attrs || {};\n var pos = attrs.pos || 'bottom';\n var width = attrs.w || '';\n var delay = parseInt(attrs.delay) || 300;\n\n var wrapper = el('span', {\n class: 'tokui-hover-card tokui-hover-card--' + pos,\n 'data-delay': String(delay)\n });\n\n var triggerEl = null;\n var contentEl = null;\n\n // 构建 content 面板(含 arrow + body)\n function buildContentPanel() {\n var panel = el('span', {\n class: 'tokui-hover-card__content',\n role: 'dialog'\n });\n if (width) panel.style.width = width + 'px';\n var arrow = el('span', { class: 'tokui-hover-card__arrow tokui-hover-card__arrow--' + pos });\n panel.appendChild(arrow);\n var body = el('span', { class: 'tokui-hover-card__body' });\n panel.appendChild(body);\n return { panel: panel, body: body };\n }\n\n // 非流式模式:直接遍历 children 构建\n if (node.children && node.children.length > 0) {\n node.children.forEach(function (child) {\n if (child.type === 'hover-trigger') {\n triggerEl = el('span', { class: 'tokui-hover-card__trigger' });\n rc([child]).forEach(function (rendered) {\n if (rendered && rendered.nodeType) {\n if (rendered._tokuiType === 'hover-trigger') {\n while (rendered.firstChild) triggerEl.appendChild(rendered.firstChild);\n } else {\n triggerEl.appendChild(rendered);\n }\n }\n });\n wrapper.appendChild(triggerEl);\n } else if (child.type === 'hover-content') {\n var built = buildContentPanel();\n contentEl = built.panel;\n rc([child]).forEach(function (rendered) {\n if (rendered && rendered.nodeType) {\n if (rendered._tokuiType === 'hover-content') {\n while (rendered.firstChild) built.body.appendChild(rendered.firstChild);\n } else {\n built.body.appendChild(rendered);\n }\n }\n });\n wrapper.appendChild(contentEl);\n } else {\n rc([child]).forEach(function (r) {\n if (r && r.nodeType) wrapper.appendChild(r);\n });\n }\n });\n }\n\n // position:fixed 定位计算\n function positionPanel(panel) {\n var trig = wrapper.querySelector('.tokui-hover-card__trigger');\n if (!trig) return;\n var rect = trig.getBoundingClientRect();\n var pRect = panel.getBoundingClientRect();\n var gap = 8;\n\n if (pos === 'bottom') {\n panel.style.left = (rect.left + rect.width / 2 - pRect.width / 2) + 'px';\n panel.style.top = (rect.bottom + gap) + 'px';\n } else if (pos === 'top') {\n panel.style.left = (rect.left + rect.width / 2 - pRect.width / 2) + 'px';\n panel.style.top = (rect.top - pRect.height - gap) + 'px';\n } else if (pos === 'left') {\n panel.style.left = (rect.left - pRect.width - gap) + 'px';\n panel.style.top = (rect.top + rect.height / 2 - pRect.height / 2) + 'px';\n } else if (pos === 'right') {\n panel.style.left = (rect.right + gap) + 'px';\n panel.style.top = (rect.top + rect.height / 2 - pRect.height / 2) + 'px';\n }\n // 视口边界修正\n var fRect = panel.getBoundingClientRect();\n if (fRect.left < 4) panel.style.left = '4px';\n if (fRect.right > window.innerWidth - 4) panel.style.left = (window.innerWidth - fRect.width - 4) + 'px';\n if (fRect.top < 4) panel.style.top = (rect.bottom + gap) + 'px';\n }\n\n // Hover behavior\n var showTimer = null;\n var hideTimer = null;\n\n function showPanel() {\n clearTimeout(hideTimer);\n showTimer = setTimeout(function () {\n var c = wrapper.querySelector('.tokui-hover-card__content');\n if (c) {\n positionPanel(c);\n c.classList.add('tokui-hover-card__content--visible');\n }\n }, delay);\n }\n\n function hidePanel() {\n clearTimeout(showTimer);\n hideTimer = setTimeout(function () {\n var c = wrapper.querySelector('.tokui-hover-card__content');\n if (c) c.classList.remove('tokui-hover-card__content--visible');\n }, 150);\n }\n\n wrapper.addEventListener('mouseenter', showPanel);\n wrapper.addEventListener('mouseleave', hidePanel);\n\n // 滚动时隐藏\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('scroll', hidePanel, true);\n }\n\n // 流式模式:_slot 指向自身,_streamCloseHook 重构子节点\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'hover-card';\n\n wrapper._streamCloseHook = function () {\n var trigWrap = null;\n var contWrap = null;\n var others = [];\n for (var i = 0; i < wrapper.children.length; i++) {\n var ch = wrapper.children[i];\n if (ch._tokuiType === 'hover-trigger') trigWrap = ch;\n else if (ch._tokuiType === 'hover-content') contWrap = ch;\n else others.push(ch);\n }\n // mount 模式下 trigger/content 已由非流式分支建成最终面板(无 _tokuiType 印章),\n // trigWrap/contWrap 均为 null —— 直接返回,避免清空已建好的内容(mount() 也会调本 hook)。\n // 仅流式模式(temp span 带 _tokuiType)才需要重建。\n if (!trigWrap && !contWrap) return;\n // 清空 wrapper\n while (wrapper.firstChild) wrapper.removeChild(wrapper.firstChild);\n // 重建 trigger\n var newTrigger = el('span', { class: 'tokui-hover-card__trigger' });\n if (trigWrap) {\n while (trigWrap.firstChild) newTrigger.appendChild(trigWrap.firstChild);\n }\n wrapper.appendChild(newTrigger);\n // 重建 content\n var built = buildContentPanel();\n if (contWrap) {\n while (contWrap.firstChild) built.body.appendChild(contWrap.firstChild);\n }\n wrapper.appendChild(built.panel);\n // others\n others.forEach(function (o) { wrapper.appendChild(o); });\n };\n\n return wrapper;\n });\n\n // === Hover Card Trigger 触发器(容器)===\n // 返回 span 元素(非 fragment),设置 _tokuiType 以便父级识别\n renderer.register('hover-trigger', (node, rc) => {\n var span = el('span');\n if (node.children && node.children.length > 0) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) span.appendChild(child);\n });\n }\n if (node.content) {\n span.appendChild(document.createTextNode(node.content));\n }\n span._tokuiType = 'hover-trigger';\n span._slot = span;\n return span;\n });\n\n // === Hover Card Content 内容区(容器)===\n // 返回屏幕外隐藏的 span,流式输出时内容完全不可见\n renderer.register('hover-content', (node, rc) => {\n var span = el('span', { class: 'tokui-hover-card__content-temp' });\n if (node.children && node.children.length > 0) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) span.appendChild(child);\n });\n }\n if (node.content) {\n span.appendChild(document.createTextNode(node.content));\n }\n span._tokuiType = 'hover-content';\n span._slot = span;\n return span;\n });\n\n // === InputTag 标签输入框(容器)===\n // attrs.ph = 占位文字, attrs.n = name, attrs.id = 标识\n // attrs.max = 最大标签数, attrs.tags = 初始标签(逗号分隔)\n // attrs.clk = 事件回调\n renderer.register('input-tag', (node, rc) => {\n var attrs = node.attrs || {};\n var placeholder = attrs.ph || '输入后按回车添加';\n var name = attrs.n || 'tags';\n var id = attrs.id || '';\n var maxTags = parseInt(attrs.max) || 0;\n var initialTags = (attrs.tags || '').split(',').map(function(s) { return s.trim(); }).filter(Boolean);\n\n var wrapper = el('div', { class: 'tokui-input-tag', role: 'group' });\n if (id) wrapper.id = id;\n\n var field = el('div', { class: 'tokui-field' });\n if (attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, attrs.l));\n }\n\n var box = el('div', { class: 'tokui-input-tag__box' });\n\n var tagList = el('div', { class: 'tokui-input-tag__list', role: 'list' });\n initialTags.forEach(function(text) {\n tagList.appendChild(createTag(text));\n });\n box.appendChild(tagList);\n\n var input = el('input', {\n class: 'tokui-input-tag__input',\n type: 'text',\n placeholder: placeholder\n });\n box.appendChild(input);\n\n // 隐藏 input 存储值\n var hidden = el('input', {\n type: 'hidden',\n name: name,\n value: initialTags.join(',')\n });\n box.appendChild(hidden);\n\n field.appendChild(box);\n wrapper.appendChild(field);\n\n function createTag(text) {\n var tag = el('span', { class: 'tokui-input-tag__tag', role: 'listitem' });\n tag.textContent = text;\n var close = el('span', { class: 'tokui-input-tag__close' });\n close.textContent = '×';\n close.addEventListener('click', function() {\n tag.remove();\n syncHidden();\n });\n tag.appendChild(close);\n return tag;\n }\n\n function syncHidden() {\n var tags = Array.from(tagList.querySelectorAll('.tokui-input-tag__tag')).map(function(t) {\n return t.firstChild.textContent;\n });\n hidden.value = tags.join(',');\n }\n\n input.addEventListener('keydown', function(e) {\n if (e.key === 'Enter') {\n e.preventDefault();\n var val = input.value.trim();\n if (!val) return;\n // 检查重复\n var existing = Array.from(tagList.querySelectorAll('.tokui-input-tag__tag')).map(function(t) {\n return t.firstChild.textContent;\n });\n if (existing.indexOf(val) !== -1) { input.value = ''; return; }\n // 检查最大数量\n if (maxTags > 0 && existing.length >= maxTags) { input.value = ''; return; }\n tagList.appendChild(createTag(val));\n input.value = '';\n syncHidden();\n }\n // Backspace 删除最后一个\n if (e.key === 'Backspace' && !input.value) {\n var tags = tagList.querySelectorAll('.tokui-input-tag__tag');\n if (tags.length > 0) {\n tags[tags.length - 1].remove();\n syncHidden();\n }\n }\n });\n\n // 动态更新方法:供 [upd id:xxx dis:true] 调用\n wrapper._update = function (uAttrs) {\n if (uAttrs.dis === true || uAttrs.dis === 'true') {\n input.disabled = true;\n wrapper.classList.add('tokui-input-tag--disabled');\n } else if (uAttrs.dis === false || uAttrs.dis === 'false') {\n input.disabled = false;\n wrapper.classList.remove('tokui-input-tag--disabled');\n }\n };\n\n wrapper._tokuiType = 'input-tag';\n return wrapper;\n });\n\n // === Countdown 倒计时组件(自闭合)===\n // attrs.target = 目标时间戳(ms), attrs.dur = 持续时间(秒)\n // attrs.fmt = 显示格式: 'dhms'(默认), 'hms', 'ms', 's'\n // attrs.clk = 计时结束事件回调名\n // attrs.id = 标识, attrs.tx = 结束文案(默认\"已结束\")\n // attrs.l = 标签, attrs.s = 尺寸(sm/lg)\n renderer.register('countdown', (node) => {\n var attrs = node.attrs || {};\n var targetTime = parseInt(attrs.target) || 0;\n var duration = parseInt(attrs.dur) || 0;\n var label = attrs.l || '';\n var size = attrs.s || '';\n var endText = attrs.tx || '已结束';\n var id = attrs.id || '';\n var fmt = attrs.fmt || 'dhms';\n var handlerName = attrs.clk || '';\n\n if (!targetTime && duration > 0) {\n targetTime = Date.now() + duration * 1000;\n }\n\n var classes = ['tokui-countdown'];\n if (size === 'sm') classes.push('tokui-countdown--sm');\n else if (size === 'lg') classes.push('tokui-countdown--lg');\n\n var wrapperAttrs = { class: classes.join(' '), role: 'timer', 'aria-live': 'polite' };\n if (id) wrapperAttrs.id = id;\n var wrapper = el('div', wrapperAttrs);\n\n if (label) {\n var labelEl = el('div', { class: 'tokui-countdown__label' });\n labelEl.textContent = label;\n wrapper.appendChild(labelEl);\n }\n\n // 根据 fmt 决定显示哪些单位\n var allUnits = [\n { key: 'd', label: '天' },\n { key: 'h', label: '时' },\n { key: 'm', label: '分' },\n { key: 's', label: '秒' }\n ];\n var fmtKeys = fmt.split('');\n var items = allUnits.filter(function(u) { return fmtKeys.indexOf(u.key) !== -1; });\n\n var digitsWrap = el('div', { class: 'tokui-countdown__digits' });\n\n var numEls = {};\n items.forEach(function(item, idx) {\n var itemEl = el('div', { class: 'tokui-countdown__item' });\n var numEl = el('span', { class: 'tokui-countdown__num', 'data-key': item.key });\n numEl.textContent = '00';\n numEls[item.key] = numEl;\n itemEl.appendChild(numEl);\n var unitEl = el('span', { class: 'tokui-countdown__unit' });\n unitEl.textContent = item.label;\n itemEl.appendChild(unitEl);\n digitsWrap.appendChild(itemEl);\n\n if (idx < items.length - 1) {\n var sep = el('span', { class: 'tokui-countdown__sep' });\n sep.textContent = ':';\n digitsWrap.appendChild(sep);\n }\n });\n\n wrapper.appendChild(digitsWrap);\n\n function pad2(n) { return n < 10 ? '0' + n : String(n); }\n var ended = false;\n\n function update() {\n var now = Date.now();\n var diff = Math.max(0, targetTime - now);\n\n if (diff <= 0) {\n if (!ended) {\n ended = true;\n Object.keys(numEls).forEach(function(k) { numEls[k].textContent = '00'; });\n wrapper.classList.add('tokui-countdown--ended');\n var endedEl = el('div', { class: 'tokui-countdown__ended' });\n endedEl.textContent = endText;\n digitsWrap.parentNode.replaceChild(endedEl, digitsWrap);\n clearInterval(timer);\n if (handlerName) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.TokUIEventBus : null;\n if (bus) {\n var handler = bus.getHandler(handlerName);\n if (typeof handler === 'function') {\n handler({ id: id, target: targetTime });\n }\n }\n }\n }\n return;\n }\n\n var totalSec = Math.floor(diff / 1000);\n var d = Math.floor(totalSec / 86400);\n var h = Math.floor((totalSec % 86400) / 3600);\n var m = Math.floor((totalSec % 3600) / 60);\n var s = totalSec % 60;\n\n if (numEls.d) numEls.d.textContent = pad2(d);\n if (numEls.h) numEls.h.textContent = pad2(h);\n if (numEls.m) numEls.m.textContent = pad2(m);\n if (numEls.s) numEls.s.textContent = pad2(s);\n }\n\n update();\n var timer = setInterval(update, 1000);\n wrapper._countdownTimer = timer;\n wrapper._tokuiType = 'countdown';\n return wrapper;\n });\n\n // === Popconfirm 确认气泡(自闭合)===\n // 点击触发确认气泡,替代 window.confirm()\n // attrs.tt = 确认文案, attrs.tx = 触发按钮文本, attrs.clk = 确认回调名\n // attrs.t = 按钮类型(primary/danger), attrs.pos = 气泡位置(top/bottom/left/right)\n // attrs.ok-text = 确认按钮文字(默认\"确定\"), attrs.cancel-text = 取消按钮文字(默认\"取消\")\n renderer.register('popconfirm', (node) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n var handlerName = attrs.clk || '';\n var btnType = attrs.t || 'primary';\n var pos = attrs.pos || 'top';\n var okText = attrs['ok-text'] || '确定';\n var cancelText = attrs['cancel-text'] || '取消';\n\n // 触发按钮文字:优先用节点内容(builder 传入的 text),其次用 tx 属性\n var triggerText = node.content || attrs.tx || '确认';\n\n var wrapper = el('span', { class: 'tokui-popconfirm' });\n\n // 触发按钮\n var trigger = el('button', {\n class: 'tokui-popconfirm__trigger',\n type: 'button',\n tabindex: '0',\n 'aria-haspopup': 'true',\n 'aria-expanded': 'false'\n });\n trigger.textContent = triggerText;\n wrapper.appendChild(trigger);\n\n // 存储 popup 引用\n wrapper._popconfirmPopup = null;\n\n function closePopup() {\n if (wrapper._popconfirmPopup) {\n wrapper._popconfirmPopup.classList.remove('tokui-popconfirm__popup--visible');\n var ref = wrapper._popconfirmPopup;\n setTimeout(function() { if (ref.parentNode) ref.parentNode.removeChild(ref); }, 150);\n wrapper._popconfirmPopup = null;\n trigger.setAttribute('aria-expanded', 'false');\n }\n }\n\n function openPopup() {\n // 先关闭已有的\n closePopup();\n\n var popup = el('div', {\n class: 'tokui-popconfirm__popup tokui-popconfirm__popup--' + pos,\n role: 'dialog',\n 'aria-label': title || '确认操作'\n });\n\n // 箭头\n var arrow = el('div', { class: 'tokui-popconfirm__arrow' });\n popup.appendChild(arrow);\n\n // 消息文本\n if (title) {\n var msgEl = el('div', { class: 'tokui-popconfirm__message' });\n msgEl.textContent = title;\n popup.appendChild(msgEl);\n }\n\n // 按钮行\n var btnRow = el('div', { class: 'tokui-popconfirm__buttons' });\n\n var cancelBtn = el('button', {\n class: 'tokui-popconfirm__btn tokui-popconfirm__btn--cancel',\n type: 'button'\n });\n cancelBtn.textContent = cancelText;\n cancelBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n closePopup();\n });\n btnRow.appendChild(cancelBtn);\n\n var confirmBtnClasses = 'tokui-popconfirm__btn tokui-popconfirm__btn--' + btnType;\n var confirmBtn = el('button', {\n class: confirmBtnClasses,\n type: 'button'\n });\n if (handlerName) confirmBtn.setAttribute('data-tokui-clk', handlerName);\n confirmBtn.textContent = okText;\n confirmBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n // 通过事件总线触发回调\n if (handlerName) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(handlerName, {});\n }\n }\n closePopup();\n });\n btnRow.appendChild(confirmBtn);\n popup.appendChild(btnRow);\n\n // 添加到 body\n if (typeof document !== 'undefined' && document.body) {\n document.body.appendChild(popup);\n }\n\n // 定位(延迟一帧确保 DOM 已渲染以获取正确尺寸)\n function doPosition() {\n if (trigger.getBoundingClientRect) {\n var rect = trigger.getBoundingClientRect();\n var popupRect = popup.getBoundingClientRect();\n var gap = 8;\n\n if (pos === 'top') {\n popup.style.left = (rect.left + rect.width / 2 - popupRect.width / 2) + 'px';\n popup.style.top = (rect.top - popupRect.height - gap) + 'px';\n } else if (pos === 'bottom') {\n popup.style.left = (rect.left + rect.width / 2 - popupRect.width / 2) + 'px';\n popup.style.top = (rect.bottom + gap) + 'px';\n } else if (pos === 'left') {\n popup.style.left = (rect.left - popupRect.width - gap) + 'px';\n popup.style.top = (rect.top + rect.height / 2 - popupRect.height / 2) + 'px';\n } else if (pos === 'right') {\n popup.style.left = (rect.right + gap) + 'px';\n popup.style.top = (rect.top + rect.height / 2 - popupRect.height / 2) + 'px';\n }\n\n // 视口边界修正\n if (popup.getBoundingClientRect) {\n var finalRect = popup.getBoundingClientRect();\n if (finalRect.left < 4) popup.style.left = '4px';\n if (finalRect.right > window.innerWidth - 4) popup.style.left = (window.innerWidth - finalRect.width - 4) + 'px';\n if (finalRect.top < 4) popup.style.top = (rect.bottom + gap) + 'px';\n }\n }\n\n popup.classList.add('tokui-popconfirm__popup--visible');\n }\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(doPosition);\n } else {\n doPosition();\n }\n\n wrapper._popconfirmPopup = popup;\n trigger.setAttribute('aria-expanded', 'true');\n }\n\n // 点击触发按钮\n trigger.addEventListener('click', function(e) {\n e.stopPropagation();\n if (wrapper._popconfirmPopup) {\n closePopup();\n } else {\n openPopup();\n }\n });\n\n // 外部点击关闭\n if (typeof document !== 'undefined' && typeof document.addEventListener === 'function') {\n document.addEventListener('click', function(e) {\n if (wrapper._popconfirmPopup && !wrapper._popconfirmPopup.contains(e.target) && !wrapper.contains(e.target)) {\n closePopup();\n }\n });\n }\n\n // Escape 关闭\n wrapper.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') closePopup();\n });\n\n // 页面滚动时关闭\n if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n window.addEventListener('scroll', closePopup, true);\n }\n\n // 存储 pos 属性供测试验证\n wrapper._tokuiPopconfirmPos = pos;\n wrapper._tokuiType = 'popconfirm';\n return wrapper;\n });\n\n // === Watermark 水印组件(容器)===\n // attrs.tx = 水印文字, attrs.s = 尺寸(sm/md/lg)\n // attrs.c = 颜色, attrs.gap = 间距, attrs.ro = 旋转角度\n // attrs.font = 字体大小\n renderer.register('watermark', (node, rc) => {\n var attrs = node.attrs || {};\n var text = attrs.tx || 'TokUI';\n var fontSize = attrs.font || (attrs.s === 'sm' ? '12' : attrs.s === 'lg' ? '20' : '16');\n var gap = attrs.gap || '40';\n var rotate = attrs.ro || '-22';\n var color = attrs.c || 'rgba(0,0,0,0.2)';\n\n var wrapper = el('div', { class: 'tokui-watermark' });\n wrapper.style.overflow = 'hidden';\n wrapper.style.borderRadius = '8px';\n\n // 用 canvas 生成水印图案\n var canvas = document.createElement('canvas');\n var ctx = canvas.getContext('2d');\n var fSize = parseInt(fontSize) || 16;\n var gapVal = parseInt(gap) || 40;\n ctx.font = fSize + 'px sans-serif';\n var textWidth = ctx.measureText(text).width;\n var cellW = textWidth + gapVal;\n var cellH = fSize + gapVal;\n // 单元格尺寸即为 canvas 尺寸,repeat 时无缝平铺\n canvas.width = cellW;\n canvas.height = cellH;\n ctx.font = fSize + 'px sans-serif';\n ctx.fillStyle = color;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n var deg = (parseFloat(rotate) || -22) * Math.PI / 180;\n // 在画布中心绘制旋转文字\n ctx.translate(cellW / 2, cellH / 2);\n ctx.rotate(deg);\n ctx.fillText(text, 0, 0);\n\n // 渲染子节点到内容层\n var content = el('div', { class: 'tokui-watermark__content' });\n content.style.position = 'relative';\n content.style.zIndex = '1';\n if (node.children && node.children.length > 0) {\n var rendered = rc(node.children);\n if (rendered && rendered.forEach) {\n rendered.forEach(function(c) { if (c) content.appendChild(c); });\n }\n }\n wrapper.appendChild(content);\n\n // overlay 在 content 之后,确保 z-index 层叠在上层\n var overlay = el('div', { class: 'tokui-watermark__overlay' });\n overlay.style.backgroundImage = 'url(' + canvas.toDataURL() + ')';\n overlay.style.backgroundRepeat = 'repeat';\n overlay.style.borderRadius = '8px';\n wrapper.appendChild(overlay);\n\n wrapper._slot = content;\n wrapper._tokuiType = 'watermark';\n return wrapper;\n });\n\n // === Backtop 回到顶部(自闭合)===\n // attrs.t = 触发距离(默认200), attrs.v = 变体(circle/round/square)\n // attrs.tx = 文字(默认↑), attrs.s = 尺寸(sm/lg)\n // attrs.bottom = 距底部, attrs.right = 距右侧\n // attrs.container = true 时定位在滚动容器内(absolute)而非 fixed\n renderer.register('backtop', (node) => {\n var attrs = node.attrs || {};\n var threshold = parseInt(attrs.t) || 200;\n var variant = attrs.v || 'circle';\n var text = attrs.tx || '↑';\n var size = attrs.s || '';\n var bottom = attrs.bottom || '40';\n var right = attrs.right || '40';\n var isContainer = attrs.container !== undefined;\n\n var classes = ['tokui-backtop'];\n if (variant === 'round') classes.push('tokui-backtop--round');\n else if (variant === 'square') classes.push('tokui-backtop--square');\n if (size === 'sm') classes.push('tokui-backtop--sm');\n else if (size === 'lg') classes.push('tokui-backtop--lg');\n if (isContainer) classes.push('tokui-backtop--container');\n\n var btn = el('div', { class: classes.join(' '), role: 'button', 'aria-label': '回到顶部', tabindex: '0' });\n if (isContainer) {\n btn.style.bottom = bottom + 'px';\n } else {\n btn.style.bottom = bottom + 'px';\n btn.style.right = right + 'px';\n }\n btn.textContent = text;\n\n if (typeof window !== 'undefined') {\n requestAnimationFrame(function () {\n var scrollEl = window;\n var parent = btn.parentElement;\n while (parent) {\n var style = getComputedStyle(parent);\n if ((style.overflowY === 'auto' || style.overflowY === 'scroll') && parent.scrollHeight > parent.clientHeight) {\n scrollEl = parent;\n break;\n }\n parent = parent.parentElement;\n }\n\n btn.addEventListener('click', function () {\n if (scrollEl === window) {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n } else {\n scrollEl.scrollTo({ top: 0, behavior: 'smooth' });\n }\n });\n\n var checkScroll = function () {\n var y = scrollEl === window ? window.pageYOffset : scrollEl.scrollTop;\n if (y > threshold) {\n btn.classList.add('tokui-backtop--visible');\n } else {\n btn.classList.remove('tokui-backtop--visible');\n }\n };\n scrollEl.addEventListener('scroll', checkScroll);\n checkScroll();\n btn._backtopCleanup = function () { scrollEl.removeEventListener('scroll', checkScroll); };\n });\n }\n\n return btn;\n });\n\n // === Calendar 日历组件(容器)===\n // attrs.month = 年月(如\"2025-06\"), attrs.v = 变体(card/mini)\n // attrs.marks = 标记日期(如\"3,15,25\"), attrs.tt = 标题\n renderer.register('calendar', (node) => {\n var attrs = node.attrs || {};\n var monthStr = attrs.month || '';\n var now = new Date();\n var year, month;\n if (monthStr) {\n var parts = monthStr.split('-');\n year = parseInt(parts[0]) || now.getFullYear();\n month = (parseInt(parts[1]) || now.getMonth() + 1) - 1;\n } else {\n year = now.getFullYear();\n month = now.getMonth();\n }\n var variant = attrs.v || '';\n var marksStr = attrs.marks || '';\n var marks = marksStr ? marksStr.split(',').map(function(s) { return parseInt(s.trim()); }).filter(function(n) { return n > 0; }) : [];\n\n // 离散选中天(sel 或 selected:逗号分隔日号)\n var selStr = String(attrs.sel != null ? attrs.sel : (attrs.selected != null ? attrs.selected : ''));\n var selectedDays = {};\n selStr.split(',').forEach(function(s) {\n var n = parseInt(s.trim(), 10);\n if (n > 0) selectedDays[n] = true;\n });\n\n // 区间解析:range=\"a-b\" 单段;ranges=\"a-b;c-d\" 多段(支持单日 a)\n function parseRanges(str) {\n var out = [];\n String(str || '').split(';').forEach(function(seg) {\n seg = seg.trim();\n if (!seg) return;\n var m = seg.split('-');\n if (m.length === 2) {\n var a = parseInt(m[0], 10), b = parseInt(m[1], 10);\n if (a > 0 && b > 0) out.push([Math.min(a, b), Math.max(a, b)]);\n } else {\n var single = parseInt(seg, 10);\n if (single > 0) out.push([single, single]);\n }\n });\n return out;\n }\n var ranges = [];\n if (attrs.range) ranges = ranges.concat(parseRanges(attrs.range));\n if (attrs.ranges) ranges = ranges.concat(parseRanges(attrs.ranges));\n var inRangeDays = {}, rangeStart = {}, rangeEnd = {};\n ranges.forEach(function(r) {\n for (var d = r[0]; d <= r[1]; d++) inRangeDays[d] = true;\n rangeStart[r[0]] = true;\n rangeEnd[r[1]] = true;\n });\n\n var today = now.getFullYear() === year && now.getMonth() === month ? now.getDate() : -1;\n var title = attrs.tt || year + '年' + (month + 1) + '月';\n\n var classes = ['tokui-calendar'];\n if (variant === 'card') classes.push('tokui-calendar--card');\n else if (variant === 'mini') classes.push('tokui-calendar--mini');\n\n var wrapper = el('div', { class: classes.join(' ') });\n\n // 标题栏\n var header = el('div', { class: 'tokui-calendar__header' });\n header.textContent = title;\n wrapper.appendChild(header);\n\n // 日期网格(星期头 + 日期统一在 grid 内,固定 6 行)\n var grid = el('div', { class: 'tokui-calendar__grid' });\n var weekdays = ['日', '一', '二', '三', '四', '五', '六'];\n weekdays.forEach(function(d) {\n var cell = el('div', { class: 'tokui-calendar__weekday' });\n cell.textContent = d;\n grid.appendChild(cell);\n });\n\n var firstDay = new Date(year, month, 1).getDay();\n var daysInMonth = new Date(year, month + 1, 0).getDate();\n var prevMonthDays = new Date(year, month, 0).getDate();\n var totalCells = 42; // 固定 6 行 × 7 列\n\n // 上月尾部\n for (var i = firstDay - 1; i >= 0; i--) {\n var dayEl = el('div', { class: 'tokui-calendar__day tokui-calendar__day--other' });\n var numEl = el('span', { class: 'tokui-calendar__day__num' });\n numEl.textContent = prevMonthDays - i;\n dayEl.appendChild(numEl);\n grid.appendChild(dayEl);\n }\n // 本月日期\n for (var d = 1; d <= daysInMonth; d++) {\n var dayClasses = ['tokui-calendar__day'];\n if (d === today) dayClasses.push('tokui-calendar__day--today');\n if (marks.indexOf(d) !== -1) dayClasses.push('tokui-calendar__day--marked');\n if (selectedDays[d]) dayClasses.push('tokui-calendar__day--selected');\n if (inRangeDays[d]) {\n dayClasses.push('tokui-calendar__day--in-range');\n if (rangeStart[d]) dayClasses.push('tokui-calendar__day--range-start');\n if (rangeEnd[d]) dayClasses.push('tokui-calendar__day--range-end');\n }\n var dayEl = el('div', { class: dayClasses.join(' ') });\n var numEl = el('span', { class: 'tokui-calendar__day__num' });\n numEl.textContent = d;\n dayEl.appendChild(numEl);\n grid.appendChild(dayEl);\n }\n // 下月头部填充至 42 格\n var remaining = totalCells - firstDay - daysInMonth;\n for (var n = 1; n <= remaining; n++) {\n var dayEl = el('div', { class: 'tokui-calendar__day tokui-calendar__day--other' });\n var numEl = el('span', { class: 'tokui-calendar__day__num' });\n numEl.textContent = n;\n dayEl.appendChild(numEl);\n grid.appendChild(dayEl);\n }\n wrapper.appendChild(grid);\n wrapper._tokuiType = 'calendar';\n return wrapper;\n });\n\n // === Notification 全局通知(自闭合) ===\n // attrs.id = 标识, attrs.t = 类型(success/error/warning/info)\n // attrs.tt = 标题, attrs.tx = 描述文本, attrs.duration = 自动关闭毫秒(0=手动关)\n // attrs.pos = 位置(top-right/top-left/bottom-right/bottom-left), attrs.clk = 操作按钮回调\n renderer.register('notification', (node) => {\n var attrs = node.attrs || {};\n var id = attrs.id || '';\n var type = attrs.t || 'info';\n var title = attrs.tt || '';\n var text = attrs.tx || '';\n var duration = attrs.duration !== undefined ? parseInt(attrs.duration) : 4500;\n if (isNaN(duration)) duration = 4500;\n var pos = attrs.pos || 'top-right';\n var handlerName = attrs.clk || '';\n\n var NOTIF_ICONS = {\n success: '✓',\n error: '✕',\n warning: '⚠',\n info: 'ℹ'\n };\n\n var wrapper = el('div', {\n class: 'tokui-notification tokui-notification--' + type + ' tokui-notification--' + pos,\n role: 'alert',\n 'aria-live': 'polite'\n });\n if (id) wrapper.setAttribute('data-notif-id', id);\n\n // 色条\n var bar = el('div', { class: 'tokui-notification__bar' });\n wrapper.appendChild(bar);\n\n // 图标\n var iconEl = el('span', { class: 'tokui-notification__icon' });\n iconEl.textContent = NOTIF_ICONS[type] || NOTIF_ICONS.info;\n wrapper.appendChild(iconEl);\n\n // 内容区\n var content = el('div', { class: 'tokui-notification__content' });\n if (title) {\n var titleEl = el('div', { class: 'tokui-notification__title' });\n titleEl.textContent = title;\n content.appendChild(titleEl);\n }\n if (text) {\n var descEl = el('div', { class: 'tokui-notification__desc' });\n descEl.textContent = text;\n content.appendChild(descEl);\n }\n wrapper.appendChild(content);\n\n // 关闭按钮\n var closeBtn = el('button', {\n class: 'tokui-notification__close',\n type: 'button',\n 'aria-label': '关闭'\n });\n closeBtn.textContent = '×';\n closeBtn.addEventListener('click', function() {\n wrapper.classList.add('tokui-notification--hide');\n setTimeout(function() {\n if (wrapper.parentNode) wrapper.parentNode.removeChild(wrapper);\n }, 300);\n });\n wrapper.appendChild(closeBtn);\n\n // 操作按钮(如果有 clk)\n if (handlerName) {\n var actionBtn = el('button', {\n class: 'tokui-notification__action',\n type: 'button',\n 'data-tokui-clk': handlerName\n });\n actionBtn.textContent = '查看';\n content.appendChild(actionBtn);\n }\n\n // 创建全局容器的辅助函数\n function getContainer(position) {\n if (typeof document === 'undefined' || !document.body) return null;\n var cls = 'tokui-notification-container--' + position;\n var container = document.querySelector('.' + cls);\n if (!container) {\n container = el('div', { class: 'tokui-notification-container ' + cls });\n document.body.appendChild(container);\n }\n return container;\n }\n\n // 浏览器环境:挂载到全局容器\n var hasBody = typeof document !== 'undefined' && document.body;\n\n if (hasBody) {\n var container = getContainer(pos);\n if (container) {\n container.appendChild(wrapper);\n }\n\n // 自动关闭定时器\n if (duration > 0) {\n setTimeout(function() {\n wrapper.classList.add('tokui-notification--hide');\n setTimeout(function() {\n if (wrapper.parentNode) wrapper.parentNode.removeChild(wrapper);\n }, 300);\n }, duration);\n }\n\n // 全局 API\n if (typeof window !== 'undefined') {\n if (!window.TokUI) window.TokUI = {};\n if (!window.TokUI._notifMap) window.TokUI._notifMap = {};\n if (id) window.TokUI._notifMap[id] = wrapper;\n if (!window.TokUI.showNotification) {\n window.TokUI.showNotification = function(notifId, overrides) {\n var map = window.TokUI._notifMap || {};\n var target = map[notifId];\n if (!target) return;\n if (overrides) {\n if (overrides.title) {\n var t = target.querySelector('.tokui-notification__title');\n if (t) t.textContent = overrides.title;\n }\n if (overrides.text) {\n var tx = target.querySelector('.tokui-notification__text');\n if (tx) tx.textContent = overrides.text;\n }\n }\n target.style.display = '';\n target.classList.remove('tokui-notification--hide');\n var dur = target._notifDuration || 4500;\n if (dur > 0) {\n clearTimeout(target._notifTimer);\n target._notifTimer = setTimeout(function() {\n target.classList.add('tokui-notification--hide');\n setTimeout(function() {\n target.style.display = 'none';\n }, 300);\n }, dur);\n }\n };\n };\n }\n\n // 返回隐藏占位符,通知本体已挂载到全局容器\n var placeholder = el('div', { style: 'display:none' });\n placeholder._isNotifPlaceholder = true;\n return placeholder;\n }\n\n // 非浏览器环境(测试):直接返回 wrapper\n wrapper._notifDuration = duration;\n return wrapper;\n });\n\n // === Chat-input 对话输入框(容器) ===\n // attrs.ph = placeholder, attrs.clk = 发送回调名, attrs.dis = 禁用\n // attrs.max = 最大字符数, attrs.auto = 自适应高度, attrs.rows = 初始行数(默认2)\n // 自闭合简写时自动生成发送按钮;容器模式支持自定义子节点\n renderer.register('chat-input', (node, rc) => {\n var attrs = node.attrs || {};\n var placeholder = attrs.ph || '';\n var handlerName = attrs.clk || '';\n var disabled = attrs.dis !== undefined;\n var maxChars = parseInt(attrs.max) || 0;\n var autoResize = attrs.auto !== undefined;\n var rows = parseInt(attrs.rows) || 2;\n\n var wrapper = el('div', { class: 'tokui-chat-input' });\n\n // textarea\n var textarea = el('textarea', {\n class: 'tokui-chat-input__textarea',\n rows: String(rows),\n placeholder: placeholder\n });\n if (disabled) {\n textarea.setAttribute('disabled', '');\n textarea.classList.add('tokui-chat-input__textarea--disabled');\n }\n if (autoResize) {\n textarea.classList.add('tokui-chat-input__textarea--auto');\n }\n wrapper.appendChild(textarea);\n\n // 右侧按钮区\n var actionsWrap = el('div', { class: 'tokui-chat-input__actions' });\n\n // 容器模式:渲染子节点作为操作按钮\n if (node.children && node.children.length > 0) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) actionsWrap.appendChild(child);\n });\n }\n\n // 默认发送按钮(始终渲染)\n var sendBtn = el('button', {\n class: 'tokui-chat-input__send',\n type: 'button',\n 'aria-label': '发送'\n });\n sendBtn.innerHTML = '<svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"currentColor\"><path d=\"M10 3a1 1 0 0 1 .7.3l5 5a1 1 0 0 1-1.4 1.4L11 6.4V16a1 1 0 1 1-2 0V6.4l-3.3 3.3a1 1 0 0 1-1.4-1.4l5-5A1 1 0 0 1 10 3z\"/></svg>';\n if (disabled) {\n sendBtn.setAttribute('disabled', '');\n sendBtn.classList.add('tokui-chat-input__send--disabled');\n }\n actionsWrap.appendChild(sendBtn);\n wrapper.appendChild(actionsWrap);\n\n // 字符计数器\n if (maxChars > 0) {\n var counter = el('span', { class: 'tokui-chat-input__counter' });\n counter.textContent = '0/' + maxChars;\n wrapper.appendChild(counter);\n textarea.addEventListener('input', function () {\n var len = (textarea.value || '').length;\n counter.textContent = len + '/' + maxChars;\n if (len > maxChars) {\n counter.classList.add('tokui-chat-input__counter--over');\n } else {\n counter.classList.remove('tokui-chat-input__counter--over');\n }\n });\n }\n\n // 自动高度\n if (autoResize) {\n textarea.addEventListener('input', function () {\n textarea.style.height = 'auto';\n textarea.style.height = textarea.scrollHeight + 'px';\n });\n }\n\n // 发送逻辑\n function doSend() {\n if (disabled) return;\n var val = textarea.value || '';\n if (!val.trim()) return;\n if (handlerName) {\n wrapper.setAttribute('data-tokui-clk', handlerName);\n wrapper.setAttribute('data-tokui-clk-value', val);\n }\n textarea.value = '';\n if (maxChars > 0) {\n counter.textContent = '0/' + maxChars;\n counter.classList.remove('tokui-chat-input__counter--over');\n }\n if (autoResize) {\n textarea.style.height = 'auto';\n }\n }\n\n // Enter 发送,Shift+Enter 换行\n textarea.addEventListener('keydown', function (e) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n doSend();\n }\n });\n sendBtn.addEventListener('click', function () {\n doSend();\n });\n\n if (handlerName) wrapper.setAttribute('data-tokui-clk', handlerName);\n\n // 动态更新方法\n wrapper._update = function (uAttrs) {\n if (uAttrs.dis !== undefined) {\n disabled = !!uAttrs.dis;\n if (disabled) {\n textarea.setAttribute('disabled', '');\n textarea.classList.add('tokui-chat-input__textarea--disabled');\n sendBtn.setAttribute('disabled', '');\n sendBtn.classList.add('tokui-chat-input__send--disabled');\n } else {\n textarea.removeAttribute('disabled');\n textarea.classList.remove('tokui-chat-input__textarea--disabled');\n sendBtn.removeAttribute('disabled');\n sendBtn.classList.remove('tokui-chat-input__send--disabled');\n }\n }\n };\n\n wrapper._slot = textarea;\n wrapper._tokuiType = 'chat-input';\n return wrapper;\n });\n\n // === Message-actions 消息操作栏(容器) ===\n // attrs.clk = 统一回调名, attrs.copy / attrs.regenerate / attrs.like = 布尔,生成默认按钮\n // 默认按钮通过 data-act 属性区分:copy / regenerate / like / dislike\n // 容器模式支持自定义子节点\n renderer.register('msg-actions', (node, rc) => {\n var attrs = node.attrs || {};\n var handlerName = attrs.clk || '';\n\n var cls = 'tokui-msg-actions';\n if (attrs.visible) cls += ' tokui-msg-actions--visible';\n var wrapper = el('div', { class: cls });\n\n // SVG 图标定义(统一 24x24 viewBox,Lucide 标准路径,保证绘制正确)\n var ICONS = {\n copy: '<svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"8\" y=\"8\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>',\n regenerate: '<svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/><path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/><path d=\"M3 21v-5h5\"/></svg>',\n like: '<svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 10v12\"/><path d=\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\"/></svg>',\n dislike: '<svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17 14V2\"/><path d=\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\"/></svg>',\n delete: '<svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>'\n };\n\n // 生成默认按钮\n var defaultActions = [];\n if (attrs.copy !== undefined) {\n defaultActions.push({ act: 'copy', icon: ICONS.copy, label: '复制' });\n }\n if (attrs.regenerate !== undefined) {\n defaultActions.push({ act: 'regenerate', icon: ICONS.regenerate, label: '重新生成' });\n }\n if (attrs.like !== undefined) {\n defaultActions.push({ act: 'like', icon: ICONS.like, label: '赞' });\n defaultActions.push({ act: 'dislike', icon: ICONS.dislike, label: '踩' });\n }\n if (attrs.delete !== undefined) {\n defaultActions.push({ act: 'delete', icon: ICONS.delete, label: '删除' });\n }\n\n // 渲染默认按钮\n defaultActions.forEach(function (action) {\n var btn = el('button', {\n class: 'tokui-msg-actions__btn',\n type: 'button',\n 'data-act': action.act,\n 'aria-label': action.label,\n title: action.label\n });\n var iconWrap = el('span', { class: 'tokui-msg-actions__icon' });\n iconWrap.innerHTML = action.icon;\n btn.appendChild(iconWrap);\n wrapper.appendChild(btn);\n });\n\n // 容器模式:渲染自定义子节点\n if (node.children && node.children.length > 0) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) wrapper.appendChild(child);\n });\n }\n\n // 统一事件委托\n if (handlerName) {\n wrapper.setAttribute('data-tokui-clk', handlerName);\n wrapper.addEventListener('click', function (e) {\n var btn = e.target.closest && e.target.closest('.tokui-msg-actions__btn');\n if (btn) {\n var act = btn.getAttribute('data-act');\n if (act) {\n wrapper.setAttribute('data-tokui-clk-act', act);\n }\n }\n });\n }\n\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'msg-actions';\n return wrapper;\n });\n\n // ========== AI 对话高级组件 ==========\n\n // --- Phase 1: P0 核心 AI 聊天组件 ---\n\n renderer.register('tool-call', (node, rc) => {\n var attrs = node.attrs || {};\n var name = attrs.name || 'tool';\n var status = attrs.status || 'pending';\n var duration = attrs.duration || '';\n var wrapperAttrs = { class: 'tokui-tool-call tokui-tool-call--' + status };\n if (attrs.id) wrapperAttrs.id = attrs.id;\n var wrapper = el('div', wrapperAttrs);\n var header = el('div', { class: 'tokui-tool-call__header' });\n var statusDot = el('span', { class: 'tokui-tool-call__status-dot tokui-tool-call__status-dot--' + status });\n header.appendChild(statusDot);\n var nameEl = el('span', { class: 'tokui-tool-call__name' });\n nameEl.textContent = name;\n header.appendChild(nameEl);\n var statusBadge = el('span', { class: 'tokui-tool-call__status' });\n var STATUS_TEXT = { pending: '等待中', running: '运行中', done: '完成', error: '出错', denied: '已拒绝' };\n statusBadge.textContent = STATUS_TEXT[status] || status;\n header.appendChild(statusBadge);\n if (duration) {\n var durEl = el('span', { class: 'tokui-tool-call__duration' });\n durEl.textContent = duration;\n header.appendChild(durEl);\n }\n wrapper.appendChild(header);\n var body = el('div', { class: 'tokui-tool-call__body' });\n if (node.content) {\n var paramsEl = el('div', { class: 'tokui-tool-call__params' });\n paramsEl.textContent = node.content;\n body.appendChild(paramsEl);\n }\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n wrapper.appendChild(body);\n wrapper._slot = body;\n wrapper._tokuiType = 'tool-call';\n wrapper._update = function (uAttrs) {\n if (uAttrs.status) {\n wrapper.className = 'tokui-tool-call tokui-tool-call--' + uAttrs.status;\n statusDot.className = 'tokui-tool-call__status-dot tokui-tool-call__status-dot--' + uAttrs.status;\n statusBadge.textContent = STATUS_TEXT[uAttrs.status] || uAttrs.status;\n }\n if (uAttrs.duration) {\n var dur = wrapper.querySelector('.tokui-tool-call__duration');\n if (!dur) {\n dur = el('span', { class: 'tokui-tool-call__duration' });\n header.appendChild(dur);\n }\n dur.textContent = uAttrs.duration;\n }\n if (uAttrs.result) {\n var resEl = el('div', { class: 'tokui-tool-call__result' });\n resEl.textContent = uAttrs.result;\n body.appendChild(resEl);\n }\n if (uAttrs.error) {\n var errEl = el('div', { class: 'tokui-tool-call__error' });\n errEl.textContent = uAttrs.error;\n body.appendChild(errEl);\n }\n };\n return wrapper;\n });\n\n renderer.register('typing', (node) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-typing' });\n var dots = el('span', { class: 'tokui-typing__dots' });\n for (var i = 0; i < 3; i++) {\n var dot = el('span', { class: 'tokui-typing__dot' });\n dot.style.animationDelay = (i * 0.15) + 's';\n dots.appendChild(dot);\n }\n wrapper.appendChild(dots);\n if (attrs.text) {\n var textEl = el('span', { class: 'tokui-typing__text' });\n textEl.textContent = attrs.text;\n wrapper.appendChild(textEl);\n }\n return wrapper;\n });\n\n renderer.register('quick-reply', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-quick-reply' });\n var itemsWrap = el('div', { class: 'tokui-quick-reply__items' });\n if (attrs.items) {\n attrs.items.split(',').forEach(function (label) {\n var btn = el('button', { class: 'tokui-quick-reply__item', type: 'button' });\n btn.textContent = label.trim();\n itemsWrap.appendChild(btn);\n });\n }\n if (node.children && node.children.length) {\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) itemsWrap.appendChild(child);\n });\n }\n wrapper.appendChild(itemsWrap);\n wrapper._slot = itemsWrap;\n wrapper._tokuiType = 'quick-reply';\n return wrapper;\n });\n\n // === Suggestions 提示建议卡片(容器)===\n // attrs.cols = 列数 (1-4, 默认2), attrs.clk = 全局点击回调\n // 子节点为 suggestion 卡片\n renderer.register('suggestions', (node, rc) => {\n var attrs = node.attrs || {};\n var cols = Math.min(4, Math.max(1, parseInt(attrs.cols) || 2));\n var wrapper = el('div', { class: 'tokui-suggestions' });\n if (attrs.clk) wrapper.setAttribute('data-tokui-clk', attrs.clk);\n if (attrs.id) wrapper.id = attrs.id;\n var grid = el('div', {\n class: 'tokui-suggestions__grid tokui-suggestions__grid--' + cols\n });\n grid.style.gridTemplateColumns = 'repeat(' + cols + ', 1fr)';\n if (node.children && node.children.length) {\n rc(node.children).forEach(function(child) {\n if (child && child.nodeType) grid.appendChild(child);\n });\n }\n wrapper.appendChild(grid);\n wrapper._slot = grid;\n wrapper._tokuiType = 'suggestions';\n return wrapper;\n });\n\n // === Suggestion 单个建议卡片(自闭合)===\n // attrs.tt = 标题, attrs.tx = 描述, attrs.clk = 点击回调\n // attrs.icon = 可选图标文字\n renderer.register('suggestion', (node) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n var desc = attrs.tx || '';\n var iconText = attrs.icon || '';\n var card = el('div', { class: 'tokui-suggestion', role: 'button', tabindex: '0' });\n if (attrs.clk) card.setAttribute('data-tokui-clk', attrs.clk);\n if (attrs.dis !== undefined) {\n card.classList.add('tokui-suggestion--disabled');\n card.setAttribute('aria-disabled', 'true');\n }\n if (iconText) {\n var iconEl = el('span', { class: 'tokui-suggestion__icon' });\n iconEl.textContent = iconText;\n card.appendChild(iconEl);\n }\n var body = el('div', { class: 'tokui-suggestion__body' });\n if (title) {\n var titleEl = el('div', { class: 'tokui-suggestion__title' });\n titleEl.textContent = title;\n body.appendChild(titleEl);\n }\n if (desc) {\n var descEl = el('div', { class: 'tokui-suggestion__desc' });\n descEl.textContent = desc;\n body.appendChild(descEl);\n }\n card.appendChild(body);\n // Keyboard accessibility\n card.addEventListener('keydown', function(e) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n card.click();\n }\n });\n return card;\n });\n\n renderer.register('source', (node) => {\n var attrs = node.attrs || {};\n var num = attrs.n || '1';\n var title = attrs.tt || '';\n var snippet = attrs.sn || '';\n var url = attrs.u || attrs.url || '';\n var wrapper = el('div', { class: 'tokui-source' });\n var numEl = el('span', { class: 'tokui-source__num' });\n numEl.textContent = num;\n wrapper.appendChild(numEl);\n var body = el('div', { class: 'tokui-source__body' });\n if (title) {\n var titleEl;\n if (url) {\n titleEl = el('a', { class: 'tokui-source__title', href: url, target: '_blank' });\n } else {\n titleEl = el('span', { class: 'tokui-source__title' });\n }\n titleEl.textContent = title;\n body.appendChild(titleEl);\n }\n if (snippet) {\n var snEl = el('div', { class: 'tokui-source__snippet' });\n snEl.textContent = snippet;\n body.appendChild(snEl);\n }\n wrapper.appendChild(body);\n return wrapper;\n });\n\n function renderDiffLines(contentEl, raw) {\n contentEl.innerHTML = '';\n var lines = raw.split('\\n');\n var oldLine = 0;\n var newLine = 0;\n lines.forEach(function (line) {\n var lineEl = el('div', { class: 'tokui-diff__line' });\n var numEl = el('span', { class: 'tokui-diff__num' });\n var codeEl = el('span', { class: 'tokui-diff__code' });\n if (line.startsWith('+')) {\n lineEl.classList.add('tokui-diff__line--add');\n newLine++;\n numEl.textContent = newLine;\n codeEl.textContent = line;\n } else if (line.startsWith('-')) {\n lineEl.classList.add('tokui-diff__line--remove');\n oldLine++;\n numEl.textContent = oldLine;\n codeEl.textContent = line;\n } else {\n lineEl.classList.add('tokui-diff__line--context');\n oldLine++;\n newLine++;\n numEl.textContent = oldLine;\n codeEl.textContent = line || ' ';\n }\n lineEl.appendChild(numEl);\n lineEl.appendChild(codeEl);\n contentEl.appendChild(lineEl);\n });\n }\n\n renderer.register('diff', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-diff' });\n if (attrs.title || attrs.lang) {\n var header = el('div', { class: 'tokui-diff__header' });\n if (attrs.title) {\n var titleEl = el('span', { class: 'tokui-diff__title' });\n titleEl.textContent = attrs.title;\n header.appendChild(titleEl);\n }\n if (attrs.lang) {\n var langBadge = el('span', { class: 'tokui-diff__lang' });\n langBadge.textContent = attrs.lang;\n header.appendChild(langBadge);\n }\n wrapper.appendChild(header);\n }\n var content = el('div', { class: 'tokui-diff__content' });\n // 原始累积文本(含换行)从闭包变量取,【不】从 DOM childNodes 反读——\n // renderDiffLines 会把内容拆成行 div,DOM round-trip 会丢换行 → 多块流式后塌成一行。\n // parser 的 _unescapeRaw 已把字面 \\n 转成真换行,故 rawAcc 保留真换行。\n var rawAcc = '';\n if (node.children && node.children.length > 0) {\n rawAcc = node.children.map(function (c) { return c.content || ''; }).join('');\n } else {\n rawAcc = node.content || '';\n }\n function applyDiff() { renderDiffLines(content, rawAcc); }\n applyDiff();\n wrapper.appendChild(content);\n wrapper._slot = content;\n wrapper._tokuiType = 'diff';\n // 真流式:每块 _text 到达即累积到 rawAcc 并整体重渲染(行号/红绿着色逐块增长),\n // 不再等到 [/diff] 才出 diff 行。与 code 块 _streamAppendHook 同套路。\n wrapper._streamAppendHook = function (childNode) {\n if (childNode && childNode.type === '_text' && childNode.content) {\n rawAcc += childNode.content;\n applyDiff();\n }\n };\n wrapper._streamCloseHook = applyDiff;\n return wrapper;\n });\n\n // --- Phase 2: P1 Agent/代码助手组件 ---\n\n renderer.register('plan', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-plan' });\n if (attrs.tt) {\n var titleEl = el('div', { class: 'tokui-plan__title' });\n titleEl.textContent = attrs.tt;\n wrapper.appendChild(titleEl);\n }\n var stepsEl = el('div', { class: 'tokui-plan__steps' });\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) stepsEl.appendChild(child);\n });\n wrapper.appendChild(stepsEl);\n wrapper._slot = stepsEl;\n wrapper._tokuiType = 'plan';\n return wrapper;\n });\n\n renderer.register('plan-step', (node, rc) => {\n var attrs = node.attrs || {};\n // 状态归一化:兼容 AI 常见的同义写法(running/in-progress/complete/...)\n var VALID_STATUS = { pending: 1, doing: 1, done: 1, error: 1, skipped: 1 };\n var STATUS_ALIASES = {\n running: 'doing', active: 'doing', progress: 'doing', processing: 'doing',\n 'in-progress': 'doing', 'in_progress': 'doing', current: 'doing',\n complete: 'done', completed: 'done', finish: 'done', finished: 'done', ok: 'done', success: 'done',\n wait: 'pending', waiting: 'pending', todo: 'pending', queued: 'pending',\n fail: 'error', failed: 'error', failure: 'error'\n };\n var rawStatus = String(attrs.status || 'pending').toLowerCase();\n var status = STATUS_ALIASES[rawStatus] || (VALID_STATUS[rawStatus] ? rawStatus : 'pending');\n var wrapper = el('div', { class: 'tokui-plan-step tokui-plan-step--' + status });\n var dot = el('span', { class: 'tokui-plan-step__dot' });\n wrapper.appendChild(dot);\n var contentEl = el('div', { class: 'tokui-plan-step__content' });\n if (attrs.tt) {\n var titleEl = el('div', { class: 'tokui-plan-step__title' });\n titleEl.textContent = attrs.tt;\n contentEl.appendChild(titleEl);\n }\n if (attrs.desc) {\n var descEl = el('div', { class: 'tokui-plan-step__desc' });\n descEl.textContent = attrs.desc;\n contentEl.appendChild(descEl);\n }\n if (node.content) {\n var textEl = el('div', { class: 'tokui-plan-step__text' });\n textEl.textContent = node.content;\n contentEl.appendChild(textEl);\n }\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) contentEl.appendChild(child);\n });\n wrapper.appendChild(contentEl);\n var line = el('div', { class: 'tokui-plan-step__line' });\n wrapper.appendChild(line);\n return wrapper;\n });\n\n renderer.register('agent', (node, rc) => {\n var attrs = node.attrs || {};\n var name = attrs.name || 'Agent';\n var status = attrs.status || 'idle';\n var action = attrs.action || '';\n var duration = attrs.duration || '';\n var wrapperAttrs = { class: 'tokui-agent tokui-agent--' + status };\n if (attrs.id) wrapperAttrs.id = attrs.id;\n var wrapper = el('div', wrapperAttrs);\n var header = el('div', { class: 'tokui-agent__header' });\n var statusDot = el('span', { class: 'tokui-agent__status-dot tokui-agent__status-dot--' + status });\n header.appendChild(statusDot);\n var nameEl = el('span', { class: 'tokui-agent__name' });\n nameEl.textContent = name;\n header.appendChild(nameEl);\n var statusBadge = el('span', { class: 'tokui-agent__status' });\n var STATUS_TEXT = { idle: '空闲', running: '运行中', paused: '已暂停', done: '完成', error: '出错' };\n statusBadge.textContent = STATUS_TEXT[status] || status;\n header.appendChild(statusBadge);\n if (duration) {\n var durEl = el('span', { class: 'tokui-agent__duration' });\n durEl.textContent = duration;\n header.appendChild(durEl);\n }\n wrapper.appendChild(header);\n if (action) {\n var actionEl = el('div', { class: 'tokui-agent__action' });\n actionEl.textContent = action;\n wrapper.appendChild(actionEl);\n }\n if (node.children && node.children.length) {\n var body = el('div', { class: 'tokui-agent__body' });\n rc(node.children).forEach(function (child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n wrapper.appendChild(body);\n wrapper._slot = body;\n }\n wrapper._tokuiType = 'agent';\n wrapper._update = function (uAttrs) {\n if (uAttrs.status) {\n wrapper.className = 'tokui-agent tokui-agent--' + uAttrs.status;\n statusDot.className = 'tokui-agent__status-dot tokui-agent__status-dot--' + uAttrs.status;\n statusBadge.textContent = STATUS_TEXT[uAttrs.status] || uAttrs.status;\n }\n if (uAttrs.action && actionEl) actionEl.textContent = uAttrs.action;\n if (uAttrs.duration && durEl) durEl.textContent = uAttrs.duration;\n };\n return wrapper;\n });\n\n renderer.register('file-tree', (node, rc) => {\n var wrapper = el('div', { class: 'tokui-file-tree' });\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) wrapper.appendChild(child);\n });\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'file-tree';\n return wrapper;\n });\n\n renderer.register('ft-folder', (node, rc) => {\n var attrs = node.attrs || {};\n var name = attrs.name || 'folder';\n var isOpen = attrs.open !== undefined;\n var wrapper = el('div', { class: 'tokui-file-tree__folder' + (isOpen ? ' tokui-file-tree__folder--open' : '') });\n var nameRow = el('div', { class: 'tokui-file-tree__folder-name' });\n var toggle = el('span', { class: 'tokui-file-tree__folder-toggle' });\n toggle.textContent = isOpen ? '▾' : '▸';\n nameRow.appendChild(toggle);\n var icon = el('span', { class: 'tokui-file-tree__folder-icon' });\n icon.textContent = '📁';\n nameRow.appendChild(icon);\n var nameEl = el('span', { class: 'tokui-file-tree__name' });\n nameEl.textContent = name;\n nameRow.appendChild(nameEl);\n wrapper.appendChild(nameRow);\n var children = el('div', { class: 'tokui-file-tree__folder-children' });\n if (!isOpen) children.style.display = 'none';\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) children.appendChild(child);\n });\n wrapper.appendChild(children);\n nameRow.addEventListener('click', function () {\n var open = wrapper.classList.toggle('tokui-file-tree__folder--open');\n toggle.textContent = open ? '▾' : '▸';\n children.style.display = open ? '' : 'none';\n });\n wrapper._slot = children;\n wrapper._tokuiType = 'ft-folder';\n return wrapper;\n });\n\n renderer.register('ft-file', (node) => {\n var attrs = node.attrs || {};\n var name = attrs.name || 'file';\n var badge = attrs.badge || '';\n var wrapper = el('div', { class: 'tokui-file-tree__file' });\n var icon = el('span', { class: 'tokui-file-tree__file-icon' });\n icon.textContent = '📄';\n wrapper.appendChild(icon);\n var nameEl = el('span', { class: 'tokui-file-tree__name' });\n nameEl.textContent = name;\n wrapper.appendChild(nameEl);\n if (badge) {\n var badgeEl = el('span', { class: 'tokui-file-tree__file-badge' });\n badgeEl.textContent = badge;\n wrapper.appendChild(badgeEl);\n }\n return wrapper;\n });\n\n renderer.register('terminal', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.title || 'Terminal';\n var status = attrs.status || '';\n var wrapper = el('div', { class: 'tokui-terminal' + (status && status !== '0' ? ' tokui-terminal--error' : '') });\n var titlebar = el('div', { class: 'tokui-terminal__titlebar' });\n var dots = el('span', { class: 'tokui-terminal__dots' });\n ['🔴', '🟡', '🟢'].forEach(function (c) {\n var d = el('span', { class: 'tokui-terminal__dot' });\n d.textContent = c;\n dots.appendChild(d);\n });\n titlebar.appendChild(dots);\n var titleEl = el('span', { class: 'tokui-terminal__title' });\n titleEl.textContent = title;\n titlebar.appendChild(titleEl);\n wrapper.appendChild(titlebar);\n var content = el('div', { class: 'tokui-terminal__content' });\n if (node.content) content.textContent = node.content;\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) content.appendChild(child);\n });\n wrapper.appendChild(content);\n wrapper._slot = content;\n wrapper._tokuiType = 'terminal';\n return wrapper;\n });\n\n renderer.register('shimmer', (node) => {\n var attrs = node.attrs || {};\n var type = attrs.t || 'text';\n var rows = parseInt(attrs.rows) || 3;\n var wrapper = el('div', { class: 'tokui-shimmer tokui-shimmer--' + type });\n if (type === 'card') {\n var circle = el('div', { class: 'tokui-shimmer__circle' });\n wrapper.appendChild(circle);\n var lines = el('div', { class: 'tokui-shimmer__lines' });\n for (var i = 0; i < rows; i++) lines.appendChild(el('div', { class: 'tokui-shimmer__row' }));\n wrapper.appendChild(lines);\n } else if (type === 'avatar') {\n wrapper.appendChild(el('div', { class: 'tokui-shimmer__circle' }));\n } else {\n for (var j = 0; j < rows; j++) wrapper.appendChild(el('div', { class: 'tokui-shimmer__row' }));\n }\n return wrapper;\n });\n\n renderer.register('latency', (node) => {\n var attrs = node.attrs || {};\n var value = attrs.v || '';\n var type = attrs.t || '';\n var wrapper = el('span', { class: 'tokui-latency' + (type ? ' tokui-latency--' + type : '') });\n var ICONS = { thinking: '💡', generating: '⚡', total: '⏱' };\n if (type && ICONS[type]) {\n var icon = el('span', { class: 'tokui-latency__icon' });\n icon.textContent = ICONS[type];\n wrapper.appendChild(icon);\n }\n var valEl = el('span', { class: 'tokui-latency__value' });\n valEl.textContent = value;\n wrapper.appendChild(valEl);\n if (type) {\n var labelEl = el('span', { class: 'tokui-latency__label' });\n var LABELS = { thinking: '思考', generating: '生成', total: '总计' };\n labelEl.textContent = LABELS[type] || type;\n wrapper.appendChild(labelEl);\n }\n return wrapper;\n });\n\n // --- Phase 3: P2 高级组件 ---\n\n renderer.register('video', (node) => {\n var attrs = node.attrs || {};\n var src = attrs.s || '';\n var poster = attrs.poster || '';\n var wrapper = el('div', { class: 'tokui-video' });\n var video = el('video', { class: 'tokui-video__player', preload: 'metadata' });\n if (src) video.setAttribute('src', src);\n if (poster) video.setAttribute('poster', poster);\n video.setAttribute('controls', '');\n wrapper.appendChild(video);\n return wrapper;\n });\n\n renderer.register('audio', (node) => {\n var attrs = node.attrs || {};\n var src = attrs.s || '';\n var title = attrs.tt || '';\n var duration = attrs.duration || '';\n var wrapper = el('div', { class: 'tokui-audio' });\n var info = el('div', { class: 'tokui-audio__info' });\n var icon = el('span', { class: 'tokui-audio__icon' });\n icon.textContent = '🔊';\n info.appendChild(icon);\n if (title) {\n var titleEl = el('span', { class: 'tokui-audio__title' });\n titleEl.textContent = title;\n info.appendChild(titleEl);\n }\n if (duration) {\n var durEl = el('span', { class: 'tokui-audio__duration' });\n durEl.textContent = duration;\n info.appendChild(durEl);\n }\n wrapper.appendChild(info);\n var audio = el('audio', { class: 'tokui-audio__player', preload: 'metadata' });\n if (src) audio.setAttribute('src', src);\n audio.setAttribute('controls', '');\n wrapper.appendChild(audio);\n return wrapper;\n });\n\n renderer.register('quote', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-quote' });\n var bar = el('div', { class: 'tokui-quote__bar' });\n wrapper.appendChild(bar);\n var content = el('div', { class: 'tokui-quote__content' });\n if (attrs.role) {\n var roleBadge = el('span', { class: 'tokui-quote__role' });\n roleBadge.textContent = attrs.role === 'user' ? 'User' : 'AI';\n content.appendChild(roleBadge);\n }\n if (attrs.tx) {\n var textEl = el('div', { class: 'tokui-quote__text' });\n textEl.textContent = attrs.tx;\n content.appendChild(textEl);\n }\n if (attrs.msgid) wrapper.setAttribute('data-msgid', attrs.msgid);\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) content.appendChild(child);\n });\n wrapper.appendChild(content);\n wrapper._slot = content;\n wrapper._tokuiType = 'quote';\n return wrapper;\n });\n\n renderer.register('sandbox', (node, rc) => {\n var attrs = node.attrs || {};\n var lang = attrs.lang || '';\n var title = attrs.title || 'Preview';\n var height = attrs.height || '200';\n var wrapper = el('div', { class: 'tokui-sandbox' });\n var header = el('div', { class: 'tokui-sandbox__header' });\n var titleEl = el('span', { class: 'tokui-sandbox__title' });\n titleEl.textContent = title;\n header.appendChild(titleEl);\n if (lang) {\n var langBadge = el('span', { class: 'tokui-sandbox__lang' });\n langBadge.textContent = lang;\n header.appendChild(langBadge);\n }\n wrapper.appendChild(header);\n var preview = el('div', { class: 'tokui-sandbox__preview' });\n preview.style.height = height + 'px';\n var htmlContent = node.content || '';\n if (!htmlContent && node.children) {\n htmlContent = node.children\n .filter(function (c) { return c.type === '_text' && c.content; })\n .map(function (c) { return c.content; })\n .join('');\n }\n if (lang === 'html') {\n var iframe = el('iframe', {\n class: 'tokui-sandbox__iframe',\n sandbox: 'allow-scripts',\n frameborder: '0'\n });\n if (htmlContent) iframe.setAttribute('srcdoc', htmlContent);\n preview.appendChild(iframe);\n // 流式渲染时 _slot 收集文本追加到 iframe srcdoc\n var slotProxy = {\n appendChild: function (child) {\n var text = (child.nodeType === 3) ? child.nodeValue : (child.textContent || '');\n if (!text) return child;\n var current = iframe.getAttribute('srcdoc') || '';\n iframe.setAttribute('srcdoc', current + text);\n return child;\n }\n };\n wrapper._slot = slotProxy;\n } else {\n var codeEl = el('pre', { class: 'tokui-sandbox__code' });\n if (htmlContent) codeEl.textContent = htmlContent;\n rc((node.children || []).filter(function (c) { return c.type !== '_text'; })).forEach(function (child) {\n if (child && child.nodeType) codeEl.appendChild(child);\n });\n preview.appendChild(codeEl);\n wrapper._slot = preview;\n }\n wrapper.appendChild(preview);\n wrapper._tokuiType = 'sandbox';\n return wrapper;\n });\n\n renderer.register('commit', (node) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-commit' });\n var hash = attrs.hash || '';\n var msg = attrs.msg || '';\n var author = attrs.author || '';\n var branch = attrs.branch || '';\n var time = attrs.time || '';\n var additions = attrs.additions || '';\n var deletions = attrs.deletions || '';\n var row1 = el('div', { class: 'tokui-commit__row' });\n if (hash) {\n var hashEl = el('span', { class: 'tokui-commit__hash' });\n hashEl.textContent = hash.slice(0, 7);\n row1.appendChild(hashEl);\n }\n if (msg) {\n var msgEl = el('span', { class: 'tokui-commit__msg' });\n msgEl.textContent = msg;\n row1.appendChild(msgEl);\n }\n wrapper.appendChild(row1);\n var meta = el('div', { class: 'tokui-commit__meta' });\n if (author) {\n var authorEl = el('span', { class: 'tokui-commit__author' });\n authorEl.textContent = author;\n meta.appendChild(authorEl);\n }\n if (branch) {\n var branchEl = el('span', { class: 'tokui-commit__branch' });\n branchEl.textContent = branch;\n meta.appendChild(branchEl);\n }\n if (time) {\n var timeEl = el('span', { class: 'tokui-commit__time' });\n timeEl.textContent = time;\n meta.appendChild(timeEl);\n }\n wrapper.appendChild(meta);\n if (additions || deletions) {\n var stats = el('div', { class: 'tokui-commit__stats' });\n if (additions) {\n var addEl = el('span', { class: 'tokui-commit__additions' });\n addEl.textContent = '+' + additions;\n stats.appendChild(addEl);\n }\n if (deletions) {\n var delEl = el('span', { class: 'tokui-commit__deletions' });\n delEl.textContent = '-' + deletions;\n stats.appendChild(delEl);\n }\n wrapper.appendChild(stats);\n }\n return wrapper;\n });\n\n renderer.register('test-result', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapper = el('div', { class: 'tokui-test-result' });\n var summary = el('div', { class: 'tokui-test-result__summary' });\n var counts = [\n { key: 'pass', cls: '--pass', icon: '✓' },\n { key: 'fail', cls: '--fail', icon: '✗' },\n { key: 'skip', cls: '--skip', icon: '○' }\n ];\n counts.forEach(function (c) {\n if (attrs[c.key]) {\n var el2 = el('span', { class: 'tokui-test-result__count tokui-test-result__count' + c.cls });\n el2.textContent = c.icon + ' ' + attrs[c.key];\n summary.appendChild(el2);\n }\n });\n if (attrs.total) {\n var totalEl = el('span', { class: 'tokui-test-result__count tokui-test-result__count--total' });\n totalEl.textContent = 'Total: ' + attrs.total;\n summary.appendChild(totalEl);\n }\n if (attrs.duration) {\n var durEl = el('span', { class: 'tokui-test-result__duration' });\n durEl.textContent = attrs.duration;\n summary.appendChild(durEl);\n }\n wrapper.appendChild(summary);\n var cases = el('div', { class: 'tokui-test-result__cases' });\n rc(node.children || []).forEach(function (child) {\n if (child && child.nodeType) cases.appendChild(child);\n });\n wrapper.appendChild(cases);\n wrapper._slot = cases;\n wrapper._tokuiType = 'test-result';\n return wrapper;\n });\n\n // 构建测试用例 DOM(test-result 的子节点,标签可以是 test-case 或 case,两者等价)。\n // 盖 data-tokui-tag=node.type 印章,让 Playground 按 [test-case]/[case] 各自代码行定位。\n function buildTestCase(node) {\n var attrs = node.attrs || {};\n var status = attrs.status || 'pass';\n var wrapper = el('div', { class: 'tokui-test-case tokui-test-case--' + status, 'data-tokui-tag': node.type });\n var statusIcon = el('span', { class: 'tokui-test-case__status' });\n var ICONS = { pass: '✓', fail: '✗', skip: '○' };\n statusIcon.textContent = ICONS[status] || status;\n wrapper.appendChild(statusIcon);\n var nameEl = el('span', { class: 'tokui-test-case__name' });\n nameEl.textContent = attrs.name || 'test';\n wrapper.appendChild(nameEl);\n if (attrs.duration) {\n var durEl = el('span', { class: 'tokui-test-case__duration' });\n durEl.textContent = attrs.duration;\n wrapper.appendChild(durEl);\n }\n if (status === 'fail' && attrs.error) {\n var errEl = el('div', { class: 'tokui-test-case__error' });\n errEl.textContent = attrs.error;\n wrapper.appendChild(errEl);\n }\n return wrapper;\n }\n\n renderer.register('test-case', (node) => {\n return buildTestCase(node);\n });\n\n // test-case 简写别名(test-result 子节点内等价)\n renderer.register('case', (node) => {\n return buildTestCase(node);\n });\n\n // === Conversations 会话列表(容器) ===\n // attrs.clk = 点击回调名, attrs.act = 当前激活的会话标识\n // 子节点为 conv 自闭合项\n // 自动按 time 属性分组: 今天/昨天/更早\n renderer.register('conversations', (node, rc) => {\n var attrs = node.attrs || {};\n var handlerName = attrs.clk || '';\n var activeAct = attrs.act || '';\n\n var wrapper = el('div', {\n class: 'tokui-conversations',\n role: 'list'\n });\n\n // 收集 conv 子节点\n var convNodes = (node.children || []).filter(function (c) { return c.type === 'conv'; });\n\n var emptyEl = null;\n if (convNodes.length === 0) {\n emptyEl = el('div', { class: 'tokui-conversations__empty' });\n emptyEl.textContent = '暂无会话';\n wrapper.appendChild(emptyEl);\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'conversations';\n wrapper._convHandlerName = handlerName;\n wrapper._convActiveAct = activeAct;\n wrapper._streamCloseHook = function () {\n var hasConv = wrapper.querySelector('.tokui-conv');\n if (hasConv && emptyEl && emptyEl.parentNode) {\n emptyEl.parentNode.removeChild(emptyEl);\n }\n };\n return wrapper;\n }\n\n // 按时间分组\n var groups = categorizeConvGroups(convNodes);\n\n groups.forEach(function (group) {\n // 当有多个分组时才显示分组标题\n if (groups.length > 1) {\n var header = el('div', { class: 'tokui-conversations__group-header' });\n header.textContent = group.label;\n wrapper.appendChild(header);\n }\n\n group.items.forEach(function (convNode) {\n var convEl = renderConvItem(convNode, handlerName, activeAct, wrapper);\n wrapper.appendChild(convEl);\n });\n });\n\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'conversations';\n return wrapper;\n });\n\n // === Conv 会话列表子项(自闭合)===\n // attrs.tt = 标题, attrs.time = 时间, attrs.active = 是否激活\n // 注意: conv 通常作为 conversations 的子节点,由 conversations 渲染器统一渲染\n // 但也注册独立的 conv 渲染器,用于单独渲染\n renderer.register('conv', (node) => {\n return renderConvItem(node, '', '', null);\n });\n\n /**\n * 判断时间字符串是否为今天(HH:MM 格式)\n */\n function isTodayTime(timeStr) {\n return /^\\d{1,2}:\\d{2}$/.test(timeStr);\n }\n\n /**\n * 将 conv 子节点按时间属性分组\n * 返回 [{ label: '今天'|'昨天'|'更早', items: [...] }]\n */\n function categorizeConvGroups(convNodes) {\n var today = [];\n var yesterday = [];\n var earlier = [];\n\n convNodes.forEach(function (node) {\n var time = (node.attrs && node.attrs.time) || '';\n if (isTodayTime(time)) {\n today.push(node);\n } else if (time === '昨天') {\n yesterday.push(node);\n } else {\n earlier.push(node);\n }\n });\n\n var groups = [];\n if (today.length) groups.push({ label: '今天', items: today });\n if (yesterday.length) groups.push({ label: '昨天', items: yesterday });\n if (earlier.length) groups.push({ label: '更早', items: earlier });\n\n return groups.length ? groups : [{ label: '今天', items: convNodes }];\n }\n\n /**\n * 渲染单个会话项\n */\n function renderConvItem(node, handlerName, activeAct, container) {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n var time = attrs.time || '';\n var isActive = attrs.active === true || attrs.active === 'true';\n // 也通过父容器的 act 属性匹配\n if (!isActive && activeAct && attrs.act && attrs.act === activeAct) {\n isActive = true;\n }\n\n var classes = ['tokui-conv'];\n if (isActive) classes.push('tokui-conv--active');\n\n var item = el('div', {\n class: classes.join(' '),\n role: 'listitem',\n tabindex: '0',\n 'data-tokui-tag': 'conv'\n });\n\n // 标题\n var titleEl = el('div', { class: 'tokui-conv__title' });\n titleEl.textContent = title;\n item.appendChild(titleEl);\n\n // 时间\n if (time) {\n var timeEl = el('span', { class: 'tokui-conv__time' });\n timeEl.textContent = time;\n item.appendChild(timeEl);\n }\n\n // 操作区(悬浮显示删除按钮)\n var actionsEl = el('div', { class: 'tokui-conv__actions' });\n var deleteBtn = el('button', {\n class: 'tokui-conv__delete',\n type: 'button',\n 'aria-label': '删除'\n });\n deleteBtn.textContent = '×';\n actionsEl.appendChild(deleteBtn);\n item.appendChild(actionsEl);\n\n // 点击事件: 切换激活状态\n item.addEventListener('click', function (e) {\n // 如果点击的是删除按钮,不处理选中\n if (e.target.closest && e.target.closest('.tokui-conv__delete')) return;\n // 切换激活状态\n var allItems = container ? container.querySelectorAll('.tokui-conv') : [item];\n allItems.forEach(function (el) { el.classList.remove('tokui-conv--active'); });\n item.classList.add('tokui-conv--active');\n if (handlerName) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(handlerName, { tt: title, time: time, act: attrs.act || '' });\n }\n }\n });\n\n // 键盘 Enter 支持\n item.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n item.click();\n }\n });\n\n // 删除按钮事件\n deleteBtn.addEventListener('click', function (e) {\n e.stopPropagation();\n if (item.parentNode) item.parentNode.removeChild(item);\n });\n\n // clk 数据属性\n if (handlerName) item.setAttribute('data-tokui-clk', handlerName);\n\n return item;\n }\n\n // === Welcome 欢迎页组件(容器)===\n // attrs.tt = 主标题, attrs.st = 副标题\n // 子节点为 welcome-feature 组件,渲染到 CSS Grid 区域\n renderer.register('welcome', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n var subtitle = attrs.st || '';\n\n var wrapper = el('div', { class: 'tokui-welcome' });\n\n if (title) {\n var titleEl = el('div', { class: 'tokui-welcome__title' });\n titleEl.textContent = title;\n wrapper.appendChild(titleEl);\n }\n\n if (subtitle) {\n var subtitleEl = el('div', { class: 'tokui-welcome__subtitle' });\n subtitleEl.textContent = subtitle;\n wrapper.appendChild(subtitleEl);\n }\n\n var grid = el('div', { class: 'tokui-welcome__grid' });\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) grid.appendChild(child);\n });\n wrapper.appendChild(grid);\n\n wrapper._slot = grid;\n wrapper._tokuiType = 'welcome';\n return wrapper;\n });\n\n // 构建 Welcome 功能特性卡片 DOM(welcome 的子节点,标签可以是 welcome-feature 或 feature)。\n // attrs 驱动(忽略子节点):tt 标题、tx 描述、i 图标、clk 回调。\n // 盖 data-tokui-tag=node.type 印章供 Playground 点击定位。\n // feature 不在 CONTAINERS → 自闭合;welcome-feature 在 CONTAINERS → 容器模式(空 body 闭合即可)。两者等价。\n function buildWelcomeFeature(node) {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n var desc = attrs.tx || '';\n var iconType = attrs.i || 'code';\n var handlerName = attrs.clk || '';\n\n var FEATURE_ICONS = {\n code: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>',\n chart: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"10\"/><line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"/><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"14\"/></svg>',\n doc: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/></svg>'\n };\n\n var classes = ['tokui-welcome-feature', 'tokui-welcome-feature--' + iconType];\n\n var cardAttrs = { class: classes.join(' '), role: 'button', tabindex: '0', 'data-tokui-tag': node.type };\n if (handlerName) cardAttrs['data-tokui-clk'] = handlerName;\n\n var card = el('div', cardAttrs);\n\n var iconEl = el('div', { class: 'tokui-welcome-feature__icon' });\n iconEl.innerHTML = FEATURE_ICONS[iconType] || FEATURE_ICONS.code;\n card.appendChild(iconEl);\n\n var body = el('div', { class: 'tokui-welcome-feature__body' });\n\n if (title) {\n var titleEl = el('div', { class: 'tokui-welcome-feature__title' });\n titleEl.textContent = title;\n body.appendChild(titleEl);\n }\n\n if (desc) {\n var descEl = el('div', { class: 'tokui-welcome-feature__desc' });\n descEl.textContent = desc;\n body.appendChild(descEl);\n }\n\n card.appendChild(body);\n\n // 点击事件通过事件总线触发\n if (handlerName) {\n card.addEventListener('click', function() {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(handlerName, { title: title, icon: iconType });\n }\n });\n }\n\n card._tokuiType = 'welcome-feature';\n return card;\n }\n\n // === Welcome Feature 功能特性卡片(容器)===\n // attrs.tt = 标题, attrs.tx = 描述, attrs.i = 图标类型(code/chart/doc)\n // attrs.clk = 点击事件回调名。推荐用简写 [feature](自闭合)。\n renderer.register('welcome-feature', (node) => {\n return buildWelcomeFeature(node);\n });\n\n // welcome-feature 简写别名(不在 CONTAINERS → 自闭合,更简洁)\n renderer.register('feature', (node) => {\n return buildWelcomeFeature(node);\n });\n\n // === Attachments 文件附件区域(容器) ===\n // attrs.clk = 统一删除回调名\n // 子节点为 attach 项,水平 flex 排列\n renderer.register('attachments', (node, rc) => {\n var attrs = node.attrs || {};\n var handlerName = attrs.clk || '';\n\n var wrapper = el('div', { class: 'tokui-attachments' });\n if (handlerName) wrapper.setAttribute('data-tokui-clk', handlerName);\n\n // 渲染子节点(attach 项)\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) wrapper.appendChild(child);\n });\n\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'attachments';\n return wrapper;\n });\n\n // === Attach 单个附件项(自闭合) ===\n // attrs.t = 文件类型(image/pdf/word/excel/ppt/zip/code/video/audio)\n // attrs.s = 文件名\n // attrs.u = 文件URL\n // attrs.size = 文件大小文本\n // attrs.clk = 点击事件名\n renderer.register('attach', (node) => {\n var attrs = node.attrs || {};\n var fileType = attrs.t || 'default';\n var fileName = attrs.s || '未知文件';\n var url = attrs.u || '';\n var fileSize = attrs.size || '';\n var handlerName = attrs.clk || '';\n\n // 文件类型颜色映射\n var TYPE_COLORS = {\n pdf: '#f5222d',\n code: '#1677ff',\n excel: '#52c41a',\n word: '#1677ff',\n ppt: '#fa8c16',\n zip: '#eab308',\n video: '#722ed1',\n audio: '#13c2c2',\n image: '#eb2f96',\n default: '#8c8c8c'\n };\n var color = TYPE_COLORS[fileType] || TYPE_COLORS.default;\n\n var item = el('div', { class: 'tokui-attach tokui-attach--' + fileType });\n if (handlerName) item.setAttribute('data-tokui-clk', handlerName);\n\n // 缩略图或文件类型图标\n if (fileType === 'image' && url) {\n var thumb = el('img', {\n class: 'tokui-attach__thumb',\n src: url,\n alt: fileName\n });\n item.appendChild(thumb);\n } else {\n var iconWrap = el('div', { class: 'tokui-attach__icon' });\n iconWrap.innerHTML = getFileTypeSVG(fileType, color);\n item.appendChild(iconWrap);\n }\n\n // 文件信息\n var info = el('div', { class: 'tokui-attach__info' });\n var nameEl = el('div', { class: 'tokui-attach__name' });\n nameEl.textContent = fileName;\n if (url) {\n nameEl.style.cursor = 'pointer';\n nameEl.addEventListener('click', function() {\n if (typeof window !== 'undefined') window.open(url, '_blank');\n });\n }\n info.appendChild(nameEl);\n if (fileSize) {\n var sizeEl = el('div', { class: 'tokui-attach__size' });\n sizeEl.textContent = fileSize;\n info.appendChild(sizeEl);\n }\n item.appendChild(info);\n\n // 悬浮操作按钮\n var actions = el('div', { class: 'tokui-attach__actions' });\n // 下载按钮\n if (url) {\n var dlBtn = el('a', {\n class: 'tokui-attach__action',\n href: url,\n target: '_blank',\n rel: 'noopener noreferrer',\n download: ''\n });\n dlBtn.innerHTML = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 2v9M4.5 7.5L8 11l3.5-3.5M2 13h12\"/></svg>';\n dlBtn.title = '下载';\n actions.appendChild(dlBtn);\n }\n // 删除按钮\n var delBtn = el('button', { class: 'tokui-attach__action tokui-attach__action--del', type: 'button' });\n delBtn.innerHTML = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 4l8 8M12 4l-8 8\"/></svg>';\n delBtn.title = '删除';\n delBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n if (handlerName) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(handlerName, { name: fileName, url: url, type: fileType });\n }\n }\n // 移除此附件项\n if (item.parentNode) item.parentNode.removeChild(item);\n });\n actions.appendChild(delBtn);\n item.appendChild(actions);\n\n item._tokuiType = 'attach';\n return item;\n });\n\n // === Artifact / Canvas 侧边预览面板(容器)===\n // attrs.tt = 标题, attrs.lang = 代码语言, attrs.pos = 位置(right/left), attrs.w = 宽度百分比(默认50)\n // 子容器: artifact-code(代码内容), artifact-preview(iframe预览)\n // 渲染: 顶部标题栏 + Code/Preview切换 + 关闭按钮, 代码区(语法高亮+复制), 预览区(iframe sandbox), 拖拽调整手柄\n renderer.register('artifact', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || 'Artifact';\n var lang = attrs.lang || 'text';\n var pos = attrs.pos || 'right';\n var width = attrs.w || '50';\n\n var wrapper = el('div', { class: 'tokui-artifact' });\n\n // === Header: title + tab buttons + close ===\n var header = el('div', { class: 'tokui-artifact__header' });\n\n var titleEl = el('span', { class: 'tokui-artifact__title' });\n titleEl.textContent = title;\n header.appendChild(titleEl);\n\n var tabs = el('div', { class: 'tokui-artifact__tabs' });\n\n var codeTab = el('button', {\n class: 'tokui-artifact__tab tokui-artifact__tab--code tokui-artifact__tab--active',\n type: 'button'\n });\n codeTab.textContent = 'Code';\n tabs.appendChild(codeTab);\n\n var previewTab = el('button', {\n class: 'tokui-artifact__tab tokui-artifact__tab--preview',\n type: 'button'\n });\n previewTab.textContent = 'Preview';\n tabs.appendChild(previewTab);\n\n header.appendChild(tabs);\n\n var closeBtn = el('button', {\n class: 'tokui-artifact__close',\n type: 'button',\n 'aria-label': 'Close'\n });\n closeBtn.innerHTML = '&times;';\n header.appendChild(closeBtn);\n\n wrapper.appendChild(header);\n\n // === Code area (hidden by default when preview is shown) ===\n var codeArea = el('div', { class: 'tokui-artifact__code' });\n\n // Render artifact-code children to get the source text\n var codeText = '';\n var artifactCodeNodes = (node.children || []).filter(function(c) { return c.type === 'artifact-code'; });\n if (artifactCodeNodes.length > 0) {\n var codeChildren = artifactCodeNodes[0].children || [];\n codeText = codeChildren.map(function(c) { return c.content || ''; }).join('');\n }\n\n var pre = el('pre', { class: 'tokui-code' });\n var code = el('code', { class: 'language-' + lang });\n if (lang !== 'text' && HL_LANGS[lang]) {\n code.innerHTML = wrapLines(highlightCode(codeText, lang));\n } else {\n code.innerHTML = wrapLines(escapeHtml(codeText));\n }\n pre.appendChild(code);\n codeArea.appendChild(pre);\n\n // Copy button in code area\n var copyBtn = el('button', { class: 'tokui-artifact__code-copy', type: 'button' });\n copyBtn.textContent = 'Copy';\n copyBtn.addEventListener('click', function() {\n var text = code.textContent || '';\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n navigator.clipboard.writeText(text);\n }\n copyBtn.textContent = 'Copied';\n copyBtn.classList.add('tokui-artifact__code-copy--done');\n setTimeout(function() {\n copyBtn.textContent = 'Copy';\n copyBtn.classList.remove('tokui-artifact__code-copy--done');\n }, 2000);\n });\n codeArea.appendChild(copyBtn);\n wrapper.appendChild(codeArea);\n\n // === Preview area (iframe sandbox) ===\n var previewArea = el('div', { class: 'tokui-artifact__preview' });\n previewArea.style.display = 'none';\n\n var iframe = el('iframe', {\n class: 'tokui-artifact__iframe',\n sandbox: 'allow-scripts',\n frameborder: '0'\n });\n\n // Build HTML preview content from artifact-code text\n // For JSX/React-like code, wrap in a basic HTML template\n var htmlContent = '';\n if (lang === 'html') {\n htmlContent = codeText;\n } else {\n // Default: show the code as text in preview\n htmlContent = '<pre style=\"margin:0;padding:16px;font-family:monospace;font-size:13px;white-space:pre-wrap;word-break:break-word;\">' +\n codeText.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') +\n '</pre>';\n }\n iframe.setAttribute('srcdoc', htmlContent);\n\n previewArea.appendChild(iframe);\n wrapper.appendChild(previewArea);\n\n // === Resize handle (bottom edge, drag to adjust height) ===\n var resizeHandle = el('div', { class: 'tokui-artifact__resize' });\n wrapper.appendChild(resizeHandle);\n\n // === Tab switching logic ===\n codeTab.addEventListener('click', function() {\n codeArea.style.display = '';\n previewArea.style.display = 'none';\n codeTab.classList.add('tokui-artifact__tab--active');\n previewTab.classList.remove('tokui-artifact__tab--active');\n });\n\n previewTab.addEventListener('click', function() {\n codeArea.style.display = 'none';\n previewArea.style.display = '';\n previewTab.classList.add('tokui-artifact__tab--active');\n codeTab.classList.remove('tokui-artifact__tab--active');\n });\n\n // === Close button logic ===\n closeBtn.addEventListener('click', function() {\n // Dispatch a custom event so the parent layout can restore full width\n var event = new CustomEvent('tokui-artifact-close', { bubbles: true, detail: { artifact: wrapper } });\n wrapper.dispatchEvent(event);\n wrapper.style.display = 'none';\n });\n\n // === Resize drag logic ===\n var isDragging = false;\n resizeHandle.addEventListener('mousedown', function(e) {\n isDragging = true;\n e.preventDefault();\n document.addEventListener('mousemove', onDragMove);\n document.addEventListener('mouseup', onDragEnd);\n });\n\n function onDragMove(e) {\n if (!isDragging) return;\n var refRect = wrapper.getBoundingClientRect();\n if (!refRect) return;\n var newHeight = refRect.bottom - e.clientY;\n newHeight = Math.max(120, newHeight);\n wrapper.style.height = newHeight + 'px';\n }\n\n function onDragEnd() {\n isDragging = false;\n document.removeEventListener('mousemove', onDragMove);\n document.removeEventListener('mouseup', onDragEnd);\n }\n\n // === Streaming support ===\n // _slot points to code element for streaming text append\n wrapper._slot = code;\n wrapper._tokuiType = 'artifact';\n wrapper._artifactCode = codeText;\n\n // Remove standalone preview elements (artifact-preview renders as separate child)\n // Use setTimeout to run after initial DOM mount\n setTimeout(function() {\n var standalonePreviews = wrapper.querySelectorAll('.tokui-artifact-preview-standalone');\n standalonePreviews.forEach(function(sp) {\n if (sp.parentNode) sp.parentNode.removeChild(sp);\n });\n }, 0);\n\n // Stream close hook: re-highlight when streaming is done\n wrapper._streamCloseHook = function() {\n // 从 node.children 重新提取 artifact-code 文本(parser 的 _unescapeRaw 已把字面 \\n 转真换行),\n // 【不】从 code DOM childNodes 反读——wrapLines 已把 \\n 去掉,DOM round-trip 丢换行 → 塌成一行。\n // mount 模式下 mount() 也会调本 hook,故必须用保留换行的源。\n var acNode = (node.children || []).find(function(c) { return c.type === 'artifact-code'; });\n var raw = acNode ? (acNode.children || []).map(function(c) { return c.content || ''; }).join('') : (wrapper._artifactCode || '');\n if (lang !== 'text' && HL_LANGS[lang]) {\n code.innerHTML = wrapLines(highlightCode(raw, lang));\n } else {\n code.innerHTML = wrapLines(escapeHtml(raw));\n }\n wrapper._artifactCode = raw;\n // Update iframe preview content\n var updatedHtml = '';\n if (lang === 'html') {\n updatedHtml = raw;\n } else {\n updatedHtml = '<pre style=\"margin:0;padding:16px;font-family:monospace;font-size:13px;white-space:pre-wrap;word-break:break-word;\">' +\n raw.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') +\n '</pre>';\n }\n iframe.setAttribute('srcdoc', updatedHtml);\n // Remove standalone preview elements rendered by streaming\n var standalonePreview = wrapper.querySelector('.tokui-artifact-preview-standalone');\n if (standalonePreview && standalonePreview.parentNode) {\n standalonePreview.parentNode.removeChild(standalonePreview);\n }\n };\n\n return wrapper;\n });\n\n // === Artifact-Code 子容器 ===\n // 纯容器,内容会被 artifact 父级提取\n // 在独立渲染时(非 artifact 内),渲染为普通代码块\n renderer.register('artifact-code', (node, rc) => {\n var text = '';\n if (node.children && node.children.length > 0) {\n text = node.children.map(function(c) { return c.content || ''; }).join('');\n } else {\n text = node.content || '';\n }\n var pre = el('pre', { class: 'tokui-code' });\n var code = el('code', {});\n code.textContent = text;\n pre.appendChild(code);\n pre._slot = code;\n pre._tokuiType = 'artifact-code';\n // Stream close hook: re-highlight (language from parent context)\n pre._streamCloseHook = function() {\n var raw = '';\n for (var i = 0; i < code.childNodes.length; i++) {\n raw += code.childNodes[i].textContent || '';\n }\n code.textContent = raw;\n };\n return pre;\n });\n\n // === Artifact-Preview 子容器 ===\n // 在独立渲染时显示为 iframe 预览框\n renderer.register('artifact-preview', (node, rc, parentType) => {\n // When inside an artifact, the artifact renderer handles preview internally\n // Return hidden placeholder to avoid duplicate iframe\n if (parentType === 'artifact') {\n var hidden = el('div', { style: 'display:none' });\n hidden._tokuiType = 'artifact-preview';\n return hidden;\n }\n var wrapper = el('div', { class: 'tokui-artifact-preview-standalone' });\n var iframe = el('iframe', {\n class: 'tokui-artifact__iframe',\n sandbox: 'allow-scripts',\n frameborder: '0'\n });\n var htmlContent = '';\n if (node.children && node.children.length > 0) {\n htmlContent = node.children.map(function(c) { return c.content || ''; }).join('');\n }\n if (htmlContent) {\n iframe.setAttribute('srcdoc', htmlContent);\n }\n wrapper.appendChild(iframe);\n wrapper._tokuiType = 'artifact-preview';\n return wrapper;\n });\n\n // === Command 命令面板(容器)===\n // attrs.ph = 搜索占位文字, attrs.clk = 选择事件回调\n // 子节点: command-group(含 command-item)\n // 渲染为固定浮层,含搜索输入、分组列表、键盘导航\n renderer.register('command', (node, rc) => {\n var attrs = node.attrs || {};\n var placeholder = attrs.ph || '输入关键词搜索...';\n\n // 外层容器(fixed overlay)\n var wrapper = el('div', { class: 'tokui-command' });\n if (attrs.id) wrapper.id = attrs.id;\n if (attrs.clk) wrapper.setAttribute('data-tokui-clk', attrs.clk);\n\n // 遮罩层\n var overlay = el('div', { class: 'tokui-command__overlay' });\n wrapper.appendChild(overlay);\n\n // 面板\n var panel = el('div', { class: 'tokui-command__panel', role: 'dialog', 'aria-label': '命令面板' });\n\n // 搜索输入框容器\n var inputWrap = el('div', { class: 'tokui-command__input-wrap' });\n var searchIcon = el('span', { class: 'tokui-command__search-icon', 'aria-hidden': 'true' });\n searchIcon.innerHTML = '<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>';\n inputWrap.appendChild(searchIcon);\n var input = el('input', {\n class: 'tokui-command__input',\n type: 'text',\n placeholder: placeholder,\n autocomplete: 'off',\n autofocus: 'true'\n });\n inputWrap.appendChild(input);\n panel.appendChild(inputWrap);\n\n // 列表区域\n var list = el('div', { class: 'tokui-command__list', role: 'listbox' });\n\n // 渲染子节点(command-group)\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) list.appendChild(child);\n });\n\n // 空状态\n var empty = el('div', { class: 'tokui-command__empty' });\n empty.textContent = '没有找到匹配结果';\n empty.style.display = 'none';\n list.appendChild(empty);\n\n panel.appendChild(list);\n wrapper.appendChild(panel);\n\n // ===== 搜索过滤逻辑 =====\n var allItems = [];\n var allGroups = [];\n\n function collectItems() {\n allItems = Array.from(list.querySelectorAll('.tokui-command__item'));\n allGroups = Array.from(list.querySelectorAll('.tokui-command__group'));\n }\n collectItems();\n\n function fuzzyMatch(text, query) {\n if (!query) return { match: true, score: 0 };\n var lower = text.toLowerCase();\n var q = query.toLowerCase();\n // exact substring match\n if (lower.indexOf(q) !== -1) return { match: true, score: q.length / lower.length };\n // fuzzy: each char must appear in order\n var qi = 0;\n var matched = 0;\n for (var i = 0; i < lower.length && qi < q.length; i++) {\n if (lower[i] === q[qi]) { qi++; matched++; }\n }\n if (qi === q.length) return { match: true, score: matched / lower.length };\n return { match: false, score: 0 };\n }\n\n function highlightText(text, query) {\n if (!query) return document.createTextNode(text);\n var lower = text.toLowerCase();\n var q = query.toLowerCase();\n var idx = lower.indexOf(q);\n if (idx === -1) return document.createTextNode(text);\n var frag = document.createDocumentFragment();\n var before = text.slice(0, idx);\n var match = text.slice(idx, idx + q.length);\n var after = text.slice(idx + q.length);\n if (before) frag.appendChild(document.createTextNode(before));\n var mark = document.createElement('mark');\n mark.className = 'tokui-command__highlight';\n mark.textContent = match;\n frag.appendChild(mark);\n if (after) frag.appendChild(document.createTextNode(after));\n return frag;\n }\n\n function filterItems(query) {\n var visibleCount = 0;\n allItems.forEach(function(item) {\n var value = item.getAttribute('data-value') || item.textContent || '';\n var result = fuzzyMatch(value, query);\n if (result.match) {\n item.style.display = '';\n visibleCount++;\n // highlight matched text\n var textSpan = item.querySelector('.tokui-command__item-text');\n if (textSpan) {\n textSpan.innerHTML = '';\n textSpan.appendChild(highlightText(value, query));\n }\n } else {\n item.style.display = 'none';\n item.classList.remove('tokui-command__item--selected');\n }\n });\n // hide empty groups\n allGroups.forEach(function(group) {\n var visibleItems = group.querySelectorAll('.tokui-command__item:not([style*=\"display: none\"])');\n group.style.display = visibleItems.length === 0 ? 'none' : '';\n });\n // empty state\n empty.style.display = visibleCount === 0 ? '' : 'none';\n // reset selection\n _selectedIndex = -1;\n if (visibleCount > 0) {\n _selectedIndex = 0;\n updateSelection();\n }\n }\n\n input.addEventListener('input', function() {\n filterItems(input.value.trim());\n });\n\n // ===== 键盘导航 =====\n var _selectedIndex = -1;\n\n function getVisibleItems() {\n return allItems.filter(function(item) {\n return item.style.display !== 'none';\n });\n }\n\n function updateSelection() {\n var visible = getVisibleItems();\n visible.forEach(function(item, idx) {\n if (idx === _selectedIndex) {\n item.classList.add('tokui-command__item--selected');\n item.setAttribute('aria-selected', 'true');\n // scroll into view\n if (item.scrollIntoView) {\n item.scrollIntoView({ block: 'nearest' });\n }\n } else {\n item.classList.remove('tokui-command__item--selected');\n item.setAttribute('aria-selected', 'false');\n }\n });\n }\n\n function selectItem(item) {\n if (!item) return;\n var handlerName = item.getAttribute('data-tokui-clk');\n // dispatch via event bus\n if (handlerName) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(handlerName, { value: item.getAttribute('data-value'), text: item.textContent });\n }\n }\n // also emit command-level clk\n var rootClk = wrapper.getAttribute('data-tokui-clk');\n if (rootClk) {\n var bus2 = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus2 && typeof bus2.emit === 'function') {\n bus2.emit(rootClk, { value: item.getAttribute('data-value'), text: item.textContent, clk: handlerName });\n }\n }\n closeCommand();\n }\n\n input.addEventListener('keydown', function(e) {\n var visible = getVisibleItems();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (visible.length > 0) {\n _selectedIndex = (_selectedIndex + 1) % visible.length;\n updateSelection();\n }\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (visible.length > 0) {\n _selectedIndex = _selectedIndex <= 0 ? visible.length - 1 : _selectedIndex - 1;\n updateSelection();\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (_selectedIndex >= 0 && _selectedIndex < visible.length) {\n selectItem(visible[_selectedIndex]);\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeCommand();\n }\n });\n\n // ===== 打开/关闭逻辑 =====\n function openCommand() {\n // 流式下子项可能晚于 render 到达,打开时重新收集 + 刷新过滤/空状态/选中态\n collectItems();\n filterItems(input.value || '');\n wrapper.classList.add('tokui-command--open');\n input.focus();\n }\n\n function closeCommand() {\n wrapper.classList.remove('tokui-command--open');\n input.value = '';\n filterItems('');\n _selectedIndex = -1;\n }\n\n // 点击遮罩关闭\n overlay.addEventListener('click', function() {\n closeCommand();\n });\n\n // Cmd+K / Ctrl+K 全局快捷键(opt-in:仅 hotkey 属性声明时绑定)。\n // 多个 command 实例都默认绑同一快捷键会导致按一次弹出多个;默认改为按钮触发(openCommand),\n // 需要 Cmd+K 时显式写 hotkey(且页面只应有一个 hotkey 实例)。\n function handleGlobalKey(e) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n if (wrapper.classList.contains('tokui-command--open')) {\n closeCommand();\n } else {\n openCommand();\n }\n }\n }\n if (attrs.hotkey !== undefined && typeof document !== 'undefined') {\n document.addEventListener('keydown', handleGlobalKey);\n }\n\n // 公开方法\n wrapper._tokuiType = 'command';\n wrapper._slot = list; // 流式 command-group 子节点落入 list(非 wrapper)\n wrapper._openCommand = openCommand;\n wrapper._closeCommand = closeCommand;\n // 流式收尾:子项到齐后重新收集(mount 模式下 idempotent,无副作用)\n wrapper._streamCloseHook = function () { collectItems(); filterItems(input.value || ''); };\n\n return wrapper;\n });\n\n // 构建 command 命令项 DOM(command-group 的子节点,标签可以是 command-item 或 item)。\n // 盖 data-tokui-tag=node.type 印章,让 Playground 按 [item]/[command-item] 各自代码行定位。\n // item 与 command-item 在 command-group 内等价(item 同名按父级区分)。\n function buildCommandItem(node) {\n var attrs = node.attrs || {};\n var text = attrs.tx || '';\n var value = attrs.v || text;\n\n var item = el('div', {\n class: 'tokui-command__item',\n role: 'option',\n tabindex: '-1',\n 'data-value': value,\n 'aria-selected': 'false',\n 'data-tokui-tag': node.type\n });\n if (attrs.clk) item.setAttribute('data-tokui-clk', attrs.clk);\n\n var textSpan = el('span', { class: 'tokui-command__item-text' });\n textSpan.textContent = text;\n item.appendChild(textSpan);\n\n // 快捷键提示(可选)\n if (attrs.shortcut) {\n var shortcut = el('span', { class: 'tokui-command__item-shortcut' });\n shortcut.textContent = attrs.shortcut;\n item.appendChild(shortcut);\n }\n\n // 点击选中\n item.addEventListener('click', function() {\n // 找到父级 command 容器\n var cmd = item.closest ? item.closest('.tokui-command') : null;\n if (cmd && cmd._closeCommand) {\n // 触发事件\n var handlerName = item.getAttribute('data-tokui-clk');\n if (handlerName) {\n var bus = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus && typeof bus.emit === 'function') {\n bus.emit(handlerName, { value: value, text: text });\n }\n }\n // command-level clk\n var rootClk = cmd.getAttribute('data-tokui-clk');\n if (rootClk) {\n var bus2 = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? window.TokUI._internal.eventBus : null;\n if (bus2 && typeof bus2.emit === 'function') {\n bus2.emit(rootClk, { value: value, text: text, clk: handlerName });\n }\n }\n cmd._closeCommand();\n }\n });\n\n // 鼠标悬浮选中\n item.addEventListener('mouseenter', function() {\n var parentList = item.closest ? item.closest('.tokui-command__list') : null;\n if (!parentList) return;\n var visible = Array.from(parentList.querySelectorAll('.tokui-command__item:not([style*=\"display: none\"])'));\n visible.forEach(function(v) {\n v.classList.remove('tokui-command__item--selected');\n v.setAttribute('aria-selected', 'false');\n });\n item.classList.add('tokui-command__item--selected');\n item.setAttribute('aria-selected', 'true');\n });\n\n return item;\n }\n\n // 跨模块共享:layout.js 的 item 渲染器在 command-group 内复用本构建器(经 _internal,同 el)\n if (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal) {\n window.TokUI._internal.buildCommandItem = buildCommandItem;\n }\n\n // === Command.Group 命令分组(容器)===\n // attrs.tt = 分组标题\n // 子节点: command-item 或 item(在 command-group 内等价)\n renderer.register('command-group', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || '';\n\n var group = el('div', { class: 'tokui-command__group', role: 'group' });\n if (title) {\n group.setAttribute('aria-label', title);\n var heading = el('div', { class: 'tokui-command__group-heading' });\n heading.textContent = title;\n group.appendChild(heading);\n }\n\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) group.appendChild(child);\n });\n\n group._slot = group;\n group._tokuiType = 'command-group';\n return group;\n });\n\n // === Command.Item 命令项(自闭合)===\n // attrs.tx = 显示文本, attrs.clk = 点击事件, attrs.v = 搜索值\n renderer.register('command-item', (node) => {\n return buildCommandItem(node);\n });\n\n // === Canvas 侧边预览面板(容器)===\n // attrs.tt = 标题(默认\"Canvas\"), attrs.pos = 位置(right/left, 默认right)\n // attrs.w = 宽度(px, 默认400), attrs.tx = 文本内容(自闭合模式)\n // attrs.open = 布尔, 初始展开, attrs.closable = 显示关闭按钮(默认true)\n // 子容器: canvas-content(内容区)\n renderer.register('canvas', (node, rc) => {\n var attrs = node.attrs || {};\n var title = attrs.tt || 'Canvas';\n var pos = attrs.pos || 'right';\n var width = parseInt(attrs.w) || 400;\n var isOpen = attrs.open !== undefined;\n var isClosable = attrs.closable === undefined || attrs.closable === true;\n\n var classes = ['tokui-canvas', 'tokui-canvas--' + pos];\n if (isOpen) classes.push('tokui-canvas--open');\n\n var wrapper = el('div', { class: classes.join(' ') });\n wrapper.style.setProperty('--tokui-canvas-w', width + 'px');\n\n // 切换标签(折叠时显示在边缘)\n var toggle = el('button', {\n class: 'tokui-canvas__toggle',\n type: 'button',\n 'aria-label': isOpen ? 'Close panel' : 'Open panel'\n });\n // 竖排文字\n toggle.textContent = title;\n toggle.addEventListener('click', function() {\n var wasOpen = wrapper.classList.contains('tokui-canvas--open');\n wrapper.classList.toggle('tokui-canvas--open');\n toggle.setAttribute('aria-label', wasOpen ? 'Open panel' : 'Close panel');\n });\n wrapper.appendChild(toggle);\n\n // 面板主体\n var panel = el('div', { class: 'tokui-canvas__panel' });\n panel.style.width = width + 'px';\n\n // Header\n var header = el('div', { class: 'tokui-canvas__header' });\n var titleEl = el('span', { class: 'tokui-canvas__title' });\n titleEl.textContent = title;\n header.appendChild(titleEl);\n\n if (isClosable) {\n var closeBtn = el('button', {\n class: 'tokui-canvas__close',\n type: 'button',\n 'aria-label': 'Close'\n });\n closeBtn.innerHTML = '&times;';\n closeBtn.addEventListener('click', function() {\n wrapper.classList.remove('tokui-canvas--open');\n toggle.setAttribute('aria-label', 'Open panel');\n });\n header.appendChild(closeBtn);\n }\n panel.appendChild(header);\n\n // Body 内容区\n var body = el('div', { class: 'tokui-canvas__body' });\n\n // 自闭合模式:tx 属性作为文本内容\n if (attrs.tx) {\n body.textContent = attrs.tx;\n }\n\n // 渲染子节点(包括 canvas-content)\n var rendered = rc(node.children || []);\n rendered.forEach(function(child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n\n panel.appendChild(body);\n wrapper.appendChild(panel);\n\n wrapper._slot = body;\n wrapper._tokuiType = 'canvas';\n wrapper._update = function(uAttrs) {\n if (uAttrs.tt !== undefined) {\n var t = wrapper.querySelector('.tokui-canvas__title');\n if (t) t.textContent = uAttrs.tt;\n toggle.textContent = uAttrs.tt;\n }\n if (uAttrs.act === 'open') wrapper.classList.add('tokui-canvas--open');\n else if (uAttrs.act === 'close') wrapper.classList.remove('tokui-canvas--open');\n else if (uAttrs.act === 'toggle') wrapper.classList.toggle('tokui-canvas--open');\n };\n return wrapper;\n });\n\n // === Canvas Content 侧边面板内容区(容器)===\n // 简单的 pass-through 容器,子节点直接渲染\n renderer.register('canvas-content', (node, rc) => {\n var content = el('div', { class: 'tokui-canvas__content' });\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) content.appendChild(child);\n });\n content._slot = content;\n content._tokuiType = 'canvas-content';\n return content;\n });\n}\n\n/**\n * 生成文件类型 SVG 图标\n * @param {string} type - 文件类型\n * @param {string} color - 图标颜色\n * @returns {string} SVG HTML 字符串\n */\nfunction getFileTypeSVG(type, color) {\n var sw = '1.5';\n var cap = 'round';\n var join = 'round';\n var doc = '<path d=\"M6 2h8l6 6v12a2 2 0 01-2 2H6a2 2 0 01-2-2V4a2 2 0 012-2z\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"' + sw + '\" stroke-linecap=\"' + cap + '\" stroke-linejoin=\"' + join + '\"/><path d=\"M14 2v6h6\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"' + sw + '\" stroke-linecap=\"' + cap + '\" stroke-linejoin=\"' + join + '\"/>';\n var icons = {\n pdf: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<text x=\"12\" y=\"16.5\" text-anchor=\"middle\" font-size=\"5.5\" font-weight=\"700\" font-family=\"sans-serif\" fill=\"' + color + '\">PDF</text></svg>',\n word: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<text x=\"12\" y=\"16.5\" text-anchor=\"middle\" font-size=\"7\" font-weight=\"700\" font-family=\"sans-serif\" fill=\"' + color + '\">W</text></svg>',\n excel: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<path d=\"M9 11v6M12 11v6M8 14h4\" stroke=\"' + color + '\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n ppt: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<circle cx=\"12\" cy=\"14\" r=\"3\" stroke=\"' + color + '\" stroke-width=\"1.5\" fill=\"none\"/></svg>',\n zip: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<path d=\"M10 10h4M10 13h4M10 16h2\" stroke=\"' + color + '\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n code: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<path d=\"M9 12l-2 2 2 2M15 12l2 2-2 2\" stroke=\"' + color + '\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n video: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<path d=\"M10 12.5l4-2.5v5l-4-2.5z\" fill=\"none\" stroke=\"' + color + '\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/></svg>',\n audio: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<path d=\"M10 15v-3M12 13v4M14 11v6\" stroke=\"' + color + '\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>',\n image: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<circle cx=\"10\" cy=\"11\" r=\"1.5\" stroke=\"' + color + '\" stroke-width=\"1.2\" fill=\"none\"/><path d=\"M8 17l3-3 2 2 3-4 3 5H8z\" stroke=\"' + color + '\" stroke-width=\"1.2\" stroke-linejoin=\"round\" fill=\"none\"/></svg>',\n default: '<svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\">' + doc + '<path d=\"M9 12h6M9 15h4\" stroke=\"' + color + '\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>'\n };\n return icons[type] || icons.default;\n}\n\n/**\n * 生成分页页码数组,含省略号\n * @param {number} current - 当前页\n * @param {number} total - 总页数\n * @returns {Array<number|string>} 页码数组\n */\nfunction generatePages(current, total) {\n if (total <= 7) {\n var arr = [];\n for (var i = 1; i <= total; i++) arr.push(i);\n return arr;\n }\n var pages = [1];\n if (current > 3) pages.push('...');\n var start = Math.max(2, current - 1);\n var end = Math.min(total - 1, current + 1);\n for (var j = start; j <= end; j++) pages.push(j);\n if (current < total - 2) pages.push('...');\n pages.push(total);\n return pages;\n}\n\n/**\n * 关闭页面上所有打开的 dropdown 面板\n */\nfunction closeAllDropdowns() {\n if (typeof document === 'undefined') return;\n var openPanels = document.querySelectorAll('.tokui-dropdown__panel--open');\n openPanels.forEach(function (panel) {\n panel.classList.remove('tokui-dropdown__panel--open');\n panel.style.top = '';\n panel.style.left = '';\n var trigger = panel.parentElement.querySelector('.tokui-dropdown__trigger');\n if (trigger) trigger.setAttribute('aria-expanded', 'false');\n });\n}\n\n// 全局点击关闭 dropdown\nif (typeof document !== 'undefined' && typeof document.addEventListener === 'function') {\n document.addEventListener('click', function () {\n closeAllDropdowns();\n });\n}\n\n/**\n * 为 Markdown 容器内的图片绑定 lightbox 点击事件。\n * 同一个 md 容器内的所有图片共享一个列表,支持左右切换。\n */\nfunction bindMdLightbox(container) {\n const imgs = container.querySelectorAll('.tokui-md-img');\n if (!imgs.length) return;\n const srcList = Array.from(imgs).map(function (img) { return img.src; });\n imgs.forEach(function (img, index) {\n img.style.cursor = 'pointer';\n img.addEventListener('click', function () {\n const { getLightbox } = (typeof require === 'function')\n ? require('./lightbox')\n : window.TokUI._internal;\n const lb = getLightbox(typeof document !== 'undefined' ? document : undefined);\n lb.open(srcList[index], srcList);\n });\n });\n}\n\n/**\n * 简易 Markdown 转 HTML 解析器(增强版)\n * 支持:加粗、斜体、删除线、行内代码、链接、图片、标题、有序/无序列表、\n * 表格(含对齐)、代码围栏、任务列表、引用块、分隔线、段落。\n * 用于 [md] 组件的内容渲染。\n *\n * @param {string} text - Markdown 文本\n * @returns {string} 转换后的 HTML 字符串\n */\nfunction simpleMarkdown(text) {\n if (!text) return '';\n\n // 解析表格行 | cell | cell |\n function parseTableRow(line) {\n return line.trim().replace(/^\\|/, '').replace(/\\|$/, '').split('|').map(function (c) { return c.trim(); });\n }\n\n // 解析表格对齐方式(分隔行 → align 数组)\n function parseTableAlign(sepLine) {\n return sepLine.trim().replace(/^\\|/, '').replace(/\\|$/, '').split('|').map(function (cell) {\n cell = cell.trim();\n if (/^:-+:$/.test(cell)) return 'center';\n if (/^-+:$/.test(cell)) return 'right';\n if (/^:-+$/.test(cell)) return 'left';\n return 'left';\n });\n }\n\n // 行内格式处理(含 HTML 转义)\n function _escAttr(s) {\n return String(s).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n function inlineFormat(text) {\n text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n text = text.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\n text = text.replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n text = text.replace(/~~(.+?)~~/g, '<del>$1</del>');\n text = text.replace(/`([^`]+)`/g, '<code>$1</code>');\n // 图片 ![alt](url) 必须在链接之前处理\n text = text.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, function (match, alt, src) {\n if (!/^https?:\\/\\//i.test(src)) return match;\n return '<img src=\"' + _escAttr(src) + '\" alt=\"' + _escAttr(alt) + '\" class=\"tokui-md-img\" />';\n });\n text = text.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, function (match, t, url) {\n if (!/^(https?:\\/\\/|mailto:|\\/|#)/i.test(url)) url = '#';\n return '<a href=\"' + _escAttr(url) + '\" target=\"_blank\" rel=\"noopener\">' + t + '</a>';\n });\n return text;\n }\n\n // 预处理:提取代码围栏,替换为占位符,避免后续处理破坏代码内容\n var codeFences = [];\n text = text.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, function(match, lang, code) {\n var idx = codeFences.length;\n codeFences.push({ lang: lang, code: code.replace(/\\n$/, '') });\n return '\\x02CODEFENCE' + idx + '\\x03';\n });\n\n // 预处理:提取水平线(避免 inlineFormat 将 *** 处理为粗体/斜体)\n var HR_PLACEHOLDER = '\\x02TOKUIHR\\x03';\n text = text.replace(/^(?:\\*{3,}|-{3,}|_{3,})\\s*$/gm, HR_PLACEHOLDER);\n\n // 按空行分割为段落块,每个块独立处理\n var blocks = text.split(/\\n{2,}/);\n\n return blocks.map(function (block) {\n block = block.trim();\n if (!block) return '';\n\n // 还原代码围栏占位符,检查是否整个块就是代码围栏\n var fenceMatch = block.match(/^\\x02CODEFENCE(\\d+)\\x03$/);\n if (fenceMatch) {\n var fence = codeFences[parseInt(fenceMatch[1])];\n var lang = fence.lang || 'text';\n var highlighted = HL_LANGS[lang] ? highlightCode(fence.code, lang) : fence.code.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n return '<pre class=\"tokui-code\"><code class=\"language-' + lang + '\">' + highlighted + '</code></pre>';\n }\n\n // 先对整块做行内格式处理\n block = inlineFormat(block);\n\n // 按行处理块级元素\n var lines = block.split('\\n');\n var result = [];\n var inUl = false;\n var inOl = false;\n var inQuote = false;\n var hasBlock = false;\n\n // 检测 Markdown 表格\n var tableStart = -1;\n for (var ti = 0; ti < lines.length; ti++) {\n if (lines[ti].trim().indexOf('|') === 0) { tableStart = ti; break; }\n }\n if (tableStart !== -1) {\n var tableLines = [];\n var tableEnd = tableStart;\n for (var ti2 = tableStart; ti2 < lines.length; ti2++) {\n if (lines[ti2].trim().indexOf('|') === 0) {\n tableLines.push(lines[ti2]);\n tableEnd = ti2;\n } else {\n break;\n }\n }\n if (tableLines.length >= 2 && /^\\|[\\s\\-:|]+\\|$/.test(tableLines[1].trim())) {\n // 处理表格前的行\n for (var pi = 0; pi < tableStart; pi++) {\n processBlockLine(lines[pi]);\n }\n // 渲染表格(含对齐)\n hasBlock = true;\n var aligns = parseTableAlign(tableLines[1]);\n var tableHtml = '<table class=\"tokui-md-table\"><thead><tr>';\n var headers = parseTableRow(tableLines[0]);\n for (var hi = 0; hi < headers.length; hi++) {\n var align = aligns[hi] || 'left';\n tableHtml += '<th style=\"text-align:' + align + '\">' + headers[hi] + '</th>';\n }\n tableHtml += '</tr></thead><tbody>';\n for (var ri = 2; ri < tableLines.length; ri++) {\n var cells = parseTableRow(tableLines[ri]);\n tableHtml += '<tr>';\n for (var ci = 0; ci < cells.length; ci++) {\n var cellAlign = aligns[ci] || 'left';\n tableHtml += '<td style=\"text-align:' + cellAlign + '\">' + cells[ci] + '</td>';\n }\n tableHtml += '</tr>';\n }\n tableHtml += '</tbody></table>';\n result.push(tableHtml);\n // 处理表格后的行\n for (var ai = tableEnd + 1; ai < lines.length; ai++) {\n processBlockLine(lines[ai]);\n }\n if (inUl) result.push('</ul>');\n if (inOl) result.push('</ol>');\n if (inQuote) result.push('</blockquote>');\n var html = result.join('');\n if (!hasBlock) return '<p>' + html + '</p>';\n return html;\n }\n }\n\n for (var li = 0; li < lines.length; li++) {\n processBlockLine(lines[li]);\n }\n if (inUl) result.push('</ul>');\n if (inOl) result.push('</ol>');\n if (inQuote) result.push('</blockquote>');\n\n var html = result.join('');\n if (!hasBlock) return '<p>' + html + '</p>';\n return html;\n\n function processBlockLine(line) {\n // 水平线 --- / *** / ___ (original or preprocessed placeholder)\n if (line.trim() === '\\x02TOKUIHR\\x03' || /^(\\*{3,}|-{3,}|_{3,})\\s*$/.test(line.trim())) {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (inQuote) { result.push('</blockquote>'); inQuote = false; }\n hasBlock = true;\n result.push('<hr class=\"tokui-md__hr\">');\n return;\n }\n // 引用块\n if (line.match(/^&gt;\\s*/)) {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (!inQuote) { result.push('<blockquote class=\"tokui-md__quote\">'); inQuote = true; }\n hasBlock = true;\n var quoteContent = line.replace(/^&gt;\\s*/, '');\n result.push('<p>' + quoteContent + '</p>');\n return;\n }\n if (inQuote && !line.match(/^&gt;\\s*/)) {\n result.push('</blockquote>'); inQuote = false;\n }\n if (line.match(/^### /)) {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (inQuote) { result.push('</blockquote>'); inQuote = false; }\n hasBlock = true;\n result.push(line.replace(/^### (.+)$/, '<h3>$1</h3>'));\n } else if (line.match(/^## /)) {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (inQuote) { result.push('</blockquote>'); inQuote = false; }\n hasBlock = true;\n result.push(line.replace(/^## (.+)$/, '<h2>$1</h2>'));\n } else if (line.match(/^# /)) {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (inQuote) { result.push('</blockquote>'); inQuote = false; }\n hasBlock = true;\n result.push(line.replace(/^# (.+)$/, '<h1>$1</h1>'));\n } else if (line.match(/^- \\[[ xX]\\] /)) {\n // 任务列表\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (!inUl) { result.push('<ul class=\"tokui-md__tasks\">'); inUl = true; }\n hasBlock = true;\n var checked = /^- \\[[xX]\\] /.test(line);\n var taskText = line.replace(/^- \\[[xX ]\\] /, '');\n result.push('<li class=\"tokui-md__task\"><input type=\"checkbox\" disabled' + (checked ? ' checked' : '') + '>' + taskText + '</li>');\n } else if (line.match(/^- /)) {\n if (inOl) { result.push('</ol>'); inOl = false; }\n if (!inUl) { result.push('<ul>'); inUl = true; }\n hasBlock = true;\n result.push(line.replace(/^- (.+)$/, '<li>$1</li>'));\n } else if (line.match(/^\\d+\\. /)) {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (!inOl) { result.push('<ol>'); inOl = true; }\n hasBlock = true;\n result.push(line.replace(/^\\d+\\. (.+)$/, '<li>$1</li>'));\n } else {\n if (inUl) { result.push('</ul>'); inUl = false; }\n if (inOl) { result.push('</ol>'); inOl = false; }\n result.push(line);\n }\n }\n }).join('');\n}\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.registerBasicComponents = registerBasicComponents;\n window.TokUI._internal.resolveColor = resolveColor;\n window.TokUI._internal.highlightCode = highlightCode;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { registerBasicComponents, resolveColor, highlightCode };\n}\n","/**\n * TokUI 表格组件模块\n * 注册表格相关组件:table、thead、tbody、tr。\n * 支持斑马纹效果、表头简写(cols 属性)、特殊列(chk/序号/操作)。\n *\n * DSL 示例:\n * [table stripe]\n * [thead cols:chk,#,姓名,部门,操作]\n * [tbody]\n * [tr chk,1,张三,技术部,btn:编辑 clk:edit|btn:删除 clk:del]\n * [/tbody]\n * [/table]\n */\n'use strict';\n\n/**\n * 解析操作列按钮语法:btn:文本 clk:handler v:variant key:value|btn:...\n * 以 | 分隔多个按钮,空格分隔属性\n */\nfunction parseActionCells(content, el) {\n const container = el('div', {});\n container.style.display = 'flex';\n container.style.gap = '6px';\n container.style.alignItems = 'center';\n content.split('|').forEach(seg => {\n const trimmed = seg.trim();\n if (!trimmed) return;\n const parts = trimmed.split(/\\s+/);\n let text = '';\n const attrs = { class: 'tokui-tbtn', type: 'button' };\n parts.forEach((part, i) => {\n if (i === 0 && part.startsWith('btn:')) {\n text = part.slice(4);\n } else if (part.startsWith('clk:')) {\n attrs['data-tokui-clk'] = part.slice(4);\n } else if (part.startsWith('v:')) {\n attrs.class += ' tokui-tbtn--' + part.slice(2);\n } else if (part.includes(':')) {\n const ci = part.indexOf(':');\n const key = part.slice(0, ci);\n // 已有 data- 前缀则不加,否则加 data- 前缀\n attrs[key.startsWith('data-') ? key : 'data-' + key] = part.slice(ci + 1);\n }\n });\n container.appendChild(el('button', attrs, text));\n });\n return container;\n}\n\n/**\n * 注册表格组件到渲染器\n * @param {TokUIRenderer} renderer - 渲染器实例\n */\nfunction registerTableComponents(renderer) {\n const _mod = (typeof require === 'function')\n ? require('../core/renderer')\n : window.TokUI._internal;\n const { el } = _mod;\n // parseTag 用于把单元格内泄漏的方括号组件重建为节点内联渲染\n const _parseTag = (typeof require === 'function')\n ? require('../core/parser').parseTag\n : window.TokUI._internal.parseTag;\n\n /**\n * 将单元格内泄漏的方括号组件(如 [tag 5%]、[progress v:98])重建并内联渲染。\n * 解析器遇到 tr 这类叶子节点时,内层 [tag ...] 的 ] 会被外层 tr 截断,\n * 导致字面文本泄漏。此处兜底:识别 [type ... 形态,补全后渲染。\n * @returns {HTMLElement|null} 渲染成功的 DOM,失败返回 null\n */\n function renderInlineCell(cellStr) {\n const m = cellStr.match(/^\\[([a-zA-Z][\\w-]*)\\b([\\s\\S]*)$/);\n if (!m) return null;\n // 去除可能残留的尾部 ],再补全为完整组件描述交给 parseTag\n let inner = (m[1] + (m[2] || '')).replace(/\\]\\s*$/, '').trim();\n if (!inner) return null;\n try {\n const sub = _parseTag(inner);\n if (!sub || !sub.type) return null;\n const dom = renderer.render(sub);\n return (dom && dom.nodeType) ? dom : null;\n } catch (e) {\n return null;\n }\n }\n\n // 列类型映射,thead cols 中使用\n const COL_TYPES = {\n chk: { label: '', cls: 'tokui-col-chk' },\n '#': { label: '#', cls: 'tokui-col-seq' }\n };\n\n // 解析列定义:name | name/align | chk | #/align | name:旧语法\n // align 支持 c/center、r/right、l/left\n function parseColSpec(col) {\n var slashIdx = col.indexOf('/');\n var head = slashIdx > 0 ? col.slice(0, slashIdx) : col;\n var alignRaw = slashIdx > 0 ? col.slice(slashIdx + 1).trim().toLowerCase() : '';\n var colonIdx = head.indexOf(':');\n var name = colonIdx > 0 ? head.slice(0, colonIdx) : head;\n var ALIGNS = { c: 'center', center: 'center', r: 'right', right: 'right', l: 'left', left: 'left' };\n return { name: name, align: ALIGNS[alignRaw] || '' };\n }\n\n // 当前表格的列类型 / 对齐(流式渲染时通过模块变量传递)\n let _tableColTypes = [];\n let _tableColAligns = [];\n let _tableSeqNum = 0;\n\n // checkbox 列联动:表头全选框 ↔ 各行框(主流全选 / 半选 indeterminate 行为)\n function syncChkAll(table) {\n const all = table.querySelector('.tokui-chk-all');\n if (!all) return;\n const rows = table.querySelectorAll('.tokui-chk-row');\n const checked = table.querySelectorAll('.tokui-chk-row:checked');\n all.checked = rows.length > 0 && checked.length === rows.length;\n all.indeterminate = checked.length > 0 && checked.length < rows.length;\n }\n\n // === 表格容器 ===\n renderer.register('table', (node, rc) => {\n const attrs = { class: 'tokui-table', role: 'table' };\n if (node.attrs.id) attrs.id = node.attrs.id;\n if (node.attrs.stripe !== undefined) {\n attrs.class += ' tokui-table--stripe';\n }\n const wrapper = el('div', { class: 'tokui-table-wrapper' });\n const table = el('table', attrs);\n if (node.attrs.cap || node.attrs.caption) {\n table.appendChild(el('caption', {}, node.attrs.cap || node.attrs.caption));\n }\n\n // 提取列类型 / 对齐定义,注入到子解析节点供 tbody/tr 使用\n const colTypes = [];\n const colAligns = [];\n const theadNode = node.children.find(c => c.type === 'thead');\n if (theadNode && theadNode.attrs.cols) {\n theadNode.attrs.cols.split(',').forEach(col => {\n const spec = parseColSpec(col);\n colTypes.push(COL_TYPES[spec.name] ? spec.name : null);\n colAligns.push(spec.align);\n });\n }\n // 将 colTypes / colAligns 传递给子节点\n node.children.forEach(child => {\n child._colTypes = colTypes;\n child._colAligns = colAligns;\n });\n\n rc(node.children).forEach(child => {\n if (child && child.nodeType) table.appendChild(child);\n });\n wrapper.appendChild(table);\n wrapper._slot = table;\n wrapper._tokuiType = 'table';\n return wrapper;\n });\n\n // === 表头 ===\n renderer.register('thead', (node) => {\n const thead = el('thead', { class: 'tokui-thead' });\n const tr = el('tr', { class: 'tokui-thead-row' });\n\n if (node.attrs.cols) {\n // 重置列类型 / 对齐 / 序号\n _tableColTypes = [];\n _tableColAligns = [];\n _tableSeqNum = 0;\n\n node.attrs.cols.split(',').forEach(col => {\n const spec = parseColSpec(col);\n const name = spec.name;\n const alignCls = spec.align ? 'tokui-col-' + spec.align : '';\n const thAttrs = { scope: 'col' };\n\n // 记录列类型 / 对齐\n _tableColTypes.push(COL_TYPES[name] ? name : null);\n _tableColAligns.push(spec.align);\n\n // 特殊列类型\n if (name === 'chk') {\n // checkbox 列:表头放全选 checkbox\n thAttrs.class = 'tokui-col-chk' + (alignCls ? ' ' + alignCls : '');\n const chk = el('input', { type: 'checkbox', class: 'tokui-chk-all' });\n // 点击表头全选:切换所有行;半选态清零\n chk.addEventListener('change', function () {\n const table = chk.closest('table');\n if (!table) return;\n table.querySelectorAll('.tokui-chk-row').forEach(function (r) {\n r.checked = chk.checked;\n });\n chk.indeterminate = false;\n });\n const th = el('th', thAttrs);\n th.appendChild(chk);\n tr.appendChild(th);\n return;\n }\n if (name === '#') {\n thAttrs.class = 'tokui-col-seq' + (alignCls ? ' ' + alignCls : '');\n tr.appendChild(el('th', thAttrs, '#'));\n return;\n }\n\n thAttrs.class = alignCls;\n tr.appendChild(el('th', thAttrs, name));\n });\n } else {\n node.children.forEach(tcol => {\n const text = (tcol.attrs && tcol.attrs.n) || '';\n // tcol 占位渲染器返回空文本,这里才是它真正的 DOM(th 单元格);\n // 盖 data-tokui-tag=tcol 印章,供文档 Playground 点击 [tcol] 代码行定位。\n tr.appendChild(el('th', { scope: 'col', 'data-tokui-tag': tcol.type === 'tcol' ? 'tcol' : null }, text));\n });\n }\n\n thead.appendChild(tr);\n thead._slot = tr;\n thead._tokuiType = 'thead';\n return thead;\n });\n\n // === 表格主体 ===\n renderer.register('tbody', (node, rc) => {\n const tbody = el('tbody', { class: 'tokui-tbody' });\n const colTypes = node._colTypes || _tableColTypes;\n const colAligns = node._colAligns || _tableColAligns;\n node.children.forEach(child => {\n child._colTypes = colTypes;\n child._colAligns = colAligns;\n child._seqNum = ++_tableSeqNum;\n });\n\n rc(node.children).forEach(row => {\n if (row && row.nodeType) {\n tbody.appendChild(row);\n }\n });\n // mousedown 记录 shift 状态(change 事件本身不带 shiftKey)\n tbody.addEventListener('mousedown', function (e) {\n const t = e.target;\n tbody.__tokuiShift = !!(t && t.classList && t.classList.contains('tokui-chk-row') && e.shiftKey);\n });\n // 行 checkbox 变化(事件委托,流式新增行也生效)→ 区间选择 / 同步表头\n tbody.addEventListener('change', function (e) {\n const t = e.target;\n if (!t || !t.classList || !t.classList.contains('tokui-chk-row')) return;\n const table = tbody.closest('table');\n if (!table) return;\n const rows = Array.prototype.slice.call(table.querySelectorAll('.tokui-chk-row'));\n const idx = rows.indexOf(t);\n const shifted = tbody.__tokuiShift;\n tbody.__tokuiShift = false;\n const anchor = table.__tokuiChkAnchor;\n // shift + 有效锚点:以当前行新状态覆盖 [anchor, idx] 区间(锚点不动,可连续扩展)\n if (shifted && anchor != null && anchor >= 0 && idx >= 0 && anchor !== idx) {\n const from = Math.min(anchor, idx);\n const to = Math.max(anchor, idx);\n const target = t.checked; // change 时已是最终态\n for (let i = from; i <= to; i++) rows[i].checked = target;\n } else if (idx >= 0) {\n table.__tokuiChkAnchor = idx; // 普通点击:更新锚点\n }\n syncChkAll(table);\n });\n tbody._slot = tbody;\n tbody._tokuiType = 'tbody';\n return tbody;\n });\n\n // === 表格行 ===\n function smartSplit(str) {\n const result = [];\n let current = '';\n let inQuotes = false;\n for (let i = 0; i < str.length; i++) {\n const ch = str[i];\n if (ch === '\"') {\n inQuotes = !inQuotes;\n } else if (ch === ',' && !inQuotes) {\n result.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n result.push(current);\n return result;\n }\n\n renderer.register('tr', (node) => {\n const tr = el('tr', { class: 'tokui-table-row', role: 'row' });\n var colspanVal = node.attrs && node.attrs.cs ? parseInt(node.attrs.cs) : 0;\n const colTypes = node._colTypes || _tableColTypes;\n const colAligns = node._colAligns || _tableColAligns;\n const seqNum = node._seqNum || ++_tableSeqNum;\n\n if (node.content) {\n // parseTag 对含空格的引用内容恢复双引号,tr 需要去掉外层引号以正确分割逗号\n var content = node.content;\n if (content.length > 1 && content.charAt(0) === '\"' && content.charAt(content.length - 1) === '\"') {\n content = content.slice(1, -1);\n }\n const cells = smartSplit(content);\n cells.forEach((val, idx) => {\n const tdAttrs = { class: 'tokui-td' };\n // 列对齐类(来自 thead cols 的 /align)\n const align = colAligns[idx];\n if (align) tdAttrs.class += ' tokui-col-' + align;\n if (idx === 0 && colspanVal >= 2) {\n tdAttrs.colspan = String(colspanVal);\n }\n if (idx > 0 && idx < colspanVal) return;\n\n const trimmed = val.trim();\n\n // 特殊列:checkbox\n if (colTypes[idx] === 'chk') {\n tdAttrs.class += ' tokui-col-chk';\n const td = el('td', tdAttrs);\n td.appendChild(el('input', { type: 'checkbox', class: 'tokui-chk-row' }));\n tr.appendChild(td);\n return;\n }\n\n // 特殊列:序号\n if (colTypes[idx] === '#') {\n tdAttrs.class += ' tokui-col-seq';\n tr.appendChild(el('td', tdAttrs, String(seqNum)));\n return;\n }\n\n // 内联组件泄漏修复:[tag 5%] / [progress v:98] / [badge ...] 等方括号组件\n const inlineDom = renderInlineCell(trimmed);\n if (inlineDom) {\n tdAttrs.class += ' tokui-td--inline';\n const td = el('td', tdAttrs);\n td.appendChild(inlineDom);\n tr.appendChild(td);\n return;\n }\n\n // 操作列:内容以 btn: 开头\n if (trimmed.startsWith('btn:')) {\n tdAttrs.class += ' tokui-col-action';\n const td = el('td', tdAttrs);\n td.appendChild(parseActionCells(trimmed, el));\n tr.appendChild(td);\n return;\n }\n\n // 标签列:内容以 tag: 开头,格式 tag:文本 t:类型\n if (trimmed.startsWith('tag:')) {\n const td = el('td', tdAttrs);\n const parts = trimmed.split(/\\s+/);\n let tagText = '';\n const tagAttrs = { class: 'tokui-tag' };\n parts.forEach(part => {\n if (part.startsWith('tag:')) {\n tagText = part.slice(4);\n } else if (part.startsWith('t:')) {\n tagAttrs.class += ' tokui-tag--' + part.slice(2);\n }\n });\n const span = el('span', tagAttrs, tagText);\n td.appendChild(span);\n tr.appendChild(td);\n return;\n }\n\n // 进度列:内容以 progress 开头,格式 progress v:N t:span\n if (trimmed.startsWith('progress')) {\n const td = el('td', tdAttrs);\n const parts = trimmed.split(/\\s+/);\n let progressVal = 0;\n let progressType = 'span';\n let progressStatus = '';\n parts.forEach(part => {\n if (part.startsWith('v:')) {\n progressVal = parseInt(part.slice(2)) || 0;\n } else if (part.startsWith('t:')) {\n progressType = part.slice(2);\n } else if (part.startsWith('status:')) {\n progressStatus = part.slice(7);\n }\n });\n if (progressType === 'span') {\n // 与 progress 组件 span 变体保持一致:mini-bar + mini-fill\n const barOuter = el('span', { class: 'tokui-progress tokui-progress--span' });\n const miniBar = el('span', { class: 'tokui-progress__mini-bar' });\n let fillCls = 'tokui-progress__mini-fill';\n if (progressStatus === 'error') fillCls += ' tokui-progress--error';\n else if (progressVal >= 80) fillCls += ' tokui-progress--success';\n const miniFill = el('span', { class: fillCls });\n miniFill.style.width = progressVal + '%';\n miniBar.appendChild(miniFill);\n barOuter.appendChild(miniBar);\n const text = el('span', { class: 'tokui-progress__span-text' });\n text.textContent = progressVal + '%';\n barOuter.appendChild(text);\n td.appendChild(barOuter);\n }\n tr.appendChild(td);\n return;\n }\n\n tr.appendChild(el('td', tdAttrs, trimmed));\n });\n }\n return tr;\n });\n\n // tcol 占位渲染器:仅 thead 内部消费 attrs,流式独立出现时返回空文本\n renderer.register('tcol', () => {\n return document.createTextNode('');\n });\n}\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.registerTableComponents = registerTableComponents;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { registerTableComponents };\n}\n","/**\n * TokUI 表单组件模块\n * 注册表单相关组件:form、input、pwd、select、radio、opt、checkbox、btn。\n * 支持表单提交事件绑定(sub)和按钮点击事件绑定(clk)。\n *\n * DSL 示例:\n * [form id:login sub:handleLogin]\n * [input t:text l:用户名 id:username req]\n * [pwd l:密码 id:password req]\n * [btn tx:登录 t:submit clk:handleLogin]\n * [/form]\n */\n'use strict';\n\n/**\n * 注册表单组件到渲染器\n * @param {TokUIRenderer} renderer - 渲染器实例\n */\nfunction registerFormComponents(renderer) {\n const { el } = (typeof require === 'function')\n ? require('../core/renderer')\n : window.TokUI._internal;\n const resolveColor = (typeof require === 'function')\n ? require('./basic').resolveColor\n : window.TokUI._internal.resolveColor;\n\n /**\n * 解析 pre/app 属性值:文本 或 文本|variant\n * @param {string} val\n * @returns {{ text: string, variant: string|null }}\n */\n function parsePreAppValue(val) {\n if (!val) return null;\n var pipeIdx = val.indexOf('|');\n if (pipeIdx === -1) return { text: val, variant: null };\n return { text: val.substring(0, pipeIdx), variant: val.substring(pipeIdx + 1) };\n }\n\n /**\n * 解析 prebtn/appbtn 属性值:文本:handler 或 文本:handler|variant\n * @param {string} val\n * @returns {{ text: string, handler: string|null, variant: string|null }}\n */\n function parseBtnValue(val) {\n if (!val) return null;\n var pipeIdx = val.indexOf('|');\n var mainPart = pipeIdx === -1 ? val : val.substring(0, pipeIdx);\n var variant = pipeIdx === -1 ? null : val.substring(pipeIdx + 1);\n var colonIdx = mainPart.indexOf(':');\n if (colonIdx === -1) return { text: mainPart, handler: null, variant: variant };\n return { text: mainPart.substring(0, colonIdx), handler: mainPart.substring(colonIdx + 1), variant: variant };\n }\n\n /**\n * 检测节点是否包含 input-group 属性\n * @param {Object} node\n * @returns {boolean}\n */\n function hasInputGroup(node) {\n var a = node.attrs;\n return !!(a.pre || a.app || a.prebtn || a.appbtn);\n }\n\n /**\n * 构建 input-group 容器及子元素\n * @param {Object} node\n * @param {HTMLElement} inputEl\n * @returns {HTMLElement}\n */\n function buildInputGroup(node, inputEl) {\n var group = el('div', { class: 'tokui-input-group' });\n if (node.attrs.pre) {\n var parsed = parsePreAppValue(node.attrs.pre);\n var cls = parsed.variant ? 'tokui-input-pre tokui-input-pre--' + parsed.variant : 'tokui-input-pre';\n group.appendChild(el('span', { class: cls }, parsed.text));\n }\n if (node.attrs.prebtn) {\n var parsed = parseBtnValue(node.attrs.prebtn);\n var cls = parsed.variant ? 'tokui-input-prebtn tokui-input-prebtn--' + parsed.variant : 'tokui-input-prebtn';\n var btnAttrs = { class: cls, type: 'button' };\n if (parsed.handler) btnAttrs['data-tokui-clk'] = parsed.handler;\n group.appendChild(el('button', btnAttrs, parsed.text));\n }\n group.appendChild(inputEl);\n if (node.attrs.appbtn) {\n var parsed = parseBtnValue(node.attrs.appbtn);\n var cls = parsed.variant ? 'tokui-input-appbtn tokui-input-appbtn--' + parsed.variant : 'tokui-input-appbtn';\n var btnAttrs = { class: cls, type: 'button' };\n if (parsed.handler) btnAttrs['data-tokui-clk'] = parsed.handler;\n group.appendChild(el('button', btnAttrs, parsed.text));\n }\n if (node.attrs.app) {\n var parsed = parsePreAppValue(node.attrs.app);\n var cls = parsed.variant ? 'tokui-input-app tokui-input-app--' + parsed.variant : 'tokui-input-app';\n group.appendChild(el('span', { class: cls }, parsed.text));\n }\n return group;\n }\n\n // === 表单容器 ===\n // attrs.act = action 地址, attrs.mtd = method, attrs.sub = 提交事件处理函数名\n renderer.register('form', (node, rc) => {\n const attrs = { class: 'tokui-form' };\n if (node.attrs.id) attrs.id = node.attrs.id;\n if (node.attrs.act) {\n var actUrl = node.attrs.act;\n if (/^javascript:/i.test(actUrl)) actUrl = '#';\n attrs.action = actUrl;\n }\n if (node.attrs.mtd) attrs.method = node.attrs.mtd;\n if (node.attrs.sub) attrs['data-tokui-sub'] = node.attrs.sub;\n if (node.attrs.clk) attrs['data-tokui-clk'] = node.attrs.clk;\n const form = el('form', attrs);\n rc(node.children).forEach(child => {\n if (child && child.nodeType) form.appendChild(child);\n });\n form._slot = form;\n form._tokuiType = 'form';\n return form;\n });\n\n // === 输入框组件 ===\n // attrs.t = type(默认 text), attrs.l = 标签, attrs.ph = placeholder\n // attrs.req = 必填, attrs.dis = 禁用, attrs.ro = 只读\n // attrs.v = 变体 (inline/error/success/sm/lg/underline/pill,逗号分隔组合)\n // attrs.val = 初始值, attrs.w = 宽度, attrs.hint = 提示文字\n // attrs.search = 搜索图标(true=左侧, 'right'=右侧)\n // pre/app/prebtn/appbtn 支持 input-group\n var svgSearch = '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>';\n renderer.register('input', (node) => {\n var vList = node.attrs.v ? node.attrs.v.split(',').map(function(s) { return s.trim(); }) : [];\n var isInline = vList.indexOf('inline') !== -1;\n var hasSearch = node.attrs.search !== undefined;\n var searchRight = node.attrs.search === 'right';\n var wrapperClass = isInline ? 'tokui-field tokui-field--inline' : 'tokui-field';\n var wrapper = el('div', { class: wrapperClass });\n if (node.attrs.l) {\n var labelAttrs = { class: 'tokui-label' };\n if (node.attrs.id) labelAttrs.for = node.attrs.id;\n wrapper.appendChild(el('label', labelAttrs, node.attrs.l));\n }\n var inputAttrs = { class: 'tokui-input', type: node.attrs.t || 'text' };\n if (node.attrs.id) inputAttrs.id = node.attrs.id;\n if (node.attrs.n) inputAttrs.name = node.attrs.n;\n else if (node.attrs.id) inputAttrs.name = node.attrs.id;\n if (node.attrs.ph) inputAttrs.placeholder = node.attrs.ph;\n if (node.attrs.ml) inputAttrs.maxlength = node.attrs.ml;\n if (node.attrs.min !== undefined) inputAttrs.min = node.attrs.min;\n if (node.attrs.max !== undefined) inputAttrs.max = node.attrs.max;\n if (node.attrs.step !== undefined) inputAttrs.step = node.attrs.step;\n if (node.attrs.req !== undefined) inputAttrs.required = 'required';\n if (node.attrs.dis !== undefined) inputAttrs.disabled = 'disabled';\n if (node.attrs.ro !== undefined) inputAttrs.readonly = 'readonly';\n if (node.attrs.req !== undefined) inputAttrs['aria-required'] = 'true';\n if (node.attrs.val !== undefined) inputAttrs.value = node.attrs.val;\n var inputEl = el('input', inputAttrs);\n if (node.attrs.w) inputEl.style.width = node.attrs.w;\n // 搜索图标包装\n var searchWrap = null;\n if (hasSearch) {\n searchWrap = el('div', { class: 'tokui-search-input' });\n if (searchRight) searchWrap.classList.add('tokui-search-input--right');\n var iconSpan = el('span', { class: 'tokui-search-input__icon' });\n iconSpan.innerHTML = svgSearch;\n searchWrap.appendChild(iconSpan);\n searchWrap.appendChild(inputEl);\n }\n // 决定挂载内容:searchWrap 或 inputEl\n var mountTarget = searchWrap || inputEl;\n if (hasInputGroup(node)) {\n var group = buildInputGroup(node, mountTarget);\n if (vList.indexOf('pill') !== -1) group.classList.add('tokui-input-group--pill');\n wrapper.appendChild(group);\n } else {\n wrapper.appendChild(mountTarget);\n }\n var hintEl = null;\n if (node.attrs.hint) {\n hintEl = el('div', { class: 'tokui-field__hint' }, node.attrs.hint);\n if (vList.indexOf('error') !== -1) hintEl.classList.add('tokui-field__hint--error');\n else if (vList.indexOf('success') !== -1) hintEl.classList.add('tokui-field__hint--success');\n wrapper.appendChild(hintEl);\n }\n wrapper._update = function(uAttrs) {\n if (uAttrs.v !== undefined) inputEl.value = uAttrs.v;\n if (uAttrs.dis === true || uAttrs.dis === 'true') inputEl.disabled = true;\n else if (uAttrs.dis === false || uAttrs.dis === 'false') inputEl.disabled = false;\n if (uAttrs.ph !== undefined) inputEl.placeholder = uAttrs.ph;\n if (uAttrs.ro === true || uAttrs.ro === 'true') inputEl.readOnly = true;\n else if (uAttrs.ro === false || uAttrs.ro === 'false') inputEl.readOnly = false;\n if (uAttrs.hint !== undefined && hintEl) hintEl.textContent = uAttrs.hint;\n };\n wrapper._variantTarget = inputEl;\n return wrapper;\n });\n\n // === 密码输入框组件 ===\n // 与 input 类似,但 type 固定为 password\n // 支持 v:inline/error/success/sm/lg/underline, pre/app/prebtn/appbtn input-group\n // toggle = 密码显示/隐藏切换按钮, val/w/hint 同 input\n renderer.register('pwd', (node) => {\n var vList = node.attrs.v ? node.attrs.v.split(',').map(function(s) { return s.trim(); }) : [];\n var isInline = vList.indexOf('inline') !== -1;\n var wrapperClass = isInline ? 'tokui-field tokui-field--inline' : 'tokui-field';\n var wrapper = el('div', { class: wrapperClass });\n if (node.attrs.l) {\n var labelAttrs = { class: 'tokui-label' };\n if (node.attrs.id) labelAttrs.for = node.attrs.id;\n wrapper.appendChild(el('label', labelAttrs, node.attrs.l));\n }\n var inputAttrs = { class: 'tokui-input', type: 'password' };\n if (node.attrs.id) inputAttrs.id = node.attrs.id;\n if (node.attrs.n) inputAttrs.name = node.attrs.n;\n else if (node.attrs.id) inputAttrs.name = node.attrs.id;\n if (node.attrs.ph) inputAttrs.placeholder = node.attrs.ph;\n if (node.attrs.ml) inputAttrs.maxlength = node.attrs.ml;\n if (node.attrs.min !== undefined) inputAttrs.min = node.attrs.min;\n if (node.attrs.max !== undefined) inputAttrs.max = node.attrs.max;\n if (node.attrs.req !== undefined) inputAttrs.required = 'required';\n if (node.attrs.dis !== undefined) inputAttrs.disabled = 'disabled';\n if (node.attrs.ro !== undefined) inputAttrs.readonly = 'readonly';\n if (node.attrs.req !== undefined) inputAttrs['aria-required'] = 'true';\n if (node.attrs.val !== undefined) inputAttrs.value = node.attrs.val;\n var inputEl = el('input', inputAttrs);\n if (node.attrs.w) inputEl.style.width = node.attrs.w;\n // 密码显示/隐藏切换按钮\n var toggleBtn = null;\n if (node.attrs.toggle !== undefined && !node.attrs.dis) {\n toggleBtn = el('button', { class: 'tokui-pwd-toggle', type: 'button', tabindex: '-1' });\n toggleBtn.setAttribute('aria-label', 'Toggle password visibility');\n // 睁眼 SVG(密码可见)\n var svgEyeOpen = '<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\n // 闭眼 SVG(密码隐藏)\n var svgEyeClosed = '<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\"/><path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\"/><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/><path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\"/></svg>';\n toggleBtn.innerHTML = svgEyeClosed; // 默认隐藏密码\n toggleBtn.addEventListener('click', function() {\n var isPassword = inputEl.type === 'password';\n inputEl.type = isPassword ? 'text' : 'password';\n toggleBtn.innerHTML = isPassword ? svgEyeOpen : svgEyeClosed;\n toggleBtn.classList.toggle('tokui-pwd-toggle--active', isPassword);\n });\n }\n if (hasInputGroup(node) || toggleBtn) {\n var group = buildInputGroup(node, inputEl);\n if (toggleBtn) {\n var next = inputEl.nextSibling;\n if (next) group.insertBefore(toggleBtn, next);\n else group.appendChild(toggleBtn);\n }\n wrapper.appendChild(group);\n } else {\n wrapper.appendChild(inputEl);\n }\n var hintEl = null;\n if (node.attrs.hint) {\n hintEl = el('div', { class: 'tokui-field__hint' }, node.attrs.hint);\n if (vList.indexOf('error') !== -1) hintEl.classList.add('tokui-field__hint--error');\n else if (vList.indexOf('success') !== -1) hintEl.classList.add('tokui-field__hint--success');\n wrapper.appendChild(hintEl);\n }\n wrapper._update = function(uAttrs) {\n if (uAttrs.v !== undefined) inputEl.value = uAttrs.v;\n if (uAttrs.dis === true || uAttrs.dis === 'true') inputEl.disabled = true;\n else if (uAttrs.dis === false || uAttrs.dis === 'false') inputEl.disabled = false;\n if (uAttrs.ph !== undefined) inputEl.placeholder = uAttrs.ph;\n if (uAttrs.ro === true || uAttrs.ro === 'true') inputEl.readOnly = true;\n else if (uAttrs.ro === false || uAttrs.ro === 'false') inputEl.readOnly = false;\n if (uAttrs.hint !== undefined && hintEl) hintEl.textContent = uAttrs.hint;\n };\n wrapper._variantTarget = inputEl;\n return wrapper;\n });\n\n // === 多行文本框组件 ===\n // attrs.ph = placeholder, attrs.rows = 行数, attrs.maxrows = 自动高度最大行数\n // attrs.maxlen = 最大字数, attrs.auto = 自动高度, attrs.tx = 初始内容\n // attrs.ro/dis/req 同 input\n renderer.register('textarea', (node, rc) => {\n const wrapper = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n const labelAttrs = { class: 'tokui-label' };\n if (node.attrs.id) labelAttrs.for = node.attrs.id;\n wrapper.appendChild(el('label', labelAttrs, node.attrs.l));\n }\n\n const maxlen = node.attrs.maxlen ? parseInt(node.attrs.maxlen, 10) : 0;\n const isAuto = node.attrs.auto !== undefined;\n const defaultRows = parseInt(node.attrs.rows, 10) || 4;\n const maxRows = node.attrs.maxrows ? parseInt(node.attrs.maxrows, 10) : 0;\n\n // textarea 容器(用于定位字数统计)\n const box = (maxlen > 0 || isAuto)\n ? el('div', { class: 'tokui-textarea-box' })\n : null;\n if (box) wrapper.appendChild(box);\n\n const taAttrs = { class: 'tokui-input', rows: String(defaultRows) };\n if (node.attrs.id) taAttrs.id = node.attrs.id;\n if (node.attrs.n) taAttrs.name = node.attrs.n;\n else if (node.attrs.id) taAttrs.name = node.attrs.id;\n if (node.attrs.ph) taAttrs.placeholder = node.attrs.ph;\n if (node.attrs.req !== undefined) taAttrs.required = 'required';\n if (node.attrs.dis !== undefined) taAttrs.disabled = 'disabled';\n if (node.attrs.ro !== undefined) taAttrs.readonly = 'readonly';\n if (node.attrs.req !== undefined) taAttrs['aria-required'] = 'true';\n if (maxlen > 0) taAttrs.maxlength = String(maxlen);\n const ta = el('textarea', taAttrs);\n // 内容:children > content > tx 属性\n const text = (node.children && node.children.length > 0)\n ? node.children.map(c => c.content || '').join('')\n : (node.content || node.attrs.tx || '');\n ta.textContent = text;\n\n // 自动高度:根据内容自适应,最小为默认 rows,maxrows 限制最大行数\n if (isAuto) {\n ta.classList.add('tokui-textarea--auto');\n var minPx = 0;\n var maxPx = 0;\n function autoResize() {\n if (!minPx) {\n // 首次:用 rows 计算最小高度,用 maxrows 计算最大高度\n var savedRows = ta.getAttribute('rows');\n ta.setAttribute('rows', '1');\n var lineH = ta.scrollHeight;\n minPx = lineH * defaultRows;\n maxPx = maxRows > 0 ? lineH * maxRows : 0;\n ta.setAttribute('rows', savedRows);\n // 考虑 padding/border 差异,用实际 scrollHeight 校准\n ta.style.height = 'auto';\n var emptyH = ta.scrollHeight;\n minPx = Math.max(minPx, emptyH);\n ta.style.height = minPx + 'px';\n }\n ta.style.height = 'auto';\n var newH = ta.scrollHeight;\n newH = Math.max(newH, minPx);\n if (maxPx > 0) newH = Math.min(newH, maxPx);\n ta.style.height = newH + 'px';\n // 超过最大高度时出现滚动条\n ta.style.overflow = (maxPx > 0 && ta.scrollHeight > maxPx) ? 'auto' : 'hidden';\n }\n if (ta.addEventListener) {\n ta.addEventListener('input', autoResize);\n }\n setTimeout(autoResize, 0);\n }\n\n if (box) {\n box.appendChild(ta);\n if (maxlen > 0) {\n const counter = el('span', { class: 'tokui-textarea-counter' });\n counter.textContent = text.length + '/' + maxlen;\n if (text.length > maxlen) counter.classList.add('tokui-textarea-counter--over');\n box.appendChild(counter);\n ta.addEventListener('input', function () {\n var len = ta.value.length;\n counter.textContent = len + '/' + maxlen;\n if (len > maxlen) counter.classList.add('tokui-textarea-counter--over');\n else counter.classList.remove('tokui-textarea-counter--over');\n });\n }\n } else {\n wrapper.appendChild(ta);\n }\n\n wrapper._update = function(uAttrs) {\n if (uAttrs.v !== undefined) ta.value = uAttrs.v;\n if (uAttrs.dis === true || uAttrs.dis === 'true') ta.disabled = true;\n else if (uAttrs.dis === false || uAttrs.dis === 'false') ta.disabled = false;\n if (uAttrs.ro === true || uAttrs.ro === 'true') ta.readOnly = true;\n else if (uAttrs.ro === false || uAttrs.ro === 'false') ta.readOnly = false;\n };\n wrapper._variantTarget = ta;\n wrapper._slot = ta;\n wrapper._tokuiType = 'textarea';\n return wrapper;\n });\n\n // === 自定义选择器组件 ===\n // 基于 div/ul/li 实现,支持搜索过滤、键盘导航、单选/多选、标签胶囊\n renderer.register('picker', (node, rc) => {\n const isMulti = node.attrs.multi !== undefined;\n const isDisabled = node.attrs.dis !== undefined;\n const name = node.attrs.n || node.attrs.id || 'picker';\n const placeholder = node.attrs.ph || '';\n\n const vList = node.attrs.v ? node.attrs.v.split(',').map(s => s.trim()) : [];\n const isInline = vList.indexOf('inline') !== -1;\n const wrapperClass = isInline ? 'tokui-field tokui-field--inline' : 'tokui-field';\n const wrapper = el('div', { class: wrapperClass });\n if (node.attrs.l) {\n const labelAttrs = { class: 'tokui-label' };\n if (node.attrs.id) labelAttrs.for = node.attrs.id;\n wrapper.appendChild(el('label', labelAttrs, node.attrs.l));\n }\n\n const pickerClasses = ['tokui-picker'];\n if (isMulti) pickerClasses.push('tokui-picker--multi');\n if (isDisabled) pickerClasses.push('tokui-picker--disabled');\n const pickerEl = el('div', { class: pickerClasses.join(' '), 'data-tokui-picker': node.attrs.id || '', role: 'listbox', 'aria-expanded': 'false' });\n\n // 计算预选初始值\n var initialSingleValue = '';\n var initialSingleText = '';\n if (!isMulti) {\n node.children.forEach(optNode => {\n if (optNode.attrs && optNode.attrs.chk !== undefined) {\n initialSingleValue = optNode.attrs.v || '';\n initialSingleText = (optNode.attrs && optNode.attrs.tx) || initialSingleValue;\n }\n });\n }\n\n // 控制区\n const control = el('div', { class: 'tokui-picker-control' });\n if (isMulti) {\n node.children.forEach(optNode => {\n if (optNode.attrs && optNode.attrs.chk !== undefined) {\n control.appendChild(_buildPickerTag(optNode, pickerEl, name));\n }\n });\n }\n const searchAttrs = { class: 'tokui-picker-search', type: 'text', autocomplete: 'off' };\n if (placeholder && !initialSingleText) searchAttrs.placeholder = placeholder;\n if (isDisabled) searchAttrs.disabled = 'disabled';\n if (initialSingleText) searchAttrs.value = initialSingleText;\n control.appendChild(el('input', searchAttrs));\n control.appendChild(el('span', { class: 'tokui-picker-arrow' }));\n pickerEl.appendChild(control);\n\n // 下拉列表\n const dropdown = el('ul', { class: 'tokui-picker-dropdown' });\n node.children.forEach(optNode => {\n dropdown.appendChild(_renderPickerOpt(optNode));\n });\n var pickerEmpty = el('li', { class: 'tokui-picker-empty' }, '无匹配项');\n pickerEmpty.style.display = 'none';\n dropdown.appendChild(pickerEmpty);\n pickerEl.appendChild(dropdown);\n\n // 隐藏 inputs 用于表单提交\n if (!isMulti) {\n pickerEl.appendChild(el('input', { type: 'hidden', name: name, value: initialSingleValue }));\n } else {\n node.children.forEach(optNode => {\n if (optNode.attrs && optNode.attrs.chk !== undefined) {\n pickerEl.appendChild(el('input', { type: 'hidden', name: name, value: optNode.attrs.v || '' }));\n }\n });\n }\n\n wrapper.appendChild(pickerEl);\n wrapper._variantTarget = pickerEl;\n wrapper._slot = dropdown;\n wrapper._tokuiType = 'picker';\n\n // 通过 _streamCloseHook 在容器关闭时初始化交互\n // hook 必须挂在 wrapper 上(_streamClose 从 slotStack 取 entry.el = wrapper)\n wrapper._streamCloseHook = function() {\n // 流式模式下 children 在 render 时为空,此处 opt 已全部到达,同步预选状态\n var preselected = dropdown.querySelectorAll('.tokui-picker-option--selected');\n if (!isMulti && preselected.length > 0) {\n var firstSel = preselected[0];\n var search = pickerEl.querySelector('.tokui-picker-search');\n var hidden = pickerEl.querySelector('input[type=hidden]');\n if (search && !search.value) search.value = firstSel.getAttribute('data-text');\n if (hidden && !hidden.value) hidden.value = firstSel.getAttribute('data-value');\n }\n if (isMulti && preselected.length > 0) {\n preselected.forEach(function (opt) {\n var tagText = opt.getAttribute('data-text');\n var tagValue = opt.getAttribute('data-value');\n var tag = el('span', { class: 'tokui-picker-tag', 'data-value': tagValue }, tagText + ' ');\n var close = el('span', { class: 'tokui-picker-tag-close' }, '×');\n tag.appendChild(close);\n control.insertBefore(tag, control.querySelector('.tokui-picker-search'));\n pickerEl.appendChild(el('input', { type: 'hidden', name: name, value: tagValue }));\n });\n }\n if (!isDisabled && typeof document !== 'undefined') {\n _initPickerBehavior(pickerEl, { multi: isMulti, name: name });\n }\n };\n\n return wrapper;\n });\n\n /**\n * 渲染 picker 单个选项 li\n */\n function _renderPickerOpt(optNode) {\n const value = (optNode.attrs && optNode.attrs.v) || '';\n const text = (optNode.attrs && optNode.attrs.tx) || value || optNode.content || '';\n const isChecked = optNode.attrs && optNode.attrs.chk !== undefined;\n const liAttrs = { class: 'tokui-picker-option', 'data-value': value, 'data-text': text, 'data-tokui-tag': 'opt', role: 'option', 'aria-selected': String(isChecked) };\n const li = el('li', liAttrs, text);\n if (isChecked) li.classList.add('tokui-picker-option--selected');\n return li;\n }\n\n /**\n * 构建多选标签胶囊\n */\n function _buildPickerTag(optNode, pickerEl, name) {\n const text = (optNode.attrs && optNode.attrs.tx) || (optNode.attrs && optNode.attrs.v) || optNode.content || '';\n const value = (optNode.attrs && optNode.attrs.v) || optNode.content || '';\n const tag = el('span', { class: 'tokui-picker-tag', 'data-value': value }, text + ' ');\n const close = el('span', { class: 'tokui-picker-tag-close' }, '×');\n tag.appendChild(close);\n return tag;\n }\n\n /**\n * 初始化 picker 交互行为\n */\n function _initPickerBehavior(pickerEl, options) {\n var multi = options.multi;\n var name = options.name;\n var control = pickerEl.querySelector('.tokui-picker-control');\n var search = pickerEl.querySelector('.tokui-picker-search');\n var dropdown = pickerEl.querySelector('.tokui-picker-dropdown');\n var emptyTip = pickerEl.querySelector('.tokui-picker-empty');\n var isOpen = false;\n var activeIndex = -1;\n\n function getVisibleOptions() {\n return Array.from(dropdown.querySelectorAll('.tokui-picker-option')).filter(function(li) {\n return li.style.display !== 'none';\n });\n }\n\n function open() {\n if (isOpen) return;\n isOpen = true;\n pickerEl.classList.add('tokui-picker--open');\n // fixed 定位:根据 control 的视口位置动态设置 dropdown\n var rect = control.getBoundingClientRect();\n dropdown.style.left = rect.left + 'px';\n dropdown.style.top = (rect.bottom + 4) + 'px';\n dropdown.style.width = rect.width + 'px';\n search.focus();\n activeIndex = -1;\n }\n\n function close() {\n if (!isOpen) return;\n isOpen = false;\n pickerEl.classList.remove('tokui-picker--open');\n if (multi) search.value = '';\n filterOptions('');\n resetActive();\n }\n\n function toggle() {\n if (isOpen) close(); else open();\n }\n\n function resetActive() {\n var opts = getVisibleOptions();\n opts.forEach(function(li) { li.classList.remove('tokui-picker-option--active'); });\n activeIndex = -1;\n }\n\n function setActive(idx) {\n var opts = getVisibleOptions();\n resetActive();\n if (idx < 0 || idx >= opts.length) return;\n activeIndex = idx;\n opts[idx].classList.add('tokui-picker-option--active');\n opts[idx].scrollIntoView({ block: 'nearest' });\n }\n\n function filterOptions(query) {\n var q = query.toLowerCase();\n var allOpts = dropdown.querySelectorAll('.tokui-picker-option');\n var visibleCount = 0;\n allOpts.forEach(function(li) {\n var match = !q || li.getAttribute('data-text').toLowerCase().indexOf(q) !== -1;\n li.style.display = match ? '' : 'none';\n if (match) visibleCount++;\n });\n emptyTip.style.display = visibleCount === 0 ? '' : 'none';\n resetActive();\n }\n\n function selectOption(li) {\n var value = li.getAttribute('data-value');\n var text = li.getAttribute('data-text');\n if (multi) {\n toggleMultiSelect(li, value, text);\n } else {\n singleSelect(li, value, text);\n }\n }\n\n function singleSelect(li, value, text) {\n dropdown.querySelectorAll('.tokui-picker-option--selected').forEach(function(opt) {\n opt.classList.remove('tokui-picker-option--selected');\n });\n li.classList.add('tokui-picker-option--selected');\n search.value = text;\n var hidden = pickerEl.querySelector('input[type=hidden]');\n if (hidden) hidden.value = value;\n close();\n }\n\n function toggleMultiSelect(li, value, text) {\n var isSelected = li.classList.toggle('tokui-picker-option--selected');\n if (isSelected) {\n addTag(value, text);\n addHiddenInput(value);\n } else {\n removeTag(value);\n removeHiddenInput(value);\n }\n search.value = '';\n search.focus();\n }\n\n function addTag(value, text) {\n var tag = el('span', { class: 'tokui-picker-tag', 'data-value': value }, text + ' ');\n var closeBtn = el('span', { class: 'tokui-picker-tag-close' }, '×');\n closeBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n var opt = dropdown.querySelector('.tokui-picker-option[data-value=\"' + value + '\"]');\n if (opt) opt.classList.remove('tokui-picker-option--selected');\n removeTag(value);\n removeHiddenInput(value);\n });\n tag.appendChild(closeBtn);\n control.insertBefore(tag, search);\n }\n\n function removeTag(value) {\n var tag = control.querySelector('.tokui-picker-tag[data-value=\"' + value + '\"]');\n if (tag) control.removeChild(tag);\n }\n\n function addHiddenInput(value) {\n pickerEl.appendChild(el('input', { type: 'hidden', name: name, value: value }));\n }\n\n function removeHiddenInput(value) {\n var inputs = pickerEl.querySelectorAll('input[type=hidden][name=\"' + name + '\"]');\n inputs.forEach(function(inp) {\n if (inp.value === value) pickerEl.removeChild(inp);\n });\n }\n\n // 点击控制区展开/收起\n control.addEventListener('click', function(e) {\n if (e.target.classList.contains('tokui-picker-tag-close')) return;\n toggle();\n });\n\n // 搜索过滤\n search.addEventListener('input', function() {\n if (!isOpen) open();\n filterOptions(search.value);\n });\n\n // 键盘导航\n search.addEventListener('keydown', function(e) {\n var opts = getVisibleOptions();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n if (!isOpen) open();\n setActive(activeIndex < opts.length - 1 ? activeIndex + 1 : 0);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n if (!isOpen) open();\n setActive(activeIndex > 0 ? activeIndex - 1 : opts.length - 1);\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (activeIndex >= 0 && activeIndex < opts.length) {\n selectOption(opts[activeIndex]);\n }\n } else if (e.key === 'Escape') {\n close();\n } else if (e.key === 'Backspace' && multi && search.value === '') {\n var tags = control.querySelectorAll('.tokui-picker-tag');\n if (tags.length > 0) {\n var lastTag = tags[tags.length - 1];\n var val = lastTag.getAttribute('data-value');\n var opt = dropdown.querySelector('.tokui-picker-option[data-value=\"' + val + '\"]');\n if (opt) opt.classList.remove('tokui-picker-option--selected');\n removeTag(val);\n removeHiddenInput(val);\n }\n }\n });\n\n // 点击选项\n dropdown.addEventListener('click', function(e) {\n var li = e.target.closest('.tokui-picker-option');\n if (li) selectOption(li);\n });\n\n // 点击外部关闭\n document.addEventListener('click', function(e) {\n if (!pickerEl.contains(e.target)) close();\n });\n\n // 为初始预选标签绑定 close 事件\n control.querySelectorAll('.tokui-picker-tag-close').forEach(function(closeBtn) {\n closeBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n var tag = closeBtn.parentElement;\n var value = tag.getAttribute('data-value');\n var opt = dropdown.querySelector('.tokui-picker-option[data-value=\"' + value + '\"]');\n if (opt) opt.classList.remove('tokui-picker-option--selected');\n removeTag(value);\n removeHiddenInput(value);\n });\n });\n }\n\n // === 下拉选择组件 ===\n // 子节点为 opt 选项,multi 属性启用多选\n renderer.register('select', (node, rc) => {\n const isMulti = node.attrs.multi !== undefined;\n const vList = node.attrs.v ? node.attrs.v.split(',').map(s => s.trim()) : [];\n const isInline = vList.indexOf('inline') !== -1;\n const wrapperClass = isInline ? 'tokui-field tokui-field--inline' : 'tokui-field';\n const wrapper = el('div', { class: wrapperClass });\n if (node.attrs.l) {\n const labelAttrs = { class: 'tokui-label' };\n if (node.attrs.id && !isMulti) labelAttrs.for = node.attrs.id;\n wrapper.appendChild(el('label', labelAttrs, node.attrs.l));\n }\n const selectAttrs = { class: 'tokui-select' };\n if (isMulti) selectAttrs.multiple = true;\n if (node.attrs.id) selectAttrs.id = node.attrs.id;\n if (node.attrs.n) selectAttrs.name = node.attrs.n;\n else if (node.attrs.id) selectAttrs.name = node.attrs.id;\n if (node.attrs.req !== undefined) selectAttrs['aria-required'] = 'true';\n const select = el('select', selectAttrs);\n if (node.attrs.ph) {\n const phOpt = el('option', { value: '', disabled: '', selected: '' }, node.attrs.ph);\n select.appendChild(phOpt);\n }\n rc(node.children).forEach(child => {\n if (child && child.nodeType) select.appendChild(child);\n });\n wrapper.appendChild(select);\n wrapper._update = function(uAttrs) {\n if (uAttrs.v !== undefined) select.value = uAttrs.v;\n if (uAttrs.dis === true || uAttrs.dis === 'true') select.disabled = true;\n else if (uAttrs.dis === false || uAttrs.dis === 'false') select.disabled = false;\n };\n wrapper._variantTarget = select;\n wrapper._slot = select; // 插槽指向 select 元素\n wrapper._tokuiType = 'select';\n return wrapper;\n });\n\n // === 单选按钮组组件 ===\n // 子节点为 opt 选项,同一组 radio 共享 name 属性\n renderer.register('radio', (node, rc) => {\n const vList = node.attrs.v ? node.attrs.v.split(',').map(s => s.trim()) : [];\n const isInline = vList.indexOf('inline') !== -1;\n const wrapperClass = isInline ? 'tokui-field tokui-field--inline' : 'tokui-field';\n const wrapper = el('div', { class: wrapperClass });\n if (node.attrs.l) {\n wrapper.appendChild(el('div', { class: 'tokui-label' }, node.attrs.l));\n }\n const group = el('div', { class: 'tokui-radio-group', role: 'radiogroup' });\n if (node.attrs.id) group.id = node.attrs.id;\n const radioName = node.attrs.n || node.attrs.id || 'radio';\n group._radioName = radioName; // 存储共享 name,供子 opt 渲染时读取\n node.children.forEach(optNode => {\n group.appendChild(_renderRadioOpt(optNode, radioName));\n });\n wrapper.appendChild(group);\n wrapper._slot = group;\n wrapper._tokuiType = 'radio';\n return wrapper;\n });\n\n /**\n * 渲染单个 radio 选项\n * @param {Object} optNode - opt 节点\n * @param {string} radioName - radio 的 name 属性值\n * @returns {HTMLElement} label 元素(包含 input 和文本)\n */\n function _renderRadioOpt(optNode, radioName) {\n const label = el('label', { class: 'tokui-radio-item' });\n // opt 在 radio 内不走 render()(radio 需注入共享 name),手动补 data-tokui-tag 印章,\n // 供文档 Playground 点击代码行定位(见 src/core/renderer.js render() 统一盖章逻辑)。\n label.setAttribute('data-tokui-tag', 'opt');\n const inputAttrs = { type: 'radio', name: radioName, class: 'tokui-radio-input' };\n if (optNode.attrs && optNode.attrs.v) inputAttrs.value = optNode.attrs.v;\n if (optNode.attrs && optNode.attrs.chk !== undefined) inputAttrs.checked = 'checked';\n label.appendChild(el('input', inputAttrs));\n const displayText = (optNode.attrs && optNode.attrs.tx) || (optNode.attrs && optNode.attrs.v) || optNode.content || '';\n label.appendChild(el('span', { class: 'tokui-radio-text' }, displayText));\n return label;\n }\n\n // === 选项组件 ===\n // 根据父级类型自动适配:\n // - 在 radio 内 → 渲染为 radio 选项\n // - 在 picker 内 → 渲染为 picker 选项 li\n // - 在 select 内 → 渲染为 <option>\n renderer.register('opt', (node, rc, parentType) => {\n if (parentType === 'radio') {\n return _renderRadioOpt(node, '');\n }\n if (parentType === 'picker') {\n return _renderPickerOpt(node);\n }\n const value = node.attrs ? node.attrs.v : '';\n const text = (node.attrs && node.attrs.tx) || value || node.content || '';\n return el('option', { value: value }, text);\n });\n\n // === 复选框组件 ===\n // attrs.l = 标签文本, attrs.chk = 默认选中\n renderer.register('checkbox', (node) => {\n const vList = node.attrs.v ? node.attrs.v.split(',').map(s => s.trim()) : [];\n const isInline = vList.indexOf('inline') !== -1;\n var cb = el('label', { class: 'tokui-checkbox' + (isInline ? ' tokui-checkbox--inline' : ''), role: 'checkbox', 'aria-checked': String(node.attrs.chk !== undefined) });\n const inputAttrs = { type: 'checkbox', class: 'tokui-checkbox-input' };\n if (node.attrs.id) inputAttrs.id = node.attrs.id;\n if (node.attrs.n) inputAttrs.name = node.attrs.n;\n else if (node.attrs.id) inputAttrs.name = node.attrs.id;\n if (node.attrs.chk !== undefined) inputAttrs.checked = 'checked';\n const input = el('input', inputAttrs);\n cb.appendChild(input);\n cb.appendChild(el('span', { class: 'tokui-checkbox-text' }, node.attrs.l || ''));\n input.addEventListener('change', function() {\n cb.setAttribute('aria-checked', String(input.checked));\n });\n if (!isInline) {\n var field = el('div', { class: 'tokui-field' });\n field.appendChild(cb);\n return field;\n }\n return cb;\n });\n\n // === 开关组件 ===\n // attrs.l = 标签文本, attrs.chk = 默认选中, attrs.dis = 禁用\n // attrs.clk = change handler, attrs.id, attrs.n, attrs.v\n renderer.register('switch', (node) => {\n var wrapper = el('label', { class: 'tokui-switch' });\n // label 已包裹 input,无需 for 属性;否则若把 id 移到 wrapper 会导致 for 指向自己\n var inputAttrs = { type: 'checkbox', class: 'tokui-switch-input' };\n if (node.attrs.n) inputAttrs.name = node.attrs.n;\n else if (node.attrs.id) inputAttrs.name = node.attrs.id;\n if (node.attrs.v) inputAttrs.value = node.attrs.v;\n if (node.attrs.chk !== undefined) inputAttrs.checked = 'checked';\n if (node.attrs.dis !== undefined) inputAttrs.disabled = 'disabled';\n wrapper.appendChild(el('input', inputAttrs));\n var track = el('span', { class: 'tokui-switch__track', role: 'switch', 'aria-checked': String(!!inputAttrs.checked) });\n wrapper.appendChild(track);\n if (node.attrs.l) {\n wrapper.appendChild(el('span', { class: 'tokui-switch__label' }, node.attrs.l));\n }\n var input = wrapper.querySelector('.tokui-switch-input');\n input.addEventListener('change', function() {\n track.setAttribute('aria-checked', String(input.checked));\n });\n if (node.attrs.clk && renderer.eventBus) {\n var handler = renderer.eventBus.getHandler(node.attrs.clk);\n if (handler) {\n input.addEventListener('change', function(e) {\n handler(null, e, wrapper);\n });\n }\n }\n wrapper._update = function(uAttrs) {\n if (uAttrs.chk === true || uAttrs.chk === 'true') { input.checked = true; track.setAttribute('aria-checked', 'true'); }\n else if (uAttrs.chk === false || uAttrs.chk === 'false') { input.checked = false; track.setAttribute('aria-checked', 'false'); }\n if (uAttrs.dis === true || uAttrs.dis === 'true') input.disabled = true;\n else if (uAttrs.dis === false || uAttrs.dis === 'false') input.disabled = false;\n };\n // 让 upd 指令通过 id 找到 wrapper(upd 用 getElementById)\n if (node.attrs.id) {\n wrapper.id = node.attrs.id;\n }\n return wrapper;\n });\n\n // === 滑块组件 ===\n // attrs.l = 标签, attrs.min/max/step/v = 范围参数, attrs.dis = 禁用\n // attrs.clk = change handler, attrs.id, attrs.n\n renderer.register('slider', (node) => {\n var min = parseFloat(node.attrs.min) || 0;\n var max = parseFloat(node.attrs.max) || 100;\n var step = parseFloat(node.attrs.step) || 1;\n var value = parseFloat(node.attrs.v) || 0;\n if (value < min) value = min;\n if (value > max) value = max;\n\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label', for: node.attrs.id || '' }, node.attrs.l));\n }\n\n var slider = el('div', { class: 'tokui-slider' });\n var track = el('div', { class: 'tokui-slider__track' });\n var fill = el('div', { class: 'tokui-slider__fill' });\n var thumb = el('div', { class: 'tokui-slider__thumb', role: 'slider', 'aria-valuemin': String(min), 'aria-valuemax': String(max), 'aria-valuenow': String(value), 'aria-label': node.attrs.l || 'Slider', tabindex: '0' });\n var valSpan = el('span', { class: 'tokui-slider__value' }, String(value));\n var hidden = el('input', { type: 'hidden' });\n if (node.attrs.id) hidden.id = node.attrs.id;\n if (node.attrs.n) hidden.name = node.attrs.n;\n else if (node.attrs.id) hidden.name = node.attrs.id;\n hidden.value = value;\n\n track.appendChild(fill);\n track.appendChild(thumb);\n slider.appendChild(track);\n slider.appendChild(valSpan);\n slider.appendChild(hidden);\n\n var pct = ((value - min) / (max - min)) * 100;\n fill.style.width = pct + '%';\n thumb.style.left = pct + '%';\n\n if (node.attrs.dis !== undefined) {\n slider.classList.add('tokui-slider--disabled');\n } else {\n var onDrag = function(e) {\n e.preventDefault();\n var rect = track.getBoundingClientRect();\n var clientX = e.touches ? e.touches[0].clientX : e.clientX;\n var ratio = (clientX - rect.left) / rect.width;\n ratio = Math.max(0, Math.min(1, ratio));\n var raw = min + ratio * (max - min);\n var snapped = Math.round(raw / step) * step;\n snapped = Math.max(min, Math.min(max, snapped));\n var floatFix = step < 1 ? Math.pow(10, Math.ceil(-Math.log10(step))) : 1;\n snapped = Math.round(snapped * floatFix) / floatFix;\n value = snapped;\n var p = ((value - min) / (max - min)) * 100;\n fill.style.width = p + '%';\n thumb.style.left = p + '%';\n valSpan.textContent = String(value);\n hidden.value = value;\n thumb.setAttribute('aria-valuenow', String(value));\n };\n var onEnd = function() {\n document.removeEventListener('mousemove', onDrag);\n document.removeEventListener('mouseup', onEnd);\n document.removeEventListener('touchmove', onDrag);\n document.removeEventListener('touchend', onEnd);\n thumb.classList.remove('tokui-slider__thumb--dragging');\n if (node.attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(node.attrs.clk) : null;\n if (handler) handler({ value: value, id: node.attrs.id });\n }\n };\n var onStart = function(e) {\n e.preventDefault();\n onDrag(e);\n document.addEventListener('mousemove', onDrag);\n document.addEventListener('mouseup', onEnd);\n document.addEventListener('touchmove', onDrag);\n document.addEventListener('touchend', onEnd);\n thumb.classList.add('tokui-slider__thumb--dragging');\n };\n slider.addEventListener('mousedown', onStart);\n slider.addEventListener('touchstart', onStart, { passive: false });\n }\n\n field._update = function(uAttrs) {\n if (uAttrs.v !== undefined) {\n var newVal = parseFloat(uAttrs.v) || 0;\n if (!isNaN(min)) newVal = Math.max(min, newVal);\n if (!isNaN(max)) newVal = Math.min(max, newVal);\n value = newVal;\n var p = ((value - min) / (max - min)) * 100;\n fill.style.width = p + '%';\n thumb.style.left = p + '%';\n valSpan.textContent = String(value);\n hidden.value = value;\n thumb.setAttribute('aria-valuenow', String(value));\n }\n if (uAttrs.dis === true || uAttrs.dis === 'true') {\n slider.classList.add('tokui-slider--disabled');\n } else if (uAttrs.dis === false || uAttrs.dis === 'false') {\n slider.classList.remove('tokui-slider--disabled');\n }\n };\n slider._variantTarget = slider;\n field.appendChild(slider);\n return field;\n });\n\n // === 评分组件 ===\n // attrs.l = 标签, attrs.v = 初始值, attrs.max = 最大星数(默认5)\n // attrs.clk = click handler, attrs.dis = 禁用, attrs.tx = 自定义字符\n renderer.register('rate', (node) => {\n var max = parseInt(node.attrs.max) || 5;\n var current = parseInt(node.attrs.v) || 0;\n var charOn = node.attrs.tx || '★';\n var charOff = '☆';\n\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label', for: node.attrs.id || '' }, node.attrs.l));\n }\n\n var rate = el('div', { class: 'tokui-rate', role: 'radiogroup', 'aria-label': node.attrs.l || '评分', tabindex: '0' });\n var hidden = el('input', { type: 'hidden' });\n if (node.attrs.id) hidden.id = node.attrs.id;\n if (node.attrs.n) hidden.name = node.attrs.n;\n else if (node.attrs.id) hidden.name = node.attrs.id;\n hidden.value = current;\n\n var stars = [];\n for (var i = 0; i < max; i++) {\n var star = el('span', { class: 'tokui-rate__star', 'data-index': String(i + 1), role: 'radio', 'aria-checked': String(i < current) });\n star.textContent = i < current ? charOn : charOff;\n if (i < current) star.classList.add('tokui-rate__star--active');\n stars.push(star);\n rate.appendChild(star);\n }\n var textSpan = el('span', { class: 'tokui-rate__text' });\n if (current > 0) textSpan.textContent = current + '/' + max;\n rate.appendChild(textSpan);\n rate.appendChild(hidden);\n\n if (node.attrs.dis === undefined) {\n rate.addEventListener('mouseover', function(e) {\n var t = e.target;\n if (!t.classList.contains('tokui-rate__star')) return;\n var idx = parseInt(t.getAttribute('data-index'));\n for (var j = 0; j < stars.length; j++) {\n stars[j].textContent = j < idx ? charOn : charOff;\n stars[j].classList.toggle('tokui-rate__star--hover', j < idx);\n }\n });\n rate.addEventListener('mouseout', function() {\n for (var j = 0; j < stars.length; j++) {\n stars[j].textContent = j < current ? charOn : charOff;\n stars[j].classList.remove('tokui-rate__star--hover');\n }\n });\n rate.addEventListener('click', function(e) {\n var t = e.target;\n if (!t.classList.contains('tokui-rate__star')) return;\n var idx = parseInt(t.getAttribute('data-index'));\n current = (current === idx) ? 0 : idx;\n hidden.value = current;\n textSpan.textContent = current > 0 ? current + '/' + max : '';\n for (var j = 0; j < stars.length; j++) {\n stars[j].textContent = j < current ? charOn : charOff;\n stars[j].classList.toggle('tokui-rate__star--active', j < current);\n stars[j].setAttribute('aria-checked', String(j < current));\n }\n if (node.attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(node.attrs.clk) : null;\n if (handler) handler({ value: current, max: max, id: node.attrs.id });\n }\n });\n // 键盘导航:ArrowRight/Up 增,ArrowLeft/Down 减\n rate.addEventListener('keydown', function(e) {\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n current = Math.min(current + 1, max);\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n current = Math.max(current - 1, 0);\n } else {\n return;\n }\n hidden.value = current;\n textSpan.textContent = current > 0 ? current + '/' + max : '';\n for (var j = 0; j < stars.length; j++) {\n stars[j].textContent = j < current ? charOn : charOff;\n stars[j].classList.toggle('tokui-rate__star--active', j < current);\n stars[j].setAttribute('aria-checked', String(j < current));\n }\n });\n } else {\n rate.classList.add('tokui-rate--disabled');\n }\n\n field._update = function(uAttrs) {\n if (uAttrs.v !== undefined) {\n current = parseInt(uAttrs.v) || 0;\n if (current > max) current = max;\n if (current < 0) current = 0;\n hidden.value = current;\n textSpan.textContent = current > 0 ? current + '/' + max : '';\n for (var j = 0; j < stars.length; j++) {\n stars[j].textContent = j < current ? charOn : charOff;\n stars[j].classList.toggle('tokui-rate__star--active', j < current);\n stars[j].setAttribute('aria-checked', String(j < current));\n }\n }\n if (uAttrs.dis === true || uAttrs.dis === 'true') {\n rate.classList.add('tokui-rate--disabled');\n } else if (uAttrs.dis === false || uAttrs.dis === 'false') {\n rate.classList.remove('tokui-rate--disabled');\n }\n };\n rate._variantTarget = rate;\n field.appendChild(rate);\n return field;\n });\n\n // === 穿梭框组件 ===\n // attrs.l = 标签, attrs.tt = 左标题, attrs.tt2 = 右标题\n // attrs.clk = change handler, attrs.id, attrs.dis\n // 子节点: opt(v, tx, chk)\n renderer.register('transfer', (node, rc) => {\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, node.attrs.l));\n }\n\n var transfer = el('div', { class: 'tokui-transfer' });\n\n function makePanel(title) {\n var panel = el('div', { class: 'tokui-transfer__panel', role: 'listbox' });\n var header = el('div', { class: 'tokui-transfer__header' });\n var checkAll = el('input', { type: 'checkbox', class: 'tokui-transfer__check-all' });\n header.appendChild(checkAll);\n header.appendChild(el('span', {}, title));\n var count = el('span', { class: 'tokui-transfer__count' }, '0/0');\n header.appendChild(count);\n panel.appendChild(header);\n var body = el('div', { class: 'tokui-transfer__body' });\n panel.appendChild(body);\n panel._body = body;\n panel._header = header;\n panel._checkAll = checkAll;\n panel._count = count;\n panel._items = [];\n // 全选/取消全选\n checkAll.addEventListener('change', function() {\n var checked = checkAll.checked;\n panel._items.forEach(function(item) { item._cb.checked = checked; });\n updateCount(panel);\n });\n return panel;\n }\n\n function makeItem(val, text, optIdx) {\n var label = el('label', { class: 'tokui-transfer__item', role: 'option', 'aria-selected': 'false' });\n // transfer 按 chk 把 opt 拆到左右两栏,DOM 序 ≠ DSL 序;盖 data-tokui-tag + data-tokui-idx,\n // Playground 按 idx 排序后定位(见 docs Playground onLineClick)。\n label.setAttribute('data-tokui-tag', 'opt');\n if (optIdx !== undefined) label.setAttribute('data-tokui-idx', String(optIdx));\n var cb = el('input', { type: 'checkbox', value: val });\n label.appendChild(cb);\n label.appendChild(el('span', {}, text));\n label._cb = cb;\n // 单个 checkbox 变化时同步全选状态和计数\n cb.addEventListener('change', function() {\n var panel = label.closest('.tokui-transfer__panel');\n if (panel) {\n updateCount(panel);\n }\n });\n return label;\n }\n\n var leftTitle = node.attrs.tt || 'Source';\n var rightTitle = node.attrs.tt2 || 'Target';\n var leftPanel = makePanel(leftTitle);\n var rightPanel = makePanel(rightTitle);\n\n // 高度属性:h=固定高度(min/max/height 三者同值,内容滚动);\n // mh=最大高度(覆盖默认 320px,少内容时仍按 min-height 收缩)。\n // 纯数字按 px,其余(如 40vh)原样透传。\n function normSize(v) { return /^\\d+$/.test(String(v).trim()) ? (String(v).trim() + 'px') : String(v).trim(); }\n [leftPanel, rightPanel].forEach(function(panel) {\n if (node.attrs.h) {\n var hv = normSize(node.attrs.h);\n panel.style.height = hv;\n panel.style.minHeight = hv;\n panel.style.maxHeight = hv;\n } else if (node.attrs.mh) {\n panel.style.maxHeight = normSize(node.attrs.mh);\n }\n });\n\n var actions = el('div', { class: 'tokui-transfer__actions' });\n var btnRight = el('button', { class: 'tokui-transfer__btn', type: 'button' }, '→');\n var btnLeft = el('button', { class: 'tokui-transfer__btn', type: 'button' }, '←');\n actions.appendChild(btnRight);\n actions.appendChild(btnLeft);\n\n var hidden = el('input', { type: 'hidden' });\n if (node.attrs.id) hidden.id = node.attrs.id;\n if (node.attrs.n) hidden.name = node.attrs.n;\n else if (node.attrs.id) hidden.name = node.attrs.id;\n\n function updateHidden() {\n var vals = rightPanel._items.map(function(item) { return item._cb.value; });\n hidden.value = vals.join(',');\n }\n\n function updateCount(panel) {\n var checked = panel._items.filter(function(item) { return item._cb.checked; }).length;\n panel._count.textContent = checked + '/' + panel._items.length;\n panel._checkAll.checked = checked > 0 && checked === panel._items.length;\n }\n\n function moveChecked(from, to) {\n var moved = [];\n from._items = from._items.filter(function(item) {\n if (item._cb.checked) {\n item._cb.checked = false;\n to._body.appendChild(item);\n to._items.push(item);\n moved.push(item);\n return false;\n }\n return true;\n });\n updateCount(from);\n updateCount(to);\n updateHidden();\n if (node.attrs.clk && moved.length > 0) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(node.attrs.clk) : null;\n if (handler) handler({ values: rightPanel._items.map(function(i) { return i._cb.value; }), id: node.attrs.id });\n }\n }\n\n function populatePanels(children) {\n // opt 在本 transfer 内的出现序(= DSL 内 opt 序),供 Playground 定位。\n // 计数器挂在 field 上,与流式追加 _tokuiTransferAppend 共享(两者互斥:mount 整批 vs 流式逐个)。\n (children || []).forEach(function(child) {\n if (child.type === 'opt') {\n appendOpt(child);\n }\n });\n updateCount(leftPanel);\n updateCount(rightPanel);\n updateHidden();\n }\n\n // 单个 opt 追加到对应栏(chk→右,否则→左)。mount 整批与流式逐个共用,保证 idx 连续。\n function appendOpt(optNode) {\n var val = (optNode.attrs && optNode.attrs.v) || '';\n var text = (optNode.attrs && optNode.attrs.tx) || val;\n var chk = optNode.attrs && optNode.attrs.chk !== undefined;\n var item = makeItem(val, text, field._transferOptIdx++);\n if (chk) {\n rightPanel._body.appendChild(item);\n rightPanel._items.push(item);\n } else {\n leftPanel._body.appendChild(item);\n leftPanel._items.push(item);\n }\n updateCount(leftPanel);\n updateCount(rightPanel);\n updateHidden();\n return item;\n }\n\n btnRight.addEventListener('click', function() { moveChecked(leftPanel, rightPanel); });\n btnLeft.addEventListener('click', function() { moveChecked(rightPanel, leftPanel); });\n\n // opt 出现序计数器(mount 整批 / 流式逐个共用),供 data-tokui-idx 定位\n field._transferOptIdx = 0;\n\n // 隐藏的暂存区:流式期间 opt 已被 _streamChild 提前拦截走 appendOpt(不进 staging),\n // staging 仅兜底拦截可能的非 opt 子节点渲染,避免误显。\n var staging = el('div', {});\n staging.style.display = 'none';\n\n transfer.appendChild(leftPanel);\n transfer.appendChild(actions);\n transfer.appendChild(rightPanel);\n transfer.appendChild(hidden);\n transfer.appendChild(staging);\n\n if (node.attrs.dis !== undefined) {\n transfer.classList.add('tokui-transfer--disabled');\n }\n\n // 真流式追加钩子:流式模式下每个 opt 子节点到达时由 renderer._streamChild 调用,\n // 立即追加到对应栏并更新计数/hidden,边收边显(不再等 [/transfer] 整批渲染)。\n field._tokuiTransferAppend = function(optNode) {\n return appendOpt(optNode);\n };\n\n // mount 模式(节点带完整 children):直接整批填充\n if (node.children && node.children.length) {\n populatePanels(node.children);\n }\n\n // 容器关闭:仅清暂存区。流式 opt 已逐个追加,无需整批重填(否则与 mount 路径双重填充)。\n field._streamCloseHook = function() {\n staging.innerHTML = '';\n };\n\n field._slot = staging;\n field._tokuiType = 'transfer';\n transfer._variantTarget = transfer;\n field.appendChild(transfer);\n return field;\n });\n\n // === 数字输入框组件(自闭合)===\n // attrs.v = 值(默认0), attrs.min = 最小值, attrs.max = 最大值, attrs.step = 步长(默认1)\n // attrs.dis = 禁用, attrs.n = name, attrs.id, attrs.l = 标签\n renderer.register('numinput', (node) => {\n var min = parseFloat(node.attrs.min);\n var max = parseFloat(node.attrs.max);\n var step = parseFloat(node.attrs.step) || 1;\n var value = parseFloat(node.attrs.v) || 0;\n if (!isNaN(min)) value = Math.max(min, value);\n if (!isNaN(max)) value = Math.min(max, value);\n var isDisabled = node.attrs.dis !== undefined;\n\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, node.attrs.l));\n }\n\n var wrapper = el('div', { class: 'tokui-numinput' + (isDisabled ? ' tokui-numinput--disabled' : '') });\n\n // 减少按钮\n var minusBtn = el('button', {\n class: 'tokui-numinput__btn tokui-numinput__btn--minus',\n type: 'button'\n });\n minusBtn.textContent = '−'; // minus sign\n wrapper.appendChild(minusBtn);\n\n // 数字输入\n var inputAttrs = {\n class: 'tokui-numinput__input',\n type: 'text',\n value: String(value)\n };\n if (node.attrs.id) inputAttrs.id = node.attrs.id;\n // 不设 name,表单提交由 hidden input 负责\n if (isDisabled) inputAttrs.disabled = 'disabled';\n var input = el('input', inputAttrs);\n wrapper.appendChild(input);\n\n // 增加按钮\n var plusBtn = el('button', {\n class: 'tokui-numinput__btn tokui-numinput__btn--plus',\n type: 'button'\n });\n plusBtn.textContent = '+'; // plus sign\n wrapper.appendChild(plusBtn);\n\n // hidden input 用于表单\n var hiddenAttrs = { type: 'hidden' };\n if (node.attrs.n) hiddenAttrs.name = node.attrs.n;\n else if (node.attrs.id) hiddenAttrs.name = node.attrs.id;\n hiddenAttrs.value = String(value);\n var hidden = el('input', hiddenAttrs);\n wrapper.appendChild(hidden);\n\n if (!isDisabled) {\n function clamp(val) {\n if (!isNaN(min)) val = Math.max(min, val);\n if (!isNaN(max)) val = Math.min(max, val);\n return val;\n }\n\n function updateValue(newVal) {\n var floatFix = step < 1 ? Math.pow(10, Math.ceil(-Math.log10(step))) : 1;\n newVal = Math.round(newVal * floatFix) / floatFix;\n newVal = clamp(newVal);\n value = newVal;\n input.value = String(value);\n hidden.value = value;\n }\n\n minusBtn.addEventListener('click', function() {\n updateValue(value - step);\n });\n\n plusBtn.addEventListener('click', function() {\n updateValue(value + step);\n });\n\n input.addEventListener('change', function() {\n var parsed = parseFloat(input.value);\n if (isNaN(parsed)) parsed = 0;\n updateValue(parsed);\n });\n }\n\n field._update = function(uAttrs) {\n if (uAttrs.v !== undefined) {\n var newVal = parseFloat(uAttrs.v) || 0;\n if (!isNaN(min)) newVal = Math.max(min, newVal);\n if (!isNaN(max)) newVal = Math.min(max, newVal);\n value = newVal;\n input.value = String(value);\n hidden.value = value;\n }\n if (uAttrs.dis === true || uAttrs.dis === 'true') {\n input.disabled = true;\n wrapper.classList.add('tokui-numinput--disabled');\n } else if (uAttrs.dis === false || uAttrs.dis === 'false') {\n input.disabled = false;\n wrapper.classList.remove('tokui-numinput--disabled');\n }\n };\n field.appendChild(wrapper);\n field._variantTarget = wrapper;\n return field;\n });\n\n // === 按钮组件 ===\n // attrs.t = type, attrs.tx = text, attrs.clk = click handler\n // attrs.w = width, attrs.bg = background color, attrs.fc = font color\n // attrs.radius = border radius\n var BTN_STYLES = new Set(['primary', 'danger', 'success', 'warning', 'ghost', 'sm', 'lg', 'pill', 'square', 'block']);\n\n renderer.register('btn', (node) => {\n // sub 属性时 type 设为 submit 触发表单提交;否则用 t 的样式类型\n var btnType = node.attrs.sub ? 'submit' : 'button';\n var cls = 'tokui-btn';\n // t 属性映射为 CSS 变体 class\n if (node.attrs.t && BTN_STYLES.has(node.attrs.t)) {\n cls += ' tokui-btn--' + node.attrs.t;\n }\n const attrs = { class: cls, type: btnType };\n if (node.attrs.clk) attrs['data-tokui-clk'] = node.attrs.clk;\n if (node.attrs.sub) attrs['data-tokui-sub'] = node.attrs.sub;\n if (node.attrs.id) attrs.id = node.attrs.id;\n if (node.attrs.dis !== undefined) attrs.disabled = 'disabled';\n Object.keys(node.attrs).forEach(key => {\n if (key.startsWith('data-')) attrs[key] = node.attrs[key];\n });\n let style = '';\n if (node.attrs.w) style += 'width:' + node.attrs.w + ';';\n const bgColor = resolveColor(node.attrs.bg);\n if (bgColor) style += 'background:' + bgColor + ';';\n const textColor = resolveColor(node.attrs.fc);\n if (textColor) style += 'color:' + textColor + ';';\n if (node.attrs.radius) style += 'border-radius:' + node.attrs.radius + ';';\n if (style) attrs.style = style;\n const text = node.attrs.tx || node.content || '按钮';\n const btn = el('button', attrs, text);\n btn._tokuiType = 'btn';\n btn._update = function (uAttrs) {\n if (uAttrs.dis === true || uAttrs.dis === 'true') btn.disabled = true;\n else if (uAttrs.dis === false || uAttrs.dis === 'false') btn.disabled = false;\n if (uAttrs.tx !== undefined) btn.textContent = uAttrs.tx;\n };\n return btn;\n });\n\n // === 按钮组容器 ===\n renderer.register('btngroup', (node, rc) => {\n const attrs = { class: 'tokui-btn-group' };\n if (node.attrs.id) attrs.id = node.attrs.id;\n const group = el('div', attrs);\n rc(node.children).forEach(child => {\n if (child && child.nodeType) group.appendChild(child);\n });\n group._slot = group;\n group._tokuiType = 'btngroup';\n return group;\n });\n\n // === 级联选择器 ===\n // 容器组件,子节点为扁平 opt,通过 p 属性指定父级\n // attrs: id, l(标签), ph(placeholder), dis(禁用), clk(事件), v(预选路径), n(name)\n renderer.register('cascader', (node, rc) => {\n var isDisabled = node.attrs.dis !== undefined;\n var placeholder = node.attrs.ph || '请选择';\n\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, node.attrs.l));\n }\n if (node.attrs.id) field.id = node.attrs.id;\n\n var cascaderEl = el('div', { class: 'tokui-cascader' + (isDisabled ? ' tokui-cascader--disabled' : ''), role: 'combobox', 'aria-expanded': 'false' });\n\n // 控制栏(显示选中路径)\n var control = el('div', { class: 'tokui-cascader-control' });\n var searchInput = el('input', {\n class: 'tokui-cascader-input',\n type: 'text',\n readonly: 'readonly',\n placeholder: placeholder\n });\n var arrow = el('span', { class: 'tokui-cascader-arrow' });\n control.appendChild(searchInput);\n control.appendChild(arrow);\n cascaderEl.appendChild(control);\n\n // 下拉面板容器\n var menus = el('div', { class: 'tokui-cascader-menus', role: 'listbox' });\n cascaderEl.appendChild(menus);\n\n // hidden input 用于表单提交\n var hidden = el('input', { type: 'hidden' });\n if (node.attrs.n) hidden.name = node.attrs.n;\n else if (node.attrs.id) hidden.name = node.attrs.id;\n cascaderEl.appendChild(hidden);\n\n // 流式 staging\n var staging = el('div', {});\n staging.style.display = 'none';\n cascaderEl.appendChild(staging);\n\n field.appendChild(cascaderEl);\n\n // 构建级联树数据\n function buildCascaderTree(children) {\n var map = {};\n var roots = [];\n (children || []).forEach(function(child) {\n if (child.type !== 'opt') return;\n var val = child.attrs.v || '';\n var text = child.attrs.tx || val;\n var parent = child.attrs.p || '';\n map[val] = { v: val, tx: text, p: parent, children: [] };\n });\n Object.keys(map).forEach(function(key) {\n var item = map[key];\n if (item.p && map[item.p]) {\n map[item.p].children.push(item);\n } else {\n roots.push(item);\n }\n });\n return roots;\n }\n\n // 渲染菜单列\n function renderMenuColumn(items) {\n var col = el('div', { class: 'tokui-cascader-menu' });\n items.forEach(function(item) {\n var optEl = el('div', {\n class: 'tokui-cascader-option' + (item.children.length ? ' tokui-cascader-option--expand' : ''),\n 'data-value': item.v,\n 'data-text': item.tx\n });\n optEl.textContent = item.tx;\n col.appendChild(optEl);\n });\n return col;\n }\n\n // 高亮列中指定值的选项\n function highlightOption(col, val) {\n col.querySelectorAll('.tokui-cascader-option').forEach(function(o) {\n o.classList.toggle('tokui-cascader-option--active', o.getAttribute('data-value') === val);\n });\n }\n\n // 沿树查找节点,返回从根到该节点的完整路径(含自身)\n function findPathToNode(tree, targetVal) {\n function search(nodes, path) {\n for (var i = 0; i < nodes.length; i++) {\n var newPath = path.concat([{ v: nodes[i].v, tx: nodes[i].tx, node: nodes[i] }]);\n if (nodes[i].v === targetVal) return newPath;\n var found = search(nodes[i].children, newPath);\n if (found) return found;\n }\n return null;\n }\n return search(tree, []);\n }\n\n // 根据已选路径重建菜单列\n // activeValues: 已选中的各级值数组(如 ['zhejiang', 'hangzhou'])\n function rebuildMenus(tree, activeValues) {\n menus.innerHTML = '';\n var currentNodes = tree;\n // 渲染每一级已选的列\n for (var i = 0; i < activeValues.length; i++) {\n var col = renderMenuColumn(currentNodes);\n highlightOption(col, activeValues[i]);\n menus.appendChild(col);\n // 进入下一级\n var found = false;\n for (var j = 0; j < currentNodes.length; j++) {\n if (currentNodes[j].v === activeValues[i]) {\n currentNodes = currentNodes[j].children;\n found = true;\n break;\n }\n }\n if (!found) break;\n }\n // 渲染当前级(可选项)\n if (currentNodes && currentNodes.length) {\n menus.appendChild(renderMenuColumn(currentNodes));\n }\n }\n\n // 交互状态(挂在 cascaderEl 上避免重复绑定)\n var state = cascaderEl._cascaderState = cascaderEl._cascaderState || { isOpen: false, activeValues: [], tree: null };\n\n function openMenus(tree) {\n if (isDisabled) return;\n state.isOpen = true;\n state.tree = tree;\n cascaderEl.classList.add('tokui-cascader--open');\n cascaderEl.setAttribute('aria-expanded', 'true');\n var rect = control.getBoundingClientRect();\n menus.style.left = rect.left + 'px';\n menus.style.top = (rect.bottom + 4) + 'px';\n menus.style.minWidth = rect.width + 'px';\n rebuildMenus(tree, state.activeValues);\n }\n\n function closeMenus() {\n state.isOpen = false;\n state.activeValues = [];\n cascaderEl.classList.remove('tokui-cascader--open');\n cascaderEl.setAttribute('aria-expanded', 'false');\n }\n\n // 只绑定一次事件(检查标记避免重复绑定)\n if (!cascaderEl._cascaderBindDone) {\n cascaderEl._cascaderBindDone = true;\n\n control.addEventListener('click', function(e) {\n e.stopPropagation();\n if (state.isOpen) closeMenus();\n else if (state.tree) openMenus(state.tree);\n });\n\n menus.addEventListener('click', function(e) {\n e.stopPropagation();\n var optEl = e.target.closest('.tokui-cascader-option');\n if (!optEl) return;\n var val = optEl.getAttribute('data-value');\n var tx = optEl.getAttribute('data-text');\n if (!state.tree) return;\n\n var path = findPathToNode(state.tree, val);\n if (!path) return;\n var clickedNode = path[path.length - 1].node;\n\n // 高亮当前选项\n var col = optEl.parentElement;\n highlightOption(col, val);\n\n if (clickedNode.children.length > 0) {\n // 非叶子:更新路径到当前节点,展开下一级\n state.activeValues = path.map(function(p) { return p.v; });\n rebuildMenus(state.tree, state.activeValues);\n } else {\n // 叶子:选中完成\n var pathText = path.map(function(p) { return p.tx; }).join(' / ');\n var pathValue = path.map(function(p) { return p.v; }).join('/');\n searchInput.value = pathText;\n hidden.value = pathValue;\n closeMenus();\n if (node.attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal && window.TokUI._internal.TokUIEventBus)\n ? window.TokUI._internal.TokUIEventBus.getHandler(node.attrs.clk) : null;\n if (handler) handler({ id: node.attrs.id, value: pathValue, text: pathText, path: path });\n }\n }\n });\n\n // 外部点击关闭\n if (typeof document !== 'undefined') {\n document.addEventListener('click', function() {\n if (state.isOpen) closeMenus();\n });\n }\n }\n\n // 设置树数据并初始化\n function setupTree(tree) {\n state.tree = tree;\n // 预选值\n if (node.attrs.v) {\n var prePath = String(node.attrs.v).split('/');\n var valid = true;\n var pathTexts = [];\n var currentNodes = tree;\n for (var pi = 0; pi < prePath.length; pi++) {\n var found = false;\n for (var ci = 0; ci < currentNodes.length; ci++) {\n if (currentNodes[ci].v === prePath[pi]) {\n pathTexts.push(currentNodes[ci].tx);\n currentNodes = currentNodes[ci].children;\n found = true;\n break;\n }\n }\n if (!found) { valid = false; break; }\n }\n if (valid && pathTexts.length === prePath.length) {\n searchInput.value = pathTexts.join(' / ');\n hidden.value = node.attrs.v;\n }\n }\n }\n\n // mount 模式\n if (node.children && node.children.length) {\n setupTree(buildCascaderTree(node.children));\n }\n\n // 流式模式\n field._streamCloseHook = function() {\n staging.innerHTML = '';\n setupTree(buildCascaderTree(node.children));\n };\n field._slot = staging;\n field._tokuiType = 'cascader';\n field._variantTarget = cascaderEl;\n\n return field;\n });\n\n // === 文件上传 ===\n // 自闭合组件,拖拽/点击上传\n // attrs: id, l(标签), ph(提示文字), accept(文件类型), multi(多选), dis(禁用), clk(事件), max(最大数), n(name)\n renderer.register('upload', (node) => {\n var isDisabled = node.attrs.dis !== undefined;\n var isMulti = node.attrs.multi !== undefined;\n var maxFiles = parseInt(node.attrs.max) || 0;\n var placeholder = node.attrs.ph || '点击或拖拽文件至此处上传';\n var accept = node.attrs.accept || '';\n\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, node.attrs.l));\n }\n if (node.attrs.id) field.id = node.attrs.id;\n\n var upload = el('div', { class: 'tokui-upload' + (isDisabled ? ' tokui-upload--disabled' : '') });\n\n // 拖拽区域\n var dropzone = el('div', { class: 'tokui-upload-dropzone', role: 'button', 'aria-label': placeholder, tabindex: '0' });\n var icon = el('div', { class: 'tokui-upload-icon' });\n icon.innerHTML = '<svg viewBox=\"0 0 48 48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M24 32V12\"/><path d=\"M16 20l8-8 8 8\"/><path d=\"M8 36h32\"/></svg>';\n dropzone.appendChild(icon);\n var text = el('div', { class: 'tokui-upload-text' });\n text.textContent = placeholder;\n dropzone.appendChild(text);\n var browseBtn = el('button', { class: 'tokui-upload-btn', type: 'button' });\n browseBtn.textContent = '浏览文件';\n dropzone.appendChild(browseBtn);\n upload.appendChild(dropzone);\n\n // 隐藏的 file input\n var fileInputAttrs = { type: 'file', style: 'display:none' };\n if (accept) fileInputAttrs.accept = accept;\n if (isMulti) fileInputAttrs.multiple = 'multiple';\n var fileInput = el('input', fileInputAttrs);\n upload.appendChild(fileInput);\n\n // 文件列表\n var fileList = el('div', { class: 'tokui-upload-filelist' });\n upload.appendChild(fileList);\n\n // hidden input 用于表单\n var hidden = el('input', { type: 'hidden' });\n if (node.attrs.n) hidden.name = node.attrs.n;\n else if (node.attrs.id) hidden.name = node.attrs.id;\n upload.appendChild(hidden);\n\n // 工具函数\n function formatSize(bytes) {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1048576) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / 1048576).toFixed(1) + ' MB';\n }\n\n var selectedFiles = [];\n\n function renderFileList() {\n fileList.innerHTML = '';\n selectedFiles.forEach(function(f, idx) {\n var item = el('div', { class: 'tokui-upload-file' });\n var fileIcon = el('span', { class: 'tokui-upload-file-icon' });\n fileIcon.textContent = '📄';\n item.appendChild(fileIcon);\n var name = el('span', { class: 'tokui-upload-file-name' });\n name.textContent = f.name;\n name.title = f.name;\n item.appendChild(name);\n var size = el('span', { class: 'tokui-upload-file-size' });\n size.textContent = formatSize(f.size);\n item.appendChild(size);\n var remove = el('span', { class: 'tokui-upload-file-remove' });\n remove.textContent = '✕';\n remove.setAttribute('data-idx', idx);\n item.appendChild(remove);\n fileList.appendChild(item);\n });\n hidden.value = selectedFiles.map(function(f) { return f.name; }).join(',');\n }\n\n function addFiles(files) {\n for (var i = 0; i < files.length; i++) {\n if (maxFiles && selectedFiles.length >= maxFiles) break;\n selectedFiles.push({ name: files[i].name, size: files[i].size, type: files[i].type });\n }\n renderFileList();\n if (node.attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(node.attrs.clk) : null;\n if (handler) handler({ id: node.attrs.id, files: selectedFiles });\n }\n }\n\n if (!isDisabled) {\n // 点击浏览\n dropzone.addEventListener('click', function(e) {\n if (e.target === browseBtn || dropzone.contains(e.target)) {\n fileInput.click();\n }\n });\n browseBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n fileInput.click();\n });\n\n fileInput.addEventListener('change', function() {\n if (fileInput.files && fileInput.files.length) {\n addFiles(fileInput.files);\n fileInput.value = '';\n }\n });\n\n // 拖拽\n dropzone.addEventListener('dragover', function(e) {\n e.preventDefault();\n upload.classList.add('tokui-upload--dragover');\n });\n dropzone.addEventListener('dragleave', function(e) {\n e.preventDefault();\n upload.classList.remove('tokui-upload--dragover');\n });\n dropzone.addEventListener('drop', function(e) {\n e.preventDefault();\n upload.classList.remove('tokui-upload--dragover');\n if (e.dataTransfer && e.dataTransfer.files.length) {\n addFiles(e.dataTransfer.files);\n }\n });\n\n // 删除文件\n fileList.addEventListener('click', function(e) {\n var removeBtn = e.target.closest('.tokui-upload-file-remove');\n if (!removeBtn) return;\n var idx = parseInt(removeBtn.getAttribute('data-idx'));\n if (!isNaN(idx) && idx >= 0 && idx < selectedFiles.length) {\n selectedFiles.splice(idx, 1);\n renderFileList();\n }\n });\n }\n\n field.appendChild(upload);\n field._variantTarget = upload;\n return field;\n });\n\n // === 日期时间工具函数 ===\n\n /**\n * 解析日期字符串(支持 YYYY-MM-DD 和 YYYY-MM-DD HH:mm 等格式)\n */\n function parseDateValue(val) {\n if (!val) return null;\n var match = val.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (!match) return null;\n return new Date(parseInt(match[1]), parseInt(match[2]) - 1, parseInt(match[3]));\n }\n\n function parseDateTimeValue(val) {\n if (!val) return null;\n var match = val.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})\\s+(\\d{1,2}):(\\d{1,2})/);\n if (!match) return null;\n return new Date(parseInt(match[1]), parseInt(match[2]) - 1, parseInt(match[3]), parseInt(match[4]), parseInt(match[5]));\n }\n\n /**\n * 按格式化模板格式化日期\n * 支持 YYYY, MM, DD, HH, mm, ss 占位符\n */\n function formatDate(date, fmt) {\n var y = date.getFullYear();\n var M = date.getMonth() + 1;\n var d = date.getDate();\n var H = date.getHours();\n var m = date.getMinutes();\n var s = date.getSeconds();\n return fmt\n .replace('YYYY', String(y))\n .replace('MM', M < 10 ? '0' + M : String(M))\n .replace('DD', d < 10 ? '0' + d : String(d))\n .replace('HH', H < 10 ? '0' + H : String(H))\n .replace('mm', m < 10 ? '0' + m : String(m))\n .replace('ss', s < 10 ? '0' + s : String(s));\n }\n\n /**\n * 格式化时间\n */\n function formatTime(h, m, s, fmt) {\n return fmt\n .replace('HH', h < 10 ? '0' + h : String(h))\n .replace('mm', m < 10 ? '0' + m : String(m))\n .replace('ss', s < 10 ? '0' + s : String(s));\n }\n\n /**\n * 构建时间选择滚轮列\n * @param {string} label - 列标签\n * @param {number} count - 总数 (24 或 60)\n * @param {number} selected - 初始选中值\n * @returns {HTMLElement} 列容器\n */\n /**\n * 只更新高亮项(滚动中调用:只读,绝不写 scrollTop → 不与手势/原生 snap 打架)\n */\n function highlightColumn(col, index) {\n var list = col.querySelector('.tokui-timepicker-column-list');\n if (!list) return;\n var items = list.querySelectorAll('.tokui-timepicker-column-item');\n if (!items.length) return;\n if (index < 0) index = 0;\n if (index > items.length - 1) index = items.length - 1;\n items.forEach(function(item, i) {\n item.classList.toggle('tokui-timepicker-column-item--selected', i === index);\n });\n }\n\n /**\n * 设置列选中项:高亮 + 滚动使其居中(点击/打开回填,单次写入)\n * 自适应公式:scrollTop = offsetTop + h/2 - clientHeight/2\n * 配合 CSS(border-box 可见窗 + ::before/::after 占位 + scroll-padding + snap-align:center),\n * 居中点与原生 snap 目标天然一致,无需硬编码常数\n */\n function setColumnSelected(col, index) {\n highlightColumn(col, index);\n var list = col.querySelector('.tokui-timepicker-column-list');\n if (!list) return;\n var items = list.querySelectorAll('.tokui-timepicker-column-item');\n if (!items.length) return;\n if (index < 0) index = 0;\n if (index > items.length - 1) index = items.length - 1;\n var item = items[index];\n var h = item.offsetHeight || 32;\n // offsetTop 相对 list(list 设 position:relative);clientHeight = 可见窗高\n if (list.clientHeight && item.offsetTop !== undefined) {\n var target = item.offsetTop + h / 2 - list.clientHeight / 2;\n if (Math.abs(list.scrollTop - target) > 1) list.scrollTop = target;\n }\n }\n\n /**\n * 读取列当前居中项索引(基于几何,自适应 padding/高度)\n */\n function getColumnIndex(col) {\n var list = col.querySelector('.tokui-timepicker-column-list');\n if (!list) return 0;\n var items = list.querySelectorAll('.tokui-timepicker-column-item');\n if (!items.length) return 0;\n // 优先几何法:找最接近列表可视中线的 item(精确,含所有几何)\n if (items[0].getBoundingClientRect && list.getBoundingClientRect) {\n var lc = list.getBoundingClientRect();\n var center = lc.top + lc.height / 2;\n var best = 0, bestDist = Infinity;\n for (var i = 0; i < items.length; i++) {\n var r = items[i].getBoundingClientRect();\n var d = Math.abs((r.top + r.height / 2) - center);\n if (d < bestDist) { bestDist = d; best = i; }\n }\n return best;\n }\n // 兜底(Node 测试环境无几何):按 scrollTop 估算\n var itemHeight = items[0].offsetHeight || 32;\n var idx = Math.round((list.scrollTop + (list.clientHeight || 192) / 2) / itemHeight) - 0;\n return Math.max(0, Math.min(idx, items.length - 1));\n }\n\n function buildTimeColumn(label, count, selected) {\n var col = el('div', { class: 'tokui-timepicker-column' });\n var list = el('div', { class: 'tokui-timepicker-column-list' });\n for (var i = 0; i < count; i++) {\n var item = el('div', {\n class: 'tokui-timepicker-column-item' + (i === selected ? ' tokui-timepicker-column-item--selected' : ''),\n 'data-value': String(i)\n }, i < 10 ? '0' + i : String(i));\n // 关键修复:点击直接选中该项(原先仅靠滚动,点击无任何响应)\n item.addEventListener('click', function(e) {\n e.stopPropagation();\n var idx = parseInt(this.getAttribute('data-value'), 10);\n setColumnSelected(col, idx);\n });\n list.appendChild(item);\n }\n col.appendChild(list);\n // 滚动时(滚轮/拖拽)实时同步高亮项\n var scrollRaf = 0;\n var raf = (typeof window !== 'undefined' && window.requestAnimationFrame)\n ? window.requestAnimationFrame : function(cb) { setTimeout(cb, 16); };\n list.addEventListener('scroll', function() {\n if (scrollRaf) return;\n scrollRaf = 1;\n // 仅高亮,不写 scrollTop(交给原生 scroll-snap 顺滑吸附)\n raf(function() { scrollRaf = 0; highlightColumn(col, getColumnIndex(col)); });\n });\n col._label = label;\n return col;\n }\n\n /**\n * 获取列当前选中值(确认时调用,读取滚动位置并回填高亮)\n */\n function getSelectedValue(col) {\n var index = getColumnIndex(col);\n highlightColumn(col, index);\n var list = col.querySelector('.tokui-timepicker-column-list');\n var items = list.querySelectorAll('.tokui-timepicker-column-item');\n return parseInt(items[index].getAttribute('data-value')) || 0;\n }\n\n /**\n * 滚动到选中值(打开时调用,复用居中逻辑)\n */\n function scrollToSelected(col, value) {\n setColumnSelected(col, value);\n }\n\n /**\n * 全局面板注册表:实现\"同时仅一个打开\" + \"页面滚动关闭\"\n * 存放各 picker 实例的 closePanel 函数引用\n */\n var _datePickers = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal)\n ? (window.TokUI._internal._datePickers = window.TokUI._internal._datePickers || new Set())\n : new Set();\n\n // 打开新面板前调用:关闭其它已开面板,再登记自己\n function registerOpenPicker(closeFn) {\n var others = [];\n _datePickers.forEach(function(fn) { if (fn !== closeFn) others.push(fn); });\n others.forEach(function(fn) { try { fn(); } catch (e) {} });\n _datePickers.add(closeFn);\n }\n function unregisterPicker(closeFn) { _datePickers.delete(closeFn); }\n function closeAllPickers() {\n var all = [];\n _datePickers.forEach(function(fn) { all.push(fn); });\n _datePickers.clear();\n all.forEach(function(fn) { try { fn(); } catch (e) {} });\n }\n\n // 页面滚动 → 关闭所有面板(scroll 不冒泡,window 监听仅接视口滚动,\n // 不会误关时间列内部滚动)。全局只绑一次。\n if (typeof window !== 'undefined' && !window.TokUI._internal._dateScrollBound) {\n window.addEventListener('scroll', closeAllPickers);\n window.TokUI._internal._dateScrollBound = true;\n }\n\n // 视口宽度(右溢出保护用),各环境兜底\n function getViewportWidth() {\n if (typeof window !== 'undefined' && window.innerWidth) return window.innerWidth;\n if (typeof document !== 'undefined' && document.documentElement && document.documentElement.clientWidth) {\n return document.documentElement.clientWidth;\n }\n return 1024;\n }\n\n /**\n * 渲染日历网格(复用于 datepicker 和 datetimepicker)\n * @param {number} year - 年\n * @param {number} month - 月(0-based)\n * @param {Date} selectedDate - 已选日期\n * @param {Date} now - 当前时间\n * @param {HTMLElement} container - 要追加到的容器\n * @returns {{ prevBtn: HTMLElement, nextBtn: HTMLElement }}\n */\n function renderCalendarGrid(year, month, selectedDate, now, container) {\n // 头部导航\n var header = el('div', { class: 'tokui-datepicker-header' });\n var prevBtn = el('button', { class: 'tokui-datepicker-nav tokui-datepicker-nav--prev', type: 'button' });\n prevBtn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15 18 9 12 15 6\"/></svg>';\n var nextBtn = el('button', { class: 'tokui-datepicker-nav tokui-datepicker-nav--next', type: 'button' });\n nextBtn.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 18 15 12 9 6\"/></svg>';\n var titleEl = el('span', { class: 'tokui-datepicker-title' }, year + '年' + (month + 1) + '月');\n header.appendChild(prevBtn);\n header.appendChild(titleEl);\n header.appendChild(nextBtn);\n container.appendChild(header);\n\n // 星期头\n var weekdays = ['日', '一', '二', '三', '四', '五', '六'];\n var weekdayRow = el('div', { class: 'tokui-datepicker-weekdays' });\n weekdays.forEach(function(d) {\n weekdayRow.appendChild(el('span', { class: 'tokui-datepicker-weekday' }, d));\n });\n container.appendChild(weekdayRow);\n\n // 日期网格\n var grid = el('div', { class: 'tokui-datepicker-grid' });\n var firstDay = new Date(year, month, 1).getDay();\n var daysInMonth = new Date(year, month + 1, 0).getDate();\n var prevMonthDays = new Date(year, month, 0).getDate();\n var todayDate = now.getDate();\n var isCurrentMonth = now.getFullYear() === year && now.getMonth() === month;\n\n // 上月填充\n for (var i = firstDay - 1; i >= 0; i--) {\n grid.appendChild(el('span', { class: 'tokui-datepicker-day tokui-datepicker-day--other' }, String(prevMonthDays - i)));\n }\n // 本月\n for (var d = 1; d <= daysInMonth; d++) {\n var dayClasses = ['tokui-datepicker-day'];\n if (isCurrentMonth && d === todayDate) dayClasses.push('tokui-datepicker-day--today');\n if (selectedDate && selectedDate.getFullYear() === year && selectedDate.getMonth() === month && selectedDate.getDate() === d) {\n dayClasses.push('tokui-datepicker-day--selected');\n }\n var dayEl = el('span', { class: dayClasses.join(' '), 'data-day': String(d) }, String(d));\n grid.appendChild(dayEl);\n }\n // 下月填充(补齐到 6 行 42 格)\n var totalCells = 42;\n var remaining = totalCells - firstDay - daysInMonth;\n for (var n = 1; n <= remaining; n++) {\n grid.appendChild(el('span', { class: 'tokui-datepicker-day tokui-datepicker-day--other' }, String(n)));\n }\n container.appendChild(grid);\n\n return { prevBtn: prevBtn, nextBtn: nextBtn };\n }\n\n // === DatePicker 日期选择器(自闭合)===\n // attrs.l = 标签, attrs.ph = placeholder, attrs.fmt = 格式(默认 YYYY-MM-DD)\n // attrs.v = 初始值, attrs.clk = 选择回调, attrs.dis = 禁用\n // attrs.id, attrs.n\n // 点击输入框展开日历下拉面板,选择日期后回填并触发 clk\n renderer.register('datepicker', (node) => {\n var attrs = node.attrs || {};\n var isDisabled = attrs.dis !== undefined;\n var fmt = attrs.fmt || 'YYYY-MM-DD';\n var placeholder = attrs.ph || fmt;\n var value = attrs.v || '';\n\n var field = el('div', { class: 'tokui-field' });\n if (attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, attrs.l));\n }\n\n var classes = ['tokui-datepicker'];\n if (isDisabled) classes.push('tokui-datepicker--disabled');\n var picker = el('div', { class: classes.join(' ') });\n\n // 输入控制区\n var control = el('div', { class: 'tokui-datepicker-control' });\n var inputAttrs = {\n class: 'tokui-datepicker-input',\n type: 'text',\n readonly: 'readonly',\n placeholder: placeholder\n };\n if (attrs.id) inputAttrs.id = attrs.id;\n if (isDisabled) inputAttrs.disabled = 'disabled';\n if (value) inputAttrs.value = value;\n var input = el('input', inputAttrs);\n control.appendChild(input);\n\n // 日历图标(SVG inline)\n var icon = el('span', { class: 'tokui-datepicker-icon' });\n icon.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>';\n control.appendChild(icon);\n picker.appendChild(control);\n\n // 下拉日历面板\n var dropdown = el('div', { class: 'tokui-datepicker-dropdown' });\n\n // 解析当前日期状态\n var now = new Date();\n var currentYear, currentMonth, selectedDate;\n if (value) {\n selectedDate = parseDateValue(value);\n if (selectedDate) {\n currentYear = selectedDate.getFullYear();\n currentMonth = selectedDate.getMonth();\n }\n }\n if (!currentYear) {\n currentYear = now.getFullYear();\n currentMonth = now.getMonth();\n }\n\n // 隐藏 input\n var hidden = el('input', { type: 'hidden' });\n if (attrs.n) hidden.name = attrs.n;\n else if (attrs.id) hidden.name = attrs.id;\n hidden.value = value;\n picker.appendChild(hidden);\n\n // 渲染日历\n function renderCalendar(year, month) {\n dropdown.innerHTML = '';\n var nav = renderCalendarGrid(year, month, selectedDate, now, dropdown);\n\n // 月份导航事件\n nav.prevBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n currentMonth--;\n if (currentMonth < 0) { currentMonth = 11; currentYear--; }\n renderCalendar(currentYear, currentMonth);\n });\n nav.nextBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n currentMonth++;\n if (currentMonth > 11) { currentMonth = 0; currentYear++; }\n renderCalendar(currentYear, currentMonth);\n });\n }\n\n renderCalendar(currentYear, currentMonth);\n dropdown.style.display = 'none';\n picker.appendChild(dropdown);\n\n // 交互\n var isOpen = false;\n\n function openPanel() {\n if (isDisabled || isOpen) return;\n registerOpenPicker(closePanel);\n isOpen = true;\n dropdown.style.display = '';\n picker.classList.add('tokui-datepicker--open');\n var rect = control.getBoundingClientRect();\n dropdown.style.left = rect.left + 'px';\n dropdown.style.top = (rect.bottom + 4) + 'px';\n // 宽度不跟随输入框:内容自适应,最小宽度由 CSS(300px)兜底\n dropdown.style.width = 'auto';\n var vw = getViewportWidth();\n if (rect.left + dropdown.offsetWidth > vw - 8) {\n dropdown.style.left = Math.max(8, vw - dropdown.offsetWidth - 8) + 'px';\n }\n }\n\n function closePanel() {\n if (!isOpen) return;\n isOpen = false;\n dropdown.style.display = 'none';\n picker.classList.remove('tokui-datepicker--open');\n unregisterPicker(closePanel);\n }\n\n if (!isDisabled) {\n control.addEventListener('click', function(e) {\n e.stopPropagation();\n if (isOpen) closePanel(); else openPanel();\n });\n\n dropdown.addEventListener('click', function(e) {\n e.stopPropagation();\n var dayEl = e.target.closest('.tokui-datepicker-day');\n if (!dayEl || dayEl.classList.contains('tokui-datepicker-day--other')) return;\n var day = parseInt(dayEl.getAttribute('data-day'));\n selectedDate = new Date(currentYear, currentMonth, day);\n var formatted = formatDate(selectedDate, fmt);\n input.value = formatted;\n hidden.value = formatted;\n closePanel();\n renderCalendar(currentYear, currentMonth);\n if (attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(attrs.clk) : null;\n if (handler) handler({ value: formatted, date: selectedDate, id: attrs.id });\n }\n });\n\n if (typeof document !== 'undefined') {\n document.addEventListener('click', function(e) {\n if (!picker.contains(e.target)) closePanel();\n });\n }\n }\n\n field.appendChild(picker);\n field._variantTarget = picker;\n return field;\n });\n\n // === TimePicker 时间选择器(自闭合)===\n // attrs.l = 标签, attrs.ph = placeholder, attrs.fmt = 格式(默认 HH:mm)\n // attrs.v = 初始值, attrs.clk = 选择回调, attrs.dis = 禁用\n // attrs.id, attrs.n\n renderer.register('timepicker', (node) => {\n var attrs = node.attrs || {};\n var isDisabled = attrs.dis !== undefined;\n var fmt = attrs.fmt || 'HH:mm';\n var placeholder = attrs.ph || fmt;\n var value = attrs.v || '';\n\n var field = el('div', { class: 'tokui-field' });\n if (attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, attrs.l));\n }\n\n var classes = ['tokui-timepicker'];\n if (isDisabled) classes.push('tokui-timepicker--disabled');\n var picker = el('div', { class: classes.join(' ') });\n\n // 输入控制区\n var control = el('div', { class: 'tokui-timepicker-control' });\n var inputAttrs = {\n class: 'tokui-timepicker-input',\n type: 'text',\n readonly: 'readonly',\n placeholder: placeholder\n };\n if (attrs.id) inputAttrs.id = attrs.id;\n if (isDisabled) inputAttrs.disabled = 'disabled';\n if (value) inputAttrs.value = value;\n var input = el('input', inputAttrs);\n control.appendChild(input);\n\n // 时钟图标\n var icon = el('span', { class: 'tokui-timepicker-icon' });\n icon.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>';\n control.appendChild(icon);\n picker.appendChild(control);\n\n // 解析初始时间\n var currentHour = 0, currentMinute = 0, currentSecond = 0;\n if (value) {\n var timeParts = value.split(':');\n currentHour = parseInt(timeParts[0]) || 0;\n currentMinute = parseInt(timeParts[1]) || 0;\n currentSecond = parseInt(timeParts[2]) || 0;\n }\n\n // 下拉时间面板\n var dropdown = el('div', { class: 'tokui-timepicker-dropdown' });\n\n // 构建滚轮列\n var showSeconds = fmt.indexOf('ss') !== -1 || fmt.indexOf('s') !== -1;\n var columns = el('div', { class: 'tokui-timepicker-columns' });\n\n var hourCol = buildTimeColumn('时', 24, currentHour);\n var minuteCol = buildTimeColumn('分', 60, currentMinute);\n columns.appendChild(hourCol);\n columns.appendChild(minuteCol);\n var secondCol = null;\n if (showSeconds) {\n secondCol = buildTimeColumn('秒', 60, currentSecond);\n columns.appendChild(secondCol);\n }\n dropdown.appendChild(columns);\n\n // 确认按钮\n var footer = el('div', { class: 'tokui-timepicker-footer' });\n var confirmBtn = el('button', { class: 'tokui-timepicker-confirm', type: 'button' }, '确定');\n footer.appendChild(confirmBtn);\n dropdown.appendChild(footer);\n\n // 隐藏 input\n var hidden = el('input', { type: 'hidden' });\n if (attrs.n) hidden.name = attrs.n;\n else if (attrs.id) hidden.name = attrs.id;\n hidden.value = value;\n picker.appendChild(hidden);\n\n dropdown.style.display = 'none';\n picker.appendChild(dropdown);\n\n // 交互\n var isOpen = false;\n\n function openPanel() {\n if (isDisabled || isOpen) return;\n registerOpenPicker(closePanel);\n isOpen = true;\n dropdown.style.display = '';\n picker.classList.add('tokui-timepicker--open');\n var rect = control.getBoundingClientRect();\n dropdown.style.left = rect.left + 'px';\n dropdown.style.top = (rect.bottom + 4) + 'px';\n // 宽度不跟随输入框:内容自适应,最小宽度由 CSS(300px)兜底\n dropdown.style.width = 'auto';\n var vw = getViewportWidth();\n if (rect.left + dropdown.offsetWidth > vw - 8) {\n dropdown.style.left = Math.max(8, vw - dropdown.offsetWidth - 8) + 'px';\n }\n // 滚动到当前值\n scrollToSelected(hourCol, currentHour);\n scrollToSelected(minuteCol, currentMinute);\n if (showSeconds && secondCol) scrollToSelected(secondCol, currentSecond);\n }\n\n function closePanel() {\n if (!isOpen) return;\n isOpen = false;\n dropdown.style.display = 'none';\n picker.classList.remove('tokui-timepicker--open');\n unregisterPicker(closePanel);\n }\n\n if (!isDisabled) {\n control.addEventListener('click', function(e) {\n e.stopPropagation();\n if (isOpen) closePanel(); else openPanel();\n });\n\n confirmBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n currentHour = getSelectedValue(hourCol);\n currentMinute = getSelectedValue(minuteCol);\n if (showSeconds && secondCol) currentSecond = getSelectedValue(secondCol);\n var formatted = formatTime(currentHour, currentMinute, currentSecond, fmt);\n input.value = formatted;\n hidden.value = formatted;\n closePanel();\n if (attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(attrs.clk) : null;\n if (handler) handler({ value: formatted, hour: currentHour, minute: currentMinute, second: currentSecond, id: attrs.id });\n }\n });\n\n if (typeof document !== 'undefined') {\n document.addEventListener('click', function(e) {\n if (!picker.contains(e.target)) closePanel();\n });\n }\n }\n\n field.appendChild(picker);\n field._variantTarget = picker;\n return field;\n });\n\n // === DateTimePicker 日期时间选择器(自闭合)===\n // attrs.l = 标签, attrs.ph = placeholder, attrs.fmt = 格式(默认 YYYY-MM-DD HH:mm)\n // attrs.v = 初始值, attrs.clk = 选择回调, attrs.dis = 禁用\n // attrs.id, attrs.n\n // DatePicker 在上 + TimePicker 在下,合并为一个面板\n renderer.register('datetimepicker', (node) => {\n var attrs = node.attrs || {};\n var isDisabled = attrs.dis !== undefined;\n var fmt = attrs.fmt || 'YYYY-MM-DD HH:mm';\n var placeholder = attrs.ph || fmt;\n var value = attrs.v || '';\n\n var field = el('div', { class: 'tokui-field' });\n if (attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, attrs.l));\n }\n\n var classes = ['tokui-datetimepicker'];\n if (isDisabled) classes.push('tokui-datetimepicker--disabled');\n var picker = el('div', { class: classes.join(' ') });\n\n // 输入控制区\n var control = el('div', { class: 'tokui-datetimepicker-control' });\n var inputAttrs = {\n class: 'tokui-datetimepicker-input',\n type: 'text',\n readonly: 'readonly',\n placeholder: placeholder\n };\n if (attrs.id) inputAttrs.id = attrs.id;\n if (isDisabled) inputAttrs.disabled = 'disabled';\n if (value) inputAttrs.value = value;\n var input = el('input', inputAttrs);\n control.appendChild(input);\n\n // 日历图标\n var icon = el('span', { class: 'tokui-datetimepicker-icon' });\n icon.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/></svg>';\n control.appendChild(icon);\n picker.appendChild(control);\n\n // 解析初始值\n var now = new Date();\n var currentYear, currentMonth, selectedDate;\n var currentHour = 0, currentMinute = 0, currentSecond = 0;\n if (value) {\n selectedDate = parseDateTimeValue(value) || parseDateValue(value);\n if (selectedDate) {\n currentYear = selectedDate.getFullYear();\n currentMonth = selectedDate.getMonth();\n currentHour = selectedDate.getHours();\n currentMinute = selectedDate.getMinutes();\n currentSecond = selectedDate.getSeconds();\n }\n }\n if (!currentYear) {\n currentYear = now.getFullYear();\n currentMonth = now.getMonth();\n }\n\n // 隐藏 input\n var hidden = el('input', { type: 'hidden' });\n if (attrs.n) hidden.name = attrs.n;\n else if (attrs.id) hidden.name = attrs.id;\n hidden.value = value;\n picker.appendChild(hidden);\n\n // 下拉面板(日期 + 时间)\n var dropdown = el('div', { class: 'tokui-datetimepicker-dropdown' });\n\n // 日期面板\n var dateSection = el('div', { class: 'tokui-datetimepicker-date' });\n // 时间面板\n var showSeconds = fmt.indexOf('ss') !== -1 || fmt.indexOf('s') !== -1;\n var timeSection = el('div', { class: 'tokui-datetimepicker-time' });\n var timeColumns = el('div', { class: 'tokui-timepicker-columns' });\n var hourCol = buildTimeColumn('时', 24, currentHour);\n var minuteCol = buildTimeColumn('分', 60, currentMinute);\n timeColumns.appendChild(hourCol);\n timeColumns.appendChild(minuteCol);\n var secondCol = null;\n if (showSeconds) {\n secondCol = buildTimeColumn('秒', 60, currentSecond);\n timeColumns.appendChild(secondCol);\n }\n timeSection.appendChild(timeColumns);\n\n function renderDateSection(year, month) {\n dateSection.innerHTML = '';\n var nav = renderCalendarGrid(year, month, selectedDate, now, dateSection);\n\n nav.prevBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n currentMonth--;\n if (currentMonth < 0) { currentMonth = 11; currentYear--; }\n renderDateSection(currentYear, currentMonth);\n });\n nav.nextBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n currentMonth++;\n if (currentMonth > 11) { currentMonth = 0; currentYear++; }\n renderDateSection(currentYear, currentMonth);\n });\n }\n\n // 确认按钮\n var footer = el('div', { class: 'tokui-datetimepicker-footer' });\n var confirmBtn = el('button', { class: 'tokui-timepicker-confirm', type: 'button' }, '确定');\n footer.appendChild(confirmBtn);\n\n // 日期面板 + 时间面板横向并排(主流布局:日期为主,时间滚轮列居右侧栏)\n var body = el('div', { class: 'tokui-datetimepicker-body' });\n body.appendChild(dateSection);\n body.appendChild(timeSection);\n dropdown.appendChild(body);\n dropdown.appendChild(footer);\n\n renderDateSection(currentYear, currentMonth);\n dropdown.style.display = 'none';\n picker.appendChild(dropdown);\n\n // 交互\n var isOpen = false;\n\n function openPanel() {\n if (isDisabled || isOpen) return;\n registerOpenPicker(closePanel);\n isOpen = true;\n dropdown.style.display = '';\n picker.classList.add('tokui-datetimepicker--open');\n var rect = control.getBoundingClientRect();\n dropdown.style.left = rect.left + 'px';\n dropdown.style.top = (rect.bottom + 4) + 'px';\n // 宽度不跟随输入框:由内容自适应(日期+时间横排),最小宽度由 CSS(300px)兜底\n dropdown.style.width = 'auto';\n // 右溢出保护:贴右边则左移\n var dw = dropdown.offsetWidth;\n var vw = getViewportWidth();\n if (rect.left + dw > vw - 8) {\n dropdown.style.left = Math.max(8, vw - dw - 8) + 'px';\n }\n scrollToSelected(hourCol, currentHour);\n scrollToSelected(minuteCol, currentMinute);\n if (showSeconds && secondCol) scrollToSelected(secondCol, currentSecond);\n }\n\n function closePanel() {\n if (!isOpen) return;\n isOpen = false;\n dropdown.style.display = 'none';\n picker.classList.remove('tokui-datetimepicker--open');\n unregisterPicker(closePanel);\n }\n\n if (!isDisabled) {\n control.addEventListener('click', function(e) {\n e.stopPropagation();\n if (isOpen) closePanel(); else openPanel();\n });\n\n dateSection.addEventListener('click', function(e) {\n e.stopPropagation();\n var dayEl = e.target.closest('.tokui-datepicker-day');\n if (!dayEl || dayEl.classList.contains('tokui-datepicker-day--other')) return;\n var day = parseInt(dayEl.getAttribute('data-day'));\n selectedDate = new Date(currentYear, currentMonth, day);\n renderDateSection(currentYear, currentMonth);\n });\n\n confirmBtn.addEventListener('click', function(e) {\n e.stopPropagation();\n if (!selectedDate) selectedDate = new Date(currentYear, currentMonth, now.getDate());\n currentHour = getSelectedValue(hourCol);\n currentMinute = getSelectedValue(minuteCol);\n if (showSeconds && secondCol) currentSecond = getSelectedValue(secondCol);\n selectedDate.setHours(currentHour, currentMinute, currentSecond);\n var dateStr = formatDate(selectedDate, fmt);\n input.value = dateStr;\n hidden.value = dateStr;\n closePanel();\n if (attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._eventBus)\n ? window.TokUI._eventBus.getHandler(attrs.clk) : null;\n if (handler) handler({ value: dateStr, date: selectedDate, id: attrs.id });\n }\n });\n\n if (typeof document !== 'undefined') {\n document.addEventListener('click', function(e) {\n if (!picker.contains(e.target)) closePanel();\n });\n }\n }\n\n field.appendChild(picker);\n field._variantTarget = picker;\n return field;\n });\n}\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.registerFormComponents = registerFormComponents;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { registerFormComponents };\n}\n","/**\n * TokUI 布局组件模块\n * 注册布局相关组件:card(卡片)、row/col(栅格布局)、\n * list/item(列表)。\n *\n * DSL 示例:\n * [row]\n * [col span:6][p 左侧内容][/col]\n * [col span:6][p 右侧内容][/col]\n * [/row]\n * [card tt:标题][p 卡片内容][/card]\n * [list t:ul][item 第一项][item 第二项][/list]\n */\n'use strict';\n\n/**\n * 注册布局组件到渲染器\n * @param {TokUIRenderer} renderer - 渲染器实例\n */\nfunction registerLayoutComponents(renderer) {\n const { el } = (typeof require === 'function')\n ? require('../core/renderer')\n : window.TokUI._internal;\n\n // === 卡片组件 ===\n // attrs.tt = 标题文本, attrs.tx = body文本(自闭合模式), attrs.id = 标识\n // 两种用法:\n // 容器模式:[card tt:标题][p 内容][/card]\n // 自闭合: [card tt:标题 tx:内容]\n // 子节点中的 ft 类型会被渲染为独立的页脚区域\n var _SAFE_STYLE_PROPS = /^(background-color|color|border(-radius|-top|-bottom|-left|-right)?|padding(-top|-bottom|-left|-right)?|margin(-top|-bottom|-left|-right)?|text-align|max-width|min-height|box-shadow|opacity|font-size|font-weight|line-height|border-radius|overflow|cursor|gap|display|flex-wrap|align-items|justify-content|width|height|float|clear|visibility|white-space|word-break|text-overflow|text-decoration|list-style|vertical-align|transition|transform)$/;\n\n function _filterStyle(raw) {\n if (!raw) return undefined;\n return raw.split(';').filter(function (s) {\n var prop = s.split(':')[0].trim().toLowerCase();\n return prop && _SAFE_STYLE_PROPS.test(prop);\n }).join(';') || undefined;\n }\n\n renderer.register('card', (node, rc) => {\n const attrs = { class: 'tokui-card' };\n if (node.attrs.id) attrs.id = node.attrs.id;\n var safeStyle = _filterStyle(node.attrs.style);\n if (safeStyle) attrs.style = safeStyle;\n const card = el('div', attrs);\n if (node.attrs.w) card.style.width = /^\\d+$/.test(node.attrs.w) ? node.attrs.w + 'px' : node.attrs.w;\n if (node.attrs.tt) {\n var headerCls = 'tokui-card-header';\n var hc = node.attrs.hc || '';\n if (node.attrs.ht) headerCls += ' tokui-card-header--' + node.attrs.ht;\n if (hc && ['primary','danger','success','warning','info','dark'].indexOf(hc) !== -1 && node.attrs.ht) {\n headerCls += ' tokui-card-header--' + node.attrs.ht + '--' + hc;\n }\n var headerEl = el('div', { class: headerCls, role: 'heading', 'aria-level': '3' }, node.attrs.tt);\n // 自定义色值:inline style\n if (hc && ['primary','danger','success','warning','info','dark'].indexOf(hc) === -1) {\n var ht = node.attrs.ht || '';\n if (ht === 'fill') {\n headerEl.style.background = hc;\n headerEl.style.color = '#fff';\n } else if (ht === 'accent') {\n headerEl.style.borderLeftColor = hc;\n } else if (ht === 'underline') {\n headerEl.style.setProperty('--tokui-card-header-underline-color', hc);\n } else if (ht === 'dot') {\n headerEl.style.setProperty('--tokui-card-header-dot-color', hc);\n } else if (ht === 'pill') {\n headerEl.style.background = hc;\n headerEl.style.color = '#fff';\n }\n }\n card.appendChild(headerEl);\n }\n // 分离 ft 子节点和普通子节点\n const bodyChildren = [];\n const ftChildren = [];\n (node.children || []).forEach(child => {\n if (child.type === 'ft') {\n ftChildren.push(child);\n } else {\n bodyChildren.push(child);\n }\n });\n const body = el('div', { class: 'tokui-card-body' });\n // tx 属性作为 body 文本(自闭合模式)\n if (node.attrs.tx) {\n body.textContent = node.attrs.tx;\n }\n var renderedChildren = rc(bodyChildren);\n renderedChildren.forEach(child => {\n if (child && child.nodeType) body.appendChild(child);\n });\n card.appendChild(body);\n rc(ftChildren).forEach(child => {\n if (child && child.nodeType) card.appendChild(child);\n });\n card._slot = body;\n card._tokuiType = 'card';\n card._update = function (uAttrs) {\n if (uAttrs.tt !== undefined) {\n var header = card.querySelector('.tokui-card-header');\n if (header) header.textContent = uAttrs.tt;\n }\n if (uAttrs.tx !== undefined) {\n var cardBody = card.querySelector('.tokui-card-body');\n if (cardBody) cardBody.textContent = uAttrs.tx;\n }\n };\n // 流式关闭时检测 artifact 子节点,重构为 flex 分栏\n card._streamCloseHook = function() {};\n if (node._dsl !== undefined) card._dslNode = node;\n return card;\n });\n\n // === 卡片页脚组件 ===\n // 作为 card 的子容器,渲染为 .tokui-card-footer\n renderer.register('ft', (node, rc) => {\n var text = node.attrs.tx || node.content || '';\n const footer = el('div', { class: 'tokui-card-footer' });\n if (text) footer.textContent = text;\n rc(node.children || []).forEach(child => {\n if (child && child.nodeType) footer.appendChild(child);\n });\n // 非流式:children 已渲染完毕,若无内容则不渲染(避免空白页脚条)\n // 流式 open:children 尚未到达,乐观创建,由 _streamCloseHook 在关闭时兜底移除\n var isStreamingOpen = node._stream === 'open';\n if (!isStreamingOpen && !footer.childNodes.length && !text) return null;\n footer._slot = footer;\n footer._tokuiType = 'ft';\n footer._streamCloseHook = function () {\n if (!footer.childNodes.length && !text) {\n if (footer.parentNode) footer.parentNode.removeChild(footer);\n }\n };\n return footer;\n });\n\n // === 行容器组件(栅格行)===\n renderer.register('row', (node, rc) => {\n const row = el('div', { class: 'tokui-row' });\n rc(node.children).forEach(child => {\n if (child && child.nodeType) row.appendChild(child);\n });\n row._slot = row;\n row._tokuiType = 'row';\n return row;\n });\n\n // === 列容器组件(栅格列)===\n // attrs.span = 列宽占比(1-12,基于 12 栅格系统)。超界 clamp 到 [1,12],\n // 避免误用 24 列思维(span:14/24)时静默塌缩成 1 列破坏布局。\n renderer.register('col', (node, rc) => {\n const spanVal = (node.attrs && (node.attrs.span || node.attrs.cols));\n const col = el('div', { class: 'tokui-col' });\n if (spanVal) {\n const n = parseInt(spanVal);\n const span = isNaN(n) ? 1 : Math.min(12, Math.max(1, n));\n col.classList.add('tokui-col--' + span);\n col.style.gridColumn = `span ${span}`;\n }\n // 处理列内直接文本内容\n if (node.content) {\n col.textContent = node.content;\n }\n rc(node.children).forEach(child => {\n if (child && child.nodeType) col.appendChild(child);\n });\n col._slot = col;\n col._tokuiType = 'col';\n return col;\n });\n\n // === 列表容器组件 ===\n // attrs.t = 列表类型('ol' 有序列表,默认 'ul' 无序列表)\n // attrs.plain = 隐藏序号/圆点前缀,左对齐\n renderer.register('list', (node, rc) => {\n const tag = (node.attrs && node.attrs.t === 'ol') ? 'ol' : 'ul';\n const cls = node.attrs && node.attrs.plain ? 'tokui-list tokui-list--plain' : 'tokui-list';\n const list = el(tag, { class: cls });\n rc(node.children).forEach(child => {\n if (child && child.nodeType) list.appendChild(child);\n });\n list._slot = list;\n list._tokuiType = 'list';\n return list;\n });\n\n // === 列表项组件(支持嵌套列表)===\n // 构建 desc 描述项 DOM(desc 的子节点,标签可以是 desc-item 或 item)。\n // 盖 data-tokui-tag=node.type 印章,让 Playground 按 [item]/[desc-item] 各自的代码行定位。\n // cols 用于限制 span 上限(mount 模式 desc 已知 cols;流式模式不传则不限制)。\n function buildDescItem(node, cols) {\n var attrs = node.attrs || {};\n var span = parseInt(attrs.span) || 1;\n var itemEl = el('div', { class: 'tokui-desc__item', 'data-tokui-tag': node.type });\n if (span > 1) {\n var limit = cols ? Math.min(span, cols) : span;\n itemEl.style.gridColumn = 'span ' + limit;\n }\n var label = el('div', { class: 'tokui-desc__label' });\n label.textContent = attrs.l || '';\n itemEl.appendChild(label);\n var val = el('div', { class: 'tokui-desc__value' });\n val.textContent = attrs.tx || node.content || '';\n itemEl.appendChild(val);\n return itemEl;\n }\n\n // item 视父级自适应:desc 内 → 描述项;list/ol/ul 内 → <li> 列表项。\n renderer.register('item', (node, rc, parentType) => {\n if (parentType === 'desc') return buildDescItem(node);\n if (parentType === 'carousel') return buildCarouselSlide(node, rc);\n if (parentType === 'command-group') {\n // buildCommandItem 定义在 basic.js,经 window.TokUI._internal 跨模块共享(同 el)\n var bci = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal && window.TokUI._internal.buildCommandItem) || null;\n if (bci) return bci(node);\n }\n const li = el('li', { class: 'tokui-list-item' });\n var text = node.content || (node.attrs && node.attrs.tx) || '';\n if (text) {\n li.textContent = text;\n }\n rc(node.children || []).forEach(child => {\n if (child && child.nodeType) li.appendChild(child);\n });\n li._slot = li;\n li._tokuiType = 'item';\n return li;\n });\n\n // === 标签页容器 ===\n // 纯 CSS 实现:radio/label/panel 平铺为兄弟元素,:checked 选择器控制切换\n // 一次性渲染:tabs 遍历 tab 子节点生成 input+label+panel\n // 流式渲染:tab 子组件自行生成 input+label+panel,追加到 tabs 容器\n renderer.register('tabs', (node, rc) => {\n const container = el('div', { class: 'tokui-tabs', role: 'tablist' });\n const tabId = 'tokui-tab-' + Math.random().toString(36).slice(2, 8);\n // 存储到 DOM 属性,供 tab 子组件读取\n container._tabId = tabId;\n container._tabCount = 0;\n\n (node.children || []).forEach((child, idx) => {\n if (child.type !== 'tab') return;\n _appendTabItem(container, child, rc, tabId, idx);\n container._tabCount = idx + 1;\n });\n\n container._slot = container;\n container._tokuiType = 'tabs';\n // 键盘导航:ArrowLeft/Right 切换 tab\n container.addEventListener('keydown', function(e) {\n if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n var labels = Array.from(container.querySelectorAll('.tokui-tabs-label'));\n var idx = labels.indexOf(e.target);\n if (idx === -1) return;\n e.preventDefault();\n var next = e.key === 'ArrowRight' ? (idx + 1) % labels.length : (idx - 1 + labels.length) % labels.length;\n var radio = container.querySelector('#' + labels[next].getAttribute('for'));\n if (radio) { radio.checked = true; labels[next].focus(); }\n });\n container._update = function(uAttrs) {\n if (uAttrs.v !== undefined) {\n var radio = container.querySelector('input[data-index=\"' + uAttrs.v + '\"]');\n if (radio) radio.checked = true;\n }\n };\n return container;\n });\n /**\n * 向 tabs 容器追加一个完整的 tab 项(input + label + panel)\n */\n function _appendTabItem(container, tabNode, rc, tabId, idx) {\n // radio input\n var inputAttrs = { type: 'radio', name: tabId, class: 'tokui-tabs-input', 'data-index': String(idx) };\n if (idx === 0) inputAttrs.checked = 'checked';\n var input = el('input', inputAttrs);\n input.id = tabId + '-' + idx;\n container.appendChild(input);\n\n // label 作为 tab 导航项(盖 data-tokui-tag=tab 印章,供 Playground 点击 [tab] 代码行定位)\n var label = el('label', { class: 'tokui-tabs-label', for: tabId + '-' + idx, 'data-index': String(idx), 'data-tokui-tag': 'tab', role: 'tab', tabindex: '0' }, tabNode.attrs.tt || ('Tab ' + (idx + 1)));\n container.appendChild(label);\n\n // panel 内容区\n var panel = el('div', { class: 'tokui-tabs-panel', role: 'tabpanel', 'data-index': String(idx) });\n rc(tabNode.children || []).forEach(c => {\n if (c && c.nodeType) panel.appendChild(c);\n });\n container.appendChild(panel);\n }\n\n // === 单个标签页(tabs 的子容器)===\n // 流式渲染时:生成 input + label + panel 三件套,追加到父 tabs 容器\n renderer.register('tab', (node, rc) => {\n var panel = el('div', { class: 'tokui-tabs-panel', role: 'tabpanel' });\n rc(node.children || []).forEach(c => {\n if (c && c.nodeType) panel.appendChild(c);\n });\n panel._slot = panel;\n panel._tokuiType = 'tab';\n // 流式渲染标记:记录 tab 的标题和索引\n panel._tabTitle = (node.attrs && node.attrs.tt) || '';\n panel._isTab = true;\n return panel;\n });\n\n // === 手风琴容器 ===\n renderer.register('accordion', (node, rc) => {\n var container = el('div', { class: 'tokui-accordion' });\n rc(node.children || []).forEach(child => {\n if (child && child.nodeType) container.appendChild(child);\n });\n container._slot = container;\n container._tokuiType = 'accordion';\n return container;\n });\n\n // === 折叠面板(details/summary 原生实现)===\n renderer.register('collapse', (node, rc) => {\n var cAttrs = { class: 'tokui-collapse', 'aria-expanded': node.attrs.open !== undefined ? 'true' : 'false' };\n if (node.attrs.id) cAttrs.id = node.attrs.id;\n var details = el('details', cAttrs);\n var summary = el('summary', { class: 'tokui-collapse-title' }, node.attrs.tt || '展开');\n details.appendChild(summary);\n var body = el('div', { class: 'tokui-collapse-body' });\n rc(node.children || []).forEach(child => {\n if (child && child.nodeType) body.appendChild(child);\n });\n details.appendChild(body);\n if (node.attrs.open !== undefined) details.setAttribute('open', '');\n details.addEventListener('toggle', function() {\n details.setAttribute('aria-expanded', String(details.hasAttribute('open')));\n });\n details._slot = body;\n details._tokuiType = 'collapse';\n details._update = function (uAttrs) {\n if (uAttrs.act === 'open') details.setAttribute('open', '');\n else if (uAttrs.act === 'close') details.removeAttribute('open');\n if (uAttrs.tt !== undefined) {\n var summ = details.querySelector('.tokui-collapse-title');\n if (summ) summ.textContent = uAttrs.tt;\n }\n if (uAttrs.tx !== undefined) {\n var body = details.querySelector('.tokui-collapse-body');\n if (body) {\n var firstP = body.querySelector('p');\n if (firstP) firstP.textContent = uAttrs.tx;\n else body.textContent = uAttrs.tx;\n }\n }\n };\n return details;\n });\n\n // === 对话框(dialog 原生元素)===\n renderer.register('dialog', (node, rc) => {\n var attrs = { class: 'tokui-dialog' };\n if (node.attrs.id) attrs.id = node.attrs.id;\n var dialog = el('dialog', attrs);\n if (node.attrs.tt) {\n var header = el('div', { class: 'tokui-dialog-header' });\n var titleSpan = el('span', {}, node.attrs.tt);\n header.appendChild(titleSpan);\n var closeBtn = el('button', { class: 'tokui-dialog-close', 'aria-label': '关闭' }, '✕');\n closeBtn.addEventListener('click', function () { dialog.close(); });\n header.appendChild(closeBtn);\n dialog.appendChild(header);\n }\n // 分离 ft 子节点和普通子节点:ft 作为对话框页脚追加到 dialog(body 之后),其余进 body\n var bodyChildren = [];\n var ftChildren = [];\n (node.children || []).forEach(child => {\n if (child.type === 'ft') ftChildren.push(child);\n else bodyChildren.push(child);\n });\n var body = el('div', { class: 'tokui-dialog-body' });\n rc(bodyChildren).forEach(child => {\n if (child && child.nodeType) body.appendChild(child);\n });\n dialog.appendChild(body);\n rc(ftChildren).forEach(child => {\n if (child && child.nodeType) dialog.appendChild(child);\n });\n if (node.attrs.clk) dialog.setAttribute('data-tokui-clk', node.attrs.clk);\n dialog.addEventListener('click', function (e) {\n if (e.target === dialog) dialog.close();\n });\n dialog._slot = body;\n dialog._tokuiType = 'dialog';\n // 焦点陷阱\n dialog.addEventListener('keydown', function (e) {\n if (e.key !== 'Tab') return;\n var focusable = dialog.querySelectorAll('button, [tabindex], input, select, textarea');\n if (focusable.length === 0) return;\n var first = focusable[0];\n var last = focusable[focusable.length - 1];\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n });\n dialog._update = function (uAttrs) {\n if (uAttrs.act === 'open') dialog.showModal();\n else if (uAttrs.act === 'close') dialog.close();\n if (uAttrs.tt !== undefined) {\n var hdr = dialog.querySelector('.tokui-dialog-header span');\n if (hdr) hdr.textContent = uAttrs.tt;\n }\n };\n return dialog;\n });\n\n // === 抽屉组件 ===\n // attrs.tt = 标题, attrs.pos = 位置(left/right/top/bottom), attrs.w = 宽度, attrs.h = 高度\n // attrs.id, attrs.clk\n renderer.register('drawer', (node, rc) => {\n var pos = node.attrs.pos || 'right';\n var wrapper = el('div', { class: 'tokui-drawer tokui-drawer--' + pos, role: 'dialog', 'aria-modal': 'true' });\n if (node.attrs.id) wrapper.id = node.attrs.id;\n if (node.attrs.clk) wrapper.setAttribute('data-tokui-clk', node.attrs.clk);\n\n var overlay = el('div', { class: 'tokui-drawer__overlay' });\n overlay.addEventListener('click', function () {\n wrapper.classList.remove('tokui-drawer--open');\n });\n wrapper.appendChild(overlay);\n\n var panelAttrs = { class: 'tokui-drawer__panel' };\n var panel = el('div', panelAttrs);\n var w = node.attrs.w || '360px';\n var h = node.attrs.h || '300px';\n if (pos === 'left' || pos === 'right') {\n panel.style.width = w;\n panel.style.height = '100%';\n } else {\n panel.style.height = h;\n panel.style.width = '100%';\n }\n\n if (node.attrs.tt) {\n var header = el('div', { class: 'tokui-drawer__header' });\n header.appendChild(el('span', {}, node.attrs.tt));\n var closeBtn = el('button', { class: 'tokui-drawer__close', 'aria-label': '关闭' }, '✕');\n closeBtn.addEventListener('click', function () {\n wrapper.classList.remove('tokui-drawer--open');\n });\n header.appendChild(closeBtn);\n panel.appendChild(header);\n }\n\n // 分离 ft 子节点和普通子节点:ft 作为抽屉页脚追加到 panel(body 之后),其余进 body\n var dBodyChildren = [];\n var dFtChildren = [];\n (node.children || []).forEach(function (child) {\n if (child.type === 'ft') dFtChildren.push(child);\n else dBodyChildren.push(child);\n });\n var body = el('div', { class: 'tokui-drawer__body' });\n rc(dBodyChildren).forEach(function (child) {\n if (child && child.nodeType) body.appendChild(child);\n });\n panel.appendChild(body);\n rc(dFtChildren).forEach(function (child) {\n if (child && child.nodeType) panel.appendChild(child);\n });\n wrapper.appendChild(panel);\n\n wrapper._slot = body;\n wrapper._tokuiType = 'drawer';\n // Escape 关闭\n wrapper.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') { wrapper.classList.remove('tokui-drawer--open'); e.stopPropagation(); }\n });\n wrapper._update = function (uAttrs) {\n if (uAttrs.act === 'open') wrapper.classList.add('tokui-drawer--open');\n else if (uAttrs.act === 'close') wrapper.classList.remove('tokui-drawer--open');\n if (uAttrs.tt !== undefined) {\n var hdr = wrapper.querySelector('.tokui-drawer__header span');\n if (hdr) hdr.textContent = uAttrs.tt;\n }\n };\n return wrapper;\n });\n\n // === 多图容器组件 ===\n // 支持两种模式:\n // 1. 简写版:attrs.s 包含逗号分隔的 URL,自动生成子 img\n // 2. 完整版:子节点为 img 标签(一次性渲染或流式追加)\n // 根据子图片数量动态设置 CSS 类实现九宫格布局\n renderer.register('imgs', (node, rc) => {\n const container = el('div', { class: 'tokui-imgs', role: 'group', 'aria-label': '图片画廊' });\n let childNodes = node.children || [];\n\n // 简写版:从 s: 属性拆分生成虚拟 img 子节点\n if (node.attrs && node.attrs.s) {\n const urls = node.attrs.s.split(',').map(u => u.trim()).filter(Boolean);\n childNodes = urls.map(url => ({\n type: 'img',\n attrs: { s: url },\n content: '',\n children: []\n }));\n }\n\n // 渲染子 img 节点(一次性模式)\n const rendered = rc(childNodes);\n rendered.forEach(child => {\n if (child && child.nodeType) container.appendChild(child);\n });\n\n // 根据图片数量设置布局类\n const count = rendered.length;\n if (count >= 1) {\n container.classList.add('tokui-imgs--' + Math.min(count, 9));\n }\n\n container._slot = container;\n container._tokuiType = 'imgs';\n\n // 收集所有 img src 供灯箱导航\n const sources = childNodes\n .filter(n => n.type === 'img' && n.attrs && n.attrs.s)\n .map(n => n.attrs.s);\n container._imgSources = sources;\n\n // 为已有的 img 绑定灯箱点击\n function bindLightbox(parent, srcList) {\n const imgEls = parent.querySelectorAll('.tokui-img');\n imgEls.forEach((imgEl) => {\n if (imgEl._lbBound) return;\n imgEl._lbBound = true;\n const cloned = imgEl.cloneNode(true);\n imgEl.parentNode.replaceChild(cloned, imgEl);\n cloned.style.cursor = 'pointer';\n cloned.addEventListener('click', function () {\n const { getLightbox } = (typeof require === 'function')\n ? require('./lightbox')\n : window.TokUI._internal;\n const lb = getLightbox(typeof document !== 'undefined' ? document : undefined);\n lb.open(cloned.getAttribute('src'), srcList);\n });\n });\n }\n\n bindLightbox(container, sources);\n\n // 流式模式:子节点通过 _streamChild 逐个追加,close 时补设布局类和灯箱\n container._streamCloseHook = function () {\n const imgCount = container.querySelectorAll(':scope > .tokui-img').length;\n if (imgCount >= 1) {\n container.classList.add('tokui-imgs--' + Math.min(imgCount, 9));\n }\n // 收集实际渲染的图片 src\n const actualSrcs = [];\n container.querySelectorAll(':scope > .tokui-img').forEach(el => {\n actualSrcs.push(el.getAttribute('src'));\n });\n bindLightbox(container, actualSrcs);\n };\n\n return container;\n });\n\n // === Timeline 时间轴组件 ===\n // 容器 [timeline],子项 [ti tm:\"时间\" t:success 内容]\n // attrs.v = variant (horizontal/alternate/card)\n renderer.register('timeline', (node, rc) => {\n const attrs = node.attrs || {};\n const classes = ['tokui-timeline'];\n const variant = attrs.v || '';\n const isAlternate = (variant === 'alternate' || variant === 'alt');\n if (variant === 'h' || variant === 'horizontal') classes.push('tokui-timeline--horizontal');\n if (isAlternate) classes.push('tokui-timeline--alternate');\n if (variant === 'card') classes.push('tokui-timeline--card');\n const wrapper = el('div', { class: classes.join(' ') });\n if (node.children && node.children.length > 0) {\n const children = rc(node.children);\n children.forEach(child => wrapper.appendChild(child));\n }\n // 交替排列:按 ti 在兄弟中的\"真实序号\"打左右类,而非 :nth-child。\n // 否则 AI 在 timeline 里前置一个 [h3]/[p] 标题元素会把 nth-child 顶偏,\n // 导致第一项跑到右侧、整体左右翻转(demo 不加标题所以正常,AI 常加)。\n if (isAlternate) {\n const assignSides = () => {\n const tis = wrapper.querySelectorAll(':scope > .tokui-ti');\n tis.forEach((ti, i) => {\n ti.classList.toggle('tokui-ti--alt-left', i % 2 === 0);\n ti.classList.toggle('tokui-ti--alt-right', i % 2 === 1);\n });\n };\n assignSides(); // 非流式:子项已全部在 wrapper 内\n // 流式:每来一个 ti 就实时重算左右(MutationObserver 在 paint 前触发 microtask),\n // 保证流式过程中每个 ti 一挂载就出现在正确的左/右位置,而不是等 [/timeline] 闭合才生效。\n const mo = new MutationObserver(() => assignSides());\n mo.observe(wrapper, { childList: true });\n wrapper._streamCloseHook = () => { assignSides(); mo.disconnect(); };\n }\n return wrapper;\n });\n\n // === Timeline Item ===\n // attrs.tm = timestamp, attrs.t = type (primary/success/warning/error/info)\n // attrs.tt = title, content = body text\n renderer.register('ti', (node) => {\n const attrs = node.attrs || {};\n const itemClasses = ['tokui-ti'];\n const tagType = attrs.t || '';\n if (tagType) itemClasses.push('tokui-ti--' + tagType);\n const item = el('div', { class: itemClasses.join(' ') });\n\n // dot/indicator\n const dot = el('div', { class: 'tokui-ti__dot' });\n item.appendChild(dot);\n\n // content area\n const content = el('div', { class: 'tokui-ti__content' });\n if (attrs.tt) {\n const title = el('div', { class: 'tokui-ti__title' });\n title.textContent = attrs.tt;\n content.appendChild(title);\n }\n const body = el('div', { class: 'tokui-ti__body' });\n body.textContent = node.content || '';\n content.appendChild(body);\n if (attrs.tm) {\n const time = el('div', { class: 'tokui-ti__time' });\n time.textContent = attrs.tm;\n content.appendChild(time);\n }\n item.appendChild(content);\n return item;\n });\n\n // === Steps 步骤条容器 ===\n // attrs.v = 当前步骤(1-based), attrs.s = 尺寸(sm/lg), attrs.vd = 方向(horizontal/vertical)\n renderer.register('steps', (node, rc) => {\n const attrs = node.attrs || {};\n const current = parseInt(attrs.v) || 1;\n const size = attrs.s || '';\n const direction = attrs.vd || '';\n const classes = ['tokui-steps'];\n if (size === 'sm' || size === 'small') classes.push('tokui-steps--sm');\n if (direction === 'vertical' || direction === 'v') classes.push('tokui-steps--vertical');\n const wrapperAttrs = { class: classes.join(' ') };\n if (attrs.id) wrapperAttrs.id = attrs.id;\n const wrapper = el('div', wrapperAttrs);\n\n const stepNodes = (node.children || []).filter(c => c.type === 'step');\n stepNodes.forEach(function (child, idx) {\n const stepIdx = idx + 1;\n const stepAttrs = child.attrs || {};\n const stepClasses = ['tokui-step'];\n if (stepAttrs.status === 'error' || stepAttrs.status === 'danger') {\n stepClasses.push('tokui-step--error');\n if (stepIdx <= current) stepClasses.push('tokui-step--current');\n } else if (stepIdx < current) {\n stepClasses.push('tokui-step--done');\n } else if (stepIdx === current) {\n stepClasses.push('tokui-step--active');\n } else {\n stepClasses.push('tokui-step--pending');\n }\n\n const stepEl = el('div', { class: stepClasses.join(' '), 'data-tokui-tag': 'step' });\n const circle = el('div', { class: 'tokui-step__circle' });\n if (stepAttrs.status === 'error' || stepAttrs.status === 'danger') {\n circle.textContent = '✕';\n } else if (stepIdx < current) {\n circle.textContent = '✓';\n } else {\n circle.textContent = String(stepIdx);\n }\n stepEl.appendChild(circle);\n\n const body = el('div', { class: 'tokui-step__body' });\n if (stepAttrs.tt) {\n const title = el('div', { class: 'tokui-step__title' });\n title.textContent = stepAttrs.tt;\n body.appendChild(title);\n }\n if (child.content) {\n const desc = el('div', { class: 'tokui-step__desc' });\n desc.textContent = child.content;\n body.appendChild(desc);\n }\n stepEl.appendChild(body);\n wrapper.appendChild(stepEl);\n });\n\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'steps';\n wrapper._currentStep = current;\n\n // 重新计算所有 step 状态的通用方法\n function _applyStepStates(cur) {\n const stepEls = wrapper.querySelectorAll(':scope > .tokui-step');\n const total = stepEls.length;\n const complete = cur >= total;\n if (complete) {\n wrapper.classList.add('tokui-steps--complete');\n } else {\n wrapper.classList.remove('tokui-steps--complete');\n }\n stepEls.forEach(function (stepEl, idx) {\n const stepIdx = idx + 1;\n const circle = stepEl.querySelector('.tokui-step__circle');\n const isError = stepEl.getAttribute('data-step-status') === 'error';\n stepEl.className = 'tokui-step';\n if (isError) {\n stepEl.classList.add('tokui-step--error');\n if (stepIdx <= cur) stepEl.classList.add('tokui-step--current');\n if (circle) circle.textContent = '✕';\n } else if (complete) {\n stepEl.classList.add('tokui-step--done');\n if (circle) circle.textContent = '✓';\n } else if (stepIdx < cur) {\n stepEl.classList.add('tokui-step--done');\n if (circle) circle.textContent = '✓';\n } else if (stepIdx === cur) {\n stepEl.classList.add('tokui-step--active');\n if (circle) circle.textContent = String(stepIdx);\n } else {\n stepEl.classList.add('tokui-step--pending');\n if (circle) circle.textContent = String(stepIdx);\n }\n });\n }\n\n // 流式模式:关闭时重新设置所有 step 的状态和序号\n wrapper._streamCloseHook = function () {\n _applyStepStates(wrapper._currentStep);\n };\n\n // 动态更新方法:供 [upd id:xxx v:3] 调用\n wrapper._update = function (uAttrs) {\n if (uAttrs.v === undefined) return;\n var newCurrent = parseInt(uAttrs.v) || 1;\n wrapper._currentStep = newCurrent;\n _applyStepStates(newCurrent);\n };\n\n return wrapper;\n });\n\n // === Step 步骤项(流式模式使用)===\n renderer.register('step', (node) => {\n const attrs = node.attrs || {};\n const stepEl = el('div', { class: 'tokui-step tokui-step--pending' });\n if (attrs.status === 'error' || attrs.status === 'danger') {\n stepEl.setAttribute('data-step-status', 'error');\n }\n const circle = el('div', { class: 'tokui-step__circle' });\n circle.textContent = '?';\n stepEl.appendChild(circle);\n const body = el('div', { class: 'tokui-step__body' });\n if (attrs.tt) {\n const title = el('div', { class: 'tokui-step__title' });\n title.textContent = attrs.tt;\n body.appendChild(title);\n }\n if (node.content) {\n const desc = el('div', { class: 'tokui-step__desc' });\n desc.textContent = node.content;\n body.appendChild(desc);\n }\n stepEl.appendChild(body);\n return stepEl;\n });\n\n // === Description List 描述列表(容器)===\n // attrs.cols = 每行列数(默认3), attrs.stripe = 斑马纹, attrs.bordered = 带边框\n // attrs.v = 布局: horizontal/h(label和value左右排列), 默认上下排列\n // attrs.lw = label宽度(如 '120px',horizontal模式生效)\n // 子节点为 desc-item,grid 直接在 wrapper 上,流式和非流式通用\n renderer.register('desc', (node, rc) => {\n var attrs = node.attrs || {};\n var cols = parseInt(attrs.cols) || 3;\n var classes = ['tokui-desc'];\n if (attrs.stripe !== undefined) classes.push('tokui-desc--stripe');\n if (attrs.bordered !== undefined) classes.push('tokui-desc--bordered');\n var isHorizontal = attrs.v === 'horizontal' || attrs.v === 'h';\n if (isHorizontal) classes.push('tokui-desc--horizontal');\n\n var wrapper = el('div', { class: classes.join(' ') });\n wrapper.style.setProperty('--tokui-desc-cols', String(cols));\n if (attrs.lw) wrapper.style.setProperty('--tokui-desc-label-w', attrs.lw);\n\n // 非流式:有 children 时直接渲染。子节点标签可以是 desc-item 或 item(item 在 desc 内按描述项处理)。\n var items = (node.children || []).filter(function(c) { return c.type === 'desc-item' || c.type === 'item'; });\n if (items.length > 0) {\n items.forEach(function(childNode) {\n wrapper.appendChild(buildDescItem(childNode, cols));\n });\n }\n\n wrapper._slot = wrapper;\n wrapper._tokuiType = 'desc';\n return wrapper;\n });\n\n // === Description Item(自闭合)===\n // attrs.l = 标签, attrs.tx = 值, attrs.span = 列跨距\n // 流式模式下由 slot 机制 append 到 desc wrapper,自动参与 grid 布局\n renderer.register('desc-item', (node) => {\n return buildDescItem(node);\n });\n\n // 构建 carousel 幻灯片 DOM(carousel 的子节点,标签可以是 carousel-item 或 item)。\n // 盖 data-tokui-tag=node.type 印章,让 Playground 按 [item]/[carousel-item] 各自代码行定位。\n // carousel-item 与 item 在 carousel 内等价(item 同名按父级区分:list→<li>、desc→描述项、carousel→幻灯片)。\n function buildCarouselSlide(node, rc) {\n var attrs = node.attrs || {};\n var slide = el('div', { class: 'tokui-carousel__slide', 'data-tokui-tag': node.type });\n if (attrs.s) {\n var img = el('img', { src: attrs.s, alt: attrs.tt || '' });\n img.style.width = '100%';\n img.style.display = 'block';\n slide.appendChild(img);\n }\n rc(node.children || []).forEach(function (c) {\n if (c && c.nodeType) slide.appendChild(c);\n });\n if (attrs.tt || attrs.tx) {\n var body = el('div', { class: 'tokui-carousel__slide-body' });\n if (attrs.tt) body.appendChild(el('div', { class: 'tokui-carousel__slide-title' }, attrs.tt));\n if (attrs.tx) body.appendChild(el('div', { class: 'tokui-carousel__slide-desc' }, attrs.tx));\n slide.appendChild(body);\n }\n return slide;\n }\n\n // === Carousel 轮播图容器 ===\n // attrs: id, auto(自动播放间隔ms)\n // 子节点为 carousel-item / item(等价)/ img 类型\n renderer.register('carousel', (node, rc) => {\n var attrs = node.attrs || {};\n var wrapperAttrs = { class: 'tokui-carousel' };\n if (attrs.id) wrapperAttrs.id = attrs.id;\n wrapperAttrs['data-carousel'] = attrs.id || ('carousel-' + Math.random().toString(36).slice(2, 8));\n var wrapper = el('div', wrapperAttrs);\n\n var track = el('div', { class: 'tokui-carousel__track' });\n\n // 收集 carousel-item / item(等价)/ img 子节点\n var itemNodes = (node.children || []).filter(function(c) {\n return c.type === 'carousel-item' || c.type === 'item' || c.type === 'img';\n });\n\n // 一次性渲染所有子节点\n itemNodes.forEach(function(child) {\n if (child.type === 'carousel-item' || child.type === 'item') {\n track.appendChild(buildCarouselSlide(child, rc));\n } else if (child.type === 'img') {\n var slide = el('div', { class: 'tokui-carousel__slide' });\n rc([child]).forEach(function(c) {\n if (c && c.nodeType) slide.appendChild(c);\n });\n track.appendChild(slide);\n }\n });\n\n wrapper.appendChild(track);\n\n // 左右箭头\n var prevBtn = el('button', {\n class: 'tokui-carousel__arrow tokui-carousel__arrow--prev',\n 'aria-label': '上一张',\n 'data-dir': 'prev'\n });\n prevBtn.innerHTML = '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"15 18 9 12 15 6\"/></svg>';\n wrapper.appendChild(prevBtn);\n\n var nextBtn = el('button', {\n class: 'tokui-carousel__arrow tokui-carousel__arrow--next',\n 'aria-label': '下一张',\n 'data-dir': 'next'\n });\n nextBtn.innerHTML = '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 6 15 12 9 18\"/></svg>';\n wrapper.appendChild(nextBtn);\n\n // 指示点\n var dots = el('div', { class: 'tokui-carousel__dots' });\n var slideCount = itemNodes.length;\n for (var i = 0; i < slideCount; i++) {\n var dot = el('button', {\n class: 'tokui-carousel__dot' + (i === 0 ? ' tokui-carousel__dot--active' : ''),\n 'aria-label': '第' + (i + 1) + '张',\n 'data-index': String(i)\n });\n dots.appendChild(dot);\n }\n wrapper.appendChild(dots);\n\n wrapper._slot = track;\n wrapper._tokuiType = 'carousel';\n\n // 交互行为绑定\n function initCarouselBehavior() {\n var currentIndex = 0;\n var slideEls = track.querySelectorAll(':scope > .tokui-carousel__slide');\n var dotEls = dots.querySelectorAll('.tokui-carousel__dot');\n var autoInterval = null;\n\n function goTo(index) {\n if (index < 0) index = slideEls.length - 1;\n if (index >= slideEls.length) index = 0;\n currentIndex = index;\n track.style.transform = 'translateX(-' + (currentIndex * 100) + '%)';\n dotEls.forEach(function(d, di) {\n if (di === currentIndex) {\n d.classList.add('tokui-carousel__dot--active');\n } else {\n d.classList.remove('tokui-carousel__dot--active');\n }\n });\n }\n\n prevBtn.addEventListener('click', function() {\n goTo(currentIndex - 1);\n resetAuto();\n });\n nextBtn.addEventListener('click', function() {\n goTo(currentIndex + 1);\n resetAuto();\n });\n dots.addEventListener('click', function(e) {\n var dot = e.target.closest('.tokui-carousel__dot');\n if (!dot) return;\n goTo(parseInt(dot.getAttribute('data-index')));\n resetAuto();\n });\n\n function startAuto() {\n var interval = parseInt(attrs.auto);\n if (interval && interval > 0) {\n autoInterval = setInterval(function() {\n goTo(currentIndex + 1);\n }, interval);\n }\n }\n function resetAuto() {\n if (autoInterval) clearInterval(autoInterval);\n startAuto();\n }\n\n startAuto();\n\n // 键盘导航\n wrapper.setAttribute('tabindex', '0');\n wrapper.addEventListener('keydown', function(e) {\n if (e.key === 'ArrowLeft') { goTo(currentIndex - 1); resetAuto(); }\n else if (e.key === 'ArrowRight') { goTo(currentIndex + 1); resetAuto(); }\n });\n\n // 拖动/滑动切换\n var dragStartX = 0;\n var dragDelta = 0;\n var isDragging = false;\n\n track.addEventListener('mousedown', function(e) {\n isDragging = true;\n dragStartX = e.clientX;\n dragDelta = 0;\n track.style.transition = 'none';\n resetAuto();\n });\n track.addEventListener('touchstart', function(e) {\n isDragging = true;\n dragStartX = e.touches[0].clientX;\n dragDelta = 0;\n track.style.transition = 'none';\n resetAuto();\n }, { passive: true });\n\n function onMove(clientX) {\n if (!isDragging) return;\n dragDelta = clientX - dragStartX;\n var offset = -(currentIndex * wrapper.offsetWidth) + dragDelta;\n track.style.transform = 'translateX(' + offset + 'px)';\n }\n if (typeof document !== 'undefined' && document.addEventListener) {\n document.addEventListener('mousemove', function(e) { onMove(e.clientX); });\n document.addEventListener('touchmove', function(e) { onMove(e.touches[0].clientX); }, { passive: true });\n }\n\n function onEnd() {\n if (!isDragging) return;\n isDragging = false;\n track.style.transition = '';\n var threshold = wrapper.offsetWidth * 0.2;\n if (dragDelta < -threshold) {\n goTo(currentIndex + 1);\n } else if (dragDelta > threshold) {\n goTo(currentIndex - 1);\n } else {\n goTo(currentIndex);\n }\n }\n if (typeof document !== 'undefined' && document.addEventListener) {\n document.addEventListener('mouseup', onEnd);\n document.addEventListener('touchend', onEnd);\n }\n }\n\n // 一次性渲染:立即绑定\n if (itemNodes.length > 0) {\n initCarouselBehavior();\n }\n\n // 流式模式:关闭时绑定\n wrapper._streamCloseHook = function() {\n initCarouselBehavior();\n };\n\n return wrapper;\n });\n\n // === Carousel Item 轮播图子项 ===\n // 自闭合:attrs.s=图片URL, attrs.tt=标题, attrs.tx=描述\n // 也支持 img 子节点\n renderer.register('carousel-item', (node, rc) => {\n return buildCarouselSlide(node, rc);\n });\n\n // === 树节点 ===\n // 容器组件,可递归嵌套子 tn\n // attrs: v(值), tx(显示文本), open(默认展开), leaf(叶节点), chk(选中), dis(禁用)\n renderer.register('tn', (node, rc) => {\n var isLeaf = node.attrs.leaf !== undefined;\n var isOpen = node.attrs.open !== undefined;\n var isDisabled = node.attrs.dis !== undefined;\n\n var nodeEl = el('div', {\n class: 'tokui-tree-node' +\n (isLeaf ? ' tokui-tree-node--leaf' : '') +\n (isOpen ? ' tokui-tree-node--open' : '') +\n (isDisabled ? ' tokui-tree-node--disabled' : ''),\n role: 'treeitem',\n 'aria-expanded': !isLeaf ? String(isOpen) : undefined\n });\n nodeEl.setAttribute('data-value', node.attrs.v || '');\n nodeEl.setAttribute('data-text', node.attrs.tx || node.attrs.v || '');\n\n var header = el('div', { class: 'tokui-tree-node-header', tabindex: '0' });\n\n var arrow = el('span', { class: 'tokui-tree-arrow' });\n arrow.textContent = '▶';\n header.appendChild(arrow);\n\n var icon = el('span', { class: 'tokui-tree-icon' });\n icon.textContent = isLeaf ? '📄' : '📁';\n header.appendChild(icon);\n\n var text = el('span', { class: 'tokui-tree-text' }, node.attrs.tx || node.attrs.v || '');\n header.appendChild(text);\n\n nodeEl.appendChild(header);\n\n // 子节点容器(非叶节点才有)\n var childContainer = null;\n if (!isLeaf) {\n childContainer = el('div', { class: 'tokui-tree-node-children' });\n if (!isOpen) childContainer.style.display = 'none';\n if (node.children && node.children.length) {\n rc(node.children).forEach(function(child) {\n if (child && child.nodeType) childContainer.appendChild(child);\n });\n }\n nodeEl.appendChild(childContainer);\n nodeEl._slot = childContainer;\n }\n nodeEl._tokuiType = 'tn';\n\n return nodeEl;\n });\n\n // === 树形控件 ===\n // 容器组件,子节点为 tn\n // attrs: id, l(标签), clk(点击事件), chk(复选框模式), dis(禁用)\n renderer.register('tree', (node, rc) => {\n var isChkMode = node.attrs.chk !== undefined;\n var isDisabled = node.attrs.dis !== undefined;\n\n var field = el('div', { class: 'tokui-field' });\n if (node.attrs.l) {\n field.appendChild(el('label', { class: 'tokui-label' }, node.attrs.l));\n }\n if (node.attrs.id) field.id = node.attrs.id;\n\n var tree = el('div', {\n class: 'tokui-tree' +\n (isChkMode ? ' tokui-tree--checkable' : '') +\n (isDisabled ? ' tokui-tree--disabled' : ''),\n role: 'tree'\n });\n\n // mount 模式:立即渲染子节点\n if (node.children && node.children.length) {\n rc(node.children).forEach(function(child) {\n if (child && child.nodeType) tree.appendChild(child);\n });\n }\n\n field.appendChild(tree);\n\n // 是否已绑定过事件\n var behaviorBound = false;\n\n // 初始化交互行为\n function initTreeBehavior() {\n if (isDisabled || behaviorBound) return;\n behaviorBound = true;\n\n // 展开/折叠(委托到 tree,支持动态添加的节点)\n tree.addEventListener('click', function(e) {\n var arrow = e.target.closest('.tokui-tree-arrow');\n if (!arrow) return;\n e.stopPropagation();\n var nodeEl = arrow.closest('.tokui-tree-node');\n if (!nodeEl || nodeEl.classList.contains('tokui-tree-node--leaf')) return;\n var children = nodeEl.querySelector(':scope > .tokui-tree-node-children');\n if (!children) return;\n var isOpen = nodeEl.classList.contains('tokui-tree-node--open');\n if (isOpen) {\n nodeEl.classList.remove('tokui-tree-node--open');\n children.style.display = 'none';\n } else {\n nodeEl.classList.add('tokui-tree-node--open');\n children.style.display = '';\n }\n });\n\n // 节点选中(委托)\n tree.addEventListener('click', function(e) {\n var textEl = e.target.closest('.tokui-tree-text');\n if (!textEl) return;\n e.stopPropagation();\n var nodeEl = textEl.closest('.tokui-tree-node');\n if (!nodeEl) return;\n tree.querySelectorAll('.tokui-tree-node--selected').forEach(function(n) {\n n.classList.remove('tokui-tree-node--selected');\n });\n nodeEl.classList.add('tokui-tree-node--selected');\n\n if (node.attrs.clk) {\n var handler = (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal && window.TokUI._internal.TokUIEventBus)\n ? window.TokUI._internal.TokUIEventBus.getHandler(node.attrs.clk) : null;\n if (handler) handler({\n id: node.attrs.id,\n value: nodeEl.getAttribute('data-value'),\n text: nodeEl.getAttribute('data-text')\n });\n }\n });\n\n // 复选框模式\n if (isChkMode) {\n tree.querySelectorAll('.tokui-tree-node-header').forEach(function(header) {\n var cb = el('input', { type: 'checkbox', class: 'tokui-tree-checkbox' });\n var nodeEl = header.closest('.tokui-tree-node');\n if (nodeEl && nodeEl.classList.contains('tokui-tree-node--disabled')) {\n cb.disabled = true;\n }\n header.insertBefore(cb, header.firstChild);\n });\n\n tree.addEventListener('change', function(e) {\n if (!e.target.classList.contains('tokui-tree-checkbox')) return;\n var nodeEl = e.target.closest('.tokui-tree-node');\n if (!nodeEl) return;\n var checked = e.target.checked;\n nodeEl.querySelectorAll('.tokui-tree-checkbox').forEach(function(cb) {\n if (cb !== e.target) {\n cb.checked = checked;\n cb.indeterminate = false;\n }\n });\n updateParentCheckboxes(tree);\n });\n }\n\n // 键盘导航:Enter/Space toggle,ArrowDown/Up 同级导航\n tree.addEventListener('keydown', function(e) {\n var header = e.target.closest('.tokui-tree-node-header');\n if (!header) return;\n var nodeEl = header.closest('.tokui-tree-node');\n if (!nodeEl) return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n var arrow = header.querySelector('.tokui-tree-arrow');\n if (arrow && !nodeEl.classList.contains('tokui-tree-node--leaf')) {\n arrow.click();\n }\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n var siblings = Array.from(tree.querySelectorAll(':scope .tokui-tree-node-header'));\n var idx = siblings.indexOf(header);\n if (e.key === 'ArrowDown' && idx < siblings.length - 1) {\n siblings[idx + 1].focus();\n } else if (e.key === 'ArrowUp' && idx > 0) {\n siblings[idx - 1].focus();\n }\n }\n });\n }\n\n function updateParentCheckboxes(treeEl) {\n treeEl.querySelectorAll('.tokui-tree-node').forEach(function(nodeEl) {\n var children = nodeEl.querySelector(':scope > .tokui-tree-node-children');\n if (!children) return;\n var childBoxes = children.querySelectorAll(':scope > .tokui-tree-node > .tokui-tree-node-header > .tokui-tree-checkbox');\n if (childBoxes.length === 0) return;\n var parentBox = nodeEl.querySelector(':scope > .tokui-tree-node-header > .tokui-tree-checkbox');\n if (!parentBox) return;\n var total = childBoxes.length;\n var checked = 0;\n childBoxes.forEach(function(cb) { if (cb.checked) checked++; });\n if (checked === 0) {\n parentBox.checked = false;\n parentBox.indeterminate = false;\n } else if (checked === total) {\n parentBox.checked = true;\n parentBox.indeterminate = false;\n } else {\n parentBox.checked = false;\n parentBox.indeterminate = true;\n }\n });\n }\n\n // mount 模式\n if (node.children && node.children.length) {\n initTreeBehavior();\n }\n\n // 流式模式:tree 关闭时绑定事件\n field._streamCloseHook = function() {\n initTreeBehavior();\n };\n // 直接指向 tree,子节点流式追加到可见区域\n field._slot = tree;\n field._tokuiType = 'tree';\n field._variantTarget = tree;\n\n return field;\n });\n // === Menu 菜单容器 ===\n // attrs.v = 变体(vertical/horizontal/inline), attrs.act = 默认选中项 clk 值\n // attrs.bg = 背景色, attrs.fc = 文字色\n // 子节点为 menu-item(自闭合),渲染为菜单项列表\n renderer.register('menu', (node, rc) => {\n var attrs = node.attrs || {};\n var variant = attrs.v || 'vertical';\n var classes = ['tokui-menu'];\n if (variant === 'horizontal' || variant === 'h') classes.push('tokui-menu--horizontal');\n else if (variant === 'inline') classes.push('tokui-menu--inline');\n\n var menuAttrs = { class: classes.join(' '), role: 'menu' };\n if (attrs.id) menuAttrs.id = attrs.id;\n var menu = el('div', menuAttrs);\n\n // 背景和文字色\n if (attrs.bg) menu.style.setProperty('--tokui-menu-bg', attrs.bg);\n if (attrs.fc) menu.style.setProperty('--tokui-menu-fc', attrs.fc);\n\n var activeClk = attrs.act || '';\n\n // 非流式:渲染 menu-item 子节点\n var itemNodes = (node.children || []).filter(function(c) { return c.type === 'menu-item'; });\n itemNodes.forEach(function(childNode) {\n var itemEl = _buildMenuItem(childNode, activeClk);\n menu.appendChild(itemEl);\n });\n\n menu._slot = menu;\n menu._tokuiType = 'menu';\n menu._activeClk = activeClk;\n\n // 键盘导航:ArrowDown/Up 在 menu-item 间移动,Enter 选择\n menu.addEventListener('keydown', function(e) {\n var item = e.target.closest('.tokui-menu__item');\n if (!item) return;\n var items = Array.from(menu.querySelectorAll('.tokui-menu__item:not(.tokui-menu__item--disabled)'));\n var idx = items.indexOf(item);\n if (e.key === 'ArrowDown' && idx < items.length - 1) {\n e.preventDefault();\n items[idx + 1].focus();\n } else if (e.key === 'ArrowUp' && idx > 0) {\n e.preventDefault();\n items[idx - 1].focus();\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n item.click();\n }\n });\n\n return menu;\n });\n\n function _buildMenuItem(childNode, activeClk) {\n var itemAttrs = childNode.attrs || {};\n var itemClasses = ['tokui-menu__item'];\n if (itemAttrs.dis !== undefined) itemClasses.push('tokui-menu__item--disabled');\n if (activeClk && itemAttrs.clk === activeClk) itemClasses.push('tokui-menu__item--active');\n\n var elAttrs = { class: itemClasses.join(' '), role: 'menuitem', tabindex: '0' };\n var itemEl = el('div', elAttrs);\n\n // 图标\n if (itemAttrs.i) {\n var icon = el('span', { class: 'tokui-menu__icon' }, itemAttrs.i);\n itemEl.appendChild(icon);\n }\n\n // 文字\n var text = el('span', { class: 'tokui-menu__text' }, itemAttrs.tx || childNode.content || '');\n itemEl.appendChild(text);\n\n // 点击事件\n if (itemAttrs.clk && itemAttrs.dis === undefined) {\n itemEl.setAttribute('data-tokui-clk', itemAttrs.clk);\n itemEl.addEventListener('click', function() {\n // 更新激活状态\n var menu = itemEl.closest('.tokui-menu');\n if (menu) {\n menu.querySelectorAll('.tokui-menu__item--active').forEach(function(el) {\n el.classList.remove('tokui-menu__item--active');\n });\n }\n itemEl.classList.add('tokui-menu__item--active');\n });\n }\n\n return itemEl;\n }\n\n // === Menu Item 菜单项(自闭合)===\n // attrs.tx = 文字, attrs.clk = 点击事件, attrs.i = 图标字符\n // attrs.dis = 禁用, attrs.act = 选中激活\n // 流式模式下由 slot 机制 append 到 menu wrapper\n renderer.register('menu-item', (node) => {\n // 需要找到最近的 menu 容器来获取 activeClk\n var attrs = node.attrs || {};\n var itemClasses = ['tokui-menu__item'];\n if (attrs.dis !== undefined) itemClasses.push('tokui-menu__item--disabled');\n if (attrs.act !== undefined) itemClasses.push('tokui-menu__item--active');\n\n var elAttrs = { class: itemClasses.join(' '), role: 'menuitem', tabindex: '0' };\n var itemEl = el('div', elAttrs);\n\n if (attrs.i) {\n itemEl.appendChild(el('span', { class: 'tokui-menu__icon' }, attrs.i));\n }\n itemEl.appendChild(el('span', { class: 'tokui-menu__text' }, attrs.tx || node.content || ''));\n\n if (attrs.clk && attrs.dis === undefined) {\n itemEl.setAttribute('data-tokui-clk', attrs.clk);\n itemEl.addEventListener('click', function() {\n var menu = itemEl.closest('.tokui-menu');\n if (menu) {\n menu.querySelectorAll('.tokui-menu__item--active').forEach(function(el) {\n el.classList.remove('tokui-menu__item--active');\n });\n }\n itemEl.classList.add('tokui-menu__item--active');\n });\n }\n\n return itemEl;\n });\n\n // === Resizable 分割面板 ===\n // attrs.dir = 方向(h水平/v竖直, 默认h), attrs.min = 最小尺寸(px, 默认100)\n // attrs.max = 最大尺寸(px, 默认800), attrs.default = 初始尺寸(px, 默认300)\n // attrs.w = 容器宽度\n // 两个子面板之间有可拖拽的分割手柄,支持鼠标和触摸\n renderer.register('resizable', (node, rc) => {\n var attrs = node.attrs || {};\n var dir = attrs.dir || 'h';\n var minSize = parseInt(attrs.min) || 100;\n var maxSize = parseInt(attrs.max) || 800;\n var defaultSize = parseInt(attrs['default']) || 300;\n\n var isHorizontal = dir !== 'v';\n var classes = ['tokui-resizable'];\n classes.push(isHorizontal ? 'tokui-resizable--h' : 'tokui-resizable--v');\n\n var wrapperAttrs = { class: classes.join(' ') };\n if (attrs.w) wrapperAttrs.style = 'width:' + attrs.w;\n var wrapper = el('div', wrapperAttrs);\n\n // 第一面板 — flex:none 使 width/height 不被 flex:1 覆盖\n var panel1 = el('div', { class: 'tokui-resizable__panel' });\n panel1.style.flex = 'none';\n if (isHorizontal) {\n panel1.style.width = defaultSize + 'px';\n panel1.style.minWidth = minSize + 'px';\n panel1.style.maxWidth = maxSize + 'px';\n } else {\n panel1.style.height = defaultSize + 'px';\n panel1.style.minHeight = minSize + 'px';\n panel1.style.maxHeight = maxSize + 'px';\n panel1.style.overflow = 'auto';\n }\n\n // 拖拽手柄\n var handle = el('div', {\n class: 'tokui-resizable__handle',\n role: 'separator',\n 'aria-orientation': isHorizontal ? 'vertical' : 'horizontal',\n tabindex: '0'\n });\n\n // 第二面板\n var panel2 = el('div', { class: 'tokui-resizable__panel' });\n if (!isHorizontal) panel2.style.overflow = 'auto';\n\n wrapper.appendChild(panel1);\n wrapper.appendChild(handle);\n wrapper.appendChild(panel2);\n\n // 拖拽逻辑\n function onStart(e) {\n e.preventDefault();\n var clientPos = isHorizontal\n ? (e.touches ? e.touches[0].clientX : e.clientX)\n : (e.touches ? e.touches[0].clientY : e.clientY);\n startPos = clientPos;\n startSize = isHorizontal ? panel1.offsetWidth : panel1.offsetHeight;\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onEnd);\n document.addEventListener('touchmove', onMove, { passive: false });\n document.addEventListener('touchend', onEnd);\n handle.classList.add('tokui-resizable__handle--active');\n }\n var startPos = 0;\n var startSize = 0;\n\n function onMove(e) {\n e.preventDefault();\n var clientPos = isHorizontal\n ? (e.touches ? e.touches[0].clientX : e.clientX)\n : (e.touches ? e.touches[0].clientY : e.clientY);\n var delta = clientPos - startPos;\n var newSize = startSize + delta;\n newSize = Math.max(minSize, Math.min(maxSize, newSize));\n if (isHorizontal) {\n panel1.style.width = newSize + 'px';\n } else {\n panel1.style.height = newSize + 'px';\n }\n }\n\n function onEnd() {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onEnd);\n document.removeEventListener('touchmove', onMove);\n document.removeEventListener('touchend', onEnd);\n handle.classList.remove('tokui-resizable__handle--active');\n }\n\n handle.addEventListener('mousedown', onStart);\n handle.addEventListener('touchstart', onStart, { passive: false });\n\n // 键盘支持\n handle.addEventListener('keydown', function(e) {\n var step = 10;\n var currentSize = isHorizontal ? panel1.offsetWidth : panel1.offsetHeight;\n if (isHorizontal && e.key === 'ArrowLeft') {\n e.preventDefault();\n panel1.style.width = Math.max(minSize, currentSize - step) + 'px';\n } else if (isHorizontal && e.key === 'ArrowRight') {\n e.preventDefault();\n panel1.style.width = Math.min(maxSize, currentSize + step) + 'px';\n } else if (!isHorizontal && e.key === 'ArrowUp') {\n e.preventDefault();\n panel1.style.height = Math.max(minSize, currentSize - step) + 'px';\n } else if (!isHorizontal && e.key === 'ArrowDown') {\n e.preventDefault();\n panel1.style.height = Math.min(maxSize, currentSize + step) + 'px';\n }\n });\n\n // 非流式模式:通过 rc() 渲染子节点并分发到两个面板\n var rendered = rc(node.children || []);\n var children = [];\n rendered.forEach(function(child) {\n if (child && child.nodeType) children.push(child);\n });\n if (children[0]) panel1.appendChild(children[0]);\n for (var i = 1; i < children.length; i++) {\n panel2.appendChild(children[i]);\n }\n\n // 流式关闭钩子:将流式追加到 wrapper 的子节点分发到两个面板\n wrapper._streamCloseHook = function() {\n var items = [];\n for (var i = 0; i < wrapper.children.length; i++) {\n var c = wrapper.children[i];\n if (c !== panel1 && c !== handle && c !== panel2) {\n items.push(c);\n }\n }\n if (items.length > 0) {\n panel1.appendChild(items[0]);\n for (var j = 1; j < items.length; j++) {\n panel2.appendChild(items[j]);\n }\n }\n };\n\n // 不设 _slot,流式子节点追加到 wrapper 自身,由 _streamCloseHook 分发\n wrapper._tokuiType = 'resizable';\n return wrapper;\n });\n\n // === Scroll Area 自定义滚动区域 ===\n // 容器组件, attrs.h = 高度(px), attrs.w = 宽度\n // 外层 overflow:hidden 固定尺寸,内层 overflow:auto 可滚动\n // 自定义滚动条样式(webkit + Firefox)\n renderer.register('scroll-area', (node, rc) => {\n var attrs = node.attrs || {};\n var outerAttrs = { class: 'tokui-scroll-area' };\n if (attrs.id) outerAttrs.id = attrs.id;\n var outer = el('div', outerAttrs);\n\n // 设置外层尺寸\n if (attrs.h) outer.style.height = String(attrs.h).match(/^\\d+$/) ? attrs.h + 'px' : attrs.h;\n if (attrs.w) outer.style.width = attrs.w;\n\n // 内层可滚动视口\n var viewport = el('div', { class: 'tokui-scroll-area__viewport' });\n\n // 渲染子节点到视口\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) viewport.appendChild(child);\n });\n\n outer.appendChild(viewport);\n outer._slot = viewport;\n outer._tokuiType = 'scroll-area';\n return outer;\n });\n\n // === Sidebar 侧边栏容器 ===\n // attrs.w = 宽度(px, 默认260), attrs.pos = 位置(left/right, 默认left)\n // attrs.collapsible = 可折叠, attrs.tt = 标题/logo文本\n // attrs.bg = 背景色, attrs.fc = 文字色\n // 子容器: sidebar-content(内容区), sidebar-footer(页脚)\n renderer.register('sidebar', (node, rc) => {\n var attrs = node.attrs || {};\n var width = attrs.w || '260';\n var pos = attrs.pos || 'left';\n var isCollapsible = attrs.collapsible !== undefined;\n var bg = attrs.bg || '';\n var fc = attrs.fc || '';\n\n var classes = ['tokui-sidebar', 'tokui-sidebar--' + pos];\n if (isCollapsible) classes.push('tokui-sidebar--collapsible');\n\n var sidebarAttrs = { class: classes.join(' ') };\n if (attrs.id) sidebarAttrs.id = attrs.id;\n var sidebar = el('div', sidebarAttrs);\n sidebar.style.setProperty('--tokui-sidebar-w', width + 'px');\n if (bg) sidebar.style.setProperty('--tokui-sidebar-bg', bg);\n if (fc) sidebar.style.setProperty('--tokui-sidebar-fc', fc);\n if (bg) sidebar.style.setProperty('--tokui-sidebar-footer-bg', 'rgba(0,0,0,0.15)');\n if (bg) sidebar.style.setProperty('--tokui-sidebar-header-bg', 'rgba(0,0,0,0.15)');\n if (bg) sidebar.style.setProperty('--tokui-sidebar-border', 'rgba(255,255,255,0.1)');\n\n // 分离子节点\n var contentChildren = [];\n var footerChildren = [];\n var otherChildren = [];\n (node.children || []).forEach(function(child) {\n if (child.type === 'sidebar-content') {\n contentChildren.push(child);\n } else if (child.type === 'sidebar-footer') {\n footerChildren.push(child);\n } else {\n otherChildren.push(child);\n }\n });\n\n // Header 区域\n if (attrs.tt || isCollapsible) {\n var header = el('div', { class: 'tokui-sidebar__header' });\n if (attrs.tt) {\n var title = el('div', { class: 'tokui-sidebar__title' }, attrs.tt);\n header.appendChild(title);\n }\n if (isCollapsible) {\n var toggle = el('button', {\n class: 'tokui-sidebar__toggle',\n 'aria-label': 'Toggle sidebar',\n type: 'button'\n });\n toggle.textContent = '☰'; // hamburger character ☰\n toggle.addEventListener('click', function() {\n sidebar.classList.toggle('tokui-sidebar--collapsed');\n // Update aria-expanded\n var isCollapsed = sidebar.classList.contains('tokui-sidebar--collapsed');\n sidebar.setAttribute('aria-expanded', String(!isCollapsed));\n });\n header.appendChild(toggle);\n }\n sidebar.appendChild(header);\n }\n sidebar.setAttribute('aria-expanded', 'true');\n\n // Content 区域\n var contentDiv = el('div', { class: 'tokui-sidebar__content' });\n // Render sidebar-content children into content div\n contentChildren.forEach(function(cNode) {\n rc(cNode.children || []).forEach(function(child) {\n if (child && child.nodeType) contentDiv.appendChild(child);\n });\n });\n // Also render any non-sidebar children into content (backward compat)\n rc(otherChildren).forEach(function(child) {\n if (child && child.nodeType) contentDiv.appendChild(child);\n });\n sidebar.appendChild(contentDiv);\n\n // Footer 区域\n if (footerChildren.length > 0) {\n var footer = el('div', { class: 'tokui-sidebar__footer' });\n footerChildren.forEach(function(fNode) {\n rc(fNode.children || []).forEach(function(child) {\n if (child && child.nodeType) footer.appendChild(child);\n });\n });\n sidebar.appendChild(footer);\n }\n\n sidebar._slot = contentDiv;\n sidebar._tokuiType = 'sidebar';\n sidebar._update = function(uAttrs) {\n if (uAttrs.tt !== undefined) {\n var t = sidebar.querySelector('.tokui-sidebar__title');\n if (t) t.textContent = uAttrs.tt;\n }\n if (uAttrs.act === 'collapse') sidebar.classList.add('tokui-sidebar--collapsed');\n else if (uAttrs.act === 'expand') sidebar.classList.remove('tokui-sidebar--collapsed');\n else if (uAttrs.act === 'toggle') sidebar.classList.toggle('tokui-sidebar--collapsed');\n };\n if (node._dsl !== undefined) sidebar._dslNode = node;\n return sidebar;\n });\n\n // === Sidebar Content 侧边栏内容区 ===\n renderer.register('sidebar-content', (node, rc) => {\n var content = el('div', { class: 'tokui-sidebar__content' });\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) content.appendChild(child);\n });\n content._slot = content;\n content._tokuiType = 'sidebar-content';\n return content;\n });\n\n // === Sidebar Footer 侧边栏页脚 ===\n renderer.register('sidebar-footer', (node, rc) => {\n var footer = el('div', { class: 'tokui-sidebar__footer' });\n rc(node.children || []).forEach(function(child) {\n if (child && child.nodeType) footer.appendChild(child);\n });\n footer._slot = footer;\n footer._tokuiType = 'sidebar-footer';\n return footer;\n });\n}\n\n// 兼容浏览器和 Node.js 环境导出\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.registerLayoutComponents = registerLayoutComponents;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { registerLayoutComponents };\n}\n","/**\n * TokUI 组件注册入口\n * 统一注册所有组件类别(基础、表格、表单、布局、图表)到渲染器。\n */\n'use strict';\n\n// 依赖解析延迟到 registerAllComponents 调用时(运行期),而非模块求值期。\n// 否则 SSR 环境(无 window 且 require 被 bundler 剥离)import 本模块即崩。\n// 三态:Node CJS(require) / 浏览器(window.TokUI._internal) / SSR(无 window → no-op,渲染交还客户端)。\nvar _resolved = false;\nvar _regBasic, _regTable, _regForm, _regLayout, _regChart;\n\nfunction _resolve() {\n if (_resolved) return;\n _resolved = true;\n if (typeof require === 'function') {\n _regBasic = require('./basic').registerBasicComponents;\n _regTable = require('./table').registerTableComponents;\n _regForm = require('./form').registerFormComponents;\n _regLayout = require('./layout').registerLayoutComponents;\n _regChart = require('./chart').registerChartComponents;\n } else if (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal) {\n _regBasic = window.TokUI._internal.registerBasicComponents;\n _regTable = window.TokUI._internal.registerTableComponents;\n _regForm = window.TokUI._internal.registerFormComponents;\n _regLayout = window.TokUI._internal.registerLayoutComponents;\n _regChart = window.TokUI._internal.registerChartComponents;\n }\n // else: SSR 无 window —— 保持 undefined,registerAllComponents 将 no-op\n}\n\nfunction registerAllComponents(renderer) {\n _resolve();\n if (!_regBasic) return; // SSR 无 DOM:注册无意义,渲染交还客户端\n _regBasic(renderer);\n _regTable(renderer);\n _regForm(renderer);\n _regLayout(renderer);\n _regChart(renderer);\n}\n\nif (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI._internal = window.TokUI._internal || {};\n window.TokUI._internal.registerAllComponents = registerAllComponents;\n}\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { registerAllComponents };\n}\n","/**\n * TokUI 主入口模块\n * 整合解析器、渲染器、事件总线、主题管理和组件注册,\n * 对外暴露统一的 TokUI 类。\n *\n * 使用方式:\n * const tokui = new TokUI({ container: '#app' });\n * tokui.render('[h1 Hello]'); // 一次性渲染\n * tokui.startStream(); tokui.feed('[h1 Hi]'); // 流式渲染\n * tokui.connect('/api/chat', { prompt: '...' }); // SSE 连接\n */\n'use strict';\n\n(function() {\n var _TokUIParser, _TokUIRenderer, _el, _TokUIEventBus, _TokUITheme, _registerAll;\n var _resolved = false;\n\n // 依赖延迟解析(运行期,非模块求值期):避免 SSR 环境 import 即崩。\n // 三态:Node CJS(require) / 浏览器(window.TokUI._internal) / SSR(无 window → 依赖保持 undefined)。\n function _resolve() {\n if (_resolved) return;\n _resolved = true;\n if (typeof require === 'function') {\n var _parser = require('./core/parser');\n _TokUIParser = _parser.TokUIParser;\n var _renderer = require('./core/renderer');\n _TokUIRenderer = _renderer.TokUIRenderer;\n _el = _renderer.el;\n _TokUIEventBus = require('./core/event-bus');\n _TokUITheme = require('./core/theme');\n _registerAll = require('./components/index').registerAllComponents;\n } else if (typeof window !== 'undefined' && window.TokUI && window.TokUI._internal) {\n _TokUIParser = window.TokUI._internal.TokUIParser;\n _TokUIRenderer = window.TokUI._internal.TokUIRenderer;\n _el = window.TokUI._internal.el;\n _TokUIEventBus = window.TokUI._internal.TokUIEventBus;\n _TokUITheme = window.TokUI._internal.TokUITheme;\n _registerAll = window.TokUI._internal.registerAllComponents;\n }\n // else: SSR 无 window —— 依赖保持 undefined,构造/渲染时给出明确报错\n }\n\n /**\n * TokUI 核心类\n * 提供一次性渲染、流式渲染和 SSE 连接三种使用方式。\n */\n class TokUIClass {\n /**\n * @param {Object} [options] - 配置选项\n * @param {string|HTMLElement} [options.container=null] - 渲染目标容器(选择器或 DOM 元素)\n * @param {string} [options.theme='default'] - 主题名称\n * @param {boolean} [options.streaming=true] - 是否启用流式渲染模式\n * @param {Function} [options.onEvent=null] - 事件回调(如 'streamEnd')\n */\n constructor(options) {\n _resolve();\n this.options = Object.assign({\n container: null,\n theme: 'default',\n streaming: true,\n onEvent: null\n }, options);\n\n // 初始化渲染器并注册所有组件\n this.renderer = new _TokUIRenderer(_TokUIEventBus);\n _registerAll(this.renderer);\n\n this.parser = null;\n this.container = null;\n this.streamingContainer = null;\n\n // 解析并初始化容器\n if (this.options.container && typeof document !== 'undefined') {\n this.container = typeof this.options.container === 'string'\n ? document.querySelector(this.options.container)\n : this.options.container;\n _TokUITheme.init(this.container);\n if (this.options.theme && this.options.theme !== 'default') {\n _TokUITheme.setTheme(this.options.theme);\n }\n }\n\n // 在浏览器环境下挂载全局 API\n if (typeof window !== 'undefined') {\n window.TokUI._instance = this;\n window.TokUI._internal.el = _el;\n window.TokUI.registerHandler = _TokUIEventBus.registerHandler.bind(_TokUIEventBus);\n window.TokUI.setTheme = _TokUITheme.setTheme.bind(_TokUITheme);\n // showNotification 由 notification 组件注册到 window.TokUI.showNotification\n // 此处确保 TokUI 对象已初始化\n if (!window.TokUI.showNotification) {\n window.TokUI.showNotification = function() {};\n }\n }\n }\n\n /**\n * 一次性渲染 TokUI 字符串\n * 解析完整的 TokUI DSL 文本并渲染到指定容器。\n *\n * @param {string} tokuiString - TokUI DSL 文本\n * @param {HTMLElement} [targetContainer] - 目标容器(默认使用构造函数中的 container)\n */\n render(tokuiString, targetContainer) {\n const container = targetContainer || this.container;\n if (!container) throw new Error('TokUI: no container specified');\n const parser = new _TokUIParser((node) => {\n this.renderer.mount(node, container);\n });\n parser.parse(tokuiString);\n }\n\n /**\n * 开始流式渲染\n * 初始化流式解析器,后续通过 feed() 逐步输入数据。\n *\n * @param {HTMLElement} [targetContainer] - 目标容器\n */\n startStream(targetContainer) {\n this.streamingContainer = targetContainer || this.container;\n if (!this.streamingContainer) throw new Error('TokUI: no container specified');\n var self = this;\n var useStreaming = this.options.streaming !== false;\n this.parser = new _TokUIParser(function(node) {\n if (useStreaming) {\n self.renderer.mountStreaming(node, self.streamingContainer);\n } else {\n self.renderer.mount(node, self.streamingContainer);\n }\n }, { streaming: useStreaming });\n this.parser.startStream();\n }\n\n /**\n * 向流式解析器输入数据片段\n *\n * @param {string} chunk - TokUI DSL 文本片段\n */\n feed(chunk) {\n if (this.parser) {\n this.parser.feed(chunk);\n } else {\n console.warn('TokUI: feed() called before startStream()');\n }\n }\n\n /**\n * 断开 SSE 连接\n * 终止正在进行的 fetch 请求并结束流式渲染。\n */\n disconnect() {\n if (this._abortController) {\n this._abortController.abort();\n this._abortController = null;\n }\n this.endStream();\n // 清理 connect() 创建的流式容器\n if (this._streamTarget && this._streamTarget.parentNode) {\n this._streamTarget.parentNode.removeChild(this._streamTarget);\n }\n this._streamTarget = null;\n }\n\n /**\n * 结束流式渲染\n * 刷新解析器缓冲区并重置渲染器插槽栈。\n */\n endStream() {\n if (this.parser) {\n this.parser.endStream();\n this.parser = null;\n }\n if (this.renderer.slotStack.length) {\n this.renderer.resetSlotStack();\n }\n }\n\n /**\n * 通过 SSE(Server-Sent Events)连接服务器并流式渲染\n * 向服务器发送 POST 请求,读取 SSE 响应流,\n * 解析 data 行中的 JSON 数据并 feed 给解析器。\n *\n * @param {string} url - SSE 服务端地址\n * @param {Object} [body] - 请求体(JSON 序列化)\n * @returns {Promise} fetch 请求的 Promise\n */\n connect(url, body) {\n this._abortController = new AbortController();\n return fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body || {}),\n signal: this._abortController.signal\n }).then(response => {\n if (!response.ok) {\n throw new Error('TokUI connect: HTTP ' + response.status);\n }\n if (!response.body) {\n throw new Error('TokUI connect: response body is null');\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // 创建独立的流式渲染容器(清理旧容器)\n if (this._streamTarget && this._streamTarget.parentNode) {\n this._streamTarget.parentNode.removeChild(this._streamTarget);\n }\n const msgContainer = document.createElement('div');\n msgContainer.className = 'tokui-stream-target';\n this._streamTarget = msgContainer;\n if (this.container) {\n this.container.appendChild(msgContainer);\n }\n\n this.startStream(msgContainer);\n\n var self = this;\n\n // 递归读取响应流\n const processChunk = () => {\n reader.read().then(({ done, value }) => {\n if (done) {\n self.endStream();\n if (self.options.onEvent) {\n self.options.onEvent('streamEnd', {});\n }\n return;\n }\n\n // 解码并按行分割处理 SSE 数据\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop(); // 最后一行可能不完整,保留在缓冲区\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n // SSE 结束标记\n self.endStream();\n if (self.options.onEvent) {\n self.options.onEvent('streamEnd', {});\n }\n return;\n }\n try {\n const parsed = JSON.parse(data);\n if (parsed.tokui) {\n self.feed(parsed.tokui);\n }\n } catch (e) {\n console.warn('TokUI: malformed JSON in SSE data', e.message);\n }\n }\n }\n\n processChunk();\n });\n };\n\n processChunk();\n });\n }\n }\n\n // 兼容浏览器和 Node.js 环境导出\n if (typeof window !== 'undefined') {\n window.TokUI = window.TokUI || {};\n window.TokUI.TokUI = TokUIClass;\n }\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = TokUIClass;\n }\n})();\n","/**\n * TokUI — 库打包入口(Vite/Rolldown 消费)。\n * Bundler entry that assembles the public TokUI namespace.\n *\n * 消费方式:\n * - ESM: import TokUI from '@jboltai/tokui'; new TokUI.TokUI({container})\n * - 命名导出: import { TokUI, registerHandler, setTheme, el } from '@jboltai/tokui'\n * - UMD/CDN: <script src=\"tokui.umd.js\"> → window.TokUI(命名空间)\n *\n * 设计要点:\n * Rolldown 把 src 的 CJS 重写为 ESM 时会移除 require/module/exports,src 文件\n * 的 `typeof require` 分支全失效,运行时统一走 window 分支,靠共享总线\n * window.TokUI._internal 的\"先写后读\"顺序工作。因此本入口必须:\n * 1. 显式按拓扑序 import 全部 src 模块(叶子→中层→聚合器→主类最后),\n * 用真实 ESM 边强制 Rolldown 求值顺序;\n * 2. 不具名导出 _internal / showNotification —— 它们属 window.TokUI 级,\n * 由 src 文件 window 分支填充;具名导出会覆盖掉 src 累加的 _internal。\n */\n'use strict';\n\n// 库 CSS(Vite 抽为 tokui.css,不影响 JS 求值顺序)\nimport './styles/index.css';\n\n// —— 叶子模块(无 src 依赖,仅写 window.TokUI._internal)——\nimport TokUIEventBus from './core/event-bus.js'; // CJS 裸对象 → default\nimport TokUITheme from './core/theme.js'; // CJS 裸对象 → default\nimport './core/color-generator.js';\nimport './core/parser.js';\nimport { TokUIRenderer, el } from './core/renderer.js'; // CJS 对象 → 命名\nimport './components/lightbox.js';\nimport './components/chart.js';\n// —— 中层(读叶子)——\nimport './components/basic.js'; // 读 renderer.el、lightbox\nimport './components/table.js'; // 读 renderer、parser\nimport './components/form.js'; // 读 renderer、basic\nimport './components/layout.js'; // 读 renderer、lightbox\n// —— 聚合器(读 basic/table/form/layout/chart,写 _internal.registerAllComponents)——\nimport './components/index.js';\n// —— 主类(读全部 _internal)——必须最后求值\nimport TokUIClass from './index.js';\n\n// 绑定单例方法的稳定引用(供命名空间与具名导出)\nconst registerHandler = TokUIEventBus.registerHandler.bind(TokUIEventBus);\nconst removeHandler = TokUIEventBus.removeHandler.bind(TokUIEventBus);\nconst setTheme = TokUITheme.setTheme.bind(TokUITheme);\nconst getTheme = TokUITheme.getTheme.bind(TokUITheme);\n\n// 公共命名空间对象(ESM default)。window.TokUI._internal / showNotification /\n// showToast 由 src 文件与 new TokUI() 构造时挂到 window.TokUI,不在此重复。\nconst TokUI = {\n TokUI: TokUIClass,\n registerHandler,\n removeHandler,\n setTheme,\n getTheme,\n el,\n};\n\nexport {\n TokUIClass as TokUI,\n registerHandler,\n removeHandler,\n setTheme,\n getTheme,\n el,\n};\nexport default TokUI;\n"],"mappings":"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"}