@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.umd.js","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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"}