@chatbi-v/xcml 2.0.0 → 2.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.
- package/dist/index.cjs +17 -18
- package/dist/index.css +700 -185
- package/dist/index.d.cts +36 -2
- package/dist/index.d.ts +36 -2
- package/dist/index.js +17 -18
- package/package.json +4 -3
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/index.ts","../src/renderers/basic/Metric/schema.ts","../src/renderers/basic/Table/schema.ts","../src/renderers/basic/List/schema.ts","../src/renderers/basic/Card/schema.ts","../src/renderers/basic/TOC/schema.ts","../src/renderers/antv/Chart/strategies/Line/schema.ts","../src/renderers/antv/Chart/strategies/Column/schema.ts","../src/renderers/antv/Chart/strategies/Pie/schema.ts","../src/renderers/antv/Chart/strategies/DualAxes/schema.ts","../src/renderers/antv/Chart/strategies/Funnel/schema.ts","../src/renderers/antv/Chart/schema.ts","../src/renderers/cards/InsightCard/schema.ts","../src/renderers/cards/InteractiveSummary/schema.ts","../src/renderers/cards/MetricCard/schema.ts","../src/renderers/cards/MiniKpiStrip/schema.ts","../src/renderers/cards/PosterCard/schema.ts","../src/renderers/cards/SnapshotTable/schema.ts","../src/renderers/cards/ThoughtChain/schema.ts","../src/core/schema.ts","../src/core/base.ts","../src/core/utils.ts","../src/core/hooks.ts","../src/markdown/index.tsx","../src/markdown/TOCContext.tsx","../src/renderers/antv/Chart/index.tsx","../src/theme/theme-provider.tsx","../src/renderers/antv/themes/index.ts","../src/renderers/antv/Chart/strategies/Line/index.ts","../src/renderers/antv/Chart/strategies/Column/index.ts","../src/renderers/antv/Chart/strategies/Pie/index.ts","../src/renderers/antv/Chart/strategies/DualAxes/index.ts","../src/renderers/antv/Chart/strategies/Funnel/index.ts","../src/renderers/antv/Chart/strategies/index.ts","../src/renderers/antv/Chart/utils.tsx","../src/renderers/basic/withXCMLCard.tsx","../src/renderers/basic/CardWrapper.tsx","../src/renderers/antv/index.tsx","../src/renderers/basic/Metric/index.tsx","../src/renderers/basic/Card/index.tsx","../src/renderers/basic/List/index.tsx","../src/renderers/basic/TOC/index.tsx","../src/renderers/basic/Table/index.tsx","../src/renderers/basic/index.tsx","../src/renderers/cards/MetricCard/index.tsx","../src/renderers/cards/MiniKpiStrip/index.tsx","../src/renderers/cards/SnapshotTable/index.tsx","../src/renderers/cards/InsightCard/index.tsx","../src/renderers/cards/PosterCard/index.tsx","../src/renderers/cards/ThoughtChain/index.tsx","../src/renderers/cards/InteractiveSummary/index.tsx","../src/renderers/cards/index.tsx"],"sourcesContent":["/**\n * XCML 架构说明 (Architecture Guide)\n * \n * 1. Schema 定义 (./schemas/): \n * 定义组件的 tag、props、example 等元数据。\n * 每个组件拥有独立的 schema 文件,便于维护 and 扩展。\n * 这是组件的“身份证”,用于工作台展示 and 数据校验。\n * \n * 2. 核心逻辑 (./index.ts): \n * 处理 XCML 标签的预处理、解析、数据转换及事件通信 (xcmlBus)。\n * \n * 3. 渲染层 (../renderers/):\n * - basic: 基础组件 (Metric, Table, List)\n * - antv: 图表组件 (基于 @ant-design/plots)\n * - cards: 复合业务组件 (InsightCard, ThoughtChain)\n * \n * 如何扩展新组件:\n * 1. 在 core/schemas/ 目录下创建新的 schema 文件并导出。\n * 2. 在 core/schema.ts 的 XCML_SCHEMAS 注册表中引入并注册该 schema。\n * 3. 在对应的 renderers 目录下创建 React 组件实现。\n * 4. 在 renderers 的工厂方法中导出该组件的渲染函数。\n */\n\nimport { parse } from 'yaml'\nimport { XCML_SCHEMAS } from './schema'\n\n/**\n * XCML 核心类型与事件总线\n */\n\n/**\n * 标签归一化:将任意格式的标签名统一转换为不带前缀的纯名称\n * @param tag - 原始标签名 (如 xcml:metric, x-metric)\n * @returns 归一化后的名称 (如 metric)\n */\nexport function normalizeTagName(tag: string): string {\n if (tag.startsWith('xcml:')) return tag.slice(5);\n if (tag.startsWith('x-')) return tag.slice(2);\n return tag;\n}\n\n/**\n * 转换为 x- 前缀格式(用于 HTML 渲染)\n */\nexport function toXTag(tag: string): string {\n const name = normalizeTagName(tag);\n return `x-${name}`;\n}\n\n/**\n * 转换为 xcml: 前缀格式(用于 Schema 匹配)\n */\nexport function toXCMLTag(tag: string): string {\n const name = normalizeTagName(tag);\n return `xcml:${name}`;\n}\n\nexport type XCMLRenderer = (node: any, key: string | number) => any\n\nexport interface XCMLContext {\n theme: string\n whitelist?: { link?: string[]; image?: string[] }\n}\n\nexport type XCMLPlugin = (ast: any, ctx: XCMLContext) => any\n\n/**\n * XCML 事件总线\n * 职责:实现渲染层组件与宿主页面之间的双向通信。\n * \n * 支持的内置事件:\n * - refresh: 请求组件重新加载数据\n * - update: 外部向组件注入新数据\n * - resize: 通知组件重绘图表尺寸\n * - export: 触发组件导出操作 (图片/CSV)\n */\nexport class XCMLEventBus {\n /** 监听器映射:事件名到监听函数数组 */\n private listeners: Record<string, Array<(payload?: any) => void>> = {}\n\n /** 注册事件监听器 */\n on(event: string, handler: (payload?: any) => void) {\n if (!this.listeners[event]) this.listeners[event] = []\n this.listeners[event].push(handler)\n }\n\n /** 触发事件 */\n emit(event: string, payload?: any) {\n ;(this.listeners[event] || []).forEach(fn => fn(payload))\n }\n\n /** 刷新方法:按 id 或全部刷新 */\n refresh(id?: string) {\n this.emit('refresh', { id })\n }\n\n /** 更新方法:按 id 注入数据 */\n update(id: string, payload: any) {\n this.emit('update', { id, payload })\n }\n\n /** 重绘尺寸 */\n resize(id?: string) {\n this.emit('resize', { id })\n }\n\n /** 导出方法:导出指定类型 */\n export(id: string, type: string) {\n this.emit('export', { id, type })\n }\n}\n\n/**\n * 事件总线单例:供渲染器与页面交互使用\n */\nexport const xcmlBus = new XCMLEventBus()\n\n/**\n * 预编译正则:JSONC 注释清理\n */\nconst JSONC_CLEAN_REGEX = /\\/\\/(.*)$/gm;\nconst JSONC_BLOCK_CLEAN_REGEX = /\\/\\*[\\s\\S]*?\\*\\//g;\n\n/**\n * 智能数据解析引擎\n * \n * 职责:\n * 根据 `data-format` 属性将文本块解析为 JavaScript 对象/数组。\n * \n * 特性:\n * 1. 支持 JSON / JSONC (带注释的 JSON)。\n * 2. 支持 YAML (由于 YAML 格式更宽容,常作为 JSON 解析失败后的 Fallback)。\n * 3. 支持 CSV / TSV 自动转换(含简单的类型识别)。\n * 4. 支持 NDJSON (每行一个 JSON 对象)。\n * \n * @param text - 待解析的文本内容\n * @param format - 指定的数据格式\n * @returns 解析后的对象或数组\n */\nexport function parseInlineData(text: string, format: 'json' | 'jsonc' | 'yaml' | 'csv' | 'tsv' | 'ndjson' = 'json') {\n let trimmed = text.trim();\n if (!trimmed) return null;\n\n // 启发式检查:如果未明确指定非 JSON 格式,且内容看起来不像 JSON,则直接返回\n // 这避免了对 Markdown 文本块(如以 # 开头的标题)进行昂贵且会抛错的 JSON 解析\n if (format === 'json' || format === 'jsonc') {\n const isJsonLike = (trimmed.startsWith('{') && trimmed.endsWith('}')) || \n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n if (!isJsonLike) {\n return trimmed;\n }\n }\n\n try {\n if (format === 'json' || format === 'jsonc') {\n const cleaned = format === 'jsonc' \n ? trimmed.replace(JSONC_CLEAN_REGEX, '').replace(JSONC_BLOCK_CLEAN_REGEX, '') \n : trimmed;\n try {\n return JSON.parse(cleaned);\n } catch (e) {\n // Fallback 1: 尝试使用 YAML 解析器,它对 JSON 格式更宽容(如支持未转义引号)\n try {\n const yamlParsed = parse(cleaned);\n // 如果解析结果仍然是字符串且看起来像 JSON,说明 YAML 也没能深度解析\n if (typeof yamlParsed === 'string' && (yamlParsed.startsWith('{') || yamlParsed.startsWith('['))) {\n throw e;\n }\n return yamlParsed;\n } catch (yamlError) {\n throw e;\n }\n }\n }\n \n if (format === 'yaml') {\n return parse(trimmed);\n }\n \n if (format === 'csv' || format === 'tsv') {\n const sep = format === 'csv' ? ',' : '\\t';\n const lines = trimmed.split(/\\r?\\n/).filter(line => line.trim());\n if (lines.length === 0) return [];\n \n const headers = lines[0].split(sep).map(h => h.trim());\n return lines.slice(1).map(line => {\n const cols = line.split(sep);\n const obj: Record<string, any> = {};\n headers.forEach((h, i) => {\n let val = cols[i]?.trim();\n // 简单的自动类型转换\n if (val === 'true') val = true as any;\n else if (val === 'false') val = false as any;\n else if (val !== '' && !isNaN(Number(val))) val = Number(val) as any;\n obj[h] = val;\n });\n return obj;\n });\n }\n \n if (format === 'ndjson') {\n return trimmed.split(/\\r?\\n/).filter(Boolean).map(line => JSON.parse(line));\n }\n \n return JSON.parse(trimmed);\n } catch (e) {\n // 只有在明确指定了格式且非 json/jsonc 的情况下,才抛出错误\n // 对于默认的 json/jsonc,如果解析失败,交由上层处理(可能只是普通文本)\n if (format !== 'json' && format !== 'jsonc') {\n throw e;\n }\n throw e;\n }\n}\n\n/**\n * 安全校验占位:后续接入 Ajv Schema 校验与白名单过滤\n */\nexport function validateDataSchema(_component: string, data: any): boolean {\n return data != null\n}\n\nexport { parse, stringify } from 'yaml'\n\n/**\n * 规范化数据对象:根据 Schema 定义,将属性中可能的 JSON 字符串解析为对象/数组\n * 解决双重序列化问题 (Double Serialization)\n */\nexport function normalizeNodeData(tag: string, data: any): any {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return data;\n\n const nodeType = toXCMLTag(tag);\n const schema = XCML_SCHEMAS[nodeType];\n if (!schema) return data;\n\n const result = { ...data };\n const propsToProcess = [...(schema.props || []), ...(schema.body || [])];\n\n propsToProcess.forEach(p => {\n const val = result[p.name];\n if ((p.type === 'object' || p.type === 'array') && typeof val === 'string') {\n try {\n const trimmed = val.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n let parsed: any = trimmed;\n let count = 0;\n // 尝试解析 JSON,支持最多 2 层嵌套字符串 (Double Serialization)\n while (typeof parsed === 'string' && count < 2) {\n const pVal = JSON.parse(parsed);\n if (pVal === null || typeof pVal !== 'object') {\n if (typeof pVal === 'string' && (pVal.startsWith('{') || pVal.startsWith('['))) {\n parsed = pVal;\n } else {\n // 如果解析出来不是对象/数组,也不是可能是 JSON 的字符串,则停止\n break;\n }\n } else {\n parsed = pVal;\n break;\n }\n count++;\n }\n result[p.name] = parsed;\n }\n } catch (e) {\n // 解析失败保持原样\n }\n }\n });\n\n return result;\n}\n\n/**\n * 核心逻辑:属性与数据智能合并\n * \n * 职责:\n * 将解析出的标签属性 (attrs) 与标签体数据 (bodyData) 根据 Schema 定义进行智能分流。\n * \n * 核心策略:\n * 1. 结构化匹配:如果 bodyData 是对象,将其字段分流到 Props 或 Body 属性中。\n * 2. 类型适配:如果 bodyData 是数组,根据 Schema 查找对应的数组字段(默认为 `data`)。\n * 3. preferBody 模式:为了生成更简洁的 XCML 标签,支持将所有业务属性强制压缩到 Body 的 JSON 中。\n * \n * @param tagName - 标签名\n * @param attrs - 标签上的属性集合\n * @param bodyData - 标签体内的解析后数据\n * @param options - 合并配置\n * @returns 分流后的 { props, body } 对象\n */\nexport function mergePropsAndBody(\n tagName: string, \n attrs: Record<string, any>, \n bodyData: any, \n options: { preferBody?: boolean } = {}\n) {\n const nodeType = toXCMLTag(tagName);\n const schema = XCML_SCHEMAS[nodeType];\n\n const finalProps: Record<string, any> = {};\n const finalBody: Record<string, any> = {};\n \n const { preferBody = false } = options;\n\n // 0. 数据清洗:纠正可能存在的类数组对象\n const cleanBodyData = ensureArray(bodyData);\n\n // 1. 处理 Body 数据\n let processedBodyData = cleanBodyData;\n if (schema) {\n if (typeof cleanBodyData === 'string') {\n // 核心治理:如果是 string 格式,映射到 schema 定义的 contentProp\n const contentProp = schema.example?.contentProp || \n (schema.body || []).find(p => p.name === 'content' || p.name === 'value')?.name || \n 'content';\n processedBodyData = { [contentProp]: cleanBodyData };\n } else if (cleanBodyData && typeof cleanBodyData === 'object' && !Array.isArray(cleanBodyData)) {\n // 核心治理:如果是 JSON 对象,解析后适配 body 属性\n // 保持 processedBodyData 为该对象\n }\n }\n\n // 基础合并:如果 processedBodyData 是对象,则先作为基准 (仅保留非数字索引字段)\n if (processedBodyData && typeof processedBodyData === 'object' && !Array.isArray(processedBodyData)) {\n Object.keys(processedBodyData).forEach(key => {\n if (!/^\\d+$/.test(key)) {\n finalBody[key] = processedBodyData[key];\n }\n });\n }\n\n // 2. 将所有输入(attrs 和 processedBodyData)进行归一化处理\n const combined = { \n ...(processedBodyData && typeof processedBodyData === 'object' && !Array.isArray(processedBodyData) ? processedBodyData : {}),\n ...attrs \n };\n\n // 如果没有 schema,则保持现状\n if (!schema) {\n return { props: attrs, body: bodyData };\n }\n\n const schemaProps = new Set((schema.props || []).map(p => p.name));\n const schemaBodyProps = new Set((schema.body || []).map(p => p.name));\n\n // 3. 根据 Schema 进行分流\n for (const [key, val] of Object.entries(combined)) {\n // 过滤掉因为数组合并产生的数字索引 key\n if (/^\\d+$/.test(key)) continue;\n\n // 治理规则:如果 preferBody 开启,则将所有已定义的 props 和 body 属性都放入 finalBody 中\n if (preferBody) {\n if (schemaProps.has(key) || schemaBodyProps.has(key)) {\n finalBody[key] = val;\n } else {\n if (key in attrs) {\n finalProps[key] = val;\n } else {\n finalBody[key] = val;\n }\n }\n } else {\n // 传统分流逻辑\n if (schemaProps.has(key)) {\n finalProps[key] = val;\n } else if (schemaBodyProps.has(key)) {\n finalBody[key] = val;\n } else {\n if (key in attrs) {\n finalProps[key] = val;\n } else {\n finalBody[key] = val;\n }\n }\n }\n }\n\n // 4. 特殊处理:如果 cleanBodyData 是数组且 finalBody 为空\n let resultBody = finalBody;\n if (Array.isArray(cleanBodyData)) {\n if (Object.keys(finalBody).length === 0) {\n resultBody = cleanBodyData;\n } else {\n // 治理逻辑:如果 cleanBodyData 是数组,且 finalBody 不为空\n // 我们需要将数组放入 finalBody 中的一个合适字段(优先查找 schema.body 中的数组字段)\n const arrayPropName = (schema.body || []).find(p => p.type === 'array')?.name || 'data';\n finalBody[arrayPropName] = cleanBodyData;\n resultBody = finalBody;\n }\n }\n\n return {\n props: normalizeNodeData(nodeType, finalProps),\n body: normalizeNodeData(nodeType, resultBody)\n };\n}\n\n/**\n * 辅助工具:判断并转换类数组对象为真实数组\n */\nfunction ensureArray(val: any): any {\n if (Array.isArray(val)) return val;\n if (val && typeof val === 'object') {\n const keys = Object.keys(val).filter(k => /^\\d+$/.test(k)).sort((a, b) => Number(a) - Number(b));\n if (keys.length > 0 && keys.length === Object.keys(val).length && keys.every((k, i) => Number(k) === i)) {\n return keys.map(k => (val as any)[k]);\n }\n }\n return val;\n}\n\n/**\n * 序列化引擎:将内存中的节点模型转换为 XCML 标签字符串\n * \n * 治理要求:\n * 遵循“全量 Body 化”协定,除了技术性属性(id, className)外,\n * 所有业务属性一律序列化为 Body 中的 JSON,以提高 Markdown 的可读性和容错率。\n * \n * @param node - 待转换的节点模型\n * @returns 格式化后的 XCML 字符串\n */\nexport function stringifyToXCML(node: { tag?: string, type?: string, props?: Record<string, any>, body?: any }): string {\n const nodeType = toXCMLTag(node.tag || node.type || 'unknown');\n const tagName = toXTag(nodeType);\n \n // 0. 数据清洗:纠正可能存在的类数组对象\n const rawProps = { ...(node.props || {}) };\n const rawBody = ensureArray(node.body);\n\n // 1. 获取全量合并后的数据 (开启 preferBody)\n // 在 preferBody 模式下,mergePropsAndBody 会将 props 和 body 属性全部合并到 body 返回值中\n const { body: allData } = mergePropsAndBody(nodeType, rawProps, rawBody, { preferBody: true });\n\n // 2. 标签属性:仅保留技术性属性 (如 id, className 等透传属性),业务属性一律进入 Body\n const attrs: string[] = [];\n \n // 3. 构建 Body 内容\n // 治理要求:即使只有一个 data 数组,也建议包裹在对象中以保持结构一致性,\n // 或者如果 allData 结构清晰,直接序列化 allData\n let finalBodyData = allData;\n\n // 特殊处理:如果 allData 只有一个 'data' 字段且是数组,为了简洁可以考虑直接输出数组\n // 但根据“所有属性放入 body”的协定,保持对象结构更稳健\n const keys = Object.keys(allData || {});\n if (keys.length === 1 && keys[0] === 'data' && Array.isArray(allData.data)) {\n finalBodyData = allData.data;\n }\n\n const attrStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';\n const bodyStr = JSON.stringify(finalBodyData, null, 2);\n\n return `<${tagName}${attrStr}>\\n${bodyStr}\\n</${tagName}>`;\n}\n\n/**\n * 简单的 XCML 解析器,用于工作台同步\n * 仅处理单个根节点\n */\nexport function parseXCML(xcml: string): { tag: string, props: Record<string, any>, body: any } | null {\n if (!xcml) return null;\n\n const trimmedXCML = xcml.trim();\n\n // 1. 尝试作为 YAML 解析 (兼容旧版)\n if (!trimmedXCML.startsWith('<')) {\n try {\n const parsed = parse(trimmedXCML);\n if (parsed && (parsed.tag || parsed.type)) {\n return {\n tag: parsed.tag || parsed.type,\n props: parsed.props || {},\n body: parsed.body || parsed.data || parsed.dataProps || {}\n };\n }\n } catch (e) {}\n }\n\n // 2. 作为 XML 标签解析\n const tagMatch = trimmedXCML.match(/^<((?:xcml:|x-)[^\\s/>]+)\\s*([\\s\\S]*?)(\\/?>)([\\s\\S]*?)$/);\n if (!tagMatch) return null;\n\n const [, tagName, attrContent, tagEnd] = tagMatch;\n const isSelfClosing = tagEnd === '/>';\n \n // 解析属性\n const props: Record<string, any> = {};\n const attrRegex = /([a-zA-Z0-9-]+)\\s*=\\s*(?:'([^']*)'|\"([^\"]*)\"|`([^`]*)`|((?:(?!\\s|\\/|>).)+))/g;\n let attrMatch;\n while ((attrMatch = attrRegex.exec(attrContent)) !== null) {\n const key = attrMatch[1];\n const val = attrMatch[2] || attrMatch[3] || attrMatch[4] || attrMatch[5];\n props[key] = val;\n }\n\n // 解析 Body\n let bodyText = '';\n if (!isSelfClosing) {\n const closeTag = `</${tagName}>`;\n const closeTagIndex = trimmedXCML.lastIndexOf(closeTag);\n \n if (closeTagIndex !== -1) {\n let openTagEndIndex = -1;\n let inQuote: string | null = null;\n for (let i = 0; i < trimmedXCML.length; i++) {\n const char = trimmedXCML[i];\n if (char === \"'\" || char === '\"' || char === '`') {\n if (!inQuote) inQuote = char;\n else if (inQuote === char) inQuote = null;\n }\n if (char === '>' && !inQuote) {\n openTagEndIndex = i;\n break;\n }\n }\n \n if (openTagEndIndex !== -1) {\n bodyText = trimmedXCML.slice(openTagEndIndex + 1, closeTagIndex).trim();\n }\n }\n }\n\n const node = toXCMLNodeFromElement(tagName, props, bodyText);\n \n return {\n tag: node.type,\n props: node.props,\n body: node.body\n };\n}\n\nexport * from './schema'\nexport * from './base'\nexport * from './utils'\nexport * from './hooks'\n\n/**\n * 统一节点模型转换器\n * \n * 职责:\n * 接收原始的 DOM 元素信息(标签名、属性、文本内容),将其转换为 XCML AST 节点。\n * 这是连接 Markdown 解析层与 XCML 渲染层的关键桥梁。\n * \n * @param name - 标签名\n * @param attrs - DOM 属性集合\n * @param bodyText - 标签体内的原始文本\n * @returns 标准化的 XCML AST 节点对象\n */\nexport function toXCMLNodeFromElement(name: string, attrs: Record<string, any>, bodyText: string) {\n const tagName = normalizeTagName(name);\n const nodeType = toXCMLTag(tagName);\n const format = attrs['data-format'] || 'json';\n \n let rawData: any;\n try {\n rawData = parseInlineData(bodyText, format);\n } catch (e) {\n if (tagName === 'list') {\n try {\n rawData = parseMarkdownList(bodyText);\n } catch {}\n }\n if (!rawData && bodyText.trim()) {\n rawData = bodyText.trim();\n }\n if (!rawData) rawData = null;\n }\n\n // 1. 属性预处理:清理引号、基础类型转换\n const processedAttrs = { ...attrs };\n for (const key in processedAttrs) {\n let val = processedAttrs[key];\n if (typeof val === 'string') {\n let cleaned = val.trim();\n while (cleaned.length >= 2 && (\n (cleaned.startsWith('\"') && cleaned.endsWith('\"')) || \n (cleaned.startsWith(\"'\") && cleaned.endsWith(\"'\")) || \n (cleaned.startsWith(\"`\") && cleaned.endsWith(\"`\"))\n )) {\n cleaned = cleaned.slice(1, -1).trim();\n }\n \n if (cleaned === 'true') processedAttrs[key] = true;\n else if (cleaned === 'false') processedAttrs[key] = false;\n else if (/^-?\\d+(\\.\\d+)?$/.test(cleaned)) {\n const num = Number(cleaned);\n if (!isNaN(num)) processedAttrs[key] = num;\n } else if (cleaned.startsWith('[') || cleaned.startsWith('{')) {\n try {\n processedAttrs[key] = JSON.parse(cleaned);\n } catch (e) {\n try {\n processedAttrs[key] = JSON.parse(cleaned.replace(/'/g, '\"'));\n } catch (e2) {\n processedAttrs[key] = cleaned;\n }\n }\n } else {\n processedAttrs[key] = cleaned;\n }\n }\n }\n\n // 2. 核心升级:使用智能合并逻辑分流 props 和 body\n const { props, body } = mergePropsAndBody(nodeType, processedAttrs, rawData);\n\n return { type: nodeType, props, body, __source: bodyText };\n}\n\n/**\n * 解析 Markdown 列表内容为对象数组\n * 支持 - / * / + 形式的列表及 [ ]/[x]/[-] 任务列表\n */\nfunction parseMarkdownList(text: string) {\n const lines = text.split(/\\r?\\n/).filter(line => line.trim())\n const items = lines.map(line => {\n // 匹配任务列表语法:- [ ] / * [x] / + [-]\n const taskMatch = line.match(/^\\s*[-*+]\\s*\\[([ x-])\\]\\s*(.*)$/)\n if (taskMatch) {\n const mark = taskMatch[1]\n const title = taskMatch[2].trim()\n let status = 'todo'\n if (mark === 'x') status = 'done'\n else if (mark === '-') status = 'doing'\n return { title, status }\n }\n // 匹配普通列表:- 内容 / * 内容 / + 内容\n const listMatch = line.match(/^\\s*[-*+]\\s*(.*)$/)\n if (listMatch) {\n return { title: listMatch[1].trim(), status: 'normal' }\n }\n return null\n }).filter(Boolean)\n \n return items.length > 0 ? { items } : null\n}\n\n/**\n * 修复 XCML 标签中的属性:\n * 将未加引号的 JSON 数组/对象属性 (key=[...]) 自动包裹在单引号中 (key='[...]')\n */\nfunction fixXCMLTagAttributes(tag: string): string {\n if (!tag.startsWith('<x-') && !tag.startsWith('<xcml:')) return tag;\n\n const match = tag.match(/^(<(?:x-|xcml:)[^\\s/>]+)\\s*([\\s\\S]*?)(\\/?>)$/);\n if (!match) return tag;\n\n const [, tagName, attrContent, tagEnd] = match;\n if (!attrContent) return tag;\n\n const regex = /([a-zA-Z0-9-]+)\\s*=\\s*([\\[\\{])/g;\n let lastIndex = 0;\n let newContent = '';\n let matchArr;\n\n while ((matchArr = regex.exec(attrContent)) !== null) {\n const key = matchArr[1];\n const openChar = matchArr[2];\n const closeChar = openChar === '[' ? ']' : '}';\n const startIndex = matchArr.index;\n const valueStartIndex = startIndex + matchArr[0].length - 1;\n\n // 检查是否已经在引号内\n const beforeStr = attrContent.slice(0, startIndex);\n const quoteCount = (beforeStr.match(/['\"]/g) || []).length;\n if (quoteCount % 2 !== 0) continue;\n\n // 查找平衡的闭合括号\n let balance = 0;\n let foundEnd = -1;\n for (let k = valueStartIndex; k < attrContent.length; k++) {\n if (attrContent[k] === openChar) balance++;\n else if (attrContent[k] === closeChar) balance--;\n \n if (balance === 0) {\n foundEnd = k;\n break;\n }\n }\n\n if (foundEnd !== -1) {\n // 检查是否已经带了引号\n const quoteBefore = attrContent[valueStartIndex - 1];\n if (quoteBefore === \"'\" || quoteBefore === '\"') continue;\n\n const val = attrContent.slice(valueStartIndex, foundEnd + 1);\n newContent += attrContent.slice(lastIndex, startIndex);\n newContent += `${key}='${val}'`;\n lastIndex = foundEnd + 1;\n regex.lastIndex = lastIndex;\n }\n }\n \n newContent += attrContent.slice(lastIndex);\n return `${tagName} ${newContent}${tagEnd}`;\n}\n\n/**\n * 预处理 XCML 内容:\n * 0. 流式优化与归一化\n * 1. 忽略代码块中的标签\n * 2. 转义未闭合的标签\n * 3. 修复属性格式\n * 4. 剔除未识别的 x- 标签 (如果提供了 knownTags)\n */\nexport function preprocessXCML(md: string, knownTags?: string[]): string {\n if (!md) return '';\n\n // 0. 流式优化:处理末尾不完整的前缀\n const shortPrefixMatch = md.match(/<(xcml:|xcml|xcm|xc|x)$/);\n if (shortPrefixMatch) {\n md = md.slice(0, shortPrefixMatch.index);\n }\n\n // 1. 归一化 xcml: 到 x-\n let processedMd = md.replace(/<(\\/?)xcml:([a-zA-Z0-9-]+)/g, '<$1x-$2');\n\n const knownTagsSet = knownTags ? new Set(knownTags) : null;\n const result: string[] = [];\n let i = 0;\n const len = processedMd.length;\n\n while (i < len) {\n const char = processedMd[i];\n\n // 快速跳过普通字符\n if (char !== '<' && char !== '`') {\n const nextLT = processedMd.indexOf('<', i + 1);\n const nextBT = processedMd.indexOf('`', i + 1);\n let nextPos = -1;\n \n if (nextLT !== -1 && nextBT !== -1) nextPos = Math.min(nextLT, nextBT);\n else if (nextLT !== -1) nextPos = nextLT;\n else if (nextBT !== -1) nextPos = nextBT;\n\n if (nextPos === -1) {\n result.push(processedMd.slice(i));\n break;\n }\n result.push(processedMd.slice(i, nextPos));\n i = nextPos;\n continue;\n }\n\n // 2. 处理代码块 ``` ... ```\n if (processedMd.startsWith('```', i)) {\n const end = processedMd.indexOf('```', i + 3);\n if (end === -1) {\n result.push(processedMd.slice(i));\n break;\n }\n result.push(processedMd.slice(i, end + 3));\n i = end + 3;\n continue;\n }\n\n // 3. 处理行内代码 ` ... `\n if (char === '`') {\n const end = processedMd.indexOf('`', i + 1);\n if (end === -1) {\n result.push(processedMd.slice(i));\n break;\n }\n result.push(processedMd.slice(i, end + 1));\n i = end + 1;\n continue;\n }\n\n // 4. 处理标签 <\n if (char === '<') {\n let nextGT = -1;\n let inQuote: string | null = null;\n \n // 查找闭合 >\n for (let k = i + 1; k < len; k++) {\n const c = processedMd[k];\n if (c === \"'\" || c === '\"' || c === '`') {\n if (!inQuote) inQuote = c;\n else if (inQuote === c) inQuote = null;\n }\n if (c === '>' && !inQuote) {\n nextGT = k;\n break;\n }\n }\n\n if (nextGT === -1) {\n // CASE A: 标签未闭合\n if (i + 1 < len && /[a-zA-Z\\/]/.test(processedMd[i + 1])) {\n let j = i + (processedMd[i + 1] === '/' ? 2 : 1);\n while (j < len && /[a-zA-Z0-9-]/.test(processedMd[j])) j++;\n \n const tagName = processedMd.slice(i + (processedMd[i + 1] === '/' ? 2 : 1), j);\n if (tagName.startsWith('x-')) {\n if (knownTagsSet && !knownTagsSet.has(tagName)) break;\n\n if (processedMd[i + 1] !== '/') {\n result.push(`\\n\\n<${tagName} data-xcml-loading=\"true\"></${tagName}>\\n\\n`);\n } else {\n result.push(`\\n\\n${processedMd.slice(i).trim()}>\\n\\n`);\n }\n break;\n }\n }\n result.push(char);\n i++;\n continue;\n } else {\n // CASE B: 标签已闭合\n const isCloseTag = processedMd[i + 1] === '/';\n const tagNameStart = i + (isCloseTag ? 2 : 1);\n let j = tagNameStart;\n while (j < nextGT && /[a-zA-Z0-9-]/.test(processedMd[j])) j++;\n \n const tagName = processedMd.slice(tagNameStart, j);\n if (tagName.startsWith('x-')) {\n if (knownTagsSet && !knownTagsSet.has(tagName)) {\n const closeTag = `</${tagName}>`;\n const endTagIndex = processedMd.indexOf(closeTag, i);\n i = endTagIndex !== -1 ? endTagIndex + closeTag.length : nextGT + 1;\n continue;\n }\n\n let fullTag = processedMd.slice(i, nextGT + 1);\n if (!isCloseTag) {\n fullTag = fixXCMLTagAttributes(fullTag.replace(/\\r?\\n/g, ' '));\n }\n\n const normalizedTag = fullTag.replace(/\\s+/g, ' ');\n\n if (isCloseTag || normalizedTag.endsWith('/>')) {\n result.push(`\\n\\n${normalizedTag}\\n\\n`);\n i = nextGT + 1;\n continue;\n } else {\n const closeTag = `</${tagName}>`;\n const closeTagIndex = processedMd.indexOf(closeTag, nextGT + 1);\n \n if (closeTagIndex === -1) {\n // 未闭合标签,视为流式加载中\n let loadingTag = normalizedTag;\n if (!loadingTag.includes('data-xcml-loading')) {\n loadingTag = loadingTag.replace('>', ' data-xcml-loading=\"true\">');\n }\n result.push(`\\n\\n${loadingTag}\\n</${tagName}>\\n\\n`);\n break;\n } else {\n // 标签已闭合,提取并处理 Body\n const bodyContent = processedMd.slice(nextGT + 1, closeTagIndex);\n \n // 智能保护逻辑:\n // 如果 Body 看起来像 JSON (以 { 或 [ 开头),则保护其中的反斜杠,防止被 Markdown 解析器吞噬\n // 这解决了 JSON 字符串中包含转义引号 (e.g. \"key\": \"val\\\"ue\") 导致的解析错误\n const trimmedBody = bodyContent.trim();\n let processedBody = bodyContent;\n \n if (trimmedBody.startsWith('{') || trimmedBody.startsWith('[')) {\n // 将 \\ 替换为 \\\\,这样 Markdown 解析后会保留一个 \\\n processedBody = bodyContent.replace(/\\\\/g, '\\\\\\\\');\n }\n \n // 额外保护:为了防止 Markdown 解析器解析自定义标签内部的内容(如把 # 识别为标题),\n // 我们将原始 Body 编码后存入 data-xcml-raw 属性中,供渲染器优先使用。\n // 仅对非空 Body 且非纯空格 Body 进行此操作\n let tagWithRaw = normalizedTag;\n let finalBody = processedBody;\n\n if (trimmedBody) {\n const encodedBody = btoa(unescape(encodeURIComponent(bodyContent)));\n tagWithRaw = normalizedTag.replace('>', ` data-xcml-raw=\"${encodedBody}\">`);\n \n // 重要修复:为了防止 Markdown 解析器在解析 HTML 块时,\n // 错误地将内部的 Markdown 语法(如 # 标题)识别并破坏结构,\n // 我们在 data-xcml-raw 存在时,将 Body 内容清空(或保持简单),\n // 这样 Markdown 引擎就不会去尝试解析标签内部的复杂 Markdown 了。\n // 渲染器会通过 data-xcml-raw 重新还原出内容。\n finalBody = ''; \n }\n \n // 确保标签前后有换行,以便 Markdown 解析器将其识别为独立的块级元素\n result.push(`\\n\\n${tagWithRaw}\\n${finalBody}\\n${closeTag}\\n\\n`);\n i = closeTagIndex + closeTag.length;\n continue;\n }\n }\n }\n }\n }\n\n result.push(char);\n i++;\n }\n\n return result.join('').replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const metricSchema: XCMLComponentSchema = {\n tag: 'xcml:metric',\n title: '指标卡片',\n description: '用于展示单一核心数值及其趋势或备注信息,支持多种布局和样式变体。',\n props: [\n { name: 'label', type: 'string', description: '指标名称/标题', category: 'required', required: true },\n { name: 'variant', type: 'enum', description: '展示变体样式', category: 'style', options: ['card', 'plain', 'compact'], default: 'card' },\n { name: 'layout', type: 'enum', description: '布局方向', category: 'layout', options: ['horizontal', 'vertical'], default: 'vertical' },\n { name: 'icon', type: 'string', description: '装饰图标 (Emoji)', category: 'style' },\n { name: 'precision', type: 'number', description: '数值保留小数位数', category: 'style', default: 0 }\n ],\n body: [\n { name: 'value', type: 'string', description: '指标数值', category: 'required', required: true },\n { name: 'trend', type: 'enum', description: '趋势方向', category: 'optional', options: ['up', 'down', 'none'] },\n { name: 'trendValue', type: 'string', description: '趋势值', category: 'optional' },\n { name: 'note', type: 'string', description: '指标备注', category: 'optional' },\n { name: 'footer', type: 'string', description: '底部辅助信息', category: 'optional' },\n ],\n example: {\n props: {\n label: '月度净销售额',\n variant: 'card',\n layout: 'vertical',\n precision: 0,\n icon: '💰'\n },\n body: {\n value: '1280000',\n trend: 'up',\n trendValue: '+12.5%',\n note: '较上月增长 12.5%'\n },\n contentProp: 'value'\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const tableSchema: XCMLComponentSchema = {\n tag: 'xcml:table',\n title: '可视化数据表格',\n description: '报表级数据表格,支持进度条、趋势图等可视化列渲染,全量展示不分页。',\n props: [\n { name: 'title', type: 'string', description: '表格标题', category: 'style' },\n { name: 'bordered', type: 'boolean', description: '是否显示边框', category: 'style', default: true },\n { name: 'variant', type: 'enum', description: '展示变体 (card, plain)', category: 'style', options: ['card', 'plain'], default: 'card' },\n { name: 'size', type: 'enum', description: '表格尺寸', category: 'layout', options: ['small', 'middle', 'large'], default: 'middle' },\n { name: 'summary', type: 'boolean', description: '是否显示合计行', category: 'optional', default: false },\n ],\n body: [\n { \n name: 'columns', \n type: 'array', \n description: '列定义', \n category: 'required', \n required: true,\n items: [\n { \n name: 'column', \n type: 'object', \n description: '列配置对象', \n category: 'required',\n properties: [\n { name: 'title', type: 'string', description: '列标题', category: 'required' },\n { name: 'key', type: 'string', description: '数据字段键名', category: 'required' },\n { name: 'type', type: 'enum', description: '渲染类型', category: 'style', options: ['text', 'progress', 'trend', 'badge', 'image', 'link'] },\n { name: 'align', type: 'enum', description: '对齐方式', category: 'style', options: ['left', 'center', 'right'] },\n { name: 'width', type: 'number', description: '列宽', category: 'layout' },\n ]\n }\n ]\n },\n { \n name: 'rows', \n type: 'array', \n description: '行数据', \n category: 'required', \n required: true,\n items: [{ name: 'row', type: 'object', description: '行数据对象', category: 'required' }]\n },\n ],\n example: {\n props: {\n title: '各区域销售达成报表',\n bordered: false,\n size: 'middle',\n summary: true\n },\n body: {\n columns: [\n { title: '区域', key: 'region', align: 'left' },\n { title: '销售额', key: 'sales', align: 'right', type: 'text' },\n { title: '目标达成率', key: 'rate', align: 'center', type: 'progress' },\n { title: '近期趋势', key: 'trend', align: 'center', type: 'trend' },\n { title: '状态', key: 'status', align: 'center', type: 'badge' }\n ],\n rows: [\n { region: '华东区', sales: '¥1,250,000', rate: 0.92, trend: [10, 20, 15, 30, 40], status: 'normal' },\n { region: '华北区', sales: '¥980,000', rate: 0.78, trend: [30, 20, 25, 10, 15], status: 'warning' },\n { region: '华南区', sales: '¥1,560,000', rate: 1.12, trend: [20, 30, 40, 50, 60], status: 'success' },\n { region: '西部区', sales: '¥420,000', rate: 0.45, trend: [10, 8, 5, 12, 10], status: 'error' }\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const listSchema: XCMLComponentSchema = {\n tag: 'xcml:list',\n title: '网格/列表布局',\n description: '通用布局容器,支持 Grid 和 List 两种模式,适合排版多个卡片。',\n props: [\n { name: 'title', type: 'string', description: '列表标题' },\n { name: 'header', type: 'string', description: '列表页眉文本' },\n { name: 'footer', type: 'string', description: '列表页脚文本' },\n { name: 'layout', type: 'enum', description: '布局模式', options: ['grid', 'list'], default: 'grid' },\n { name: 'columns', type: 'number', description: '网格列数 (Grid模式有效)', default: 3 },\n { name: 'gap', type: 'number', description: '间距', default: 16 },\n { name: 'type', type: 'enum', description: '列表项默认类型', options: ['text', 'metric'], default: 'text' },\n { name: 'stripe', type: 'boolean', description: '是否开启斑马纹', default: false },\n ],\n body: [\n { name: 'items', type: 'array', description: '列表项集合', required: true },\n ],\n example: {\n props: {\n title: '统计指标',\n header: '最近一个月数据',\n footer: '数据来源:数据库',\n layout: 'grid',\n columns: 3,\n gap: 16\n },\n body: {\n items: [\n { title: '用户增长', value: '+12%', type: 'metric' },\n { title: '活跃度', value: '85%', type: 'metric' },\n { title: '留存率', value: '42%', type: 'metric' }\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const cardSchema: XCMLComponentSchema = {\n tag: 'xcml:card',\n title: '通用卡片',\n description: '基础容器卡片,支持标题、描述和悬浮效果。',\n props: [\n {\n name: 'title',\n type: 'string',\n description: '卡片标题',\n category: 'optional'\n },\n {\n name: 'type',\n type: 'enum',\n description: '卡片类型',\n category: 'style',\n options: ['inner', 'default'],\n default: 'default',\n },\n {\n name: 'hoverable',\n type: 'boolean',\n description: '是否支持悬停效果',\n category: 'interaction',\n default: true\n },\n {\n name: 'variant',\n type: 'enum',\n description: '展示变体 (card, plain)',\n category: 'style',\n options: ['card', 'plain'],\n default: 'card'\n },\n ],\n body: [\n {\n name: 'description',\n type: 'string',\n description: '卡片描述/正文 (兼容旧属性)',\n category: 'optional'\n },\n {\n name: 'content',\n type: 'string',\n description: '卡片主要内容 (支持 Markdown)',\n category: 'required',\n required: true,\n },\n ],\n example: {\n props: {\n type: 'default',\n hoverable: true,\n variant: 'card',\n title: '提示信息',\n theme: 'light'\n },\n body: {\n description: '这是一个基础卡片示例',\n content: '这是一个基础卡片容器,可以用来包裹简单的文本或作为其他组件的占位。',\n },\n contentProp: 'content'\n },\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const tocSchema: XCMLComponentSchema = {\n tag: 'xcml:toc',\n title: '文档目录',\n description: '自动提取文档中的 H2-H6 标题生成可跳转的目录。',\n props: [\n { name: 'title', type: 'string', description: '目录标题', default: '目录' },\n ],\n example: {\n props: {\n title: '内容大纲'\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../../../core/schema'\n\n/**\n * 折线图 XCML Schema 定义\n */\nexport const lineChartSchema: XCMLComponentSchema = {\n tag: 'x-line-chart',\n title: '折线图',\n description: '用于展示连续时间跨度下的数据趋势。',\n props: [],\n body: [\n { name: 'data', type: 'array', description: '折线图数据', required: true },\n { name: 'xField', type: 'string', description: 'x轴字段', default: 'category', required: true },\n { name: 'yField', type: 'string', description: 'y轴字段', default: 'value', required: true },\n { name: 'seriesField', type: 'string', description: '分组字段', default: 'type' },\n ],\n example: {\n props: {\n title: \"各类型商品销售趋势\",\n },\n body: {\n title: \"各类型商品销售趋势\",\n xField: 'category',\n yField: 'value',\n seriesField: 'type',\n data: [\n { category: 'A', value: 10, type: 'T1' },\n { category: 'B', value: 20, type: 'T1' },\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../../../core/schema'\n\n/**\n * 柱状图 XCML Schema 定义\n */\nexport const columnChartSchema: XCMLComponentSchema = {\n tag: 'x-column-chart',\n title: '柱状图',\n description: '用于比较不同分类之间的数据差异。',\n props: [],\n body: [\n // 字段映射\n {\n name: 'xField',\n type: 'string',\n description: 'X轴字段 (分类)',\n category: 'required',\n required: true,\n },\n {\n name: 'yField',\n type: 'string',\n description: 'Y轴字段 (数值)',\n category: 'required',\n required: true,\n },\n { name: 'seriesField', type: 'string', description: '系列字段 (分组)', category: 'optional' },\n { name: 'colorField', type: 'string', description: '颜色映射字段', category: 'optional' },\n { name: 'stack', type: 'any', description: '是否堆叠', category: 'layout' },\n { name: 'group', type: 'any', description: '是否分组显示', category: 'layout' },\n { name: 'percent', type: 'boolean', description: '是否百分比展示', category: 'layout' },\n { name: 'conversionTag', type: 'object', description: '转化率配置', category: 'style' },\n { name: 'markBackground', type: 'object', description: '元素背景配置', category: 'style' },\n\n // 基础属性\n {\n name: 'data',\n type: 'array',\n description: '图表数据源',\n category: 'required',\n required: true,\n },\n {\n name: 'title',\n type: 'any',\n description: '图表标题',\n category: 'style',\n properties: [\n { name: 'title', type: 'string', description: '主标题', category: 'optional' },\n { name: 'subtitle', type: 'string', description: '副标题', category: 'optional' },\n {\n name: 'align',\n type: 'enum',\n description: '对齐方式',\n category: 'style',\n options: ['left', 'center', 'right'],\n },\n { name: 'titleFontSize', type: 'number', description: '主标题字号', category: 'style' },\n { name: 'titleFontWeight', type: 'any', description: '主标题字重', category: 'style' },\n { name: 'titleFill', type: 'string', description: '主标题颜色', category: 'style' },\n ],\n },\n {\n name: 'label',\n type: 'any',\n description: '标签配置',\n category: 'style',\n properties: [\n { name: 'text', type: 'string', description: '映射字段', category: 'optional' },\n {\n name: 'position',\n type: 'enum',\n description: '位置',\n category: 'layout',\n options: ['top', 'bottom', 'inside', 'left', 'right'],\n },\n { name: 'style', type: 'object', description: '样式', category: 'style' },\n { name: 'background', type: 'any', description: '背景配置', category: 'style' },\n { name: 'transform', type: 'array', description: '布局变换', category: 'style' },\n ],\n },\n {\n name: 'axis',\n type: 'object',\n description: '坐标轴配置',\n category: 'style',\n properties: [\n {\n name: 'x',\n type: 'object',\n description: 'X轴配置',\n category: 'style',\n properties: [\n { name: 'title', type: 'any', description: '轴标题', category: 'style' },\n { name: 'line', type: 'any', description: '轴线', category: 'style' },\n { name: 'tick', type: 'any', description: '刻度线', category: 'style' },\n { name: 'label', type: 'any', description: '刻度值', category: 'style' },\n { name: 'grid', type: 'any', description: '网格线', category: 'style' },\n { name: 'labelFormatter', type: 'any', description: '格式化', category: 'style' },\n ],\n },\n {\n name: 'y',\n type: 'object',\n description: 'Y轴配置',\n category: 'style',\n properties: [\n { name: 'title', type: 'any', description: '轴标题', category: 'style' },\n { name: 'line', type: 'any', description: '轴线', category: 'style' },\n { name: 'tick', type: 'any', description: '刻度线', category: 'style' },\n { name: 'label', type: 'any', description: '刻度值', category: 'style' },\n { name: 'grid', type: 'any', description: '网格线', category: 'style' },\n { name: 'labelFormatter', type: 'any', description: '格式化', category: 'style' },\n ],\n },\n ],\n },\n {\n name: 'scale',\n type: 'object',\n description: '比例尺配置',\n category: 'style',\n properties: [\n { name: 'type', type: 'string', description: '类型', category: 'style' },\n { name: 'domain', type: 'array', description: '定义域', category: 'style' },\n { name: 'range', type: 'array', description: '值域', category: 'style' },\n { name: 'palette', type: 'string', description: '色板', category: 'style' },\n ],\n },\n { name: 'legend', type: 'object', description: '图例配置', category: 'style' },\n { name: 'tooltip', type: 'object', description: '悬浮提示配置', category: 'interaction' },\n { name: 'style', type: 'object', description: '图形样式配置', category: 'style' },\n { name: 'annotations', type: 'array', description: '辅助标注配置', category: 'style' },\n ],\n example: {\n props: {\n title: \"各区域年度销售分析\",\n },\n body: {\n xField: 'region',\n yField: 'sales',\n seriesField: 'year',\n stack: true,\n label: {\n text: 'sales',\n position: 'inside',\n },\n data: [\n { region: '华东', year: '2022', sales: 4500 },\n { region: '华东', year: '2023', sales: 5200 },\n { region: '华北', year: '2022', sales: 3800 },\n { region: '华北', year: '2023', sales: 4100 },\n { region: '华南', year: '2022', sales: 4200 },\n { region: '华南', year: '2023', sales: 4800 },\n ],\n },\n },\n}\n","import { XCMLComponentSchema } from '../../../../../core/schema'\n\n/**\n * 饼图 XCML Schema 定义\n */\nexport const pieChartSchema: XCMLComponentSchema = {\n tag: 'x-pie-chart',\n title: '饼图',\n description: '用于展示分类数据的占比情况。',\n props: [],\n body: [\n // 字段映射\n { name: 'colorField', type: 'string', description: '分类字段', category: 'required', required: true },\n { name: 'angleField', type: 'string', description: '数值字段', category: 'required', required: true },\n { name: 'radius', type: 'number', description: '半径', category: 'layout' },\n { name: 'innerRadius', type: 'number', description: '内半径 (环图)', category: 'layout' },\n\n // 基础属性\n { \n name: 'data', \n type: 'array', \n description: '图表数据源', \n category: 'required',\n required: true\n },\n {\n name: 'title',\n type: 'any',\n description: '图表标题',\n category: 'style',\n properties: [\n { name: 'title', type: 'string', description: '主标题', category: 'optional' },\n { name: 'subtitle', type: 'string', description: '副标题', category: 'optional' },\n { name: 'align', type: 'enum', description: '对齐方式', category: 'style', options: ['left', 'center', 'right'] },\n { name: 'titleFontSize', type: 'number', description: '主标题字号', category: 'style' },\n { name: 'titleFontWeight', type: 'any', description: '主标题字重', category: 'style' },\n { name: 'titleFill', type: 'string', description: '主标题颜色', category: 'style' }\n ]\n },\n {\n name: 'label',\n type: 'any',\n description: '标签配置',\n category: 'style',\n properties: [\n { name: 'text', type: 'string', description: '映射字段', category: 'optional' },\n { name: 'position', type: 'enum', description: '位置', category: 'layout', options: ['outside', 'inside'] },\n { name: 'style', type: 'object', description: '样式', category: 'style' },\n { name: 'background', type: 'any', description: '背景配置', category: 'style' },\n { name: 'connector', type: 'any', description: '连接线配置', category: 'style' },\n { name: 'transform', type: 'array', description: '布局变换', category: 'style' }\n ]\n },\n {\n name: 'legend',\n type: 'object',\n description: '图例配置',\n category: 'style',\n properties: [\n { name: 'position', type: 'enum', description: '位置', category: 'layout', options: ['top', 'bottom', 'left', 'right', 'top-left', 'top-right', 'bottom-left', 'bottom-right'] },\n { name: 'title', type: 'any', description: '标题', category: 'style' },\n { name: 'layout', type: 'object', description: '布局', category: 'style' },\n { name: 'itemMarker', type: 'any', description: '标记形状', category: 'style' }\n ]\n },\n { \n name: 'scale', \n type: 'object', \n description: '比例尺配置', \n category: 'style',\n properties: [\n { name: 'type', type: 'string', description: '类型', category: 'style' },\n { name: 'domain', type: 'array', description: '定义域', category: 'style' },\n { name: 'range', type: 'array', description: '值域', category: 'style' },\n { name: 'palette', type: 'string', description: '色板', category: 'style' }\n ]\n },\n { name: 'tooltip', type: 'object', description: '悬浮提示配置', category: 'interaction' },\n { name: 'style', type: 'object', description: '图形样式配置', category: 'style' },\n { name: 'annotations', type: 'array', description: '辅助标注配置', category: 'style' }\n ],\n example: {\n props: {},\n body: {\n colorField: 'type',\n angleField: 'value',\n data: [\n { type: 'A', value: 40 },\n { type: 'B', value: 60 },\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../../../core/schema'\n\n/**\n * 双轴图 XCML Schema 定义\n */\nexport const dualAxesChartSchema: XCMLComponentSchema = {\n tag: 'x-dual-axes-chart',\n title: '双轴图',\n description: '用于在同一图表中展示两个不同量纲的数据系列。',\n props: [],\n body: [\n // 字段映射\n { name: 'xField', type: 'string', description: 'X轴字段', category: 'required', required: true },\n\n // 子图层配置\n {\n name: 'children',\n type: 'array',\n description: '子图层配置数组',\n category: 'required',\n required: true,\n transform: (children: any[], context: any) => {\n if (!Array.isArray(children)) return children\n return children.map((child: Record<string, any>) => {\n // 如果子图层没写 xField,复用父图层的\n if (!child.xField && context.xField) {\n child.xField = context.xField\n }\n const scaleKey = child.xField || 'x'\n const childScale = child.scale || {}\n const xScale = childScale[scaleKey] || {}\n // 柱状图强制使用 band 缩放\n if (child.type === 'interval' || !xScale.type) {\n xScale.type = 'band'\n }\n return {\n ...child,\n scale: { ...childScale, [scaleKey]: xScale }\n }\n })\n },\n items: [\n {\n name: 'properties',\n type: 'object',\n description: '子图层配置',\n category: 'required',\n properties: [\n {\n name: 'type',\n type: 'enum',\n description: '图层类型',\n category: 'required',\n options: ['interval', 'line', 'area', 'point'],\n required: true,\n },\n { name: 'yField', type: 'string', description: '数值字段', category: 'required', required: true },\n { name: 'colorField', type: 'string', description: '分组字段', category: 'optional' },\n { name: 'seriesField', type: 'string', description: '系列字段 (别名)', category: 'optional' },\n { name: 'shapeField', type: 'string', description: '形状映射字段', category: 'optional' },\n { name: 'group', type: 'boolean', description: '是否分组', category: 'layout' },\n { name: 'style', type: 'object', description: '图形样式配置', category: 'style' },\n { name: 'interaction', type: 'object', description: '交互配置', category: 'interaction' },\n { name: 'data', type: 'array', description: '子图层独立数据源', category: 'required' },\n {\n name: 'axis',\n type: 'object',\n description: '该图层的轴配置',\n category: 'style',\n properties: [{ name: 'y', type: 'object', description: 'Y轴配置', category: 'style' }],\n },\n {\n name: 'label',\n type: 'any',\n description: '标签配置',\n category: 'style',\n properties: [\n { name: 'text', type: 'string', description: '映射字段', category: 'optional' },\n { name: 'position', type: 'enum', description: '位置', category: 'layout', options: ['top', 'bottom', 'inside', 'left', 'right'] },\n { name: 'style', type: 'object', description: '样式', category: 'style' },\n { name: 'background', type: 'any', description: '背景配置', category: 'style' },\n { name: 'transform', type: 'array', description: '布局变换', category: 'style' }\n ],\n },\n {\n name: 'scale',\n type: 'object',\n description: '比例尺配置',\n category: 'style',\n properties: [\n { name: 'type', type: 'string', description: '类型', category: 'style' },\n { name: 'domain', type: 'array', description: '定义域', category: 'style' },\n { name: 'range', type: 'array', description: '值域', category: 'style' },\n { name: 'palette', type: 'string', description: '色板', category: 'style' }\n ],\n },\n ],\n },\n ],\n },\n\n // 基础属性\n {\n name: 'data',\n type: 'array',\n description: '图表数据源',\n category: 'required',\n required: true\n },\n {\n name: 'title',\n type: 'any',\n description: '图表标题',\n category: 'style',\n properties: [\n { name: 'title', type: 'string', description: '主标题', category: 'optional' },\n { name: 'subtitle', type: 'string', description: '副标题', category: 'optional' },\n { name: 'align', type: 'enum', description: '对齐方式', category: 'style', options: ['left', 'center', 'right'] },\n { name: 'titleFontSize', type: 'number', description: '主标题字号', category: 'style' },\n { name: 'titleFontWeight', type: 'any', description: '主标题字重', category: 'style' },\n { name: 'titleFill', type: 'string', description: '主标题颜色', category: 'style' }\n ]\n },\n {\n name: 'label',\n type: 'any',\n description: '标签配置',\n category: 'style',\n properties: [\n { name: 'text', type: 'string', description: '映射字段', category: 'optional' },\n { name: 'position', type: 'enum', description: '位置', category: 'layout', options: ['top', 'bottom', 'middle', 'left', 'right'] },\n { name: 'style', type: 'object', description: '样式', category: 'style' },\n { name: 'background', type: 'any', description: '背景配置', category: 'style' },\n { name: 'transform', type: 'array', description: '布局变换', category: 'style' }\n ]\n },\n {\n name: 'axis',\n type: 'object',\n description: '坐标轴配置',\n category: 'style',\n properties: [\n { \n name: 'x', \n type: 'object', \n description: 'X轴配置', \n category: 'style',\n properties: [\n { name: 'title', type: 'any', description: '轴标题', category: 'style' },\n { name: 'line', type: 'any', description: '轴线', category: 'style' },\n { name: 'tick', type: 'any', description: '刻度线', category: 'style' },\n { name: 'label', type: 'any', description: '刻度值', category: 'style' },\n { name: 'grid', type: 'any', description: '网格线', category: 'style' },\n { name: 'labelFormatter', type: 'any', description: '格式化', category: 'style' }\n ]\n },\n { \n name: 'y', \n type: 'object', \n description: 'Y轴配置', \n category: 'style',\n properties: [\n { name: 'title', type: 'any', description: '轴标题', category: 'style' },\n { name: 'line', type: 'any', description: '轴线', category: 'style' },\n { name: 'tick', type: 'any', description: '刻度线', category: 'style' },\n { name: 'label', type: 'any', description: '刻度值', category: 'style' },\n { name: 'grid', type: 'any', description: '网格线', category: 'style' },\n { name: 'labelFormatter', type: 'any', description: '格式化', category: 'style' }\n ]\n }\n ]\n },\n { \n name: 'scale', \n type: 'object', \n description: '比例尺配置', \n category: 'style',\n properties: [\n { name: 'type', type: 'string', description: '类型', category: 'style' },\n { name: 'domain', type: 'array', description: '定义域', category: 'style' },\n { name: 'range', type: 'array', description: '值域', category: 'style' },\n { name: 'palette', type: 'string', description: '色板', category: 'style' }\n ]\n },\n { name: 'legend', type: 'object', description: '图例配置', category: 'style' },\n { name: 'tooltip', type: 'object', description: '悬浮提示配置', category: 'interaction' },\n { name: 'style', type: 'object', description: '图形样式配置', category: 'style' },\n { name: 'annotations', type: 'array', description: '辅助标注配置', category: 'style' }\n ],\n example: {\n props: {\n xField: 'month',\n children: [\n {\n type: 'interval',\n yField: 'sales',\n label: { position: 'middle' }\n },\n {\n type: 'line',\n yField: 'rate',\n label: { position: 'top' },\n style: { stroke: '#5AD8A6', lineWidth: 2 }\n }\n ],\n axis: {\n y: [\n { title: { text: '销售额' } },\n { title: { text: '利润率' }, position: 'right' }\n ]\n },\n data: [\n { month: '1月', sales: 450, rate: 0.12 },\n { month: '2月', sales: 520, rate: 0.15 },\n { month: '3月', sales: 480, rate: 0.14 },\n { month: '4月', sales: 610, rate: 0.18 },\n { month: '5月', sales: 580, rate: 0.16 }\n ]\n },\n body: {\n xField: 'time',\n yField: ['value', 'count'],\n data: [\n { time: '2021-01', value: 10, count: 5 },\n { time: '2021-02', value: 20, count: 10 },\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../../../core/schema'\n\n/**\n * 漏斗图 XCML Schema 定义\n */\nexport const funnelChartSchema: XCMLComponentSchema = {\n tag: 'x-funnel-chart',\n title: '漏斗图',\n description: '用于展示业务流程中各阶段的数据转化情况。',\n props: [],\n body: [\n { name: 'data', type: 'array', description: '漏斗图数据', required: true },\n { name: 'xField', type: 'string', description: '类别字段', default: 'category', required: true },\n { name: 'yField', type: 'string', description: '数值字段', default: 'value', required: true },\n ],\n example: {\n props: {},\n body: {\n xField: 'category',\n yField: 'value',\n data: [\n { category: 'A', value: 100 },\n { category: 'B', value: 80 },\n ]\n }\n }\n}\n","import { XCMLComponentSchema, XCMLPropertyDefinition } from '../../../core/schema'\nimport { lineChartSchema } from './strategies/Line/schema'\nimport { columnChartSchema } from './strategies/Column/schema'\nimport { pieChartSchema } from './strategies/Pie/schema'\nimport { dualAxesChartSchema } from './strategies/DualAxes/schema'\nimport { funnelChartSchema } from './strategies/Funnel/schema'\n\n/**\n * 策略 Schema 列表\n */\nconst STRATEGY_SCHEMAS: Record<string, XCMLComponentSchema> = {\n line: lineChartSchema,\n column: columnChartSchema,\n pie: pieChartSchema,\n 'dual-axes': dualAxesChartSchema,\n funnel: funnelChartSchema,\n}\n\n/**\n * 合并多个策略的属性定义\n * 职责:聚合所有子图表的属性,并自动注入基于 type 的可见性逻辑,以便在工作台中动态切换\n */\nfunction mergeStrategyProps(\n schemas: Record<string, XCMLComponentSchema>,\n source: 'props' | 'body',\n): XCMLPropertyDefinition[] {\n const propMap = new Map<string, { def: XCMLPropertyDefinition; types: string[] }>()\n\n Object.entries(schemas).forEach(([type, schema]) => {\n const targetProps = schema[source] || []\n targetProps.forEach((prop) => {\n // 过滤掉已在通用属性中定义的字段,以及容器统一管理的 type 和 data\n const commonProps = [\n 'type',\n 'data',\n 'xField',\n 'yField',\n 'colorField',\n 'seriesField',\n 'title',\n 'label',\n 'axis',\n 'legend',\n 'tooltip',\n 'scale',\n 'interaction',\n 'theme',\n ]\n if (commonProps.includes(prop.name)) return\n\n const existing = propMap.get(prop.name)\n if (existing) {\n existing.types.push(type)\n } else {\n propMap.set(prop.name, { def: prop, types: [type] })\n }\n })\n })\n\n return Array.from(propMap.values()).map(({ def, types }) => ({\n ...def,\n // 注入动态可见性判断:只有当 type 匹配时才显示该属性\n visibleIf: (props: Record<string, any>) => {\n const isTypeMatch = types.includes(props.type)\n if (!isTypeMatch) return false\n // 如果原始定义中已有 visibleIf (如双轴图特有的属性),则需同时满足\n return def.visibleIf ? def.visibleIf(props) : true\n },\n }))\n}\n\n/**\n * AntV 通用图表 XCML Schema 定义\n * 职责:作为图表组件的通用容器入口,聚合各子图表的属性定义,支持在工作台中根据 type 动态切换。\n */\nexport const chartSchema: XCMLComponentSchema = {\n tag: 'xcml:chart',\n title: 'AntV 通用图表',\n description: '全功能图表组件容器,支持通过 type 动态切换折线图、柱状图、饼图等。',\n props: [\n {\n name: 'type',\n type: 'enum',\n description: '图表类型',\n category: 'required',\n required: true,\n options: ['line', 'column', 'pie', 'dual-axes', 'funnel'],\n default: 'line',\n },\n ...mergeStrategyProps(STRATEGY_SCHEMAS, 'props'),\n ],\n body: [\n {\n name: 'data',\n type: 'array',\n description: '图表数据源',\n category: 'required',\n required: true\n },\n { name: 'xField', type: 'string', description: 'X轴字段', category: 'required', required: true },\n { name: 'yField', type: 'string', description: 'Y轴字段', category: 'required', required: true },\n { name: 'colorField', type: 'string', description: '颜色/分组字段', category: 'optional' },\n { name: 'seriesField', type: 'string', description: '系列字段', category: 'optional' },\n { name: 'title', type: 'object', description: '图表标题', category: 'style' },\n { name: 'label', type: 'object', description: '数据标签', category: 'style' },\n { name: 'axis', type: 'object', description: '坐标轴配置', category: 'style' },\n { name: 'legend', type: 'object', description: '图例配置', category: 'style' },\n { name: 'tooltip', type: 'object', description: '提示信息', category: 'interaction' },\n { name: 'scale', type: 'object', description: '度量配置', category: 'optional' },\n { name: 'interaction', type: 'object', description: '交互配置', category: 'interaction' },\n { name: 'theme', type: 'string', description: '图表主题', category: 'style' },\n ...mergeStrategyProps(STRATEGY_SCHEMAS, 'body'),\n ],\n example: {\n props: {\n type: 'line',\n theme: 'light',\n },\n body: {\n xField: 'year',\n yField: 'value',\n seriesField: 'category',\n data: [\n { year: '1991', value: 3, category: 'A' },\n { year: '1992', value: 4, category: 'A' },\n { year: '1993', value: 3.5, category: 'A' },\n { year: '1994', value: 5, category: 'A' },\n { year: '1995', value: 4.9, category: 'A' },\n { year: '1996', value: 6, category: 'A' },\n { year: '1997', value: 7, category: 'A' },\n { year: '1998', value: 9, category: 'A' },\n { year: '1999', value: 13, category: 'A' },\n { year: '1991', value: 3, category: 'B' },\n { year: '1992', value: 4, category: 'B' },\n { year: '1993', value: 3.5, category: 'B' },\n { year: '1994', value: 5, category: 'B' },\n { year: '1995', value: 4.9, category: 'B' },\n { year: '1996', value: 6, category: 'B' },\n { year: '1997', value: 7, category: 'B' },\n { year: '1998', value: 9, category: 'B' },\n { year: '1999', value: 13, category: 'B' },\n ]\n }\n }\n}\n\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const insightCardSchema: XCMLComponentSchema = {\n tag: 'xcml:insight-card',\n title: '洞察卡片 (Pro)',\n description: '全量展示的洞察卡片,支持引用来源与行动建议。',\n props: [\n { name: 'title', type: 'string', description: '洞察标题' },\n { name: 'sentiment', type: 'enum', description: '情感倾向', options: ['positive', 'negative', 'neutral', 'insight', 'warning', 'success', 'error'], default: 'insight' },\n { name: 'icon', type: 'string', description: '图标 (Emoji 或 AntD Icon 名称)' },\n { name: 'variant', type: 'string', description: '展示变体 (card, plain)', default: 'card' },\n ],\n body: [\n { name: 'actions', type: 'array', description: '建议行动列表' },\n { name: 'citations', type: 'array', description: '引用来源列表' },\n { name: 'highlights', type: 'array', description: '需要高亮的关键词列表' },\n { name: 'content', type: 'string', description: '洞察正文内容 (支持从 Body 传入)' },\n ],\n example: {\n props: {\n title: '库存预警:热门商品缺货风险',\n sentiment: 'warning',\n },\n body: {\n highlights: ['3 天内售罄', '立即启动补货'],\n citations: ['库存管理系统', '销售预测模型'],\n actions: ['生成补货单', '暂停广告投放'],\n content: '根据当前销售速率,iPhone 15 Pro Max 将在 3 天内售罄。建议立即启动补货流程,并调整广告投放策略以避免超卖。'\n },\n contentProp: 'content'\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const interactiveSummarySchema: XCMLComponentSchema = {\n tag: 'xcml:interactive-summary',\n title: '交互式汇总',\n description: '带操作按钮的数值汇总卡片,支持实时调整数值并触发业务回调。',\n props: [\n { name: 'label', type: 'string', description: '指标名称', default: '调整目标' },\n { name: 'value', type: 'number', description: '初始数值', default: 0 },\n { name: 'step', type: 'number', description: '调整步长', default: 1 },\n { name: 'unit', type: 'string', description: '数值单位' },\n { name: 'actionId', type: 'string', description: '触发回调的事件 ID', default: 'update_target' },\n { name: 'variant', type: 'string', description: '展示变体 (card, plain)', default: 'card' },\n ],\n body: [\n { name: 'content', type: 'string', description: '汇总文本内容 (支持从 Body 传入)' },\n { name: 'highlightKeywords', type: 'array', description: '文本中需要高亮的关键词数组' },\n { name: 'trendData', type: 'array', itemType: 'number', description: '背景趋势图数据' },\n ],\n example: {\n props: {\n label: '季度销售目标',\n value: 5000,\n unit: 'k',\n step: 100,\n actionId: 'set_sales_target'\n },\n body: {\n trendData: [10, 20, 15, 30, 40, 35, 50],\n content: '根据当前业务增长,建议将目标设定在 5000k 以上。'\n },\n contentProp: 'content'\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const metricCardSchema: XCMLComponentSchema = {\n tag: 'xcml:metric-card',\n title: '复合指标卡',\n description: '增强型指标展示,支持数值动画、单位、前缀以及同比/环比趋势。',\n props: [\n { name: 'title', type: 'string', description: '卡片标题' },\n { name: 'label', type: 'string', description: '指标名称 (title 的别名)' },\n { name: 'unit', type: 'string', description: '数值单位' },\n { name: 'prefix', type: 'string', description: '数值前缀' },\n { name: 'footer', type: 'string', description: '底部辅助信息' },\n { name: 'precision', type: 'number', description: '保留小数位数', default: 2 },\n { name: 'variant', type: 'string', description: '展示变体 (card, plain)', default: 'card' },\n ],\n body: [\n { name: 'value', type: 'number', description: '核心数值', required: true },\n { name: 'wow', type: 'number', description: '环比增长率 (%)' },\n { name: 'yoy', type: 'number', description: '同比增长率 (%)' },\n ],\n example: {\n props: {\n label: '活跃用户',\n unit: '人'\n },\n body: {\n value: 84200,\n wow: 12.5\n },\n contentProp: 'value'\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const miniKpiStripSchema: XCMLComponentSchema = {\n tag: 'xcml:mini-kpi-strip',\n title: '迷你指标条',\n description: '紧凑的横向指标排列,支持迷你趋势图(Sparkline)和环比展示。',\n props: [],\n body: [\n { \n name: 'items', \n type: 'array', \n description: '指标项列表',\n items: [\n { name: 'label', type: 'string', description: '指标名称', required: true },\n { name: 'value', type: 'string', description: '指标当前数值', required: true },\n { name: 'wow', type: 'number', description: '环比增长率 (%)' },\n { name: 'trendData', type: 'array', itemType: 'number', description: '迷你趋势图数据点数组' }\n ]\n },\n ],\n example: {\n body: {\n items: [\n { label: '营收', value: '¥1.2M', wow: 12, trendData: [10, 20, 15, 30, 40] },\n { label: '用户', value: '85.2K', wow: -5, trendData: [50, 40, 45, 35, 30] },\n { label: '转化率', value: '3.2%', wow: 2, trendData: [2, 3, 2.5, 3.1, 3.2] },\n { label: '活跃度', value: '92%', wow: 0, trendData: [90, 91, 92, 90, 92] }\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const posterCardSchema: XCMLComponentSchema = {\n tag: 'xcml:poster-card',\n title: '数据海报',\n description: '美观的数据可视化海报,支持多种图表组合、二维码展示及一键下载图片。',\n props: [\n { name: 'title', type: 'string', description: '海报标题', default: '数据海报' },\n { name: 'subTitle', type: 'string', description: '海报副标题', default: 'Data Insight Poster' },\n { name: 'themeColor', type: 'string', description: '海报主题色' },\n { name: 'backgroundImage', type: 'string', description: '背景图片 URL' },\n { name: 'qrCode', type: 'string', description: '二维码内容', default: 'https://ant.design' },\n { name: 'author', type: 'string', description: '作者', default: 'ChatBI' },\n { name: 'date', type: 'string', description: '日期' },\n { name: 'variant', type: 'string', description: '展示变体 (card, plain)', default: 'card' },\n ],\n body: [\n { \n name: 'charts', \n type: 'array', \n description: '包含在海报中的图表列表',\n items: [\n { name: 'type', type: 'enum', description: '图表类型', options: ['column', 'line', 'pie'], required: true },\n { name: 'title', type: 'string', description: '图表标题' },\n { \n name: 'data', \n type: 'array', \n description: '图表数据数组', \n required: true,\n items: [\n { name: 'label', type: 'string', description: '维度名称', required: true },\n { name: 'value', type: 'number', description: '指标数值', required: true }\n ]\n }\n ]\n },\n ],\n example: {\n props: {\n title: '双十一销售战报',\n subTitle: '2023 核心指标回顾',\n author: '数据分析团队'\n },\n body: {\n charts: [\n { \n type: 'pie', \n title: '各渠道占比', \n data: [\n { label: '直播', value: 45 },\n { label: '搜索', value: 30 },\n { label: '其他', value: 25 }\n ] \n },\n { \n type: 'column', \n title: '近 7 日趋势', \n data: [\n { label: '11.01', value: 120 },\n { label: '11.02', value: 150 },\n { label: '11.03', value: 200 }\n ] \n }\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const snapshotTableSchema: XCMLComponentSchema = {\n tag: 'xcml:snapshot-table',\n title: '快照表格',\n description: '轻量级数据快照,支持 CSV 导出和滚动查看。',\n props: [\n { name: 'title', type: 'string', description: '表格标题' },\n ],\n body: [\n { \n name: 'columns', \n type: 'array', \n description: '表格列定义',\n items: [\n { name: 'title', type: 'string', description: '列标题', required: true },\n { name: 'key', type: 'string', description: '数据对应字段', required: true },\n { name: 'width', type: 'number', description: '列宽' },\n { name: 'align', type: 'enum', description: '对齐方式', options: ['left', 'center', 'right'] }\n ]\n },\n { \n name: 'rows', \n type: 'array', \n description: '表格行数据',\n items: [\n { name: 'properties', type: 'object', description: '行数据对象,键值需对应 columns 中的 key' }\n ]\n },\n ],\n example: {\n props: {\n title: '实时库存快照'\n },\n body: {\n columns: [\n { title: '商品名', key: 'name' },\n { title: '库存量', key: 'stock' },\n { title: '预警线', key: 'threshold' }\n ],\n rows: [\n { name: 'iPhone 15', stock: 120, threshold: 50 },\n { name: 'iPad Air', stock: 45, threshold: 30 },\n { name: 'MacBook Pro', stock: 12, threshold: 20 }\n ]\n }\n }\n}\n","import { XCMLComponentSchema } from '../../../core/schema'\n\nexport const thoughtChainSchema: XCMLComponentSchema = {\n tag: 'xcml:thought-chain',\n title: '思维链 (Timeline)',\n description: '全展开的时间轴式思维链,展示执行耗时与详细结果。',\n props: [\n { name: 'title', type: 'string', description: '思维链标题', default: '分析过程' },\n { name: 'variant', type: 'string', description: '展示变体 (card, plain)', default: 'card' },\n ],\n body: [\n { \n name: 'steps', \n type: 'array', \n description: '执行步骤列表',\n items: [\n { name: 'tool', type: 'string', description: '使用的工具名称' },\n { name: 'action', type: 'string', description: '执行的操作描述' },\n { name: 'status', type: 'enum', description: '执行状态', options: ['success', 'running', 'pending', 'error'] },\n { name: 'duration', type: 'string', description: '耗时描述' },\n { name: 'thought', type: 'string', description: '思考过程/日志' },\n { name: 'result', type: 'string', description: '执行结果摘要' },\n { name: 'error', type: 'string', description: '错误信息' }\n ]\n },\n ],\n example: {\n props: {\n title: '智能分析执行路径'\n },\n body: {\n steps: [\n { \n tool: 'SQL Generator', \n action: '生成查询语句', \n duration: '120ms', \n status: 'success', \n thought: '根据用户意图,需要查询 2023 年后的销售数据。',\n result: 'SELECT * FROM sales WHERE date > \"2023-01-01\"' \n },\n { \n tool: 'Data Query', \n action: '执行数据库查询', \n duration: '1.2s', \n status: 'success', \n thought: '正在连接生产库执行查询...',\n result: 'Total rows: 1250' \n },\n { \n tool: 'Analysis', \n action: '计算同比增长率', \n duration: '45ms', \n status: 'success', \n thought: '对比去年同期数据进行计算。',\n result: 'YoY Growth: +15.2%' \n }\n ]\n }\n }\n}\n","/**\n * XCML 组件规范定义 (Metadata Registry)\n * 职责:显式标注所有组件的可选属性,支持自动化表单生成、校验及 AI 意图映射。\n */\n\n/** 属性数据类型 */\nexport type XCMLPropertyType = 'string' | 'number' | 'boolean' | 'object' | 'array' | 'enum' | 'any'\n\n/** 属性功能分类 */\nexport type XCMLPropertyCategory = 'required' | 'optional' | 'layout' | 'interaction' | 'style'\n\n/** \n * 单个属性的详细定义\n */\nexport interface XCMLPropertyDefinition {\n /** 属性名 */\n name: string\n /** 数据类型 */\n type: XCMLPropertyType\n /** 属性描述(用于文档或 Tooltip) */\n description: string\n /** 功能分类 */\n category?: XCMLPropertyCategory\n /** 是否必填 */\n required?: boolean\n /** 默认值 */\n default?: any\n /** 属性转换器:在渲染前对属性值进行最后一次加工(如字符串转数字) */\n transform?: (value: any, context: any) => any\n /** 枚举类型的可选值列表 */\n options?: string[]\n /** 动态可见性判断:根据其他属性值决定当前属性是否显示 */\n visibleIf?: (props: Record<string, any>) => boolean\n /** 对象的子属性定义 (仅当 type 为 'object' 时有效) */\n properties?: XCMLPropertyDefinition[]\n /** 数组项的属性定义 (仅当 type 为 'array' 且项为对象时有效) */\n items?: XCMLPropertyDefinition[]\n /** 数组项的基本类型 (仅当 type 为 'array' 且项为基本类型时有效) */\n itemType?: XCMLPropertyType\n}\n\n/**\n * 组件完整 Schema 定义\n */\nexport interface XCMLComponentSchema {\n /** 组件标签名 (如 xcml:metric) */\n tag: string\n /** 组件中文标题 */\n title: string\n /** 组件功能描述 */\n description: string\n /** 标签属性定义 (Attributes) */\n props: XCMLPropertyDefinition[]\n /** 标签体数据定义 (Body Data) */\n body?: XCMLPropertyDefinition[] \n /** 示例配置,用于编辑器快速生成代码 */\n example?: {\n /** 示例属性 */\n props?: Record<string, any>\n /** 示例 Body 数据 */\n body?: Record<string, any>\n /** 当 Body 为纯字符串时,默认映射到的属性名(如 'content') */\n contentProp?: string\n }\n}\n\n/** \n * 通用组件属性定义 \n * 所有 XCML 组件都会自动继承这些属性,无需在每个组件中重复定义\n */\nexport const COMMON_PROPS: XCMLPropertyDefinition[] = [\n { \n name: 'theme', \n type: 'enum', \n description: '组件视觉主题风格', \n category: 'style',\n options: ['light', 'dark', 'ocean', 'sunset', 'lavender', 'rose', 'amber', 'midnight', 'forest', 'slate', 'crimson', 'cyber'],\n default: undefined \n }\n]\n\n/**\n * 全局组件规范注册表\n * 职责:定义组件属性契约,并提供开箱即用的默认示例数据。\n */\nimport { metricSchema } from '../renderers/basic/Metric/schema'\nimport { tableSchema } from '../renderers/basic/Table/schema'\nimport { listSchema } from '../renderers/basic/List/schema'\nimport { cardSchema } from '../renderers/basic/Card/schema'\nimport { tocSchema } from '../renderers/basic/TOC/schema'\nimport { chartSchema } from '../renderers/antv/Chart/schema'\nimport { insightCardSchema } from '../renderers/cards/InsightCard/schema'\nimport { interactiveSummarySchema } from '../renderers/cards/InteractiveSummary/schema'\nimport { metricCardSchema } from '../renderers/cards/MetricCard/schema'\nimport { miniKpiStripSchema } from '../renderers/cards/MiniKpiStrip/schema'\nimport { posterCardSchema } from '../renderers/cards/PosterCard/schema'\nimport { snapshotTableSchema } from '../renderers/cards/SnapshotTable/schema'\nimport { thoughtChainSchema } from '../renderers/cards/ThoughtChain/schema'\n\nconst RAW_SCHEMAS: Record<string, XCMLComponentSchema> = {\n 'xcml:metric': metricSchema,\n 'xcml:table': tableSchema,\n 'xcml:chart': chartSchema,\n 'xcml:list': listSchema,\n 'xcml:thought-chain': thoughtChainSchema,\n 'xcml:insight-card': insightCardSchema,\n 'xcml:metric-card': metricCardSchema,\n 'xcml:card': cardSchema,\n 'xcml:toc': tocSchema,\n 'xcml:poster-card': posterCardSchema,\n 'xcml:mini-kpi-strip': miniKpiStripSchema,\n 'xcml:interactive-summary': interactiveSummarySchema,\n 'xcml:snapshot-table': snapshotTableSchema,\n}\n\n// 自动注入通用属性 (theme 等)\nexport const XCML_SCHEMAS: Record<string, XCMLComponentSchema> = Object.fromEntries(\n Object.entries(RAW_SCHEMAS).map(([key, schema]) => [\n key,\n {\n ...schema,\n props: [...(schema.props || []), ...COMMON_PROPS]\n }\n ])\n)\n\n","import React from 'react'\nimport { XCMLComponentSchema } from './schema'\n\n/**\n * XCML 基础组件属性定义\n * 所有 XCML 组件都应继承此接口,以确保通用样式的统一透传\n */\nexport interface XCMLBaseProps {\n /** 唯一标识符,用于事件总线(xcmlBus)定位组件 */\n id?: string\n /** 视觉主题,可选值如 'light', 'dark', 'ocean' 等 */\n theme?: string\n /** 变体样式,用于区分同组件的不同视觉呈现 */\n variant?: string\n /** 组件尺寸 */\n size?: 'small' | 'middle' | 'large'\n /** 自定义 Tailwind 类名 */\n className?: string\n /** 自定义内联样式 */\n style?: React.CSSProperties\n /** 手动指定加载状态 */\n loading?: boolean\n /** \n * 数据流状态\n * - loading: 初始加载中\n * - streaming: 正在接收流式数据\n * - done: 加载完成\n * - error: 发生错误\n */\n streamStatus?: 'loading' | 'streaming' | 'done' | 'error'\n /** 错误信息对象 */\n error?: Error | null\n /** 原始 XCML AST 节点引用 */\n node?: any\n}\n\n/**\n * XCML 基础组件接口\n * 定义了组件应实现的通用方法与元数据\n * \n * @example\n * ```tsx\n * const MyComponent: XCMLBaseComponent<Props> = (props) => { ... }\n * MyComponent.schema = mySchema;\n * ```\n */\nexport interface XCMLBaseComponent<P = {}> extends React.FC<P & XCMLBaseProps> {\n /** \n * 组件元数据定义 (Schema)\n * 用于自动化的属性提取、文档生成及工作台交互\n */\n schema: XCMLComponentSchema\n}\n\n/**\n * 通用样式提取工具\n * 从组件 Props 中提取出 XCMLBaseProps 定义的通用样式属性,便于透传给 Wrapper\n * \n * @param props - 组件接收到的所有属性\n * @returns 仅包含基础样式的属性对象\n */\nexport function extractBaseStyles(props: Record<string, any>): Partial<XCMLBaseProps> {\n const { theme, variant, size, className, style } = props\n return { theme, variant, size, className, style }\n}\n","import { XCMLComponentSchema, XCML_SCHEMAS } from './schema';\nimport { XCMLBaseProps } from './base';\n\n/**\n * XCML 内部通用工具函数\n */\n\n/**\n * 核心 Hook:从 XCML 节点中提取并合并属性与数据\n * \n * 治理原则:\n * 1. 优先级:显式标签属性 (Props) > 标签体数据 (Body Data) > Schema 默认值 (Defaults)。\n * 2. 智能解析:自动识别 Body 中的 JSON 字符串并解析。\n * 3. 结构适配:根据 Schema 将 Body 中的数组或原始值映射到正确的属性名上。\n * \n * @param node - XCML AST 节点模型\n * @param schema - 组件的规范定义\n * @returns 合并后的全量属性对象\n * \n * @template T - 组件特有的属性类型\n */\nexport function useXCMLNode<T = Record<string, any>>(node: any, schema?: XCMLComponentSchema): T & XCMLBaseProps {\n // 1. 提取原始属性 (Attributes)\n const props = (node.props || {}) as any;\n \n // 2. 提取标签体数据 (Body Data)\n // 遵循:data-xcml-raw (预处理保护的数据) > node.body (新版) > node.data (旧版兼容)\n let bodyData = node.body !== undefined ? node.body : node.data;\n\n // 优先从 data-xcml-raw 中解码原始数据\n const rawData = (node.props || {})['data-xcml-raw'];\n if (rawData) {\n try {\n bodyData = decodeURIComponent(escape(atob(rawData)));\n } catch (e) {\n console.warn('[XCML] Failed to decode data-xcml-raw:', e);\n }\n }\n \n // 尝试解析 JSON 字符串格式的 body\n if (typeof bodyData === 'string') {\n const trimmed = bodyData.trim();\n if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {\n try {\n bodyData = JSON.parse(trimmed);\n } catch (e) {\n // 解析失败则保持原样,作为 content 处理\n }\n }\n }\n\n // 3. 构造结果对象,首先应用 Schema 默认值\n const result: any = {};\n \n if (schema) {\n // 处理 props 默认值\n (schema.props || []).forEach(p => {\n if (p.default !== undefined) {\n result[p.name] = p.default;\n }\n });\n // 处理 body 默认值\n (schema.body || []).forEach(p => {\n if (p.default !== undefined) {\n result[p.name] = p.default;\n }\n });\n }\n\n // 4. 合并逻辑:优先级 标签属性 (Props) > 数据体 (Body Data) > 默认值 (Defaults)\n if (bodyData !== undefined && bodyData !== null) {\n if (typeof bodyData === 'object' && !Array.isArray(bodyData)) {\n // 如果是对象,合并到 result 中\n Object.assign(result, bodyData);\n \n // 特殊处理:如果对象中有 'data' 字段且它是数组,则保留它\n // (通常 bodyData 中的 data 应该被保留,除非 props 中也有 data)\n if (Array.isArray(bodyData.data)) {\n result.data = bodyData.data;\n }\n } else if (Array.isArray(bodyData)) {\n // 如果是数组,根据 schema 查找合适的存放字段,默认为 'data'\n const arrayProp = (schema?.body || []).find(p => p.type === 'array')?.name || 'data';\n result[arrayProp] = bodyData;\n } else {\n // 原始类型 (String/Number/Boolean),映射到 contentProp\n const contentProp = schema?.example?.contentProp || \n (schema?.body || []).find(p => p.name === 'content' || p.name === 'value')?.name || \n 'content';\n result[contentProp] = bodyData;\n }\n }\n\n // 5. 最后合并显式 Props,确保其优先级最高\n Object.assign(result, props);\n\n // 4. 确保核心样式属性 (theme, variant, layout, size) 即使不在 Data 中也能正确透传\n // 这些属性通常用于控制包装器的表现\n const commonStyles = ['theme', 'variant', 'layout', 'size'];\n commonStyles.forEach(styleKey => {\n // 如果 Data 中没有,则尝试使用 Props 中的值\n if (result[styleKey] === undefined && props[styleKey] !== undefined) {\n result[styleKey] = props[styleKey];\n }\n });\n\n return result as T & XCMLBaseProps;\n}\n\n/**\n * 增强型数组解析工具\n * \n * 支持以下格式:\n * 1. 标准 JSON 数组: `[\"a\", \"b\"]`\n * 2. 非标单引号数组: `['a', 'b']`\n * 3. 逗号分隔字符串: `a, b, c` 或 `a,b,c`\n * \n * @param val - 待解析的原始值\n * @returns 归一化后的字符串数组\n */\nexport const parseArrayProp = (val: any): string[] => {\n if (Array.isArray(val)) return val;\n if (typeof val === 'string') {\n const trimmed = val.trim();\n if (!trimmed) return [];\n \n // 如果是 JSON 数组格式\n if (trimmed.startsWith('[')) {\n try {\n // 尝试解析标准 JSON\n return JSON.parse(trimmed);\n } catch (e) {\n try {\n // 尝试解析单引号 JSON (['a', 'b']) -> ([\"a\", \"b\"])\n return JSON.parse(trimmed.replace(/'/g, '\"'));\n } catch {}\n }\n }\n \n // 默认作为逗号分隔字符串处理\n return trimmed.split(/[,,]/).map(s => s.trim()).filter(Boolean);\n }\n return [];\n};\n\n/**\n * 渲染器别名生成工具\n * \n * 职责:\n * 为组件创建标准 `xcml:` 前缀的映射,并根据别名表生成冗余映射。\n * 注意:`x-` 前缀的兼容性由 Markdown 渲染引擎在运行时通过 `normalizeTagName` 自动处理。\n * \n * @param baseMap - 基础渲染器映射表 { tagName: Renderer }\n * @param aliases - 别名映射表 { tagName: [alias1, alias2] }\n * @returns 补全后的渲染器映射表\n */\nexport function createRenderersWithAliases(\n baseMap: Record<string, (node: any, key: string | number) => any>,\n aliases: Record<string, string[]> = {}\n) {\n const result: Record<string, (node: any, key: string | number) => any> = {}\n\n Object.entries(baseMap).forEach(([tagName, renderer]) => {\n // 仅注册标准 xcml: 前缀\n result[`xcml:${tagName}`] = renderer\n\n // 注册额外别名的标准前缀\n if (aliases[tagName]) {\n aliases[tagName].forEach(alias => {\n result[`xcml:${alias}`] = renderer\n })\n }\n })\n\n return result\n}\n\n/**\n * XCML 独立渲染函数\n * 职责:接收 XCML 节点数据,返回对应的 React 组件\n */\nexport const renderXCML = (node: any, key: string | number = 'xcml-node'): any => {\n if (!node || !node.type) return null;\n\n // 获取全局注册的 Schema\n const schema = XCML_SCHEMAS[node.type];\n if (!schema) return null;\n\n // 根据类型动态加载渲染器 (这里由于是 Core 层,不直接引用具体实现,而是由外部注入或通过简单的工厂映射)\n // 在当前架构中,渲染器是通过 create*Renderers 注入给 Markdown 的。\n // 但为了工作台预览,我们需要一个“全量渲染器”\n \n // 暂时通过 window 或全局变量获取已注册的渲染器\n // 在 Demo 场景下,我们可以直接在这里导入全量渲染器映射\n // 注意:生产环境应通过 Context 注入\n \n const allRenderers = (globalThis as any).__XCML_RENDERERS__ || {};\n const renderer = allRenderers[node.type];\n\n if (renderer) {\n return renderer(node, key);\n }\n\n return null;\n};\n\n/**\n * 结构化数据校验工具\n * \n * 职责:\n * 根据 Schema 定义,对 XCML 节点的 Props 和 Body 进行合规性检查。\n * 用于编辑器实时报错提示或数据入库前的安全检查。\n * \n * @param node - 待校验的 XCML 节点\n * @param schema - 该组件对应的规范定义\n * @returns 校验结果对象,包含是否合法及详细错误列表\n */\nexport function validateXCMLNode(node: any, schema: XCMLComponentSchema) {\n const errors: string[] = [];\n const props = node.props || {};\n\n // 1. 校验必填属性\n schema.props.forEach(prop => {\n if (prop.required && (props[prop.name] === undefined || props[prop.name] === null || props[prop.name] === '')) {\n errors.push(`属性 '${prop.name}' (${prop.description}) 是必填项`);\n }\n });\n\n // 2. 校验属性类型 (基础校验)\n schema.props.forEach(prop => {\n const val = props[prop.name];\n if (val !== undefined && val !== null) {\n if (prop.type === 'number' && isNaN(Number(val))) {\n errors.push(`属性 '${prop.name}' 应为数字类型`);\n }\n if (prop.type === 'boolean' && typeof val !== 'boolean') {\n // 字符串 \"true\"/\"false\" 也算通过,渲染层会处理\n if (val !== 'true' && val !== 'false') {\n errors.push(`属性 '${prop.name}' 应为布尔类型`);\n }\n }\n if (prop.type === 'enum' && prop.options && !prop.options.includes(val)) {\n errors.push(`属性 '${prop.name}' 的值 '${val}' 不在可选范围内: ${prop.options.join(', ')}`);\n }\n }\n });\n\n // 3. 校验 Body 数据 (如果定义了 body)\n if (schema.body && schema.body.length > 0) {\n const body = node.body !== undefined ? node.body : node.data;\n schema.body.forEach(dp => {\n // 如果 body 属性是必填的\n if (dp.required) {\n if (body === undefined || body === null || body === '') {\n errors.push(`标签体内容 (Body Data) 是必填项`);\n } else if (typeof body === 'object' && !Array.isArray(body)) {\n // 如果是对象,检查该属性是否在对象中\n if (body[dp.name] === undefined || body[dp.name] === null || body[dp.name] === '') {\n errors.push(`标签体内容应包含 '${dp.name}' (${dp.description}) 字段`);\n }\n }\n }\n });\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n","import { useXCMLNode } from './utils'\nimport { XCMLBaseProps } from './base'\nimport { XCMLComponentSchema } from './schema'\n\n/**\n * XCML 组件通用业务逻辑 Hook\n * \n * 职责:\n * 1. 自动调用 `useXCMLNode` 进行属性 (Props) 与数据 (Body) 的智能合并。\n * 2. 统一计算 `loading` 状态,支持多种标记方式(外部注入、节点状态、data-属性)。\n * 3. 统一提取基础样式属性,确保所有组件在不同主题下的视觉一致性。\n * \n * @param props - 组件接收到的原始属性\n * @param schema - 组件的 Schema 定义,用于指导属性合并与默认值注入\n * @returns 包含合并后的数据 `merged`、基础样式 `baseProps` 及加载状态 `isLoading`\n * \n * @example\n * ```tsx\n * const { merged, baseProps, isLoading } = useXCMLComponent(props, cardSchema);\n * ```\n */\nexport function useXCMLComponent<P extends object>(\n props: P & XCMLBaseProps,\n schema?: XCMLComponentSchema\n) {\n const { node, streamStatus: outerStreamStatus } = props\n\n // 1. 合并属性与数据\n const merged = useXCMLNode<P>(node, schema)\n\n // 2. 计算加载状态\n // 优先级:外部传入 > 节点内部状态 > data-xcml-loading 标记\n const streamStatus = node?.streamStatus || outerStreamStatus || (merged as any).streamStatus\n const isLoading = \n streamStatus === 'loading' || \n (node as any)?.body?.['data-xcml-loading'] === 'true' ||\n (node as any)?.data?.['data-xcml-loading'] === 'true' ||\n (node as any)?.props?.['data-xcml-loading'] === 'true' ||\n (merged as any)?.['data-xcml-loading'] === 'true' ||\n props.loading\n\n // 3. 提取基础样式 (用于传递给 Wrapper)\n const baseProps: XCMLBaseProps = {\n theme: merged.theme,\n variant: merged.variant,\n size: merged.size,\n className: props.className, // className 通常由外部传入,不从 node 覆盖\n style: props.style,\n loading: isLoading,\n streamStatus,\n error: props.error\n }\n\n return {\n merged,\n baseProps,\n isLoading,\n streamStatus\n }\n}\n","import React from 'react'\nimport { XMarkdown } from '@ant-design/x-markdown'\nimport { toXCMLNodeFromElement, preprocessXCML } from '../core/index'\nimport mermaid from 'mermaid'\nimport { Button, Modal, Tooltip } from 'antd'\nimport { CodeOutlined } from '@ant-design/icons'\nimport { TOCProvider, useTOCActions } from './TOCContext'\nimport { clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport interface XCMLProps {\n content?: string\n stream?: AsyncIterable<string>\n renderers?: Record<string, (node: any, key: string | number) => React.ReactNode>\n className?: string\n style?: React.CSSProperties\n openLinksInNewTab?: boolean\n dompurifyConfig?: Record<string, any>\n /**\n * 是否启用悬停查看组件源码功能\n * @default false\n */\n enableHoverSource?: boolean\n /**\n * 主题配置,用于 Mermaid 等图表\n */\n theme?: string\n}\n\n/**\n * XCML 核心渲染组件 (XCMLMarkdown)\n * \n * 职责:\n * 1. 内容预处理:利用 `preprocessXCML` 处理不规范标签,并支持通过 `data-xcml-raw` 保护原始 Markdown 内容。\n * 2. 动态组件映射:将 `x-*` 标签自动关联到 `renderers` 中定义的业务渲染器。\n * 3. 增强 Markdown 功能:集成 Mermaid 图表、自动生成目录 (TOC) 锚点、处理 DOM 嵌套合法性(如 P 标签内嵌 Div)。\n * 4. 交互体验:支持流式输出中间态显示、源码悬浮查看、链接新窗口打开等。\n * \n * @example\n * ```tsx\n * <XCMLMarkdown \n * content=\"<x-card>Hello</x-card>\" \n * renderers={{ 'x-card': CardRenderer }} \n * />\n * ```\n */\nexport function XCMLMarkdown(props: XCMLProps) {\n const {\n content,\n stream,\n renderers,\n className,\n style,\n openLinksInNewTab,\n dompurifyConfig,\n enableHoverSource = false,\n theme,\n } = props\n\n // Preprocess content to safe-guard unclosed tags and ensure code blocks are respected\n // Use deferred value to avoid blocking main thread during heavy streaming\n const deferredContent = React.useDeferredValue(content)\n\n const processedContent = React.useMemo(() => {\n const knownTags = renderers\n ? Object.keys(renderers).map((key) => {\n if (key.startsWith('xcml:')) return `x-${key.slice(5)}`\n return key\n })\n : []\n return deferredContent ? preprocessXCML(deferredContent, knownTags) : ''\n }, [deferredContent, renderers])\n\n const nodeCache = React.useMemo(() => new WeakMap<any, any>(), [])\n\n const components = React.useMemo<Record<string, React.FC<any>>>(() => {\n const map: Record<string, React.FC<any>> = {}\n\n if (renderers) {\n // 1. 先收集所有已知的 x- 标签\n const knownXTags = new Set<string>()\n\n // 动态发现所有 x- 组件渲染器\n Object.keys(renderers).forEach((key) => {\n const isXcmlPrefix = key.startsWith('xcml:')\n const isXPrefix = key.startsWith('x-')\n\n if (isXcmlPrefix || isXPrefix) {\n const tagName = isXcmlPrefix ? `x-${key.slice(5)}` : key\n knownXTags.add(tagName)\n const renderer = renderers[key]\n /**\n * 动态渲染器映射\n * 将 Markdown 中的自定义标签转换为 XCML 节点并渲染\n */\n map[tagName] = (props: any) => {\n const {\n domNode,\n className: cls,\n streamStatus,\n node: _node,\n children: _children,\n ...attrs\n } = props\n\n let node = nodeCache.get(domNode)\n if (!node) {\n // 优先从 data-xcml-raw 恢复原始 bodyText,避免被 Markdown 引擎二次解析破坏\n let bodyText = ''\n const rawData = attrs['data-xcml-raw']\n if (rawData) {\n try {\n // 对 Base64 编码的原始内容进行解码\n bodyText = decodeURIComponent(escape(atob(rawData)))\n } catch (e) {\n console.error('[XCML] Failed to decode raw body:', e)\n bodyText = collectText(domNode?.children || [])\n }\n } else {\n bodyText = collectText(domNode?.children || [])\n }\n\n const type = isXcmlPrefix ? key.slice(5) : key.slice(2)\n node = toXCMLNodeFromElement(type, attrs, bodyText)\n nodeCache.set(domNode, node)\n }\n\n // 注入流式状态\n const nodeWithStatus = { ...node }\n if (attrs['data-xcml-loading'] === 'true') {\n nodeWithStatus.streamStatus = 'loading'\n } else {\n nodeWithStatus.streamStatus = streamStatus\n }\n\n const rendered = renderer(nodeWithStatus, attrs.key ?? tagName)\n return (\n <ComponentWrapper\n tag={tagName}\n node={nodeWithStatus}\n className={cls}\n enableHoverSource={enableHoverSource}\n >\n {rendered}\n </ComponentWrapper>\n )\n }\n }\n })\n\n }\n\n /**\n * Mermaid 代码块拦截器\n */\n map['pre'] = (props: any) => {\n const { domNode, streamStatus, node, ...rest } = props\n const code = (domNode?.children || []).find((c: any) => c?.name === 'code')\n const cls = [code?.attribs?.class, code?.attribs?.classname, code?.attribs?.className]\n .filter(Boolean)\n .join(' ')\n const isMermaid = /language-mermaid/.test(cls)\n\n if (isMermaid) {\n const content = collectText(code?.children || [])\n // Use hash of content as ID to prevent re-rendering during streaming if content is stable\n // Simple hash function for string\n const hash = content.split('').reduce((a, b) => {\n a = (a << 5) - a + b.charCodeAt(0)\n return a & a\n }, 0)\n const id = `m-${Math.abs(hash)}`\n\n return <MermaidBlock id={id} code={content} theme={theme} key={props.key} />\n }\n\n return React.createElement('pre', rest, props.children)\n }\n // Fix DOM nesting validation warning: <p> cannot contain <div>\n // If a paragraph contains our block components (which render div), render as div instead of p\n map['p'] = (props: any) => {\n const { domNode, node, children, streamStatus, ...rest } = props\n\n // Check if children contain block elements to avoid <p><div> nesting\n // Support both html-react-parser (domNode) and react-markdown (node)\n const hasBlockChildren =\n domNode?.children?.some((child: any) => {\n return (\n child.type === 'tag' &&\n ([\n 'div',\n 'p',\n 'pre',\n 'blockquote',\n 'table',\n 'ul',\n 'ol',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'form',\n 'fieldset',\n 'address',\n ].includes(child.name) ||\n (child.name && child.name.startsWith('x-')))\n )\n }) ||\n node?.children?.some((child: any) => {\n return child.tagName === 'div' || (child.tagName && child.tagName.startsWith('x-'))\n })\n\n if (hasBlockChildren) {\n return (\n <div {...rest} className={twMerge('mb-4 w-full', rest.className)}>\n {children}\n </div>\n )\n }\n return <p {...rest}>{children}</p>\n }\n\n /**\n * 标题包装器 (HeadingWrapper)\n * \n * 职责:\n * 1. TOC 注册:自动将标题(h1-h6)注册到目录上下文(TOCContext)。\n * 2. 锚点生成:根据文本内容自动生成唯一的 slug ID。\n * 3. 样式增强:支持悬浮显示锚点链接,方便快速定位。\n * 4. 性能优化:通过 React.memo 和 ref 比较,避免频繁的 TOC 注册/注销操作。\n */\n const HeadingWrapper: React.FC<any> = React.memo(\n ({ level, children, domNode, streamStatus, node, ...rest }) => {\n const { register, unregister } = useTOCActions()\n // Collect text content recursively for ID generation\n const getText = React.useCallback((node: React.ReactNode): string => {\n if (typeof node === 'string') return node\n if (Array.isArray(node)) return node.map(getText).join('')\n if (React.isValidElement(node)) return getText(node.props.children)\n return ''\n }, [])\n\n const text = getText(children)\n const slug = React.useMemo(() => text.trim().toLowerCase().replace(/\\s+/g, '-'), [text])\n const finalId = rest.id || slug || `h${level}-${Math.random().toString(36).slice(2, 9)}`\n\n // Use a ref to store the last registered info to avoid redundant calls\n const lastInfoRef = React.useRef<{ id: string; title: string; level: number } | null>(null)\n\n // Register to TOC Context\n React.useEffect(() => {\n if (!register) return\n\n const currentInfo = { id: finalId, title: text, level }\n\n // Only register if info changed\n if (\n !lastInfoRef.current ||\n lastInfoRef.current.id !== currentInfo.id ||\n lastInfoRef.current.title !== currentInfo.title ||\n lastInfoRef.current.level !== currentInfo.level\n ) {\n // Unregister old one if exists\n if (lastInfoRef.current) {\n unregister?.(lastInfoRef.current.id)\n }\n\n register(currentInfo)\n lastInfoRef.current = currentInfo\n }\n\n return () => {\n if (lastInfoRef.current) {\n unregister?.(lastInfoRef.current.id)\n lastInfoRef.current = null\n }\n }\n }, [finalId, text, level, register, unregister])\n\n const Tag = `h${level}` as keyof JSX.IntrinsicElements\n return (\n <Tag id={finalId} className=\"scroll-mt-20 group relative\" {...rest}>\n {children}\n {enableHoverSource && (\n <a\n href={`#${finalId}`}\n className=\"ml-2 opacity-0 group-hover:opacity-100 text-muted-foreground transition-opacity no-underline\"\n >\n #\n </a>\n )}\n </Tag>\n )\n },\n )\n\n map['h1'] = (props: any) => <HeadingWrapper level={1} {...props} />\n map['h2'] = (props: any) => <HeadingWrapper level={2} {...props} />\n map['h3'] = (props: any) => <HeadingWrapper level={3} {...props} />\n map['h4'] = (props: any) => <HeadingWrapper level={4} {...props} />\n map['h5'] = (props: any) => <HeadingWrapper level={5} {...props} />\n map['h6'] = (props: any) => <HeadingWrapper level={6} {...props} />\n\n return map\n }, [renderers, enableHoverSource, theme])\n\n const defaultProseClasses =\n 'prose w-full max-w-none prose-headings:text-foreground prose-p:text-foreground prose-li:text-foreground prose-strong:text-foreground prose-code:text-foreground prose-th:text-foreground prose-td:text-foreground prose-a:text-primary prose-code:bg-muted/50 prose-code:rounded prose-code:px-1 prose-code:py-0.5 prose-pre:bg-muted/50 prose-pre:text-foreground'\n\n return (\n <TOCProvider>\n <XMarkdown\n content={processedContent}\n streaming={stream ? { hasNextChunk: true } : undefined}\n components={components}\n className={twMerge(clsx(defaultProseClasses, className))}\n style={style}\n openLinksInNewTab={openLinksInNewTab}\n dompurifyConfig={dompurifyConfig}\n />\n </TOCProvider>\n )\n}\n\n/**\n * 组件包装容器\n * \n * 职责:\n * 1. 布局隔离:通过 `not-prose` 退出 Tailwind Typography 的默认样式干扰。\n * 2. 交互增强:提供悬浮查看组件源码的功能(Modal 弹出)。\n * 3. 样式统一:处理宽度、滚动条及相对定位。\n */\nfunction ComponentWrapper({\n children,\n tag,\n node,\n className,\n enableHoverSource,\n}: {\n children: React.ReactNode\n tag: string\n node: any\n className?: string\n enableHoverSource?: boolean\n}) {\n const [hover, setHover] = React.useState(false)\n const [modalOpen, setModalOpen] = React.useState(false)\n\n const handleMaximize = (e: React.MouseEvent) => {\n e.stopPropagation()\n setModalOpen(true)\n }\n\n // Reconstruct simple source for display\n const source = React.useMemo(() => {\n const attrs = Object.entries(node.attributes || {})\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ')\n return `<${tag}${attrs ? ' ' + attrs : ''}>${node.children ? '\\n ' + node.children + '\\n' : ''}</${tag}>`\n }, [tag, node])\n\n return (\n <div\n className={twMerge(\n 'not-prose w-full max-w-full overflow-x-hidden overflow-y-visible custom-scrollbar flex flex-col relative',\n className,\n )}\n onMouseEnter={() => enableHoverSource && setHover(true)}\n onMouseLeave={() => enableHoverSource && setHover(false)}\n >\n {children}\n {hover && enableHoverSource && (\n <Tooltip title=\"查看源码\">\n <Button\n icon={<CodeOutlined />}\n size=\"small\"\n className=\"absolute top-1 right-1 z-10 opacity-80\"\n onClick={handleMaximize}\n />\n </Tooltip>\n )}\n <Modal\n open={modalOpen}\n onCancel={() => setModalOpen(false)}\n footer={null}\n width={800}\n centered\n title={`${tag} 源码`}\n destroyOnHidden={true}\n >\n <pre className=\"bg-muted p-4 rounded-lg overflow-auto max-h-[500px] text-sm text-foreground\">\n {source}\n </pre>\n </Modal>\n </div>\n )\n}\n\nexport default XCMLMarkdown\n\nconst textCache = new WeakMap<any, string>()\n\n/**\n * 文本递归采集工具\n * \n * 职责:\n * 1. 深度遍历:从 AST 节点的 children 数组中提取所有纯文本内容。\n * 2. 性能优化:利用 WeakMap 缓存已处理的节点数组,避免在流式渲染中重复计算。\n * \n * @param children - AST 节点子元素数组\n * @returns 拼接后的纯文本字符串\n */\nfunction collectText(children: any[]): string {\n if (!children) return ''\n if (textCache.has(children)) return textCache.get(children)!\n\n const buf: string[] = []\n const walk = (nodes: any[]) => {\n nodes?.forEach((n) => {\n if (!n) return\n if (n.type === 'text' && typeof n.data === 'string') buf.push(n.data)\n if (Array.isArray(n.children)) walk(n.children)\n })\n }\n walk(children)\n const result = buf.join('')\n textCache.set(children, result)\n return result\n}\n\ninterface MermaidProps {\n code: string\n theme?: string\n id?: string\n}\n\n/**\n * Mermaid 渲染块\n * \n * 职责:\n * 1. 异步加载:仅在有图表需求时加载 mermaid.js 库。\n * 2. 渲染管理:根据主题(Dark/Light)初始化并渲染 SVG 图形。\n * 3. 性能优化:通过 React.memo 避免在流式更新过程中对已稳定的图表进行重复渲染。\n */\nconst MermaidBlock = React.memo(({ code, theme, id }: MermaidProps) => {\n const ref = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n if (!ref.current || !code) return\n\n // Simple rendering logic\n import('mermaid').then((m) => {\n m.default.initialize({\n startOnLoad: true,\n theme: theme === 'dark' ? 'dark' : 'default',\n securityLevel: 'loose',\n })\n\n const elementId = id || `mermaid-${Math.random().toString(36).slice(2)}`\n m.default.render(elementId, code).then(({ svg }) => {\n if (ref.current) ref.current.innerHTML = svg\n })\n })\n }, [code, theme, id])\n\n return <div ref={ref} className=\"mermaid w-full flex justify-center my-4\" />\n})\n","import React, { createContext, useContext, useState, useCallback, useEffect } from 'react'\n\nexport interface TOCItem {\n id: string\n level: number\n title: string\n index: number // 用于排序\n}\n\nconst TOCItemsContext = createContext<TOCItem[]>([])\nconst TOCActionsContext = createContext<{\n register: (item: Omit<TOCItem, 'index'>) => void\n unregister: (id: string) => void\n}>({\n register: () => {},\n unregister: () => {}\n})\n\nexport const useTOCItems = () => useContext(TOCItemsContext)\nexport const useTOCActions = () => useContext(TOCActionsContext)\nexport const useTOC = () => {\n const items = useTOCItems()\n const { register, unregister } = useTOCActions()\n return { items, register, unregister }\n}\n\nexport const TOCProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n // 使用 Map 存储,key 为 id\n const [registry, setRegistry] = useState<Map<string, TOCItem>>(new Map())\n const counter = React.useRef(0)\n\n const register = useCallback((item: Omit<TOCItem, 'index'>) => {\n setRegistry(prev => {\n const next = new Map(prev)\n // 如果已存在且内容相同,则不更新,避免死循环\n const existing = next.get(item.id)\n if (existing && existing.title === item.title && existing.level === item.level) {\n return prev\n }\n \n // 使用自增计数器作为索引,确保注册顺序\n next.set(item.id, { ...item, index: existing ? existing.index : counter.current++ })\n return next\n })\n }, [])\n\n const unregister = useCallback((id: string) => {\n setRegistry(prev => {\n const next = new Map(prev)\n if (next.delete(id)) {\n return next\n }\n return prev\n })\n }, [])\n\n // 转换为数组并排序\n const items = React.useMemo(() => {\n return Array.from(registry.values()).sort((a, b) => a.index - b.index)\n }, [registry])\n\n const actions = React.useMemo(() => ({ register, unregister }), [register, unregister])\n\n return (\n <TOCActionsContext.Provider value={actions}>\n <TOCItemsContext.Provider value={items}>\n {children}\n </TOCItemsContext.Provider>\n </TOCActionsContext.Provider>\n )\n}\n","import React, { useMemo, Suspense, forwardRef } from 'react'\nimport * as Plots from '@ant-design/plots'\nimport { Skeleton } from 'antd'\nimport { useTheme } from '../../../theme/theme-provider'\nimport { getTheme } from '../themes'\nimport { getChartStrategy } from './strategies'\nimport { chartSchema } from './schema'\nimport { buildConfig, cleanPropsBySchema, DefaultEmptyPlaceholder, DefaultErrorPlaceholder } from './utils'\nimport { withXCMLCard } from '../../basic/withXCMLCard'\nimport { BaseChartProps } from './strategies/base'\n\n/**\n * 将 kebab-case, snake_case 或 space separated 转换为 PascalCase\n */\nconst toPascalCase = (str: string) => {\n if (typeof str !== 'string' || !str) return ''\n return str\n .split(/[-_ ]/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('')\n}\n\nconst COMPONENT_MAP: Record<string, string> = {\n 'dual-axes': 'DualAxes',\n 'column': 'Column',\n 'line': 'Line',\n 'pie': 'Pie',\n 'funnel': 'Funnel'\n}\n\nconst lookupComponent = (type: string) => {\n if (!type) return null\n const mappedName = COMPONENT_MAP[type.toLowerCase()] || COMPONENT_MAP[type]\n const PlotsMap = Plots as unknown as Record<string, React.ComponentType<any>>\n \n // 使用 in 操作符检查属性是否存在,避免访问不存在的导出导致测试报错\n if (mappedName && mappedName in PlotsMap) return PlotsMap[mappedName]\n \n const pascalName = toPascalCase(type)\n if (pascalName && pascalName in PlotsMap) return PlotsMap[pascalName]\n \n if (type in PlotsMap) return PlotsMap[type]\n \n return null\n}\n\ninterface ChartErrorBoundaryProps {\n children: React.ReactNode\n type: string\n errorPlaceholder?: (err: Error, reset: () => void) => React.ReactNode\n}\n\ninterface ChartErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\nclass ChartErrorBoundary extends React.Component<ChartErrorBoundaryProps, ChartErrorBoundaryState> {\n constructor(props: ChartErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n static getDerivedStateFromError(error: Error) {\n return { hasError: true, error };\n }\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error(`AntV Chart Error (${this.props.type}):`, error, errorInfo);\n }\n reset = () => {\n this.setState({ hasError: false, error: null });\n }\n render() {\n if (this.state.hasError && this.state.error) {\n if (this.props.errorPlaceholder) {\n return this.props.errorPlaceholder(this.state.error, this.reset);\n }\n return <DefaultErrorPlaceholder error={this.state.error} reset={this.reset} />;\n }\n return this.props.children;\n }\n}\n\n/**\n * AntV 图表内部渲染逻辑\n */\nconst ChartInner = forwardRef<any, any>((merged, ref) => {\n // 注意:merged 已经由 withXCMLCard -> useXCMLComponent 处理过,无需再次从 node 提取\n const { type = 'line', node, theme: outerTheme, ...rest } = merged;\n const { theme: globalTheme } = useTheme();\n\n // 1. 获取策略\n const strategy = useMemo(() => getChartStrategy(type), [type]);\n\n // 2. 获取组件\n const ChartComponent = useMemo(() => {\n const comp = strategy?.getComponent() || lookupComponent(type);\n return comp;\n }, [strategy, type]);\n\n // 3. 构造最终配置对象\n const finalProps = useMemo(() => {\n // 如果没有找到对应的图表组件,直接返回 null,避免后续计算\n // if (!ChartComponent) return null; // 暂时保留计算逻辑,方便调试 \"未找到图表类型\" 的场景\n\n const finalTheme = merged.theme || outerTheme || globalTheme || 'light';\n const isDark = ['dark', 'black', 'midnight', 'slate', 'crimson'].includes(finalTheme);\n const antvThemeName = isDark ? 'dark' : 'light';\n const antvTheme = getTheme(antvThemeName);\n\n // data 已经在 merged 中被正确合并了,直接使用\n const chartData = merged.data;\n\n const rawConfig = { \n ...merged, \n theme: antvTheme,\n data: chartData\n };\n\n // 第一步:基于 Schema 清洗属性,只保留 Schema 中定义的合法属性 (解决属性污染)\n const cleaned = cleanPropsBySchema(rawConfig, strategy?.schema || chartSchema);\n \n // 第二步:执行策略特定的属性转换\n const transformed = strategy?.transformProps ? strategy.transformProps(cleaned) : cleaned;\n \n return buildConfig(transformed as BaseChartProps);\n }, [merged, outerTheme, globalTheme, strategy]);\n\n if (!ChartComponent) {\n return (\n <div className=\"w-full p-4 border border-dashed border-amber-200 text-amber-600 rounded bg-amber-50/50 text-xs\">\n 未找到图表类型: {type}\n </div>\n );\n }\n\n // 检查数据是否有效,避免 @ant-design/plots 内部 crash\n // 对于 dual-axes,数据可能存在于 top-level data 或 children data 中\n const hasTopLevelData = finalProps.data && Array.isArray(finalProps.data) && finalProps.data.length > 0;\n const hasChildrenData = Array.isArray(finalProps.children) && \n finalProps.children.some((child: any) => child.data && Array.isArray(child.data) && child.data.length > 0);\n \n const hasData = hasTopLevelData || hasChildrenData;\n \n if (!hasData) {\n return <DefaultEmptyPlaceholder />;\n }\n\n // console.log(`finalProps-${type}`, JSON.stringify(finalProps, null, 2))\n\n return (\n <ChartErrorBoundary type={type} errorPlaceholder={finalProps.errorPlaceholder}>\n <Suspense fallback={<Skeleton active />}>\n <div className=\"\">\n <ChartComponent {...finalProps} ref={ref} key={type} />\n </div>\n </Suspense>\n </ChartErrorBoundary>\n );\n});\n\n/**\n * AntV 图表加载器 (基于 withXCMLCard 重构)\n */\nexport const AntVChartLoader = withXCMLCard(ChartInner, {\n schema: chartSchema,\n renderLoading: (merged) => (\n <div\n className=\"w-full flex justify-center items-center bg-black/5 rounded-lg animate-pulse\"\n style={{ height: merged.height || 300 }}\n >\n <Skeleton.Image active />\n </div>\n )\n});\n\nexport * from './strategies'\nexport * from './schema'\nexport * from './utils'\n\n/**\n * XCML 图表组件 (对外导出,供编排使用)\n */\nexport const XCMLChart: React.FC<BaseChartProps & { node?: any }> = (props) => {\n const { node, ...rest } = props;\n \n if (node) {\n return <AntVChartLoader node={node} />;\n }\n\n const virtualNode = {\n props: {},\n body: {\n ...rest,\n data: props.data\n }\n };\n \n return <AntVChartLoader node={virtualNode} />;\n}\n","import { createContext, useContext, useEffect, useState, useMemo, useRef } from \"react\"\nimport { XProvider } from '@ant-design/x'\nimport { theme as antdTheme } from 'antd'\n\nexport type Theme = \n | \"dark\" \n | \"light\" \n | \"system\"\n | \"ocean\"\n | \"sunset\"\n | \"lavender\"\n | \"rose\"\n | \"amber\"\n | \"midnight\"\n | \"forest\"\n | \"slate\"\n | \"crimson\"\n | \"cyan\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n /**\n * Explicitly set the theme (Controlled mode).\n */\n theme?: Theme\n /**\n * Primary color for the theme (e.g., #6366f1)\n */\n primaryColor?: string\n storageKey?: string\n /**\n * Whether to apply the theme only to the container instead of the document root\n * @default true\n */\n scoped?: boolean\n className?: string\n style?: React.CSSProperties\n}\n\ntype ThemeProviderState = {\n theme: Theme\n setTheme: (theme: Theme) => void\n}\n\nconst initialState: ThemeProviderState = {\n theme: \"light\",\n setTheme: () => null,\n}\n\nconst ThemeProviderContext = createContext<ThemeProviderState>(initialState)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\",\n theme: controlledTheme,\n primaryColor = '#6366f1', // Indigo 500 default\n storageKey = \"xcml-ui-theme\",\n scoped = true,\n className,\n style,\n ...props\n}: ThemeProviderProps) {\n const [internalTheme, setInternalTheme] = useState<Theme>(\n () => (localStorage.getItem(storageKey) as Theme) || defaultTheme\n )\n\n const theme = controlledTheme ?? internalTheme\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const root = scoped ? containerRef.current : window.document.documentElement\n\n if (!root) return\n\n // Inject CSS variables for primary color and theme-specific colors\n root.style.setProperty('--primary', primaryColor)\n // Convert hex to rgb for opacity utilities if needed\n if (primaryColor.startsWith('#')) {\n const r = parseInt(primaryColor.slice(1, 3), 16)\n const g = parseInt(primaryColor.slice(3, 5), 16)\n const b = parseInt(primaryColor.slice(5, 7), 16)\n root.style.setProperty('--primary-rgb', `${r}, ${g}, ${b}`)\n }\n\n // Remove all possible theme classes/attributes first\n root.classList.remove(\"light\", \"dark\")\n root.removeAttribute(\"data-theme\")\n\n const presetThemes = [\"ocean\", \"sunset\", \"lavender\", \"rose\", \"amber\", \"midnight\", \"forest\", \"slate\", \"crimson\", \"cyan\"]\n\n if (theme === \"system\") {\n const systemTheme = window.matchMedia(\"(prefers-color-scheme: dark)\")\n .matches\n ? \"dark\"\n : \"light\"\n\n root.classList.add(systemTheme)\n return\n }\n\n if (theme === \"dark\") {\n root.classList.add(\"dark\")\n return\n }\n\n if (theme === \"light\") {\n root.classList.add(\"light\")\n return\n }\n\n if (presetThemes.includes(theme)) {\n root.setAttribute(\"data-theme\", theme)\n return\n }\n }, [theme, scoped])\n\n const value = {\n theme,\n setTheme: (newTheme: Theme) => {\n localStorage.setItem(storageKey, newTheme)\n setInternalTheme(newTheme)\n },\n }\n\n // Calculate Ant Design theme configuration\n const antDesignTheme = useMemo(() => {\n const isDark = theme === 'dark' || (theme === 'system' && typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches)\n \n return {\n algorithm: isDark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,\n token: {\n colorPrimary: primaryColor,\n colorSuccess: '#10b981', // Emerald 500\n colorWarning: '#f59e0b', // Amber 500\n colorError: '#e11d48', // Rose 600\n colorInfo: '#0ea5e9', // Sky 500\n borderRadius: 8,\n fontFamily: '\"Inter Variable\", \"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n }\n }\n }, [theme, primaryColor])\n\n return (\n <ThemeProviderContext.Provider value={value} {...props}>\n <XProvider theme={antDesignTheme}>\n <div \n ref={containerRef} \n className={`xcml-scope ${className || ''}`}\n style={{ \n color: 'inherit',\n background: 'inherit', \n ...style \n }}\n >\n {children}\n </div>\n </XProvider>\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useTheme must be used within a ThemeProvider\")\n\n return context\n}\n","// 注册自定义主题\n// 文档: https://g2.antv.antgroup.com/manual/extra-topics/theme\n\nconst COMMON_AXIS_STYLE = {\n label: {\n style: {\n fillOpacity: 0.65,\n fontSize: 12,\n },\n },\n title: {\n style: {\n fontSize: 12,\n fillOpacity: 0.85,\n },\n },\n grid: {\n line: {\n style: {\n stroke: '#d0d0d0',\n lineWidth: 1,\n lineDash: [4, 4],\n strokeOpacity: 0.7,\n },\n },\n },\n}\n\nconst DARK_AXIS_STYLE = {\n label: {\n style: {\n fill: 'rgba(255, 255, 255, 0.65)',\n fontSize: 12,\n },\n },\n title: {\n style: {\n fill: 'rgba(255, 255, 255, 0.85)',\n fontSize: 12,\n },\n },\n grid: {\n line: {\n style: {\n stroke: 'rgba(255, 255, 255, 0.15)',\n lineWidth: 1,\n lineDash: [4, 4],\n },\n },\n },\n}\n\n// 默认主题 (Light) - 欢乐主题配置\nexport const themeLight = {\n defaultColor: '#8b5cf6', // Violet-500 (Primary)\n colors10: [\n '#8b5cf6', // Violet\n '#f472b6', // Pink\n '#0ea5e9', // Sky\n '#fbbf24', // Amber\n '#34d399', // Emerald\n '#f87171', // Red\n '#60a5fa', // Blue\n '#a78bfa', // Light Violet\n '#2dd4bf', // Teal\n '#fb923c', // Orange\n ],\n styleSheet: {\n backgroundColor: 'transparent',\n },\n components: {\n axis: {\n common: COMMON_AXIS_STYLE,\n },\n tooltip: {\n style: {\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n boxShadow: '0 8px 24px -6px rgba(0, 0, 0, 0.12)',\n color: '#1e293b',\n borderRadius: '16px', // 更大的圆角\n padding: '12px 16px',\n border: '1px solid rgba(226, 232, 240, 0.8)',\n backdropFilter: 'blur(4px)',\n },\n },\n legend: {\n common: {\n itemStates: {\n active: {\n labelStyle: {\n fontWeight: 600,\n fill: '#8b5cf6',\n }\n }\n }\n }\n }\n },\n}\n\n// 暗色主题 (Dark)\nexport const themeDark = {\n defaultColor: '#a78bfa', // Violet-400\n colors10: [\n '#a78bfa', // Violet\n '#f472b6', // Pink\n '#38bdf8', // Sky\n '#fbbf24', // Amber\n '#34d399', // Emerald\n '#f87171', // Red\n '#60a5fa', // Blue\n '#c4b5fd', // Light Violet\n '#2dd4bf', // Teal\n '#fb923c', // Orange\n ],\n styleSheet: {\n backgroundColor: 'transparent',\n },\n components: {\n axis: {\n common: DARK_AXIS_STYLE,\n },\n tooltip: {\n style: {\n backgroundColor: 'rgba(30, 41, 59, 0.95)',\n boxShadow: '0 8px 24px -6px rgba(0, 0, 0, 0.3)',\n color: '#f1f5f9',\n borderRadius: '16px',\n padding: '12px 16px',\n border: '1px solid rgba(51, 65, 85, 0.8)',\n backdropFilter: 'blur(4px)',\n },\n },\n legend: {\n common: {\n labelStyle: {\n fill: 'rgba(255, 255, 255, 0.65)',\n },\n },\n },\n },\n}\n\nexport const themeMap: Record<string, any> = {\n 'light': themeLight,\n 'dark': themeDark,\n 'default': themeLight,\n}\n\nexport function getTheme(themeName?: string) {\n return themeMap[themeName || 'default'] || themeLight\n}\n","import React from 'react'\nimport { ChartStrategy, BaseChartProps } from '../base'\nimport { lineChartSchema } from './schema'\n\n/**\n * 折线图属性定义\n */\nexport interface LineChartProps extends BaseChartProps {\n type: 'line'\n xField: string\n yField: string\n colorField?: string\n seriesField?: string // 兼容旧版\n}\n\n// 动态导入组件\nconst LineComponent = React.lazy(() => \n import('@ant-design/plots').then(module => ({ default: module.Line }))\n)\n\n/**\n * 折线图策略实现\n */\nexport const lineStrategy: ChartStrategy = {\n type: 'line',\n schema: lineChartSchema,\n getComponent: () => LineComponent,\n transformProps: (props: Record<string, any>) => {\n const newProps = { ...props }\n // 兼容处理:将 seriesField 映射为 colorField (如果 colorField 未定义)\n if (newProps.seriesField && !newProps.colorField) {\n newProps.colorField = newProps.seriesField\n }\n return newProps\n }\n}\n\nexport * from './schema'\n","import React from 'react'\nimport { ChartStrategy, BaseChartProps } from '../base'\nimport { columnChartSchema } from './schema'\n\n/**\n * 柱状图属性定义\n */\nexport interface ColumnChartProps extends BaseChartProps {\n type: 'column'\n xField: string\n yField: string\n colorField?: string\n seriesField?: string // 兼容旧版\n group?: boolean | Record<string, string | number | boolean>\n isRange?: boolean\n}\n\n// 动态导入组件\nconst ColumnComponent = React.lazy(() => \n import('@ant-design/plots').then(module => ({ default: module.Column }))\n)\n\n/**\n * 柱状图策略实现\n */\nexport const columnStrategy: ChartStrategy = {\n type: 'column',\n schema: columnChartSchema,\n getComponent: () => ColumnComponent,\n transformProps: (props: Record<string, any>) => {\n const newProps = { ...props }\n // 兼容 seriesField\n if (newProps.seriesField && !newProps.colorField) {\n newProps.colorField = newProps.seriesField\n }\n\n // 强制 X 轴为 band 缩放,避免 getBandWidth 错误\n if (!newProps.scale) {\n newProps.scale = {\n x: { type: 'band' }\n }\n } else if (typeof newProps.scale === 'object' && !newProps.scale.x) {\n newProps.scale.x = { type: 'band' }\n }\n\n return newProps\n }\n}\n\nexport * from './schema'\n","import React from 'react'\nimport { ChartStrategy, BaseChartProps } from '../base'\nimport { pieChartSchema } from './schema'\n\n/**\n * 饼图属性定义\n */\nexport interface PieChartProps extends BaseChartProps {\n type: 'pie'\n angleField: string\n colorField: string\n}\n\n// 动态导入组件\nconst PieComponent = React.lazy(() => \n import('@ant-design/plots').then(module => ({ default: module.Pie }))\n)\n\n/**\n * 饼图策略实现\n */\nexport const pieStrategy: ChartStrategy = {\n type: 'pie',\n schema: pieChartSchema,\n getComponent: () => PieComponent,\n transformProps: (props: Record<string, any>) => {\n const newProps = { ...props }\n \n // 清理无关的坐标轴字段,避免干扰 Polar 坐标系渲染\n // 在 Polar 坐标系中,xField/yField 可能会被错误地解释为 Cartesian 映射\n delete newProps.xField\n delete newProps.yField\n delete newProps.seriesField\n\n // 智能映射 angleField (数值)\n if (!newProps.angleField) {\n // 尝试查找第一个数值类型的字段\n const firstData = (newProps.data || [])[0] || {}\n const numberKey = Object.keys(firstData).find(k => typeof firstData[k] === 'number')\n if (numberKey) {\n newProps.angleField = numberKey\n }\n }\n\n // 智能映射 colorField (分类)\n if (!newProps.colorField) {\n // 尝试查找第一个字符串类型的字段\n const firstData = (newProps.data || [])[0] || {}\n const stringKey = Object.keys(firstData).find(k => typeof firstData[k] === 'string')\n if (stringKey) {\n newProps.colorField = stringKey\n }\n }\n\n return newProps\n }\n}\n\nexport * from './schema'\n","import React from 'react'\nimport { ChartStrategy, BaseChartProps, ChartLabelConfig } from '../base'\nimport { dualAxesChartSchema } from './schema'\n\n/**\n * 双轴图子图层配置\n */\nexport interface DualAxesChildConfig {\n type: 'interval' | 'line' | 'area' | 'point'\n yField: string\n colorField?: string\n seriesField?: string\n shapeField?: string\n group?: boolean\n style?: Record<string, any>\n interaction?: Record<string, any>\n data?: Record<string, any>[]\n axis?: Record<string, any>\n label?: boolean | ChartLabelConfig\n [key: string]: string | number | boolean | undefined | Record<string, any> | string[] | number[] | Record<string, any>[] | ((...args: unknown[]) => unknown)\n}\n\n/**\n * 双轴图属性定义\n */\nexport interface DualAxesChartProps extends BaseChartProps {\n type: 'dual-axes'\n xField: string\n children: DualAxesChildConfig[] // 子图层配置\n}\n\n// 动态导入 DualAxes 组件以实现代码分割\nconst DualAxesComponent = React.lazy(() => \n import('@ant-design/plots').then(module => ({ default: module.DualAxes }))\n)\n\n/**\n * 双轴图策略实现\n */\nexport const dualAxesStrategy: ChartStrategy = {\n type: 'dual-axes',\n schema: dualAxesChartSchema,\n getComponent: () => DualAxesComponent,\n transformProps: (props) => {\n const newProps = { ...props };\n\n // 0. 自动修正极小宽度 (防止布局崩坏,通常是 LLM 幻觉生成了极小值)\n if (typeof newProps.width === 'number' && newProps.width < 50) {\n delete newProps.width;\n }\n\n // 1. 数据校验准备\n const data = newProps.data || [];\n const dataFields = data.length > 0 ? Object.keys(data[0]) : [];\n \n // 2. 检查 children 是否有效\n // 如果定义了 children,检查其 yField 是否在数据中真实存在\n let childrenValid = false;\n if (newProps.children && newProps.children.length > 0) {\n childrenValid = newProps.children.every((child: any) => {\n // 如果子图层有独立数据,跳过检查\n if (child.data && child.data.length > 0) return true;\n // 检查 yField 是否在主数据字段中\n // 如果主数据为空,无法校验,暂时认为有效\n if (dataFields.length === 0) return true;\n return child.yField && dataFields.includes(child.yField);\n });\n \n // 如果无效,清空 children 以触发重新推断\n if (!childrenValid && dataFields.length > 0) {\n newProps.children = [];\n }\n }\n\n // 3. 智能推断 children (如果未定义或已清空)\n if (!newProps.children || newProps.children.length === 0) {\n // 尝试兼容 yField 为数组的情况 (Legacy G2Plot 风格)\n if (Array.isArray(newProps.yField) && newProps.yField.length >= 2) {\n // 同样需要校验字段是否存在\n const validYFields = dataFields.length === 0 || newProps.yField.every((f: string) => dataFields.includes(f));\n \n if (validYFields) {\n newProps.children = [\n { type: 'interval', yField: newProps.yField[0] },\n { type: 'line', yField: newProps.yField[1], style: { lineWidth: 2 } }\n ];\n }\n } \n \n // 如果仍未生成 children,尝试从数据中推断\n if ((!newProps.children || newProps.children.length === 0) && data.length > 0) {\n const xField = newProps.xField;\n \n // 查找所有数值字段,且不是 xField\n const numberFields = dataFields.filter(key => \n key !== xField && typeof data[0][key] === 'number'\n );\n\n if (numberFields.length >= 2) {\n // 默认策略:第一个做柱状图 (左轴),第二个做折线图 (右轴)\n newProps.children = [\n { type: 'interval', yField: numberFields[0] },\n { type: 'line', yField: numberFields[1], style: { lineWidth: 2 } }\n ];\n } else if (numberFields.length === 1) {\n // 只有一个数值字段,展示为柱状图\n newProps.children = [\n { type: 'interval', yField: numberFields[0] }\n ];\n }\n }\n }\n\n // 4. 数据兼容处理:如果顶层 data 为空数组,但 children 中定义了数据,则移除顶层 data\n // 这样 AntV Plots 5.0 (G2) 会优先使用子图层的数据,避免空数据冲突\n const hasTopLevelData = Array.isArray(newProps.data) && newProps.data.length > 0;\n const hasChildrenData = Array.isArray(newProps.children) && \n newProps.children.some((child: any) => child.data && Array.isArray(child.data) && child.data.length > 0);\n\n if (!hasTopLevelData && hasChildrenData) {\n const { data, ...rest } = newProps;\n return rest;\n }\n\n return newProps;\n }\n}\n\nexport * from './schema'\n","import React from 'react'\nimport { ChartStrategy, BaseChartProps } from '../base'\nimport { funnelChartSchema } from './schema'\n\n/**\n * 漏斗图属性定义\n */\nexport interface FunnelChartProps extends BaseChartProps {\n type: 'funnel'\n xField: string // 对应 category\n yField: string // 对应 value\n}\n\n// 动态导入组件\nconst FunnelComponent = React.lazy(() => \n import('@ant-design/plots').then(module => ({ default: module.Funnel }))\n)\n\n/**\n * 漏斗图策略实现\n */\nexport const funnelStrategy: ChartStrategy = {\n type: 'funnel',\n schema: funnelChartSchema,\n getComponent: () => FunnelComponent,\n transformProps: (props: Record<string, any>) => {\n const newProps = { ...props }\n\n // 1. 字段别名兼容\n if (!newProps.xField && newProps.categoryField) newProps.xField = newProps.categoryField\n if (!newProps.yField && newProps.valueField) newProps.yField = newProps.valueField\n\n // 2. 智能字段推断\n const data = newProps.data || []\n if (data.length > 0) {\n const firstItem = data[0]\n const keys = Object.keys(firstItem)\n\n // 如果缺 xField (Category),找第一个字符串字段\n if (!newProps.xField) {\n newProps.xField = keys.find(k => typeof firstItem[k] === 'string') || 'type'\n }\n\n // 如果缺 yField (Value),找第一个数值字段\n if (!newProps.yField) {\n newProps.yField = keys.find(k => typeof firstItem[k] === 'number') || 'value'\n }\n\n // 3. 校验 colorField / seriesField 是否真实存在\n // 如果配置了不存在的字段,会导致 G2 内部 extractColumns 报错 (Cannot read properties of null)\n if (newProps.colorField && !(newProps.colorField in firstItem)) {\n // 如果 colorField 不存在,尝试降级使用 xField (通常漏斗图按分类着色)\n if (newProps.xField && newProps.xField in firstItem) {\n newProps.colorField = newProps.xField\n } else {\n delete newProps.colorField\n }\n }\n \n if (newProps.seriesField && !(newProps.seriesField in firstItem)) {\n delete newProps.seriesField\n }\n }\n\n // 4. 强制移除 axis 配置\n // 漏斗图不需要坐标轴,传入 axis 会导致 G2 底层尝试渲染坐标轴\n // 进而触发 scale.getBandWidth 错误 (因为 Funnel 坐标系不支持 band scale 操作)\n if (newProps.axis) {\n delete newProps.axis\n }\n \n // 5. 校验 theme 有效性\n // LLM 有时会生成乱码主题 (如 \"样新花低原群\"),导致样式计算错误\n const validThemes = ['light', 'dark', 'academy']\n if (newProps.theme && !validThemes.includes(newProps.theme)) {\n delete newProps.theme\n }\n\n // 6. 修正极小 width\n if (typeof newProps.width === 'number' && newProps.width < 100) {\n delete newProps.width\n }\n\n return newProps\n }\n}\n\nexport * from './schema'\n","import { ChartStrategy } from './base'\nimport { lineStrategy } from './Line'\nimport { columnStrategy } from './Column'\nimport { pieStrategy } from './Pie'\nimport { dualAxesStrategy } from './DualAxes'\nimport { funnelStrategy } from './Funnel'\n\nexport const strategies: Record<string, ChartStrategy> = {\n line: lineStrategy,\n column: columnStrategy,\n pie: pieStrategy,\n 'dual-axes': dualAxesStrategy,\n funnel: funnelStrategy,\n}\n\n/**\n * 根据类型获取图表策略\n */\nexport function getChartStrategy(type: string): ChartStrategy | null {\n if (!type) return null\n return strategies[type.toLowerCase()] || null\n}\n\nexport * from './base'\nexport * from './Line'\nexport * from './Column'\nexport * from './Pie'\nexport * from './DualAxes'\nexport * from './Funnel'\n","import { BaseChartProps } from './strategies/base'\nimport { XCMLComponentSchema } from '../../../core/schema'\n\n/**\n * 深度合并工具函数\n */\nexport function deepMerge<T extends Record<string, any>>(\n target: T,\n source: Record<string, any>,\n): T {\n if (typeof target !== 'object' || target === null) return source as T\n if (typeof source !== 'object' || source === null) return target\n\n const result = (Array.isArray(target) ? [...target] : { ...target }) as T\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key]\n const targetValue = (result as any)[key]\n\n if (\n typeof sourceValue === 'object' &&\n sourceValue !== null &&\n typeof targetValue === 'object' &&\n targetValue !== null &&\n !React.isValidElement(sourceValue)\n ) {\n ;(result as any)[key] = deepMerge(targetValue, sourceValue)\n } else {\n ;(result as any)[key] = sourceValue\n }\n }\n }\n\n return result\n}\n\nimport React from 'react'\nimport { Empty, Button, Result } from 'antd'\n\n/**\n * Schema 驱动的属性清洗器\n * 根据 Schema 定义的规则 (visibleIf, default, transform) 处理属性\n *\n * @param props 原始属性\n * @param schema 组件 Schema\n * @returns 清洗后的属性\n */\nexport function cleanPropsBySchema(\n props: Record<string, any>,\n schema?: XCMLComponentSchema,\n): Record<string, any> {\n if (!schema) return props\n\n const cleanedProps = { ...props }\n const allPropDefs = [...(schema.props || []), ...(schema.body || [])]\n\n if (allPropDefs.length === 0) return props\n\n // 遍历 Schema 定义的每个属性 (包含 props 和 body)\n allPropDefs.forEach((propDef) => {\n const key = propDef.name\n\n // 1. 处理 visibleIf\n if (propDef.visibleIf) {\n const isVisible = propDef.visibleIf(cleanedProps)\n if (!isVisible) {\n delete cleanedProps[key]\n return // 如果不可见,直接移除并跳过后续处理\n }\n }\n\n // 2. 处理默认值\n if (propDef.default !== undefined && cleanedProps[key] === undefined) {\n cleanedProps[key] = propDef.default\n } else if (\n propDef.default !== undefined &&\n typeof propDef.default === 'object' &&\n propDef.default !== null\n ) {\n // 如果是对象类型的默认值,执行深度合并\n cleanedProps[key] = deepMerge(\n propDef.default as Record<string, any>,\n cleanedProps[key] as Record<string, any>,\n )\n }\n\n // 3. 处理 transform (属性转换)\n if (propDef.transform) {\n const currentValue = cleanedProps[key]\n // 传入当前值和完整上下文\n cleanedProps[key] = propDef.transform(currentValue, cleanedProps)\n }\n })\n\n return cleanedProps\n}\n\n/**\n * 构建最终图表配置\n */\nexport function buildConfig(props: BaseChartProps): Record<string, any> {\n const { type, data, theme, title, __native__, ...rest } = props\n\n // 1. 基础默认配置\n const base: Record<string, any> = {\n data: data || [],\n height: props.height || 300, // 默认高度 300\n theme: theme || 'light', // 默认亮色主题\n autoFit: props.autoFit !== false, // 默认开启自适应\n padding: 'auto', // 开启自动内边距\n appendPadding: [20, 30, 30, 20], // 额外增加边距,确保轴标题有空间显示\n }\n\n // 2. 深度合并 (rest -> base -> __native__)\n const config = deepMerge(deepMerge(base, rest), __native__ || {})\n\n // 6. 统一分组字段映射 (seriesField -> colorField)\n if (config.seriesField && !config.colorField) {\n config.colorField = config.seriesField\n }\n\n // 7. 注入自身快照到 __native__,方便在 React DevTools 中查看最终配置\n config.__native__ = { ...config }\n\n return config\n}\n\n/**\n * 空态占位组件\n */\nexport const DefaultEmptyPlaceholder = () => (\n <div className=\"w-full h-full flex items-center justify-center border border-dashed border-border rounded-lg bg-muted/30\">\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无数据\" />\n </div>\n)\n\n/**\n * 错误态占位组件\n */\nexport const DefaultErrorPlaceholder = ({ error, reset }: { error: Error; reset: () => void }) => (\n <div className=\"w-full h-full flex items-center justify-center p-4 border border-dashed border-destructive/20 rounded bg-destructive/5\">\n <Result\n status=\"error\"\n title=\"图表加载失败\"\n subTitle={error.message}\n extra={[\n <Button type=\"primary\" key=\"retry\" onClick={reset}>\n 重试\n </Button>,\n ]}\n />\n </div>\n)\n","import React from 'react'\nimport { Skeleton } from 'antd'\nimport { XCMLBaseProps, useXCMLComponent, XCMLComponentSchema } from '../../core'\nimport { XCMLCardWrapper } from './CardWrapper'\n\n/**\n * withXCMLCard 高阶组件配置项\n */\nexport interface WithXCMLCardOptions<P> {\n /** \n * 组件 Schema 定义\n * 用于 `useXCMLComponent` 自动进行属性映射与默认值注入\n */\n schema?: XCMLComponentSchema\n /** \n * 自定义获取标题逻辑\n * @default merged.label || merged.title\n */\n getTitle?: (mergedProps: P) => string | undefined\n /** \n * 自定义获取图标逻辑\n * @default merged.icon\n */\n getIcon?: (mergedProps: P) => React.ReactNode\n /** \n * 自定义获取变体逻辑 (card | plain)\n * @default merged.variant || 'card'\n */\n getVariant?: (mergedProps: P) => string\n /** \n * 自定义加载态渲染内容\n * 如果提供此函数,则忽略骨架屏配置\n */\n renderLoading?: (mergedProps: P) => React.ReactNode\n /** \n * 是否支持骨架屏渲染\n * @default true\n */\n skeleton?: boolean | { rows?: number }\n}\n\n/**\n * XCML 渲染器增强高阶组件 (HOC)\n * \n * 职责:\n * 1. 状态集成:利用 `useXCMLComponent` 统一管理 Props 合并、数据流状态及加载判断。\n * 2. 视觉规范:自动包裹 `XCMLCardWrapper`,确保所有组件拥有统一的容器样式、标题栏和主题表现。\n * 3. 容错治理:处理标题防御(如 LLM 生成了数组或对象形式的标题)及旧版属性兼容。\n * 4. 体验优化:内置 Ant Design 骨架屏加载态。\n * \n * @param Component - 业务渲染器组件\n * @param options - 配置参数\n * \n * @example\n * ```tsx\n * export default withXCMLCard(MyTable, { schema: tableSchema });\n * ```\n */\nexport function withXCMLCard<P extends object>(\n Component: React.ComponentType<P>,\n options: WithXCMLCardOptions<P & XCMLBaseProps> = {}\n) {\n const { \n schema,\n getTitle, \n getIcon, \n getVariant, \n renderLoading, \n skeleton = true \n } = options\n\n const WrappedComponent = React.forwardRef<any, any>((props, ref) => {\n // 1. 调用通用 Hook 处理属性合并与状态\n const { merged, baseProps, isLoading, streamStatus } = useXCMLComponent<P>(props, schema)\n \n // 兼容性治理:处理旧版的 delta 属性,将其转换为 trendValue\n if ((merged as any).delta !== undefined && (merged as any).trendValue === undefined) {\n (merged as any).trendValue = (merged as any).delta;\n }\n\n const { className, ...rest } = props\n \n // 2. 提取核心 UI 属性 (标题、图标、变体)\n const rawTitle = getTitle ? getTitle(merged) : (merged as any).title\n \n // 标题防御逻辑\n let title: React.ReactNode = undefined\n if (rawTitle) {\n if (typeof rawTitle === 'string') {\n title = rawTitle\n } else if (typeof rawTitle === 'object') {\n if (Array.isArray(rawTitle)) {\n title = undefined\n } else {\n title = (rawTitle as any).text || (rawTitle as any).content || JSON.stringify(rawTitle)\n }\n }\n }\n\n const icon = getIcon ? getIcon(merged) : (merged as any).icon\n // 优先使用 Hook 提取的 variant,如果未定义则回退到默认 'card'\n const variant = getVariant ? getVariant(merged) : (baseProps.variant || 'card')\n const hoverable = (merged as any).hoverable !== undefined ? (merged as any).hoverable : true\n \n // 3. 构造 Wrapper 属性\n const wrapperProps = {\n title,\n icon,\n variant,\n hoverable,\n className, // 使用外部传入的 className\n node: props.node,\n streamStatus,\n ...rest // 透传其他未被消费的属性\n }\n\n // 4. 加载态渲染\n if (isLoading) {\n return (\n <XCMLCardWrapper {...wrapperProps}>\n {renderLoading ? (\n renderLoading(merged)\n ) : skeleton ? (\n <Skeleton \n active \n paragraph={{ rows: typeof skeleton === 'object' ? skeleton.rows : 2 }} \n />\n ) : null}\n </XCMLCardWrapper>\n )\n }\n\n // 5. 正常渲染\n return (\n <XCMLCardWrapper {...wrapperProps}>\n <Component {...merged} ref={ref} />\n </XCMLCardWrapper>\n )\n })\n\n // 设置组件名称便于调试\n const componentName = Component.displayName || Component.name || 'Component'\n WrappedComponent.displayName = `withXCMLCard(${componentName})`\n\n return WrappedComponent\n}\n","import React from 'react'\nimport { clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * XCML 通用卡片包装器属性定义\n */\nexport interface XCMLCardWrapperProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** 卡片标题 */\n title?: React.ReactNode\n /** 卡片左上角图标 */\n icon?: React.ReactNode\n /** 卡片主体内容 */\n children?: React.ReactNode\n /** 数据来源(透传属性) */\n source?: string\n /** 摘要内容(透传属性) */\n summary?: React.ReactNode\n /** 容器变体: 'card' (默认带边框阴影) | 'plain' (纯文字,无边框) */\n variant?: string\n /** 视觉主题 */\n theme?: string\n /** 是否支持悬停时的浮起阴影效果 */\n hoverable?: boolean\n /** 原始 XCML 节点数据 */\n node?: Record<string, any>\n /** 关联的 DOM 节点引用 */\n domNode?: HTMLElement | null\n /** 数据流式加载状态 */\n streamStatus?: string\n}\n\n/**\n * XCML 通用卡片包装器 (Themed Container)\n * \n * 职责:\n * 1. 提供全局一致的容器样式:圆角、边框、阴影、外边距。\n * 2. 渲染统一的标题栏布局,支持图标与悬停装饰条。\n * 3. 拦截并清理内部业务属性,防止非法的 XCML 属性透传到原生 DOM 节点引起 React 警告。\n * \n * 设计风格:\n * 参考现代 AI 助手 UI 规范,强调微阴影(shadow-card)与圆润度(rounded-xl)。\n */\nexport const XCMLCardWrapper: React.FC<XCMLCardWrapperProps> = ({ \n title, \n icon,\n children, \n source: _source, \n summary: _summary, \n variant = 'card',\n theme,\n hoverable = true,\n className, \n domNode, \n streamStatus, \n node,\n // 消费掉所有已知的 XCML 内部属性,防止传给 DOM\n // @ts-ignore\n label, value, footer, precision, layout, note, trend, trendValue, unit, prefix, \n // @ts-ignore\n wow, yoy, sentiment, highlights, citations, actions, steps, columns, rows, \n // @ts-ignore\n charts, data, subTitle, themeColor, backgroundImage, qrCode, author, date,\n ...rest \n}) => {\n const isPlain = variant === 'plain'\n const finalTheme = theme ?? (node as any)?.props?.theme ?? (node as any)?.data?.theme\n const rootClassName = twMerge(\n clsx(\n 'xcml-scope xcml-card not-prose max-w-full min-w-0 group',\n isPlain\n ? 'p-1'\n : 'rounded-xl border border-border/80 bg-card/50 backdrop-blur-sm shadow-sm p-card mb-6 overflow-hidden',\n 'relative transition-all duration-300 ease-out hover:ease-in-out',\n className,\n hoverable && !isPlain ? 'hover:shadow-md hover:border-primary/50 hover:bg-card/80' : ''\n ),\n )\n\n return (\n <div \n className={rootClassName}\n data-theme={finalTheme}\n {...rest}\n >\n {title && (\n <div className=\"relative mb-4\">\n {/* 悬停时的装饰条 - 嵌入到标题上方 */}\n {!isPlain && (\n <div className=\"absolute -top-3 -inset-x-4 h-1 bg-gradient-to-r from-primary via-primary/60 to-primary/20 opacity-0 transition-all duration-300 group-hover:opacity-100 rounded-full scale-x-95 group-hover:scale-x-100\"></div>\n )}\n <div className=\"flex items-center justify-between pb-3 border-b border-border/80\">\n <h3 className=\"text-lg font-bold text-foreground leading-snug tracking-tight flex items-center gap-3 whitespace-normal break-words flex-1\">\n {!isPlain && icon && (\n <span className=\"flex items-center justify-center w-8 h-8 rounded-lg bg-primary/10 text-primary border border-primary/20 shadow-sm\">\n {icon}\n </span>\n )}\n {!isPlain && !icon && (\n <span className=\"w-1.5 h-6 rounded-full bg-primary shadow-[0_0_8px_rgba(var(--primary-rgb),0.4)]\"></span>\n )}\n {title}\n </h3>\n </div>\n </div>\n )}\n <div className={clsx(\"xcml-card-body\", !isPlain && \"mt-1\")}>\n {children}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { AntVChartLoader } from './Chart'\nimport { AntVRendererOptions } from './types'\n\nimport { createRenderersWithAliases } from '../../core/utils'\n\nexport * from './types'\nexport * from './Chart'\nexport * from './themes'\n\n/**\n * 图表渲染器:将 xcml:chart 数据映射到 AntV Plots\n */\nexport function createAntVRenderers(options?: AntVRendererOptions) {\n const theme = options?.theme\n\n const baseMap = {\n 'chart': (node: any, key: string | number) => (\n <AntVChartLoader key={key} node={node} theme={theme} className={node.props?.className} />\n )\n }\n\n return createRenderersWithAliases(baseMap)\n}\n","import React, { useMemo } from 'react'\nimport { withXCMLCard } from '../withXCMLCard'\nimport { ArrowUpOutlined, ArrowDownOutlined } from '@ant-design/icons'\nimport { metricSchema } from './schema'\n\n/**\n * 指标卡片属性定义 (Attributes & Data)\n */\nexport interface XCMLMetricProps {\n /** 指标名称/标题,显示在卡片顶部或标签位置 */\n label: string\n /** 数值保留小数位数,默认为 0 */\n precision?: number\n /** 展示变体样式: 'card'(带边框卡片), 'plain'(无边框文本), 'compact'(紧凑型) */\n variant?: 'card' | 'plain' | 'compact'\n /** 布局方向: 'horizontal'(水平), 'vertical'(垂直) */\n layout?: 'horizontal' | 'vertical'\n /** 装饰图标,显示在指标名称旁 */\n icon?: string\n /** 底部辅助信息,显示在卡片最底部 */\n footer?: string\n /** 指标数值,支持数字或字符串格式 */\n value?: string | number\n /** 指标备注或详细说明信息,显示在数值下方 */\n note?: string\n /** 趋势方向或趋势数据 */\n trend?: 'up' | 'down' | 'none' | number[]\n /** 趋势具体数值或描述 */\n trendValue?: string | number\n}\n\n// 简单的 SVG Sparkline 组件\nconst Sparkline = ({ data, color = '#059669' }: { data: number[]; color?: string }) => {\n if (!Array.isArray(data) || data.length < 2) return null\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const width = 80\n const height = 24\n\n const points = data\n .map((d, i) => {\n const x = (i / (data.length - 1)) * width\n const y = height - ((d - min) / range) * height\n return `${x},${y}`\n })\n .join(' ')\n\n return (\n <svg width={width} height={height} className=\"overflow-visible ml-2\">\n <polyline\n points={points}\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle\n cx={((data.length - 1) / (data.length - 1)) * width}\n cy={height - ((data[data.length - 1] - min) / range) * height}\n r=\"2\"\n fill={color}\n />\n </svg>\n )\n}\n\n/**\n * XCML 指标卡片内部渲染逻辑\n */\nconst MetricInner: React.FC<XCMLMetricProps> = (merged) => {\n const {\n precision = 0,\n layout = 'vertical',\n footer,\n value,\n note,\n trend,\n trendValue,\n } = merged\n\n // 1. 格式化趋势数据\n const displayTrendValue = useMemo(() => {\n if (trendValue === undefined || trendValue === null) return null\n\n // 如果 trendValue 是数字,根据 precision 格式化\n if (typeof trendValue === 'number') {\n const formatted = trendValue.toLocaleString(undefined, {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n })\n // 自动补全符号\n if (trend === 'up' && !String(trendValue).startsWith('+')) return `+${formatted}`\n if (trend === 'down' && !String(trendValue).startsWith('-')) return `-${formatted}`\n return formatted\n }\n\n return String(trendValue)\n }, [trendValue, precision, trend])\n\n // 2. 核心数值转换逻辑\n const displayValue = useMemo(() => {\n if (value === undefined || value === null) return '-'\n const numValue =\n typeof value === 'string' && value !== '' && !isNaN(Number(value)) ? Number(value) : value\n if (typeof numValue === 'number') {\n return numValue.toLocaleString(undefined, {\n minimumFractionDigits: precision,\n maximumFractionDigits: precision,\n })\n }\n return String(value)\n }, [value, precision])\n\n const isUp = trend === 'up'\n const isDown = trend === 'down'\n const hasSparkline = Array.isArray(trend)\n\n return (\n <>\n <div\n className={`flex ${layout === 'horizontal' ? 'flex-row items-center justify-between' : 'flex-col'} gap-2`}\n >\n <div className=\"flex flex-col\">\n <div className=\"flex items-baseline gap-1.5 group\">\n <span className=\"text-metric font-bold text-card-foreground tracking-tight group-hover:text-primary transition-colors\">\n {displayValue}\n </span>\n\n {displayTrendValue && (\n <div\n className={`flex items-center text-xs font-bold px-1.5 py-0.5 rounded ${isUp ? 'text-success bg-success/10' : isDown ? 'text-destructive bg-destructive/10' : 'text-muted-foreground bg-muted'}`}\n >\n {isUp && <ArrowUpOutlined className=\"mr-0.5\" />}\n {isDown && <ArrowDownOutlined className=\"mr-0.5\" />}\n {displayTrendValue}\n </div>\n )}\n </div>\n\n {note && (\n <div className=\"text-xs text-muted-foreground mt-1 line-clamp-1\" title={note}>\n {note}\n </div>\n )}\n </div>\n\n {hasSparkline && (\n <div className=\"h-10 w-24\">\n <Sparkline\n data={trend as number[]}\n color={isUp ? '#10b981' : isDown ? '#ef4444' : '#6366f1'}\n />\n </div>\n )}\n </div>\n {footer && (\n <div className=\"mt-card-gap pt-2 border-t border-border/40 text-[10px] text-muted-foreground italic\">\n {footer}\n </div>\n )}\n </>\n )\n}\n\n/**\n * XCML 指标卡片组件 (Metric)\n *\n * 职责:\n * 专注于单一核心指标的极简展示,支持趋势分析。\n * \n * 特性:\n * 1. 趋势标识:支持上升/下降箭头及颜色反馈(Green-Success, Red-Danger)。\n * 2. 迷你图:内置 `Sparkline` (SVG) 组件,可展示最近一段时间的数据波动。\n * 3. 布局适配:支持 `vertical` (标题在上) 和 `horizontal` (左右对齐) 两种模式。\n * 4. 容错转换:自动处理数值的本地化格式化 (toLocaleString) 与精度控制。\n * \n * @component\n */\nexport const XCMLMetric = withXCMLCard(MetricInner, {\n schema: metricSchema,\n skeleton: { rows: 1 }\n})\n","import React from 'react'\nimport { withXCMLCard } from '../withXCMLCard'\nimport { cardSchema } from './schema'\nimport { XCMLMarkdown } from '../../../markdown'\n\n/**\n * 基础卡片属性定义\n */\nexport interface XCMLCardProps {\n /** 卡片标题 */\n title?: string\n /** 卡片描述内容,支持作为主内容展示 */\n description?: string\n /** 内容 */\n content?: string\n /** 卡片类型: 'inner'(内部嵌套), 'default'(默认) */\n type?: 'inner' | 'default'\n /** 是否支持鼠标悬停效果 */\n hoverable?: boolean\n /** 展示变体 (card, plain) */\n variant?: 'card' | 'plain'\n}\n\n/**\n * XCML 基础卡片内部渲染逻辑\n */\nconst CardInner: React.FC<XCMLCardProps & { node?: any }> = (merged) => {\n const { description, content, node } = merged;\n\n // 优先级:body content > props.description > node.__source (兜底)\n const displayContent = content || description || (!(node?.body || node?.data) ? node?.__source : '')\n\n return (\n <div className=\"text-muted-foreground leading-relaxed\">\n {displayContent ? (\n <XCMLMarkdown content={displayContent} />\n ) : (\n <div className=\"text-muted-foreground/50 text-xs italic\">\n No content\n </div>\n )}\n </div>\n )\n}\n\n/**\n * XCML 基础卡片组件 (Card)\n * \n * 职责:\n * 作为最基础的内容容器,用于承载 Markdown 文本或作为其他组件的占位符。\n * \n * 特性:\n * 1. 自动提取:支持从 `content`、`description` 属性或标签体 `node.__source` 中提取内容。\n * 2. Markdown 支持:内部集成 `XCMLMarkdown`,支持丰富的文本格式化。\n * 3. 灵活变体:支持 `card` (带容器) 和 `plain` (纯文本) 两种视觉表现。\n */\nexport const XCMLCard = withXCMLCard(CardInner, {\n schema: cardSchema,\n skeleton: { rows: 2 }\n})\n","import React from 'react'\nimport { withXCMLCard } from '../withXCMLCard'\nimport { CheckCircleOutlined, MinusCircleOutlined, BorderOutlined } from '@ant-design/icons'\nimport { listSchema } from './schema'\n\n/**\n * 列表/网格组件属性定义\n */\nexport interface XCMLListProps {\n /** 列表标题 */\n title?: string\n /** 列表页眉文本 */\n header?: string\n /** 列表页脚文本 */\n footer?: string\n /** 布局模式: 'list'(列表), 'grid'(网格) */\n layout?: 'list' | 'grid'\n /** 网格布局时的列数,默认为 3 */\n columns?: number\n /** 项目之间的间距 (px),默认为 16 */\n gap?: number\n /** 列表项数组 (兼容字段) */\n items?: Array<any>\n /** 列表项展现类型: 'metric'(指标型), 'text'(纯文本型) */\n type?: 'metric' | 'text'\n /** 是否开启斑马纹 (仅列表模式有效) */\n stripe?: boolean\n}\n\n/**\n * 列表项数据结构\n */\nexport interface XCMLListData {\n /** 列表项数组 */\n items: Array<{ \n /** 项目标题 */\n title: string\n /** 项目详细描述 */\n desc?: string\n /** 数值(当 type 为 'metric' 时有效) */\n value?: string | number\n /** 状态标识: 'done'(已完成), 'doing'(进行中), 'todo'(待办) */\n status?: 'done' | 'doing' | 'todo'\n /** 展现类型: 'metric'(指标型), 'text'(纯文本型) */\n type?: 'metric' | 'text'\n }>\n}\n\n/**\n * 列表项内部组件\n */\nconst ListItem = ({ item, layout, index, stripe }: { item: any; layout: string; index: number; stripe?: boolean }) => {\n const { title, desc, value, status, type = 'text' } = item;\n const isMetric = type === 'metric';\n\n if (isMetric) {\n return (\n <div className={`bg-muted/30 rounded-lg p-card-half border border-border hover:border-primary/20 transition-colors group ${stripe ? 'bg-muted/50' : ''}`}>\n <div className=\"text-xs text-muted-foreground mb-1 font-medium\">{title}</div>\n <div className=\"text-xl font-bold text-card-foreground group-hover:text-primary transition-colors\">{value}</div>\n {desc && <div className=\"text-[10px] text-muted-foreground/60 mt-1 whitespace-pre-wrap\">{desc}</div>}\n </div>\n );\n }\n\n return (\n <div\n className={`flex items-start gap-3 p-card-half bg-muted/40 border border-border rounded-lg hover:shadow-card hover:border-primary/30 transition-all group ${layout === 'list' ? 'w-full' : ''} ${stripe ? 'bg-muted/60' : ''}`}\n >\n <div className=\"mt-1\">\n {status === 'done' && <CheckCircleOutlined className=\"text-success\" />}\n {status === 'doing' && <MinusCircleOutlined className=\"text-primary animate-pulse\" />}\n {status === 'todo' && <BorderOutlined className=\"text-muted-foreground/30\" />}\n {!status && (\n <div className=\"w-4 h-4 rounded-full bg-muted flex items-center justify-center text-[10px] text-muted-foreground font-bold group-hover:bg-primary/10 group-hover:text-primary transition-colors\">\n {index + 1}\n </div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm font-medium text-card-foreground whitespace-normal break-words group-hover:text-primary transition-colors\">{title}</div>\n {desc && (\n <div className=\"text-xs text-muted-foreground mt-0.5 whitespace-normal break-words whitespace-pre-wrap\">{desc}</div>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * XCML 列表/网格内部渲染逻辑\n */\nconst ListInner: React.FC<XCMLListProps> = (merged) => {\n const {\n header,\n footer,\n layout = 'grid',\n columns = 3,\n items = [],\n type: listType = 'text',\n stripe = false,\n } = merged;\n\n const isGrid = layout === 'grid';\n // 动态生成网格列数类名\n const gridColsMap: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-1 md:grid-cols-3',\n 4: 'grid-cols-2 md:grid-cols-4',\n 5: 'grid-cols-2 md:grid-cols-5',\n 6: 'grid-cols-3 md:grid-cols-6',\n };\n const gridCols = gridColsMap[columns] || 'grid-cols-1 md:grid-cols-3';\n\n return (\n <>\n {header && <div className=\"mb-3 text-sm text-muted-foreground\">{header}</div>}\n\n <div\n className={isGrid ? `grid ${gridCols} gap-card-gap` : 'flex flex-col space-y-card-gap'}\n >\n {items.map((it: any, i: number) => (\n <ListItem \n key={i} \n item={{ type: listType, ...it }} \n layout={layout} \n index={i} \n stripe={stripe && i % 2 === 1}\n />\n ))}\n\n {items.length === 0 && (\n <div className=\"text-center py-8 text-muted-foreground/50 text-xs italic\">暂无列表项</div>\n )}\n </div>\n\n {footer && (\n <div className=\"mt-card-gap pt-3 border-t border-border/40 text-xs text-muted-foreground text-right\">\n {footer}\n </div>\n )}\n </>\n );\n}\n\n/**\n * XCML 列表/网格组件 (List)\n * \n * 职责:\n * 展示多项结构化数据,支持灵活的列表与网格切换。\n * \n * 特性:\n * 1. 布局切换:支持 `list` (单列纵向) 和 `grid` (多列横向) 两种布局模式。\n * 2. 状态映射:支持任务状态(todo, doing, done)的视觉化展示。\n * 3. 业务模式:提供 `text` (纯文本) 和 `metric` (指标型) 两种子项风格。\n * 4. 样式治理:支持 `stripe` 斑马纹,提升长列表可读性。\n */\nexport const XCMLList = withXCMLCard(ListInner, {\n schema: listSchema,\n skeleton: { rows: 3 }\n})\n","import React from 'react'\nimport { withXCMLCard } from '../withXCMLCard'\nimport { useTOC } from '../../../markdown/TOCContext'\nimport { tocSchema } from './schema'\n\n/**\n * XCML 目录内部渲染逻辑\n */\nconst TOCInner: React.FC<{ title?: string }> = () => {\n // 从 TOCContext 中获取标题项\n const { items } = useTOC()\n\n // 过滤掉 H1 标题 (通常是文档主标题)\n const filteredItems = React.useMemo(() => items.filter(item => item.level > 1), [items])\n\n const handleClick = (e: React.MouseEvent, id: string) => {\n e.preventDefault()\n const el = document.getElementById(id)\n if (el) {\n el.scrollIntoView({ behavior: 'smooth' })\n }\n }\n\n return (\n <div className=\"text-sm text-muted-foreground w-full\">\n {filteredItems.length === 0 ? (\n <div className=\"text-muted-foreground text-xs\">暂无目录</div>\n ) : (\n <ul className=\"list-none p-0 m-0 ml-2 border-l-2 border-border\">\n {filteredItems.map(item => (\n <li \n key={item.id} \n className=\"mb-2 text-sm leading-relaxed relative\"\n style={{ paddingLeft: `${(item.level - 2) * 1 + 1}rem` }}\n >\n <a \n href={`#${item.id}`} \n onClick={(e) => handleClick(e, item.id)}\n className=\"text-foreground no-underline cursor-pointer transition-colors hover:text-primary hover:underline\"\n >\n {item.title}\n </a>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/**\n * XCML 目录组件 (TOC - Table of Contents)\n * \n * 职责:\n * 自动扫描当前文档中的 Markdown 标题,生成可交互的导航树。\n * \n * 特性:\n * 1. 自动同步:通过 `useTOC` Hook 监听文档 AST 变化,实时更新目录项。\n * 2. 深度过滤:默认过滤 H1 标题,仅展示二级及以下标题,避免冗余。\n * 3. 交互导航:支持平滑滚动 (scrollIntoView),提升长文档阅读体验。\n * 4. 缩进样式:根据标题层级自动计算缩进,清晰展示文档结构。\n */\nexport const XCMLTOC = withXCMLCard(TOCInner, {\n schema: tocSchema,\n getTitle: (merged) => merged.title || '目录',\n skeleton: { rows: 4 }\n})\n","import React, { useMemo } from 'react'\nimport { withXCMLCard } from '../withXCMLCard'\nimport { Badge, Tooltip } from 'antd'\nimport { InfoCircleOutlined } from '@ant-design/icons'\nimport { tableSchema } from './schema'\n\n/**\n * 数据表格组件属性定义\n */\nexport interface XCMLTableProps {\n /** 表格标题 */\n title?: string\n /** 是否显示边框 */\n bordered?: boolean\n /** 展示变体 (card, plain) */\n variant?: 'card' | 'plain'\n /** 表格尺寸: 'small', 'middle', 'large' */\n size?: 'small' | 'middle' | 'large'\n /** 是否显示底部总结栏 */\n summary?: boolean\n /** 列定义集合 */\n columns?: Array<XCMLTableColumn>\n /** 行数据集合 */\n rows?: Array<Record<string, any>>\n /** 表格行数据 (兼容字段) */\n dataSource?: Array<Record<string, any>>\n}\n\n/**\n * 表格列配置定义\n */\nexport interface XCMLTableColumn {\n /** 列标题 */\n title: string\n /** 对应行数据中的字段 key */\n key: string\n /** 对齐方式 */\n align?: 'left' | 'center' | 'right'\n /** \n * 数据展现类型:\n * - 'text': 纯文本\n * - 'number': 数字\n * - 'progress': 进度条 (value 应为 0-1)\n * - 'trend': 趋势图 (value 应为 number[])\n * - 'badge': 徽章状态\n * - 'image': 图片预览\n */\n type?: 'text' | 'number' | 'progress' | 'trend' | 'badge' | 'image'\n /** 列宽度 */\n width?: number | string\n /** 数值前缀 */\n prefix?: string\n /** 数值后缀 */\n suffix?: string\n}\n\n/**\n * 表格数据结构\n */\nexport interface XCMLTableData {\n /** 列定义集合 */\n columns: Array<XCMLTableColumn>\n /** 行数据集合 */\n rows: Array<Record<string, any>>\n}\n\n// 简单的 SVG Sparkline 组件\nconst Sparkline = ({ data, color }: { data: number[]; color?: string }) => {\n // 默认使用当前 primary 颜色,通过 CSS 变量\n const finalColor = color || 'hsl(var(--primary))'\n\n if (!Array.isArray(data) || data.length < 2) return <span className=\"text-muted-foreground/30\">-</span>\n \n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const width = 60\n const height = 20\n \n const points = data.map((d, i) => {\n const x = (i / (data.length - 1)) * width\n const y = height - ((d - min) / range) * height\n return `${x},${y}`\n }).join(' ')\n\n return (\n <svg width={width} height={height} className=\"overflow-visible\">\n <polyline\n points={points}\n fill=\"none\"\n stroke={finalColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx={(data.length - 1) / (data.length - 1) * width} cy={height - ((data[data.length - 1] - min) / range) * height} r=\"2.5\" fill={finalColor} />\n </svg>\n )\n}\n\n// 进度条组件\nconst ProgressBar = ({ value, color = 'bg-primary' }: { value: number; color?: string }) => {\n const percent = Math.min(Math.max(value * 100, 0), 100)\n return (\n <div className=\"w-full h-1.5 bg-muted rounded-full overflow-hidden\">\n <div \n className={`h-full rounded-full transition-all duration-300 w-[var(--percent)] ${color}`} \n style={{ '--percent': `${percent}%` } as React.CSSProperties}\n />\n </div>\n )\n}\n\n/**\n * XCML 数据表格内部渲染逻辑\n */\nconst TableInner: React.FC<XCMLTableProps> = (merged) => {\n const { \n bordered = true,\n size = 'middle',\n summary = false,\n columns = [],\n rows = [],\n dataSource: mergedDataSource = [],\n } = merged;\n\n const rawRows = mergedDataSource.length > 0 ? mergedDataSource : rows;\n const hasData = columns.length > 0 && rawRows.length > 0\n\n // 计算合计行\n const summaryRow = useMemo(() => {\n if (!summary || !hasData) return null\n const result: Record<string, any> = { _isSummary: true }\n \n columns.forEach((col: XCMLTableColumn) => {\n // 如果是数值类型或看起来像数值的列,尝试求和\n const values = rawRows.map((r: any) => {\n const val = r[col.key]\n return typeof val === 'string' ? parseFloat(val.replace(/[^0-9.-]/g, '')) : val\n }).filter((v: any) => typeof v === 'number' && !isNaN(v))\n\n if (values.length > 0 && (col.type === 'number' || col.key === 'amount' || col.key === 'value' || col.key === 'sales')) {\n const sum = values.reduce((a: number, b: number) => a + b, 0)\n // 简单格式化,保留2位小数\n result[col.key] = Number.isInteger(sum) ? sum : sum.toFixed(2)\n } else {\n result[col.key] = ''\n }\n })\n // 第一列显示“合计”\n result[columns[0].key] = '合计'\n return result\n }, [summary, hasData, columns, rawRows])\n\n const renderCell = (col: XCMLTableColumn, row: any) => {\n const val = row[col.key]\n \n switch (col.type) {\n case 'progress':\n // 假设 val 是 0-1 之间的小数,或者 0-100 的数\n const numVal = typeof val === 'string' ? parseFloat(val) : val\n const percent = numVal <= 1 ? numVal : numVal / 100\n let color = 'bg-primary'\n if (percent >= 1) color = 'bg-success'\n else if (percent < 0.6) color = 'bg-destructive'\n else color = 'bg-primary/60'\n \n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs w-8 text-right font-mono\">{(percent * 100).toFixed(0)}%</span>\n <div className=\"flex-1 min-w-[60px]\">\n <ProgressBar value={percent} color={color} />\n </div>\n </div>\n )\n case 'trend':\n return <Sparkline data={Array.isArray(val) ? val : []} />\n case 'badge':\n // 尝试推断状态\n let status = 'default'\n if (['success', '完成', '正常', 'ok', 'pass'].includes(String(val).toLowerCase())) status = 'success'\n else if (['error', 'fail', '失败', '异常'].includes(String(val).toLowerCase())) status = 'error'\n else if (['warning', 'warn', '警告'].includes(String(val).toLowerCase())) status = 'warning'\n else if (['processing', 'running', '进行中'].includes(String(val).toLowerCase())) status = 'processing'\n \n return <Badge status={status as any} text={val} />\n case 'image':\n return <img src={val} alt=\"\" className=\"h-8 w-8 rounded object-cover border border-border\" />\n default:\n return (\n <span className={col.type === 'number' ? 'font-mono' : ''}>\n {col.prefix}{val}{col.suffix}\n </span>\n )\n }\n }\n\n // 尺寸映射\n const paddingMap = {\n small: 'px-4 py-2.5',\n middle: 'px-5 py-3.5',\n large: 'px-6 py-5'\n }\n const padding = paddingMap[size as keyof typeof paddingMap] || paddingMap.middle\n\n const rowBaseClass = \"border-b border-border/40 transition-all duration-150\"\n const rowHoverClass = \"hover:bg-primary/5 cursor-default\"\n\n return (\n <div className={`w-full overflow-hidden ${bordered ? 'border border-border/60 rounded-xl shadow-sm bg-card' : ''}`}>\n {!hasData ? (\n <div className=\"py-12 text-center text-muted-foreground/50 italic flex flex-col items-center gap-2\">\n <div className=\"w-12 h-12 rounded-full bg-muted/30 flex items-center justify-center\">\n <InfoCircleOutlined className=\"text-xl opacity-20\" />\n </div>\n <span>暂无数据</span>\n </div>\n ) : (\n <div className=\"overflow-x-auto custom-scrollbar\">\n <table className=\"w-full border-collapse text-[13.5px] leading-relaxed table-auto\">\n <thead>\n <tr className=\"bg-muted/40 border-b border-border/60\">\n {columns.map((c: any, i: number) => (\n <th \n key={i} \n className={`${padding} font-bold text-foreground/80 whitespace-nowrap align-middle uppercase tracking-wider text-[11px]`}\n style={{ textAlign: c.align || 'left', width: c.width }}\n >\n <div className=\"flex items-center gap-1.5\">\n {c.title}\n {(c as any).desc && (\n <Tooltip title={(c as any).desc}>\n <InfoCircleOutlined className=\"text-[10px] cursor-help opacity-40 hover:opacity-100 text-primary transition-opacity\" />\n </Tooltip>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/30\">\n {rawRows.map((row: any, i: number) => (\n <tr key={i} className={`${rowBaseClass} ${rowHoverClass}`}>\n {columns.map((col: XCMLTableColumn, j: number) => (\n <td \n key={j} \n className={`${padding} align-middle text-foreground/90 whitespace-normal break-words`}\n style={{ textAlign: col.align || 'left' }}\n >\n {renderCell(col, row)}\n </td>\n ))}\n </tr>\n ))}\n {summaryRow && (\n <tr className=\"bg-primary/5 font-bold border-t-2 border-primary/20\">\n {columns.map((col: XCMLTableColumn, i: number) => (\n <td \n key={i} \n className={`${padding} align-middle text-primary/90 whitespace-normal break-words`}\n style={{ textAlign: col.align || 'left' }}\n >\n {renderCell(col, summaryRow)}\n </td>\n ))}\n </tr>\n )}\n </tbody>\n </table>\n </div>\n )}\n \n {!summary && hasData && (\n <div className=\"py-2 text-[10px] text-muted-foreground/40 italic text-right px-4 border-t border-border/10\">\n Total {rawRows.length} rows\n </div>\n )}\n </div>\n )\n}\n\n/**\n * XCML 数据表格组件 (Table)\n * \n * 职责:\n * 提供结构化数据的中量级展示,支持多维度的视觉反馈。\n * \n * 特性:\n * 1. 丰富列型:内置 `progress` (进度条)、`trend` (迷你图)、`badge` (徽章状态) 等列渲染器。\n * 2. 自动统计:支持 `summary` 模式,可自动对数值列进行汇总求和。\n * 3. 响应式:支持 `size` (small/middle/large) 调节及横向滚动适配。\n * 4. 交互增强:表头支持 `Tooltip` 描述,单元格支持斑马纹悬停特效。\n */\nexport const XCMLTable = withXCMLCard(TableInner, {\n schema: tableSchema,\n skeleton: { rows: 4 }\n})\n","import React from 'react'\nimport { XCMLMetric } from './Metric'\nimport { XCMLCard } from './Card'\nimport { XCMLList } from './List'\nimport { XCMLTOC } from './TOC'\nimport { XCMLTable } from './Table'\nexport { XCMLCardWrapper } from './CardWrapper'\nexport { withXCMLCard } from './withXCMLCard'\n\nimport { createRenderersWithAliases } from '../../core/utils'\n\n/**\n * 基础渲染器集合:metric/table/card/list/toc\n * 说明:UI 基于 @ant-design/x,若组件名存在差异,将以简化实现占位\n */\n\n\nexport interface BasicRenderersOptions {\n theme?: string\n}\n\nexport function createBasicRenderers(options?: BasicRenderersOptions) {\n // 不再拼接 class,而是通过 data-theme 属性在根节点控制\n // 这里暂时不传 themeClass,或者如果需要局部主题,可以传递 data-theme 属性\n const themeProps = options?.theme ? { 'data-theme': options.theme } : {}\n \n const baseMap = {\n 'metric': (node: any, key: string | number) => <XCMLMetric key={key} node={node} {...themeProps} />,\n 'card': (node: any, key: string | number) => <XCMLCard key={key} node={node} {...themeProps} />,\n 'list': (node: any, key: string | number) => <XCMLList key={key} node={node} {...themeProps} />,\n 'toc': (node: any, key: string | number) => <XCMLTOC key={key} node={node} {...themeProps} />,\n 'table': (node: any, key: string | number) => <XCMLTable key={key} node={node} {...themeProps} />\n }\n\n return createRenderersWithAliases(baseMap)\n}\n","import React from 'react';\nimport { withXCMLCard } from '../../basic/withXCMLCard';\nimport { ArrowUpOutlined, ArrowDownOutlined, MinusOutlined } from '@ant-design/icons';\nimport CountUp from 'react-countup';\nimport { metricCardSchema } from './schema'\n\n/**\n * 复合指标卡片属性定义\n */\nexport interface XCMLMetricCardProps {\n /** 卡片标题 */\n title?: string\n /** 指标名称/标签 (title 的别名) */\n label?: string\n /** 指标当前数值 */\n value: string | number\n /** 环比增长率 (%) */\n wow?: number\n /** 同比增长率 (%) */\n yoy?: number\n /** 数值单位 */\n unit?: string\n /** 数值前缀 */\n prefix?: string\n /** 底部辅助信息 */\n footer?: string\n /** 数值保留小数位数 */\n precision?: number\n}\n\nconst renderTrend = (val: number | undefined, trendLabel: string) => {\n if (val === undefined || val === null) return null;\n \n const isPositive = val > 0;\n const isZero = val === 0;\n const colorClass = isPositive ? 'text-success bg-success/5' : isZero ? 'text-muted-foreground/40' : 'text-destructive bg-destructive/5';\n const Icon = isPositive ? ArrowUpOutlined : isZero ? MinusOutlined : ArrowDownOutlined;\n\n return ( <div className={`flex items-center px-2 py-0.5 rounded-full ${colorClass} text-[11px] font-bold border border-current/10 transition-all shadow-sm`}>\n <span className=\"opacity-70 mr-1\">{trendLabel}</span>\n <Icon className=\"mr-0.5 text-xs\" />\n {Math.abs(val)}%\n </div>\n );\n};\n\n/**\n * XCML 复合指标卡片内部渲染逻辑\n */\nconst MetricCardInner: React.FC<XCMLMetricCardProps> = (merged) => {\n const { \n value, \n wow, \n yoy, \n unit = '', \n prefix = '', \n footer,\n precision,\n } = merged;\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"text-metric-lg font-black my-2 bg-clip-text text-transparent bg-gradient-to-br from-foreground via-foreground to-foreground/70 group-hover:from-primary group-hover:to-pink-500 transition-all duration-500 tracking-tighter\">\n <span className=\"text-2xl mr-1 text-muted-foreground/60 font-bold align-baseline\">{prefix}</span>\n <CountUp end={Number(value) || 0} decimals={precision} separator=\",\" duration={2.5} />\n <span className=\"text-base ml-1 font-semibold text-muted-foreground/50 align-baseline\">{unit}</span>\n </div>\n \n <div className=\"flex space-x-2 mt-2\">\n {renderTrend(wow, '环比')}\n {renderTrend(yoy, '同比')}\n </div>\n\n {footer && (\n <div className=\"mt-card-gap pt-2 border-t border-border/40 text-[10px] text-muted-foreground italic whitespace-pre-wrap leading-normal\">\n {footer}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * XCML 复合指标卡片 (MetricCard)\n * \n * @description 增强型指标展示组件,支持数值动画 (CountUp)、单位前缀、以及同比/环比趋势标识。\n */\nexport const XCMLMetricCard = withXCMLCard(MetricCardInner, {\n schema: metricCardSchema,\n getTitle: (merged) => merged.title || merged.label,\n skeleton: { rows: 2 }\n});\n","import React, { useState } from 'react';\nimport { withXCMLCard } from '../../basic/withXCMLCard';\nimport { Row, Col } from 'antd';\nimport { Line } from '@ant-design/plots';\nimport { miniKpiStripSchema } from './schema'\n\n/**\n * 迷你指标项定义\n */\nexport interface XCMLMiniKpiItem {\n /** 指标名称 */\n label: string\n /** 当前数值 */\n value: string | number\n /** 环比增长率 (%) */\n wow?: number\n /** 趋势图数据数组 */\n trendData?: number[]\n}\n\n/**\n * 迷你指标条组件属性定义\n */\nexport interface XCMLMiniKpiStripProps {\n /** 包含多个指标项的数组 */\n items: XCMLMiniKpiItem[]\n}\n\nconst MiniKpiItem = ({ item }: { item: any }) => {\n const [isHovered, setIsHovered] = useState(false);\n const { label, value, wow, trendData = [] } = item;\n\n // Prepare data for Line chart (Sparkline)\n const chartData = trendData.map((val: number, idx: number) => ({ index: idx, value: val }));\n\n const config = {\n data: chartData,\n xField: 'index',\n yField: 'value',\n height: 30,\n padding: 0,\n axis: false,\n legend: false,\n tooltip: false,\n smooth: true,\n line: {\n style: {\n stroke: 'hsl(var(--primary))',\n lineWidth: 2,\n },\n },\n };\n\n return (\n <div \n className=\"p-3 border border-border/60 rounded-lg hover:shadow-card hover:border-primary/30 transition-all relative bg-muted/40 text-card-foreground min-h-[6rem] flex flex-col justify-between group overflow-hidden\"\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {/* 装饰边 */}\n <div className=\"absolute left-0 top-0 bottom-0 w-1 bg-transparent group-hover:bg-primary/20 transition-colors\"></div>\n \n <div className=\"relative z-10\">\n <div className=\"text-muted-foreground text-xs mb-1 font-medium whitespace-normal break-words\">{label}</div>\n <div className=\"flex items-end justify-between flex-wrap\">\n <span className=\"text-xl font-bold tracking-tight whitespace-normal break-words\">{value}</span>\n {wow !== undefined && (\n <div className={`w-2 h-2 rounded-full ${wow > 0 ? 'bg-success' : wow < 0 ? 'bg-destructive' : 'bg-muted'} shadow-[0_0_6px_rgba(var(--primary),0.2)]`} title={`环比: ${wow}%`} />\n )}\n </div>\n </div>\n \n {trendData.length > 0 && (\n <div className={`absolute bottom-0 left-0 right-0 h-8 transition-opacity duration-300 ${isHovered ? 'opacity-100' : 'opacity-40'}`}>\n <Line {...config} />\n </div>\n )}\n </div>\n );\n};\n\n/**\n * XCML 迷你指标条内部渲染逻辑\n */\nconst MiniKpiStripInner: React.FC<XCMLMiniKpiStripProps> = (merged) => {\n const { items = [] } = merged;\n const span = items.length > 0 ? Math.floor(24 / Math.min(items.length, 4)) : 6;\n\n return (\n <Row gutter={[16, 16]}>\n {items.map((item: any, index: number) => (\n <Col span={span} key={index}>\n <MiniKpiItem item={item} />\n </Col>\n ))}\n </Row>\n );\n};\n\n/**\n * XCML 迷你指标条组件 (MiniKpiStrip)\n * \n * @description 一行展示多个核心指标的紧凑型组件,每个指标包含名称、数值及迷你趋势图。\n */\nexport const XCMLMiniKpiStrip = withXCMLCard(MiniKpiStripInner, {\n schema: miniKpiStripSchema,\n skeleton: { rows: 2 }\n});\n","import React from 'react'\nimport { Table } from 'antd'\nimport { CSVLink } from 'react-csv'\nimport { DownloadOutlined } from '@ant-design/icons'\nimport { withXCMLCard } from '../../basic/withXCMLCard'\nimport { snapshotTableSchema } from './schema'\n\n/**\n * 快照表格属性定义\n */\nexport interface XCMLSnapshotTableProps {\n /** 表格标题 */\n title?: string\n /** 表格列定义 */\n columns?: any[]\n /** 表格行数据 */\n rows?: any[]\n /** 表格行数据 (兼容字段) */\n dataSource?: any[]\n}\n\n/**\n * XCML 快照表格内部渲染逻辑\n */\nconst SnapshotTableInner: React.FC<XCMLSnapshotTableProps> = (merged) => {\n const { \n title, \n columns = [], \n rows = [],\n dataSource: mergedDataSource = [],\n } = merged;\n\n // 1. 兼容逻辑:优先使用 dataSource,兜底使用 rows\n const rawDataSource = mergedDataSource.length > 0 ? mergedDataSource : rows;\n\n // 2. 为数据源增加唯一标识\n const dataSource = React.useMemo(() => {\n return rawDataSource.map((item, index) => ({\n ...item,\n __xcml_row_key: item.__xcml_key || item.id || `row-${index}`\n }));\n }, [rawDataSource]);\n\n // 3. 增强列定义\n const enhancedColumns = React.useMemo(() => columns.map((col: any) => ({\n ...col,\n dataIndex: col.key || col.dataIndex,\n title: col.title,\n ellipsis: false,\n className: 'whitespace-normal break-words',\n render: (text: any) => <div className=\"whitespace-normal break-words\">{text}</div>\n })), [columns]);\n\n // 4. CSV 数据准备\n const csvHeaders = React.useMemo(() => enhancedColumns.map((c: any) => ({ label: c.title, key: c.dataIndex })), [enhancedColumns]);\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"flex justify-end mb-2\">\n <CSVLink\n data={dataSource}\n headers={csvHeaders}\n filename={`${title || 'snapshot'}.csv`}\n className=\"inline-flex items-center px-3 py-1 text-sm font-medium rounded border border-border bg-card text-card-foreground hover:bg-muted transition-colors\"\n >\n <DownloadOutlined className=\"mr-1\" /> 导出CSV\n </CSVLink>\n </div>\n\n <div className=\"text-foreground\">\n <Table\n columns={enhancedColumns}\n dataSource={dataSource}\n rowKey=\"__xcml_row_key\"\n pagination={{ pageSize: 5 }}\n scroll={{ y: 300, x: '100%' }}\n className=\"w-full [&_.ant-table]:!w-full [&_.ant-table-container]:!w-full\"\n bordered\n size=\"small\"\n rowClassName={(_, index) => (index % 2 !== 0 ? 'bg-muted/20' : 'hover:bg-muted/30 transition-colors')} \n />\n </div>\n </div>\n )\n}\n\n/**\n * XCML 快照表格组件 (SnapshotTable)\n * \n * @description 用于展示静态数据快照,支持数据分页、横向滚动以及 CSV 导出功能。\n */\nexport const XCMLSnapshotTable = withXCMLCard(SnapshotTableInner, {\n schema: snapshotTableSchema,\n skeleton: { rows: 5 }\n});\n\n","import React from 'react';\nimport { Tag, Typography, Button } from 'antd';\nimport { clsx } from 'clsx';\nimport Highlighter from 'react-highlight-words';\nimport { LinkOutlined, ThunderboltOutlined } from '@ant-design/icons';\nimport { xcmlBus, parseArrayProp } from '../../../core';\nimport { insightCardSchema } from './schema'\nimport { withXCMLCard } from '../../basic/withXCMLCard'\n\nconst { Title } = Typography;\n\n/**\n * 洞察卡片属性定义\n */\nexport interface XCMLInsightProps {\n /** 洞察标题 */\n title?: string\n /** 洞察正文内容 */\n content: string\n /** 需要高亮的关键词数组,或逗号分隔的字符串 */\n highlights?: string[] | string\n /** \n * 洞察的情感倾向/类型:\n * - 'positive': 正向/增长 (📈)\n * - 'negative': 负面/下滑 (📉)\n * - 'neutral': 中性 (😐)\n * - 'insight': 洞察/发现 (💡)\n * - 'warning': 警告 (⚠️)\n * - 'success': 成功 (✅)\n * - 'error': 错误 (❌)\n */\n sentiment?: 'positive' | 'negative' | 'neutral' | 'insight' | 'warning' | 'success' | 'error' | string\n /** 引用来源列表 */\n citations?: string[] | string\n /** 行动建议列表 */\n actions?: string[] | string\n /** 图标 (Emoji 或 AntD Icon 名称) */\n icon?: string\n /** 展示变体 (card, plain) */\n variant?: 'card' | 'plain'\n}\n\nconst EMOJI_MAP: Record<string, string> = {\n positive: '📈',\n negative: '📉',\n neutral: '😐',\n insight: '💡',\n warning: '⚠️',\n success: '✅',\n error: '❌',\n insight_pro: '💎',\n};\n\nconst SENTIMENT_COLORS: Record<string, string> = {\n positive: 'text-green-500',\n negative: 'text-red-500',\n warning: 'text-amber-500',\n error: 'text-red-600',\n success: 'text-green-600',\n insight: 'text-indigo-500',\n};\n\n/**\n * XCML 洞察卡片内部渲染逻辑\n */\nconst InsightCardInner: React.FC<XCMLInsightProps> = (merged) => {\n const { \n content = '', \n highlights: rawHighlights = [], \n sentiment = 'insight',\n citations: rawCitations = [],\n actions: rawActions = [],\n } = merged;\n\n const highlights = parseArrayProp(rawHighlights);\n const citations = parseArrayProp(rawCitations);\n const actions = parseArrayProp(rawActions);\n\n const handleActionClick = (action: string) => {\n xcmlBus.emit('action_click', { action, source: 'insight_card' });\n };\n\n return (\n <div className=\"space-y-4\">\n {/* 情感标识与主内容 */}\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xl shrink-0\">\n {EMOJI_MAP[sentiment as string] || '💡'}\n </div>\n <div className={`text-base leading-normal whitespace-pre-wrap ${SENTIMENT_COLORS[sentiment as string] || 'text-foreground'}`}>\n <Highlighter\n highlightClassName=\"bg-primary/15 text-primary font-bold px-1 rounded-md mx-0.5\"\n searchWords={highlights}\n autoEscape={true}\n textToHighlight={content}\n />\n </div>\n </div>\n\n {/* 引用来源 */}\n {citations.length > 0 && (\n <div className=\"pt-2 border-t border-dashed border-border flex flex-wrap gap-2\">\n {citations.map((cite, idx) => (\n <Tag key={idx} icon={<LinkOutlined />} className=\"m-0 bg-secondary/50 border-none rounded px-2 py-0.5 text-xs\">\n {cite}\n </Tag>\n ))}\n </div>\n )}\n\n {/* 行动建议 */}\n {actions.length > 0 && (\n <div className=\"space-y-2\">\n <div className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider flex items-center gap-1.5\">\n <ThunderboltOutlined className=\"text-amber-500\" />\n 建议行动\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {actions.map((action, idx) => (\n <Button \n key={idx} \n size=\"small\" \n className=\"text-xs h-7 px-3 rounded-full hover:border-primary hover:text-primary transition-all\"\n onClick={() => handleActionClick(action)}\n >\n {action}\n </Button>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * XCML 洞察卡片组件 (InsightCard)\n * \n * @description 展示 AI 发现的数据洞察,支持关键词高亮、情感标识、引用来源及后续行动建议。\n */\nexport const XCMLInsightCard = withXCMLCard(InsightCardInner, {\n schema: insightCardSchema,\n getTitle: (merged) => merged.title || '数据洞察',\n getIcon: (merged) => merged.icon || EMOJI_MAP[merged.sentiment as string] || '💡',\n skeleton: { rows: 4 }\n})\n","import React, { useRef, useState } from 'react';\nimport { Button, QRCode, Select, Space } from 'antd';\nimport { DownloadOutlined, BgColorsOutlined } from '@ant-design/icons';\nimport html2canvas from 'html2canvas';\nimport { Column, Line, Pie } from '@ant-design/plots';\nimport { withXCMLCard } from '../../basic/withXCMLCard';\nimport { posterCardSchema } from './schema';\n\n/**\n * 海报组件属性定义\n */\nexport interface XCMLPosterProps {\n /** 海报主标题 */\n title?: string\n /** 海报副标题 */\n subTitle?: string\n /** 海报主题颜色 */\n themeColor?: string\n /** 背景图片 URL */\n backgroundImage?: string\n /** 二维码内容 */\n qrCode?: string\n /** 作者信息 */\n author?: string\n /** 日期信息 */\n date?: string\n /** 包含在海报中的图表列表 */\n charts?: Array<{\n /** 图表类型: 'column', 'line', 'pie' */\n type: 'column' | 'line' | 'pie'\n /** 图表标题 */\n title?: string\n /** 图表数据 */\n data: any[]\n }>\n}\n\nconst THEMES = [\n { label: '科技蓝', value: '#1890ff', bg: '#f0f5ff' },\n { label: '活力橙', value: '#fa8c16', bg: '#fff7e6' },\n { label: '清新绿', value: '#52c41a', bg: '#f6ffed' },\n { label: '暗夜紫', value: '#722ed1', bg: '#f9f0ff' },\n { label: '商务灰', value: '#595959', bg: '#f5f5f5' },\n];\n\n/**\n * XCML 数据海报内部渲染逻辑\n */\nconst PosterCardInner: React.FC<XCMLPosterProps> = (merged) => {\n const { \n title = '数据海报', \n subTitle = 'Data Insight Poster', \n charts = [], \n qrCode = 'https://ant.design', \n author = 'ChatBI', \n date = new Date().toLocaleDateString(),\n backgroundImage: rawBackgroundImage,\n themeColor,\n } = merged;\n\n // 进一步清洗 backgroundImage,去除可能残留的空白或反引号\n const backgroundImage = typeof rawBackgroundImage === 'string' \n ? rawBackgroundImage.trim().replace(/^[`'\" ]|[`'\" ]$/g, '').trim().replace(/^[`'\" ]|[`'\" ]$/g, '') \n : undefined;\n\n const posterRef = useRef<HTMLDivElement>(null);\n const [currentTheme, setCurrentTheme] = useState(THEMES[0]);\n\n // 如果传入了 themeColor,则覆盖当前主题的色值\n const effectiveThemeColor = themeColor || currentTheme.value;\n const effectiveBgColor = themeColor ? `${themeColor}10` : currentTheme.bg;\n\n const handleDownload = async () => {\n if (!posterRef.current) return;\n try {\n const canvas = await html2canvas(posterRef.current, {\n useCORS: true,\n scale: 2, // Retina\n backgroundColor: currentTheme.bg,\n });\n const url = canvas.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `poster-${Date.now()}.png`;\n a.click();\n } catch (e) {\n console.error('Poster generation failed', e);\n }\n };\n\n const renderChart = (chart: any, index: number) => {\n const commonConfig = {\n data: chart.data,\n height: 200,\n autoFit: true,\n };\n\n if (chart.type === 'column' || chart.type === 'bar') return <Column key={index} {...commonConfig} xField=\"label\" yField=\"value\" />;\n if (chart.type === 'line') return <Line key={index} {...commonConfig} xField=\"label\" yField=\"value\" />;\n if (chart.type === 'pie') return <Pie key={index} {...commonConfig} angleField=\"value\" colorField=\"label\" />;\n return null;\n };\n\n return (\n <div className=\"flex flex-col\">\n <div className=\"flex justify-between items-center mb-4\">\n <Space>\n <Select \n value={currentTheme.value} \n onChange={(val) => setCurrentTheme(THEMES.find(t => t.value === val) || THEMES[0])}\n options={THEMES}\n style={{ width: 120 }}\n suffixIcon={<BgColorsOutlined />}\n />\n </Space>\n <Button type=\"primary\" icon={<DownloadOutlined />} onClick={handleDownload}>\n 生成海报\n </Button>\n </div>\n\n <div className=\"flex-1 overflow-auto border border-border rounded-lg shadow-sm bg-muted/10 min-h-0 flex flex-col\">\n <div \n ref={posterRef} \n className=\"p-8 w-full mx-auto transition-colors duration-300 flex flex-col shrink-0\"\n style={{ \n backgroundColor: effectiveBgColor,\n backgroundImage: backgroundImage ? `url(${backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n color: '#333',\n minHeight: '100%'\n }}\n >\n {/* Header */}\n <div className=\"mb-6 text-center\">\n <h1 className=\"text-2xl font-bold mb-2\" style={{ color: effectiveThemeColor }}>{title}</h1>\n <p className=\"text-sm opacity-70\">{subTitle}</p>\n </div>\n\n {/* Charts */}\n <div className=\"space-y-6 mb-8\">\n {charts.map((chart: any, i: number) => (\n <div key={i} className=\"bg-white p-4 rounded-lg shadow-sm opacity-90\">\n <h4 className=\"font-medium mb-2 text-center\">{chart.title}</h4>\n {renderChart(chart, i)}\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between mt-auto pt-8 border-t border-border/40 border-dashed\">\n <div className=\"text-xs text-muted-foreground\">\n <p>Created by {author}</p>\n <p>{date}</p>\n </div>\n <div className=\"bg-white p-1 rounded\">\n <QRCode value={qrCode} size={64} bordered={false} />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * XCML 数据海报组件 (PosterCard)\n * \n * @description 生成可下载的数据海报,支持自定义主题、内嵌图表、二维码及背景图.\n */\nexport const XCMLPosterCard = withXCMLCard(PosterCardInner, {\n schema: posterCardSchema,\n skeleton: { rows: 4 }\n});\n","import React from 'react';\nimport { Tag, Typography } from 'antd';\nimport { CheckCircleFilled, CloseCircleFilled, LoadingOutlined, ClockCircleFilled } from '@ant-design/icons';\nimport { withXCMLCard } from '../../basic/withXCMLCard';\nimport { thoughtChainSchema } from './schema'\n\nconst { Text } = Typography;\n\n/**\n * 思维链步骤定义\n */\nexport interface XCMLThoughtStep {\n /** 步骤名称或工具名 */\n tool?: string\n /** 执行的具体动作 */\n action?: string\n /** 状态: 'success', 'failure', 'running', 'pending' */\n status: 'success' | 'failure' | 'running' | 'pending' | string\n /** 耗时描述,如 '1.2s' */\n duration?: string\n /** AI 的思考过程或备注 */\n thought?: string\n /** 执行结果,支持对象或字符串 */\n result?: any\n /** 错误信息 */\n error?: string\n}\n\n/**\n * 思维链组件属性定义\n */\nexport interface XCMLThoughtChainProps {\n /** 标题 */\n title?: string\n /** 步骤集合 */\n steps: XCMLThoughtStep[]\n}\n\nconst getStatusIcon = (status: string) => {\n switch (status) {\n case 'success': return <CheckCircleFilled className=\"text-success bg-card rounded-full relative z-10 shadow-sm\" />;\n case 'failure': return <CloseCircleFilled className=\"text-destructive bg-card rounded-full relative z-10 shadow-sm\" />;\n case 'running': return <LoadingOutlined className=\"text-primary bg-card rounded-full relative z-10\" />;\n default: return <ClockCircleFilled className=\"text-muted-foreground/40 bg-card rounded-full relative z-10\" />;\n }\n};\n\nconst getStatusLabel = (status: string) => {\n switch (status) {\n case 'success': return '成功';\n case 'failure': return '失败';\n case 'running': return '执行中';\n default: return status;\n }\n};\n\nconst getStatusColor = (status: string) => {\n switch (status) {\n case 'success': return 'success';\n case 'failure': return 'error';\n case 'running': return 'processing';\n default: return 'default';\n }\n};\n\n/**\n * XCML 思维链内部渲染逻辑\n */\nconst ThoughtChainInner: React.FC<XCMLThoughtChainProps> = (merged) => {\n const { steps = [] } = merged;\n\n return (\n <div className=\"relative pl-2 py-2\">\n {/* 连接线 */}\n <div className=\"absolute top-4 bottom-4 left-[15px] w-0.5 bg-gradient-to-b from-primary/10 via-primary/30 to-primary/10\" />\n \n {steps.map((step: any, index: number) => (\n <div key={index} className=\"relative flex mb-6 last:mb-0 group\">\n {/* 图标节点 */}\n <div className=\"mr-4 mt-0.5 text-lg transition-transform duration-300 group-hover:scale-110\">\n {getStatusIcon(step.status)}\n </div>\n \n {/* 内容区域 */}\n <div className=\"flex-1 min-w-0 bg-card rounded-xl p-3 border border-border/50 hover:border-primary/30 hover:shadow-md transition-all duration-300 group-hover:-translate-y-0.5\">\n {/* 头部:工具名 + 状态 + 耗时 */}\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-bold text-sm text-foreground\">{step.tool || `步骤 ${index + 1}`}</span>\n <Text type=\"secondary\" className=\"text-xs text-muted-foreground\">\n {step.action}\n </Text>\n </div>\n <div className=\"flex items-center gap-2\">\n {step.duration && (\n <span className=\"text-[10px] font-mono text-muted-foreground/60 bg-muted px-1.5 py-0.5 rounded-md\">\n {step.duration}\n </span>\n )}\n <Tag color={getStatusColor(step.status)} variant=\"filled\" className=\"mr-0 text-[10px] px-1.5 rounded-full border-none\">\n {getStatusLabel(step.status)}\n </Tag>\n </div>\n </div>\n\n {/* 思考过程 */}\n {step.thought && (\n <div className=\"mb-2 text-xs text-muted-foreground italic border-l-2 border-primary/30 pl-2 py-1 bg-primary/5 rounded-r-md whitespace-pre-wrap leading-normal\">\n {step.thought}\n </div>\n )}\n\n {/* 执行结果 (全展开) */}\n {step.result && (\n <div className=\"mt-2 text-xs\">\n <div className=\"bg-muted/30 border border-border/40 rounded-lg p-2 overflow-x-auto custom-scrollbar\">\n <pre className=\"m-0 whitespace-pre-wrap font-mono text-[11px] text-muted-foreground leading-relaxed\">\n {typeof step.result === 'string' ? step.result : JSON.stringify(step.result, null, 2)}\n </pre>\n </div>\n </div>\n )}\n \n {/* 错误信息 */}\n {step.error && (\n <div className=\"mt-2 text-xs text-destructive bg-destructive/5 p-2 rounded-lg border border-destructive/20 whitespace-pre-wrap\">\n 错误: {step.error}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\n/**\n * XCML 思维链组件 (ThoughtChain)\n * \n * @description 以时间轴形式分步展示 AI 的推理或执行过程。包含工具调用、思考逻辑及执行结果。\n */\nexport const XCMLThoughtChain = withXCMLCard(ThoughtChainInner, {\n schema: thoughtChainSchema,\n getTitle: (merged) => merged.title || \"思维链\",\n skeleton: true\n});\n","import React, { useState, useEffect } from 'react';\nimport { Button, App, InputNumber } from 'antd';\nimport { PlusOutlined, MinusOutlined, SaveOutlined, LoadingOutlined } from '@ant-design/icons';\nimport { withXCMLCard } from '../../basic/withXCMLCard';\nimport { xcmlBus, parseArrayProp } from '../../../core';\nimport Highlighter from 'react-highlight-words';\nimport { interactiveSummarySchema } from './schema';\n\n/**\n * 交互式汇总组件属性定义\n */\nexport interface XCMLInteractiveSummaryProps {\n /** 指标名称/标题 */\n label?: string\n /** 初始数值 */\n value?: string | number\n /** 调整步长,默认为 1 */\n step?: number\n /** 数值单位 */\n unit?: string\n /** 提交更新时的动作 ID,用于总线事件识别 */\n actionId?: string\n /** 背景趋势图数据点数组 */\n trendData?: number[]\n /** 汇总文本内容 */\n content?: string\n /** 文本中需要高亮的关键词数组,或逗号分隔的字符串 */\n highlightKeywords?: string[] | string\n}\n\n/**\n * XCML 交互式汇总内部渲染逻辑\n */\nconst InteractiveSummaryInner: React.FC<XCMLInteractiveSummaryProps> = (merged) => {\n const { message } = App.useApp();\n \n const { \n label = '报告摘要',\n value: initialValue = 0,\n step = 1,\n unit = '',\n actionId = 'update_summary',\n content = '',\n highlightKeywords: rawKeywords = [],\n } = merged;\n\n const [value, setValue] = useState<number>(Number(initialValue) || 0);\n const [loading, setLoading] = useState(false);\n\n // 当 initialValue 变化时同步状态\n useEffect(() => {\n setValue(Number(initialValue) || 0);\n }, [initialValue]);\n\n // 使用通用工具解析关键词数组\n const highlightKeywords = parseArrayProp(rawKeywords);\n\n const handleUpdate = (newValue: number) => {\n setValue(newValue);\n };\n\n const handleSubmit = async () => {\n setLoading(true);\n try {\n // Emit event to bus\n xcmlBus.emit('action', {\n type: actionId,\n payload: { value, label, ...merged }\n });\n \n // Simulate delay\n await new Promise(resolve => setTimeout(resolve, 800));\n \n message.success(`已更新 ${label} 设定值`);\n } catch (e) {\n message.error('提交失败');\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <div className=\"flex flex-col\">\n {content && (\n <div className=\"mb-4 text-muted-foreground leading-normal whitespace-pre-wrap\">\n <Highlighter\n highlightClassName=\"bg-primary/20 text-primary rounded px-1 font-medium\"\n searchWords={highlightKeywords}\n autoEscape={true}\n textToHighlight={content}\n />\n </div>\n )}\n \n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"text-muted-foreground mb-1 text-xs font-medium uppercase tracking-wider\">{label}</div>\n <div className=\"text-3xl font-black text-foreground flex items-baseline tracking-tight\">\n {value}\n <span className=\"text-sm font-semibold text-muted-foreground/60 ml-1.5\">{unit}</span>\n </div>\n </div>\n\n <div className=\"flex items-center space-x-1 bg-muted/40 p-1.5 rounded-xl border border-border/30 shadow-inner\">\n <Button \n icon={<MinusOutlined />} \n size=\"small\" \n shape=\"circle\"\n type=\"text\"\n className=\"hover:bg-background hover:text-primary hover:shadow-sm\"\n onClick={() => handleUpdate(value - Number(step))}\n disabled={loading}\n />\n <InputNumber\n value={value}\n onChange={(val) => handleUpdate(Number(val))}\n variant=\"borderless\"\n className=\"w-20 text-center bg-transparent font-bold text-foreground\"\n controls={false}\n disabled={loading}\n />\n <Button \n icon={<PlusOutlined />} \n size=\"small\" \n shape=\"circle\"\n type=\"text\"\n className=\"hover:bg-background hover:text-primary hover:shadow-sm\"\n onClick={() => handleUpdate(value + Number(step))}\n disabled={loading}\n />\n <div className=\"w-px h-4 bg-border/50 mx-1\" />\n <Button\n type=\"primary\"\n size=\"small\"\n shape=\"round\"\n icon={loading ? <LoadingOutlined /> : <SaveOutlined />}\n onClick={handleSubmit}\n loading={loading}\n className=\"ml-1 px-3 shadow-md shadow-primary/20 hover:shadow-primary/40 transition-all\"\n >\n 保存\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * XCML 交互式汇总组件 (InteractiveSummary)\n * \n * @description 带数值调整功能的汇总卡片。支持文本高亮、背景趋势图,并可通过按钮触发业务回调。\n */\nexport const XCMLInteractiveSummary = withXCMLCard(InteractiveSummaryInner, {\n schema: interactiveSummarySchema,\n getTitle: (merged) => merged.label,\n skeleton: { rows: 2 }\n});\n\n","import React from 'react'\nimport { XCMLMetricCard } from './MetricCard'\nimport { XCMLMiniKpiStrip } from './MiniKpiStrip'\nimport { XCMLSnapshotTable } from './SnapshotTable'\nimport { XCMLInsightCard } from './InsightCard'\nimport { XCMLPosterCard } from './PosterCard'\nimport { XCMLThoughtChain } from './ThoughtChain'\nimport { XCMLInteractiveSummary } from './InteractiveSummary'\n\nimport { createRenderersWithAliases } from '../../core/utils'\n\nexport interface ExtendedRenderersOptions {\n theme?: string\n}\n\nexport function createExtendedRenderers(options?: ExtendedRenderersOptions) {\n const themeProps = options?.theme ? { 'data-theme': options.theme } : {}\n \n const baseMap = {\n 'metric': (node: any, key: string | number) => <XCMLMetricCard key={key} node={node} {...themeProps} />,\n 'mini-kpi': (node: any, key: string | number) => <XCMLMiniKpiStrip key={key} node={node} {...themeProps} />,\n 'snapshot': (node: any, key: string | number) => <XCMLSnapshotTable key={key} node={node} {...themeProps} />,\n 'insight': (node: any, key: string | number) => <XCMLInsightCard key={key} node={node} {...themeProps} />,\n 'poster-card': (node: any, key: string | number) => <XCMLPosterCard key={key} node={node} {...themeProps} />,\n 'thought': (node: any, key: string | number) => <XCMLThoughtChain key={key} node={node} {...themeProps} />,\n 'summary': (node: any, key: string | number) => <XCMLInteractiveSummary key={key} node={node} {...themeProps} />,\n }\n\n const aliases = {\n 'metric': ['metric-card'],\n 'mini-kpi': ['mini-kpi-strip'],\n 'snapshot': ['snapshot-table', 'table-snapshot'],\n 'insight': ['insight-card'],\n 'poster-card': ['poster'],\n 'thought': ['thought-chain'],\n 'summary': ['interactive-summary'],\n }\n\n return createRenderersWithAliases(baseMap, aliases)\n}\n"],"mappings":"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","names":["parse","metricSchema","tableSchema","listSchema","cardSchema","tocSchema","lineChartSchema","columnChartSchema","pieChartSchema","dualAxesChartSchema","children","context","child","scaleKey","childScale","xScale","funnelChartSchema","STRATEGY_SCHEMAS","lineChartSchema","columnChartSchema","pieChartSchema","dualAxesChartSchema","funnelChartSchema","mergeStrategyProps","schemas","source","propMap","type","schema","prop","existing","def","types","props","chartSchema","insightCardSchema","interactiveSummarySchema","metricCardSchema","miniKpiStripSchema","posterCardSchema","snapshotTableSchema","thoughtChainSchema","COMMON_PROPS","RAW_SCHEMAS","metricSchema","tableSchema","chartSchema","listSchema","thoughtChainSchema","insightCardSchema","metricCardSchema","cardSchema","tocSchema","posterCardSchema","miniKpiStripSchema","interactiveSummarySchema","snapshotTableSchema","XCML_SCHEMAS","key","schema","parse","stringify","extractBaseStyles","props","theme","variant","size","className","style","useXCMLNode","node","schema","props","bodyData","rawData","e","trimmed","result","p","arrayProp","contentProp","styleKey","parseArrayProp","val","s","createRenderersWithAliases","baseMap","aliases","tagName","renderer","alias","renderXCML","key","XCML_SCHEMAS","validateXCMLNode","errors","prop","body","dp","useXCMLComponent","props","schema","node","outerStreamStatus","merged","useXCMLNode","streamStatus","isLoading","baseProps","normalizeTagName","tag","toXTag","toXCMLTag","XCMLEventBus","event","handler","payload","fn","id","type","xcmlBus","JSONC_CLEAN_REGEX","JSONC_BLOCK_CLEAN_REGEX","parseInlineData","text","format","trimmed","cleaned","e","yamlParsed","parse","sep","lines","line","headers","h","cols","obj","i","val","validateDataSchema","_component","data","normalizeNodeData","nodeType","schema","XCML_SCHEMAS","result","p","parsed","count","pVal","mergePropsAndBody","tagName","attrs","bodyData","options","finalProps","finalBody","preferBody","cleanBodyData","ensureArray","processedBodyData","key","combined","schemaProps","schemaBodyProps","resultBody","arrayPropName","keys","k","a","b","stringifyToXCML","node","rawProps","rawBody","allData","finalBodyData","attrStr","bodyStr","parseXCML","xcml","trimmedXCML","tagMatch","attrContent","tagEnd","isSelfClosing","props","attrRegex","attrMatch","bodyText","closeTag","closeTagIndex","openTagEndIndex","inQuote","char","toXCMLNodeFromElement","name","rawData","parseMarkdownList","processedAttrs","num","body","items","taskMatch","mark","title","status","listMatch","fixXCMLTagAttributes","match","regex","lastIndex","newContent","matchArr","openChar","closeChar","startIndex","valueStartIndex","balance","foundEnd","quoteBefore","preprocessXCML","md","knownTags","shortPrefixMatch","processedMd","knownTagsSet","len","nextLT","nextBT","nextPos","end","nextGT","c","j","isCloseTag","tagNameStart","endTagIndex","fullTag","normalizedTag","loadingTag","bodyContent","trimmedBody","processedBody","tagWithRaw","encodedBody","React","XMarkdown","Button","Modal","Tooltip","CodeOutlined","React","createContext","useContext","useState","useCallback","jsx","TOCItemsContext","TOCActionsContext","useTOCItems","useTOCActions","useTOC","items","register","unregister","TOCProvider","children","registry","setRegistry","counter","item","prev","next","existing","id","a","b","actions","clsx","twMerge","jsx","jsxs","XCMLMarkdown","props","content","stream","renderers","className","style","openLinksInNewTab","dompurifyConfig","enableHoverSource","theme","deferredContent","React","processedContent","knownTags","key","preprocessXCML","nodeCache","components","map","knownXTags","isXcmlPrefix","isXPrefix","tagName","renderer","domNode","cls","streamStatus","_node","_children","attrs","node","bodyText","rawData","e","collectText","type","toXCMLNodeFromElement","nodeWithStatus","rendered","ComponentWrapper","rest","code","c","hash","a","b","id","MermaidBlock","children","child","HeadingWrapper","level","register","unregister","useTOCActions","getText","text","slug","finalId","lastInfoRef","currentInfo","Tag","TOCProvider","XMarkdown","tag","hover","setHover","modalOpen","setModalOpen","handleMaximize","source","k","v","Tooltip","Button","CodeOutlined","Modal","textCache","collectText","children","buf","walk","nodes","n","result","MermaidBlock","React","code","theme","id","ref","m","elementId","svg","jsx","React","useMemo","Suspense","forwardRef","Plots","Skeleton","createContext","useContext","useEffect","useState","useMemo","useRef","XProvider","antdTheme","jsx","initialState","ThemeProviderContext","ThemeProvider","children","defaultTheme","controlledTheme","primaryColor","storageKey","scoped","className","style","props","internalTheme","setInternalTheme","theme","containerRef","root","r","g","presetThemes","systemTheme","value","newTheme","antDesignTheme","useTheme","context","COMMON_AXIS_STYLE","DARK_AXIS_STYLE","themeLight","themeDark","themeMap","getTheme","themeName","React","LineComponent","React","module","lineStrategy","lineChartSchema","props","newProps","React","ColumnComponent","React","module","columnStrategy","columnChartSchema","props","newProps","React","PieComponent","React","module","pieStrategy","pieChartSchema","props","newProps","firstData","numberKey","k","stringKey","React","DualAxesComponent","React","module","dualAxesStrategy","dualAxesChartSchema","props","newProps","data","dataFields","childrenValid","child","f","xField","numberFields","key","hasTopLevelData","hasChildrenData","rest","React","FunnelComponent","React","module","funnelStrategy","funnelChartSchema","props","newProps","data","firstItem","keys","k","validThemes","strategies","lineStrategy","columnStrategy","pieStrategy","dualAxesStrategy","funnelStrategy","getChartStrategy","type","React","Empty","Button","Result","jsx","deepMerge","target","source","result","key","sourceValue","targetValue","cleanPropsBySchema","props","schema","cleanedProps","allPropDefs","propDef","currentValue","buildConfig","type","data","theme","title","__native__","rest","base","config","DefaultEmptyPlaceholder","DefaultErrorPlaceholder","error","reset","React","Skeleton","clsx","twMerge","jsx","jsxs","XCMLCardWrapper","title","icon","children","_source","_summary","variant","theme","hoverable","className","domNode","streamStatus","node","label","value","footer","precision","layout","note","trend","trendValue","unit","prefix","wow","yoy","sentiment","highlights","citations","actions","steps","columns","rows","charts","data","subTitle","themeColor","backgroundImage","qrCode","author","date","rest","isPlain","finalTheme","rootClassName","jsx","withXCMLCard","Component","options","schema","getTitle","getIcon","getVariant","renderLoading","skeleton","WrappedComponent","React","props","ref","merged","baseProps","isLoading","streamStatus","useXCMLComponent","className","rest","rawTitle","title","icon","variant","hoverable","wrapperProps","XCMLCardWrapper","Skeleton","componentName","jsx","jsxs","createElement","toPascalCase","str","word","COMPONENT_MAP","lookupComponent","type","mappedName","PlotsMap","Plots","pascalName","ChartErrorBoundary","React","props","error","errorInfo","DefaultErrorPlaceholder","ChartInner","forwardRef","merged","ref","node","outerTheme","rest","globalTheme","useTheme","strategy","useMemo","getChartStrategy","ChartComponent","finalProps","finalTheme","antvThemeName","antvTheme","getTheme","chartData","rawConfig","cleaned","cleanPropsBySchema","chartSchema","transformed","buildConfig","hasTopLevelData","hasChildrenData","child","Suspense","Skeleton","DefaultEmptyPlaceholder","AntVChartLoader","withXCMLCard","XCMLChart","virtualNode","jsx","createAntVRenderers","options","theme","createRenderersWithAliases","node","key","AntVChartLoader","useMemo","ArrowUpOutlined","ArrowDownOutlined","Fragment","jsx","jsxs","Sparkline","data","color","min","range","width","height","points","d","i","x","y","MetricInner","merged","precision","layout","footer","value","note","trend","trendValue","displayTrendValue","useMemo","formatted","displayValue","numValue","isUp","isDown","hasSparkline","ArrowUpOutlined","ArrowDownOutlined","XCMLMetric","withXCMLCard","metricSchema","jsx","CardInner","merged","description","content","node","displayContent","XCMLMarkdown","XCMLCard","withXCMLCard","cardSchema","CheckCircleOutlined","MinusCircleOutlined","BorderOutlined","Fragment","jsx","jsxs","ListItem","item","layout","index","stripe","title","desc","value","status","type","CheckCircleOutlined","MinusCircleOutlined","BorderOutlined","ListInner","merged","header","footer","columns","items","listType","isGrid","gridCols","it","i","XCMLList","withXCMLCard","listSchema","React","jsx","TOCInner","items","useTOC","filteredItems","React","item","handleClick","e","id","el","XCMLTOC","withXCMLCard","tocSchema","merged","useMemo","Badge","Tooltip","InfoCircleOutlined","jsx","jsxs","Sparkline","data","color","finalColor","min","range","width","height","points","d","i","x","y","ProgressBar","value","percent","TableInner","merged","bordered","size","summary","columns","rows","mergedDataSource","rawRows","hasData","summaryRow","useMemo","result","col","values","r","val","v","sum","a","b","renderCell","row","numVal","status","Badge","paddingMap","padding","rowBaseClass","rowHoverClass","c","Tooltip","InfoCircleOutlined","j","XCMLTable","withXCMLCard","tableSchema","jsx","createBasicRenderers","options","themeProps","createRenderersWithAliases","node","key","XCMLMetric","XCMLCard","XCMLList","XCMLTOC","XCMLTable","ArrowUpOutlined","ArrowDownOutlined","MinusOutlined","CountUp","jsx","jsxs","renderTrend","val","trendLabel","isPositive","isZero","colorClass","Icon","ArrowUpOutlined","MinusOutlined","ArrowDownOutlined","MetricCardInner","merged","value","wow","yoy","unit","prefix","footer","precision","CountUp","XCMLMetricCard","withXCMLCard","metricCardSchema","useState","Row","Col","Line","jsx","jsxs","MiniKpiItem","item","isHovered","setIsHovered","useState","label","value","wow","trendData","config","val","idx","Line","MiniKpiStripInner","merged","items","span","Row","index","Col","XCMLMiniKpiStrip","withXCMLCard","miniKpiStripSchema","React","Table","CSVLink","DownloadOutlined","jsx","jsxs","SnapshotTableInner","merged","title","columns","rows","mergedDataSource","rawDataSource","dataSource","React","item","index","enhancedColumns","col","text","csvHeaders","c","CSVLink","DownloadOutlined","Table","_","XCMLSnapshotTable","withXCMLCard","snapshotTableSchema","Tag","Typography","Button","Highlighter","LinkOutlined","ThunderboltOutlined","jsx","jsxs","Title","Typography","EMOJI_MAP","SENTIMENT_COLORS","InsightCardInner","merged","content","rawHighlights","sentiment","rawCitations","rawActions","highlights","parseArrayProp","citations","actions","handleActionClick","action","xcmlBus","Highlighter","cite","idx","Tag","LinkOutlined","ThunderboltOutlined","Button","XCMLInsightCard","withXCMLCard","insightCardSchema","useRef","useState","Button","QRCode","Select","Space","DownloadOutlined","BgColorsOutlined","html2canvas","Column","Line","Pie","jsx","jsxs","THEMES","PosterCardInner","merged","title","subTitle","charts","qrCode","author","date","rawBackgroundImage","themeColor","backgroundImage","posterRef","useRef","currentTheme","setCurrentTheme","useState","effectiveThemeColor","effectiveBgColor","handleDownload","url","html2canvas","a","e","renderChart","chart","index","commonConfig","Column","Line","Pie","Space","Select","val","t","BgColorsOutlined","Button","DownloadOutlined","i","QRCode","XCMLPosterCard","withXCMLCard","posterCardSchema","Tag","Typography","CheckCircleFilled","CloseCircleFilled","LoadingOutlined","ClockCircleFilled","jsx","jsxs","Text","Typography","getStatusIcon","status","CheckCircleFilled","CloseCircleFilled","LoadingOutlined","ClockCircleFilled","getStatusLabel","getStatusColor","ThoughtChainInner","merged","steps","step","index","Tag","XCMLThoughtChain","withXCMLCard","thoughtChainSchema","useState","useEffect","Button","App","InputNumber","PlusOutlined","MinusOutlined","SaveOutlined","LoadingOutlined","Highlighter","jsx","jsxs","InteractiveSummaryInner","merged","message","App","label","initialValue","step","unit","actionId","content","rawKeywords","value","setValue","useState","loading","setLoading","useEffect","highlightKeywords","parseArrayProp","handleUpdate","newValue","Highlighter","Button","MinusOutlined","InputNumber","val","PlusOutlined","LoadingOutlined","SaveOutlined","xcmlBus","resolve","XCMLInteractiveSummary","withXCMLCard","interactiveSummarySchema","jsx","createExtendedRenderers","options","themeProps","createRenderersWithAliases","node","key","XCMLMetricCard","XCMLMiniKpiStrip","XCMLSnapshotTable","XCMLInsightCard","XCMLPosterCard","XCMLThoughtChain","XCMLInteractiveSummary"]}
|