Files
server-configs/siyuan/data/widgets/Kmind/js/2.js
2026-02-13 22:24:27 +08:00

145 lines
178 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{
/***/ "../simple-mind-map/src/plugins/FlowChartLine.js":
/*!*******************************************************!*\
!*** ../simple-mind-map/src/plugins/FlowChartLine.js ***!
\*******************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _svgdotjs_svg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @svgdotjs/svg.js */ \"../simple-mind-map/node_modules/@svgdotjs/svg.js/dist/svg.esm.js\");\n\n\n\n/**\n * 流程图连接线插件\n * 处理从连接点拖拽创建关联线的功能\n */\nclass FlowChartLine {\n constructor(opt) {\n this.mindMap = opt.mindMap;\n this.draw = this.mindMap.draw;\n this.isDragging = false;\n this.startNode = null;\n this.startPosition = null;\n this.tempLine = null;\n this.startPoint = {\n x: 0,\n y: 0\n };\n this.endPoint = {\n x: 0,\n y: 0\n };\n this.bindEvents();\n }\n\n /**\n * 绑定事件\n */\n bindEvents() {\n // 监听连接点拖拽开始事件\n this.mindMap.on('flowchart_connector_drag_start', this.handleDragStart.bind(this));\n // 监听鼠标移动事件\n this.mindMap.on('mousemove', this.handleMouseMove.bind(this));\n // 监听鼠标松开事件\n this.mindMap.on('mouseup', this.handleMouseUp.bind(this));\n // 监听节点mouseenter事件用于检测目标节点\n this.mindMap.on('node_mouseenter', this.handleNodeMouseEnter.bind(this));\n }\n\n /**\n * 处理拖拽开始\n */\n handleDragStart(data) {\n const {\n node,\n position,\n event\n } = data;\n\n // 只有流程图节点才能开始拖拽\n if (!node.nodeData.data.isFlowChart) return;\n this.isDragging = true;\n this.startNode = node;\n this.startPosition = position;\n\n // 获取连接点的绝对位置(在节点坐标系中)\n const connectorPos = node._flowChartConnector.getConnectorAbsolutePosition(position);\n if (!connectorPos) return;\n\n // 起始点就是连接点的位置在SVG坐标系中\n this.startPoint = {\n x: connectorPos.x,\n y: connectorPos.y\n };\n\n // 创建临时连接线\n this.createTempLine();\n\n // 阻止默认行为\n event.preventDefault();\n event.stopPropagation();\n }\n\n /**\n * 创建临时连接线\n */\n createTempLine() {\n this.tempLine = new _svgdotjs_svg_js__WEBPACK_IMPORTED_MODULE_1__[\"Path\"]().fill('none').stroke({\n color: '#2196f3',\n width: 2,\n dasharray: '5,5'\n }).css({\n 'pointer-events': 'none'\n });\n\n // 添加到关联线画布层,确保在正确的层级\n this.mindMap.associativeLineDraw.add(this.tempLine);\n this.tempLine.front(); // 确保在最前面\n this.updateTempLine(this.startPoint.x, this.startPoint.y);\n }\n\n /**\n * 更新临时连接线\n */\n updateTempLine(endX, endY) {\n if (!this.tempLine) return;\n const path = this.calculatePath(this.startPoint, {\n x: endX,\n y: endY\n });\n this.tempLine.plot(path);\n }\n\n /**\n * 计算路径\n */\n calculatePath(start, end) {\n // 对于流程图,使用正交路径的简化版本\n const path = [`M ${start.x} ${start.y}`];\n\n // 计算方向\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n\n // 简单的L形路径\n if (Math.abs(dx) > Math.abs(dy)) {\n // 水平方向优先\n const midX = start.x + dx / 2;\n path.push(`L ${midX} ${start.y}`);\n path.push(`L ${midX} ${end.y}`);\n path.push(`L ${end.x} ${end.y}`);\n } else {\n // 垂直方向优先\n const midY = start.y + dy / 2;\n path.push(`L ${start.x} ${midY}`);\n path.push(`L ${end.x} ${midY}`);\n path.push(`L ${end.x} ${end.y}`);\n }\n return path.join(' ');\n }\n\n /**\n * 处理鼠标移动\n */\n handleMouseMove(e) {\n if (!this.isDragging || !this.tempLine) return;\n\n // 先转换到容器坐标\n const {\n x: containerX,\n y: containerY\n } = this.mindMap.toPos(e.clientX, e.clientY);\n\n // 然后考虑画布的变换(缩放和平移)\n const transform = this.mindMap.draw.transform();\n const mousePoint = {\n x: (containerX - transform.translateX) / transform.scaleX,\n y: (containerY - transform.translateY) / transform.scaleY\n };\n\n // 检查是否靠近某个连接点(吸附功能)\n const snapResult = this.checkSnapToConnector(mousePoint, e.clientX, e.clientY);\n if (snapResult) {\n this.endPoint = snapResult.point;\n // 高亮目标连接点\n if (snapResult.connector) {\n snapResult.connector.animate(100).attr({\n opacity: 1,\n r: this.mindMap.opt.flowChartConnectorSize || 8\n });\n }\n } else {\n this.endPoint = mousePoint;\n // 取消所有连接点高亮\n this.unhighlightAllConnectors();\n }\n this.updateTempLine(this.endPoint.x, this.endPoint.y);\n }\n\n /**\n * 处理节点鼠标进入\n */\n handleNodeMouseEnter(node) {\n if (!this.isDragging) return;\n\n // 检查是否是流程图节点\n if (!node.nodeData.data.isFlowChart) return;\n\n // 不能连接到自己\n if (node.uid === this.startNode.uid) return;\n\n // 高亮目标节点的连接点\n if (node._flowChartConnector) {\n node._flowChartConnector.showConnectors();\n }\n }\n\n /**\n * 处理鼠标松开\n */\n handleMouseUp(e) {\n if (!this.isDragging) return;\n\n // 先转换坐标\n const {\n x: containerX,\n y: containerY\n } = this.mindMap.toPos(e.clientX, e.clientY);\n const transform = this.mindMap.draw.transform();\n const mousePoint = {\n x: (containerX - transform.translateX) / transform.scaleX,\n y: (containerY - transform.translateY) / transform.scaleY\n };\n\n // 检查是否可以吸附到连接点\n const snapResult = this.checkSnapToConnector(mousePoint, e.clientX, e.clientY);\n if (snapResult && snapResult.node) {\n // 创建实际的关联线,使用吸附的位置\n this.createAssociationLine(this.startNode, this.startPosition, snapResult.node, snapResult.position);\n } else {\n // 检查是否拖到空白处Phase 4.4 功能)\n const targetNode = this.findNodeAtPosition(e.clientX, e.clientY);\n if (!targetNode && this.mindMap.opt.enableDragCreateFlowChartNode !== false) {\n // 在空白处创建新的流程图节点\n this.createNewFlowChartNode(mousePoint);\n // 延迟清理让createNewFlowChartNode有机会使用startNode\n setTimeout(() => {\n this.cleanup();\n this.unhighlightAllConnectors();\n }, 200);\n return;\n }\n }\n\n // 正常情况下立即清理\n this.cleanup();\n this.unhighlightAllConnectors();\n }\n\n /**\n * 查找指定位置的节点\n */\n findNodeAtPosition(clientX, clientY) {\n // 使用更简单的方法利用当前鼠标下的hover节点\n let targetNode = null;\n\n // 遍历所有SVG元素查找包含smm-node类的元素\n const elements = document.elementsFromPoint(clientX, clientY);\n for (let element of elements) {\n // 查找包含节点类的SVG组元素\n const nodeGroup = element.closest('.smm-node');\n if (nodeGroup) {\n // 尝试从DOM元素获取存储的节点引用\n // 很多库会将节点实例存储在DOM元素上\n if (nodeGroup._node) {\n targetNode = nodeGroup._node;\n break;\n }\n\n // 如果没有直接引用遍历所有节点查找匹配的DOM元素\n const allNodes = [];\n\n // 收集所有节点\n const collectNodes = node => {\n if (!node) return;\n allNodes.push(node);\n if (node.children && node.children.length > 0) {\n node.children.forEach(child => collectNodes(child));\n }\n };\n\n // 处理多根模式\n if (this.mindMap.renderer.renderTree) {\n if (Array.isArray(this.mindMap.renderer.renderTree)) {\n // 多根模式\n this.mindMap.renderer.renderTree.forEach(root => {\n if (root && root._node) {\n collectNodes(root._node);\n }\n });\n } else if (this.mindMap.renderer.root) {\n // 单根模式 - 使用渲染后的根节点\n collectNodes(this.mindMap.renderer.root);\n }\n }\n\n // 查找匹配的节点\n for (let node of allNodes) {\n if (node.group && node.group.node === nodeGroup) {\n targetNode = node;\n break;\n }\n }\n if (targetNode) break;\n }\n }\n return targetNode;\n }\n\n /**\n * 检查是否可以吸附到连接点\n */\n checkSnapToConnector(mousePoint, clientX, clientY) {\n const snapThreshold = 20; // 吸附阈值(像素)\n\n // 查找鼠标下的节点\n const targetNode = this.findNodeAtPosition(clientX, clientY);\n if (targetNode && targetNode.nodeData.data.isFlowChart && targetNode.uid !== this.startNode.uid && targetNode._flowChartConnector) {\n // 获取所有连接点位置\n const positions = ['top', 'right', 'bottom', 'left'];\n let nearestConnector = null;\n let nearestDistance = Infinity;\n let nearestPoint = null;\n let nearestPosition = null;\n positions.forEach(position => {\n const connector = targetNode._flowChartConnector.getConnectorByPosition(position);\n if (!connector) return;\n const connectorPos = targetNode._flowChartConnector.getConnectorAbsolutePosition(position);\n if (!connectorPos) return;\n\n // 计算距离\n const distance = Math.sqrt(Math.pow(connectorPos.x - mousePoint.x, 2) + Math.pow(connectorPos.y - mousePoint.y, 2));\n if (distance < snapThreshold && distance < nearestDistance) {\n nearestDistance = distance;\n nearestConnector = connector;\n nearestPoint = connectorPos;\n nearestPosition = position;\n }\n });\n if (nearestConnector) {\n return {\n point: nearestPoint,\n connector: nearestConnector,\n node: targetNode,\n position: nearestPosition\n };\n }\n }\n return null;\n }\n\n /**\n * 取消所有连接点高亮\n */\n unhighlightAllConnectors() {\n // 遍历所有节点,取消连接点高亮\n const allNodes = [];\n const collectNodes = node => {\n if (!node) return;\n allNodes.push(node);\n if (node.children && node.children.length > 0) {\n node.children.forEach(child => collectNodes(child));\n }\n };\n if (this.mindMap.renderer.renderTree) {\n if (Array.isArray(this.mindMap.renderer.renderTree)) {\n this.mindMap.renderer.renderTree.forEach(root => {\n if (root && root._node) collectNodes(root._node);\n });\n } else if (this.mindMap.renderer.root) {\n collectNodes(this.mindMap.renderer.root);\n }\n }\n allNodes.forEach(node => {\n if (node._flowChartConnector) {\n node._flowChartConnector.hideConnectors();\n }\n });\n }\n\n /**\n * 找到最近的连接点\n */\n findNearestConnector(node, point) {\n if (!node._flowChartConnector) return null;\n let minDistance = Infinity;\n let nearestPosition = null;\n const positions = ['top', 'right', 'bottom', 'left'];\n positions.forEach(position => {\n const connectorPos = node._flowChartConnector.getConnectorAbsolutePosition(position);\n if (!connectorPos) return;\n const distance = Math.sqrt(Math.pow(connectorPos.x - point.x, 2) + Math.pow(connectorPos.y - point.y, 2));\n if (distance < minDistance) {\n minDistance = distance;\n nearestPosition = position;\n }\n });\n return nearestPosition;\n }\n\n /**\n * 创建关联线\n */\n createAssociationLine(startNode, startPosition, endNode, endPosition) {\n // 检查参数有效性\n if (!startNode || !endNode) {\n console.warn('createAssociationLine: 无效的节点参数', startNode, endNode);\n return;\n }\n\n // 使用现有的关联线功能\n if (this.mindMap.associativeLine) {\n // 先添加关联线\n this.mindMap.associativeLine.addLine(startNode, endNode);\n\n // 获取当前的关联线目标数组\n const targets = startNode.getData('associativeLineTargets') || [];\n const targetIndex = targets.findIndex(t => t === endNode.getData('uid'));\n if (targetIndex !== -1) {\n // 获取或创建关联线点位数组\n const associativeLinePoint = startNode.getData('associativeLinePoint') || [];\n\n // 确保数组长度足够\n while (associativeLinePoint.length <= targetIndex) {\n associativeLinePoint.push({});\n }\n\n // 设置该关联线的连接点位置\n associativeLinePoint[targetIndex] = {\n startPoint: {\n dir: startPosition,\n range: 0 // range 是偏移量0 表示中心位置\n },\n endPoint: {\n dir: endPosition,\n range: 0 // range 是偏移量0 表示中心位置\n }\n };\n\n // 更新节点数据\n this.mindMap.execCommand('SET_NODE_DATA', startNode, {\n associativeLinePoint\n });\n\n // 立即重新渲染关联线以应用新的位置\n setTimeout(() => {\n this.mindMap.associativeLine.renderAllLines();\n }, 0);\n }\n\n // 触发事件\n this.mindMap.emit('flowchart_line_created', {\n startNode,\n startPosition,\n endNode,\n endPosition\n });\n }\n }\n\n /**\n * 创建新的流程图节点\n */\n createNewFlowChartNode(position) {\n // 默认创建一个处理节点\n const nodeType = 'process';\n const newNodeData = {\n data: {\n text: '新节点',\n isFlowChart: true,\n flowchart: {\n nodeType: nodeType\n },\n customLeft: position.x - 50,\n // 居中\n customTop: position.y - 25\n },\n children: []\n };\n\n // 保存起始节点和位置,避免在异步回调中丢失\n const sourceNode = this.startNode;\n const sourcePosition = this.startPosition;\n\n // 使用正确的 addRootNode 方法,传入回调函数\n this.mindMap.addRootNode(newNodeData, -1, createdNode => {\n if (createdNode) {\n // 根据拖拽方向决定连接点\n const dx = position.x - this.startPoint.x;\n const dy = position.y - this.startPoint.y;\n let targetPosition = 'left';\n if (Math.abs(dx) > Math.abs(dy)) {\n targetPosition = dx > 0 ? 'left' : 'right';\n } else {\n targetPosition = dy > 0 ? 'top' : 'bottom';\n }\n\n // 稍微延迟以确保节点完全渲染并初始化\n setTimeout(() => {\n // 确保节点已经完全初始化\n if (createdNode && createdNode.getData) {\n // 创建关联线\n this.createAssociationLine(sourceNode, sourcePosition, createdNode, targetPosition);\n\n // 激活新节点以便编辑\n createdNode.active();\n\n // 触发节点创建事件\n this.mindMap.emit('flowchart_node_created', {\n node: createdNode,\n fromNode: sourceNode,\n position: position\n });\n } else {\n console.warn('新创建的节点尚未完全初始化');\n }\n }, 100); // 增加延迟时间\n }\n });\n }\n\n /**\n * 清理临时元素\n */\n cleanup() {\n if (this.tempLine) {\n this.tempLine.remove();\n this.tempLine = null;\n }\n this.isDragging = false;\n this.startNode = null;\n this.startPosition = null;\n this.startPoint = {\n x: 0,\n y: 0\n };\n this.endPoint = {\n x: 0,\n y: 0\n };\n }\n\n /**\n * 销毁插件\n */\n destroy() {\n this.cleanup();\n this.mindMap.off('flowchart_connector_drag_start', this.handleDragStart);\n this.mindMap.off('mousemove', this.handleMouseMove);\n this.mindMap.off('mouseup', this.handleMouseUp);\n this.mindMap.off('node_mouseenter', this.handleNodeMouseEnter);\n }\n}\n\n// 注册插件\nFlowChartLine.pluginName = 'flowChartLine';\n/* harmony default export */ __webpack_exports__[\"default\"] = (FlowChartLine);\n\n//# sourceURL=webpack:///../simple-mind-map/src/plugins/FlowChartLine.js?");
/***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=script&lang=js":
/*!*******************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=script&lang=js ***!
\*******************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom-exception.stack.js */ \"./node_modules/core-js/modules/web.dom-exception.stack.js\");\n/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/web.url-search-params.delete.js */ \"./node_modules/core-js/modules/web.url-search-params.delete.js\");\n/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/web.url-search-params.has.js */ \"./node_modules/core-js/modules/web.url-search-params.has.js\");\n/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/web.url-search-params.size.js */ \"./node_modules/core-js/modules/web.url-search-params.size.js\");\n/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utils_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/utils/logger */ \"./src/utils/logger/index.ts\");\n/* harmony import */ var simple_mind_map__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! simple-mind-map */ \"../simple-mind-map/index.js\");\n/* harmony import */ var simple_mind_map_src_plugins_MiniMap_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! simple-mind-map/src/plugins/MiniMap.js */ \"../simple-mind-map/src/plugins/MiniMap.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Watermark_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! simple-mind-map/src/plugins/Watermark.js */ \"../simple-mind-map/src/plugins/Watermark.js\");\n/* harmony import */ var simple_mind_map_src_plugins_KeyboardNavigation_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! simple-mind-map/src/plugins/KeyboardNavigation.js */ \"../simple-mind-map/src/plugins/KeyboardNavigation.js\");\n/* harmony import */ var simple_mind_map_src_plugins_ExportPDF_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! simple-mind-map/src/plugins/ExportPDF.js */ \"../simple-mind-map/src/plugins/ExportPDF.js\");\n/* harmony import */ var simple_mind_map_src_plugins_ExportXMind_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! simple-mind-map/src/plugins/ExportXMind.js */ \"../simple-mind-map/src/plugins/ExportXMind.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Export_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! simple-mind-map/src/plugins/Export.js */ \"../simple-mind-map/src/plugins/Export.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Drag_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! simple-mind-map/src/plugins/Drag.js */ \"../simple-mind-map/src/plugins/Drag.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Select_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! simple-mind-map/src/plugins/Select.js */ \"../simple-mind-map/src/plugins/Select.js\");\n/* harmony import */ var simple_mind_map_src_plugins_AssociativeLine_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! simple-mind-map/src/plugins/AssociativeLine.js */ \"../simple-mind-map/src/plugins/AssociativeLine.js\");\n/* harmony import */ var simple_mind_map_src_plugins_TouchEvent_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! simple-mind-map/src/plugins/TouchEvent.js */ \"../simple-mind-map/src/plugins/TouchEvent.js\");\n/* harmony import */ var simple_mind_map_src_plugins_NodeImgAdjust_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! simple-mind-map/src/plugins/NodeImgAdjust.js */ \"../simple-mind-map/src/plugins/NodeImgAdjust.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Search_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! simple-mind-map/src/plugins/Search.js */ \"../simple-mind-map/src/plugins/Search.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Painter_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! simple-mind-map/src/plugins/Painter.js */ \"../simple-mind-map/src/plugins/Painter.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Formula_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! simple-mind-map/src/plugins/Formula.js */ \"../simple-mind-map/src/plugins/Formula.js\");\n/* harmony import */ var simple_mind_map_src_plugins_RainbowLines_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! simple-mind-map/src/plugins/RainbowLines.js */ \"../simple-mind-map/src/plugins/RainbowLines.js\");\n/* harmony import */ var simple_mind_map_src_plugins_Demonstrate_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! simple-mind-map/src/plugins/Demonstrate.js */ \"../simple-mind-map/src/plugins/Demonstrate.js\");\n/* harmony import */ var simple_mind_map_src_plugins_OuterFrame_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! simple-mind-map/src/plugins/OuterFrame.js */ \"../simple-mind-map/src/plugins/OuterFrame.js\");\n/* harmony import */ var simple_mind_map_src_plugins_MindMapLayoutPro_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! simple-mind-map/src/plugins/MindMapLayoutPro.js */ \"../simple-mind-map/src/plugins/MindMapLayoutPro.js\");\n/* harmony import */ var simple_mind_map_plugin_themes__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! simple-mind-map-plugin-themes */ \"./node_modules/simple-mind-map-plugin-themes/index.js\");\n/* harmony import */ var _simple_mind_map_plugin_themes_themeList__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @/../../simple-mind-map-plugin-themes/themeList */ \"../simple-mind-map-plugin-themes/themeList.js\");\n/* harmony import */ var simple_mind_map_src_plugins_FlowChartLine_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! simple-mind-map/src/plugins/FlowChartLine.js */ \"../simple-mind-map/src/plugins/FlowChartLine.js\");\n/* harmony import */ var simple_mind_map_src_parse_markdown_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! simple-mind-map/src/parse/markdown.js */ \"../simple-mind-map/src/parse/markdown.js\");\n\n\n\n\n\n\n// 导入日志系统\n\n\n// 导入 MindMap 核心库和插件\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst defaultMarkdownTestText = ['# 一级标题A', '', '简单说明段落。', '', '## 二级标题A-1', '', '- 列表项1', '- 列表项2', '', '### 三级标题A-1-1', '', '# 一级标题B', '', '## 二级标题B-1'].join('\\n');\n\n// 注册插件\nsimple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"].usePlugin(simple_mind_map_src_plugins_MiniMap_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Watermark_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Drag_js__WEBPACK_IMPORTED_MODULE_14__[\"default\"]).usePlugin(simple_mind_map_src_plugins_KeyboardNavigation_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"]).usePlugin(simple_mind_map_src_plugins_ExportPDF_js__WEBPACK_IMPORTED_MODULE_11__[\"default\"]).usePlugin(simple_mind_map_src_plugins_ExportXMind_js__WEBPACK_IMPORTED_MODULE_12__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Export_js__WEBPACK_IMPORTED_MODULE_13__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Select_js__WEBPACK_IMPORTED_MODULE_15__[\"default\"]).usePlugin(simple_mind_map_src_plugins_AssociativeLine_js__WEBPACK_IMPORTED_MODULE_16__[\"default\"]).usePlugin(simple_mind_map_src_plugins_NodeImgAdjust_js__WEBPACK_IMPORTED_MODULE_18__[\"default\"]).usePlugin(simple_mind_map_src_plugins_TouchEvent_js__WEBPACK_IMPORTED_MODULE_17__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Search_js__WEBPACK_IMPORTED_MODULE_19__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Painter_js__WEBPACK_IMPORTED_MODULE_20__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Formula_js__WEBPACK_IMPORTED_MODULE_21__[\"default\"]).usePlugin(simple_mind_map_src_plugins_RainbowLines_js__WEBPACK_IMPORTED_MODULE_22__[\"default\"]).usePlugin(simple_mind_map_src_plugins_Demonstrate_js__WEBPACK_IMPORTED_MODULE_23__[\"default\"]).usePlugin(simple_mind_map_src_plugins_OuterFrame_js__WEBPACK_IMPORTED_MODULE_24__[\"default\"]).usePlugin(simple_mind_map_src_plugins_MindMapLayoutPro_js__WEBPACK_IMPORTED_MODULE_25__[\"default\"]).usePlugin(simple_mind_map_src_plugins_FlowChartLine_js__WEBPACK_IMPORTED_MODULE_28__[\"default\"]);\n\n// 注册主题\nsimple_mind_map_plugin_themes__WEBPACK_IMPORTED_MODULE_26__[\"default\"].init(simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Test',\n data() {\n return {\n mindMap: null,\n isMultiRoot: false,\n rootCount: 1,\n associationCount: 0,\n isAssociativeMode: false,\n activeTab: 'data',\n currentData: null,\n associationsData: [],\n operationLogs: [],\n // 主题相关\n selectedRootIndex: null,\n selectedTheme: '',\n rootsInfo: [],\n // 布局相关\n selectedLayoutRootIndex: null,\n selectedLayout: '',\n // 大括号连接线相关\n braceCurveSize: 12,\n lineTestLayout: 'mindMap',\n availableLayouts: [{\n label: '逻辑结构图',\n value: 'logicalStructure'\n }, {\n label: '逻辑结构图(向左)',\n value: 'logicalStructureLeft'\n }, {\n label: '思维导图',\n value: 'mindMap'\n }, {\n label: '组织结构图',\n value: 'organizationStructure'\n }, {\n label: '目录组织图',\n value: 'catalogOrganization'\n }, {\n label: '时间轴',\n value: 'timeline'\n }, {\n label: '时间轴2',\n value: 'timeline2'\n }, {\n label: '鱼骨图',\n value: 'fishbone'\n }, {\n label: '竖向时间轴',\n value: 'verticalTimeline'\n }, {\n label: '径向布局',\n value: 'radial'\n }],\n availableThemes: ['default', 'classic', 'classic2', 'classic3', 'classic4', 'classic5', 'classic6', 'classic7', 'classic8', 'classic9', 'classic10', 'dark', 'dark2', 'dark3', 'dark4', 'freshGreen', 'freshBlue', 'freshRed', 'freshPurple', 'freshPink', 'freshYellow'],\n // 主题预览图生成相关\n themeGeneratorDialogVisible: false,\n previewMindMap: null,\n previewMindMapEl: null,\n allThemes: [],\n generatedSVGs: [],\n generatedCount: 0,\n currentThemeName: '',\n isGenerating: false,\n // 压缩质量设置\n webpQuality: 0.8,\n // 默认80%质量\n jpgQuality: 0.85,\n // 默认85%质量\n // 布局预览图生成相关\n layoutGeneratorDialogVisible: false,\n allLayouts: [],\n generatedLayoutSVGs: [],\n generatedLayoutCount: 0,\n currentLayoutName: '',\n isGeneratingLayouts: false,\n layoutWebpQuality: 0.8,\n layoutJpgQuality: 0.85,\n layoutPreviewMindMap: null,\n layoutPreviewMindMapEl: null,\n // Markdown 测试相关\n markdownTestText: defaultMarkdownTestText\n };\n },\n computed: {\n formattedData() {\n return this.currentData ? JSON.stringify(this.currentData, null, 2) : '暂无数据';\n }\n },\n mounted() {\n // 自动初始化\n this.$nextTick(() => {\n this.initMindMap();\n });\n },\n beforeDestroy() {\n if (this.mindMap) {\n this.mindMap.destroy();\n }\n },\n methods: {\n // 添加操作日志\n addLog(message) {\n this.operationLogs.unshift({\n time: new Date().toLocaleTimeString(),\n message\n });\n // 保持最多20条日志\n if (this.operationLogs.length > 20) {\n this.operationLogs = this.operationLogs.slice(0, 20);\n }\n },\n // 初始化思维导图\n initMindMap() {\n if (this.mindMap) {\n this.mindMap.destroy();\n }\n try {\n this.mindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: this.$refs.mindMapContainer,\n data: this.getMultiRootData(),\n // 默认加载多根数据\n layout: 'logicalStructure',\n theme: 'classic7',\n fit: true,\n nodeTextEditZIndex: 1000,\n nodeNoteTooltipZIndex: 1000,\n // 启用多根节点相关配置\n enableDblclickCreateRootNode: true,\n dragToEmptySpaceCreateRootTime: 2000,\n // 允许根节点收起展开\n allowRootNodeCollapse: true\n });\n this.addLog('思维导图初始化成功');\n this.bindEvents();\n this.updateAllInfo();\n } catch (error) {\n console.error('思维导图初始化失败:', error);\n this.addLog('初始化失败: ' + error.message);\n }\n },\n // 使用旧的 markdown 解析方法(单根,只取第一个顶层节点)\n parseMarkdownOld() {\n if (!this.mindMap) return;\n const md = this.markdownTestText || '';\n const oldRoot = simple_mind_map_src_parse_markdown_js__WEBPACK_IMPORTED_MODULE_29__[\"default\"].transformMarkdownTo(md);\n if (!oldRoot) {\n this.$message.warning('旧解析结果为空(可能没有有效的标题)');\n return;\n }\n this.mindMap.setData(oldRoot);\n this.mindMap.view.fit();\n this.addLog('使用旧 Markdown 解析结果渲染导图');\n },\n // 使用新的 markdown 解析方法(以固定根节点文本“测试文档”为根)\n parseMarkdownNew() {\n if (!this.mindMap) return;\n const md = this.markdownTestText || '';\n const newRoot = simple_mind_map_src_parse_markdown_js__WEBPACK_IMPORTED_MODULE_29__[\"default\"].transformMarkdownToNodeTree(md, {\n rootText: '测试文档'\n });\n if (!newRoot) {\n this.$message.warning('新解析结果为空');\n return;\n }\n this.mindMap.setData(newRoot);\n this.mindMap.view.fit();\n this.addLog('使用新 Markdown 解析结果渲染导图(根节点为“测试文档”)');\n },\n // 触发选择 markdown 文件\n triggerMarkdownFileSelect() {\n const input = this.$refs.markdownFileInput;\n if (input && input.click) {\n input.click();\n }\n },\n // 处理测试面板中导入的 markdown 文件\n handleMarkdownFileChange(e) {\n const input = e.target;\n const file = input.files && input.files[0];\n if (!file) return;\n const reader = new FileReader();\n reader.readAsText(file);\n reader.onload = evt => {\n this.markdownTestText = evt.target.result || '';\n this.$message.success('已从文件加载 Markdown 到输入框');\n this.addLog(`从文件导入 Markdown${file.name}`);\n };\n reader.onerror = err => {\n console.error('读取 Markdown 文件失败:', err);\n this.$message.error('读取 Markdown 文件失败');\n };\n // 重置 input避免选择同一文件不触发 change\n input.value = '';\n },\n // 绑定事件\n bindEvents() {\n // 基础事件\n this.mindMap.on('node_active', (node, activeNodeList) => {\n if (node && node.getData) {\n this.addLog(`激活节点: ${node.getData('text')}`);\n } else if (activeNodeList && activeNodeList.length === 0) {\n this.addLog('清除所有激活节点');\n } else if (!node) {\n this.addLog('激活节点已清除');\n } else {\n this.addLog('激活节点: 数据异常');\n }\n });\n this.mindMap.on('data_change', () => {\n this.updateAllInfo();\n });\n this.mindMap.on('node_created', node => {\n if (node && node.getData) {\n this.addLog(`创建节点: ${node.getData('text')}`);\n } else {\n this.addLog('创建节点: 数据异常');\n }\n });\n this.mindMap.on('node_dragged', node => {\n if (node && node.getData) {\n this.addLog(`拖拽节点: ${node.getData('text')}`);\n } else {\n this.addLog('拖拽节点: 数据异常');\n }\n });\n\n // 关联线事件\n this.mindMap.on('associative_line_click', (path, clickPath, fromNode, toNode) => {\n try {\n const fromText = fromNode && fromNode.getData ? fromNode.getData('text') : '未知';\n const toText = toNode && toNode.getData ? toNode.getData('text') : '未知';\n this.addLog(`点击关联线: ${fromText} -> ${toText}`);\n } catch (error) {\n console.warn('关联线点击事件处理错误:', error);\n this.addLog('点击关联线: 数据异常');\n }\n });\n this.mindMap.on('associative_line_deactivate', () => {\n this.addLog(`关联线取消激活`);\n });\n\n // 监听数据变化来检测关联线的增删\n this.mindMap.on('data_change', () => {\n this.updateAssociationsData();\n });\n\n // 监听关联线创建状态变化\n this.mindMap.on('draw_click', () => {\n // 当点击空白处时,如果正在创建关联线,则取消\n if (this.isAssociativeMode && this.mindMap.associativeLine && !this.mindMap.associativeLine.isCreatingLine) {\n this.isAssociativeMode = false;\n this.addLog('退出关联线创建模式');\n }\n });\n },\n // 获取单根节点测试数据\n getSingleRootData() {\n return {\n data: {\n text: 'A'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }]\n }, {\n data: {\n text: 'A2'\n },\n children: [{\n data: {\n text: 'A2-1'\n }\n }, {\n data: {\n text: 'A2-2'\n }\n }]\n }]\n };\n },\n // 获取多根节点测试数据\n getMultiRootData() {\n return {\n multiRoot: true,\n roots: [{\n data: {\n text: 'A',\n layout: 'logicalStructure',\n theme: 'classic7'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }]\n }, {\n data: {\n text: 'A2'\n }\n }]\n }, {\n data: {\n text: 'B',\n layout: 'mindMap',\n theme: 'dark2'\n },\n children: [{\n data: {\n text: 'B1'\n },\n children: [{\n data: {\n text: 'B1-1'\n }\n }, {\n data: {\n text: 'B1-2'\n }\n }]\n }, {\n data: {\n text: 'B2'\n }\n }, {\n data: {\n text: 'B3'\n }\n }]\n }, {\n data: {\n text: 'C',\n theme: 'freshGreen'\n },\n children: [{\n data: {\n text: 'C1'\n }\n }, {\n data: {\n text: 'C2'\n }\n }, {\n data: {\n text: 'C3'\n }\n }]\n }]\n };\n },\n // 基础操作方法\n loadSingleRoot() {\n if (!this.mindMap) return;\n this.mindMap.setData(this.getSingleRootData());\n this.addLog('加载单根节点数据');\n },\n loadMultiRoot() {\n if (!this.mindMap) return;\n this.mindMap.setData(this.getMultiRootData());\n this.addLog('加载多根节点数据');\n },\n toggleMultiRootMode() {\n if (!this.mindMap) return;\n const currentMode = this.mindMap.isMultiRoot;\n this.mindMap.setMultiRootMode(!currentMode);\n this.addLog(`切换到${!currentMode ? '多根' : '单根'}节点模式`);\n },\n addNewRoot() {\n if (!this.mindMap) return;\n const rootCount = this.mindMap.getRootNodes().length;\n const letter = String.fromCharCode(65 + rootCount); // A=65, B=66, C=67...\n this.mindMap.addRootNode({\n data: {\n text: letter,\n layout: rootCount % 2 === 0 ? 'logicalStructure' : 'mindMap'\n },\n children: [{\n data: {\n text: `${letter}1`\n }\n }, {\n data: {\n text: `${letter}2`\n }\n }]\n });\n this.addLog(`添加新根节点 ${letter}`);\n },\n removeLastRoot() {\n if (!this.mindMap) return;\n const roots = this.mindMap.getRootNodes();\n if (roots.length > 1) {\n this.mindMap.removeRootNode(roots.length - 1);\n this.addLog('删除最后一个根节点');\n } else {\n this.$message.warning('至少需要保留一个根节点');\n }\n },\n addRootWithCustomPosition() {\n if (!this.mindMap) return;\n const rootCount = this.mindMap.getRootNodes().length;\n const letter = String.fromCharCode(65 + rootCount);\n this.mindMap.addRootNode({\n data: {\n text: letter,\n layout: 'mindMap',\n customLeft: 100 + rootCount * 50,\n customTop: 100 + rootCount * 50\n },\n children: [{\n data: {\n text: `${letter}1`\n }\n }]\n });\n this.addLog(`添加自定义位置根节点 ${letter}`);\n },\n // 关联线操作方法\n enterAssociativeMode() {\n if (!this.mindMap || !this.mindMap.associativeLine) {\n this.$message.error('关联线插件未启用');\n return;\n }\n\n // 先激活一个节点,然后创建关联线\n const activeNodes = this.mindMap.renderer.activeNodeList;\n if (activeNodes.length === 0) {\n this.$message.warning('请先选择一个起始节点');\n return;\n }\n this.mindMap.associativeLine.createLineFromActiveNode();\n this.isAssociativeMode = true;\n this.addLog('进入关联线创建模式');\n this.$message.info('现在请点击目标节点创建关联线按ESC取消');\n\n // 定时检查关联线创建状态\n this.checkAssociativeLineStatus();\n },\n createCrossRootAssociation() {\n if (!this.mindMap.isMultiRoot) {\n this.$message.warning('请先切换到多根模式');\n return;\n }\n this.enterAssociativeMode();\n this.$message.info('现在可以在不同根节点之间创建关联线');\n },\n showAllAssociations() {\n if (!this.mindMap || !this.mindMap.associativeLine) return;\n const lineList = this.mindMap.associativeLine.lineList;\n this.addLog(`显示所有关联线,共 ${lineList.length} 条`);\n this.updateAssociationsData();\n },\n clearAllAssociations() {\n if (!this.mindMap || !this.mindMap.associativeLine) return;\n this.mindMap.associativeLine.removeAllLines();\n this.addLog('清除所有关联线');\n this.updateAssociationsData();\n },\n // 日志系统测试方法\n testLoggerDebug() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].debug('test', 'Debug 日志测试消息', {\n timestamp: Date.now(),\n testData: '这是 DEBUG 级别的测试数据'\n });\n this.addLog('发送了 DEBUG 日志');\n },\n testLoggerInfo() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].info('test', 'Info 日志测试消息', {\n user: 'TestUser',\n action: '点击测试按钮',\n details: '这是 INFO 级别的测试'\n });\n this.addLog('发送了 INFO 日志');\n },\n testLoggerWarn() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].warn('test', 'Warning 日志测试消息', {\n warning: '这是一个警告',\n level: 'medium',\n suggestion: '建议检查配置'\n });\n this.addLog('发送了 WARN 日志');\n },\n testLoggerError() {\n _utils_logger__WEBPACK_IMPORTED_MODULE_6__[\"logger\"].error('test', 'Error 日志测试消息', {\n error: new Error('模拟错误'),\n code: 'TEST_ERROR',\n message: '这是 ERROR 级别的测试'\n });\n this.addLog('发送了 ERROR 日志');\n },\n // 测试可点击链接格式\n testClickableLinks() {\n console.log('========== 测试可点击链接格式 ==========');\n\n // 测试各种格式\n const formats = ['webpack-internal:///./src/pages/test.vue:1150:5', 'webpack-internal:///node_modules/vue/dist/vue.js:100:10', 'webpack:///src/pages/test.vue:1150:5', 'webpack://kmind-plugin/src/pages/test.vue:1150:5', 'webpack://kmind-plugin/./src/pages/test.vue:1150:5', 'file:///Users/test/project/src/test.js:10:5', 'http://localhost:8080/src/test.js:10:5'];\n console.log('直接输出路径:');\n formats.forEach(url => {\n console.log(` at testFunction (${url})`);\n });\n console.log('\\n使用 console.trace:');\n console.trace('这会生成一个可点击的堆栈跟踪');\n console.log('\\n使用 Error.stack:');\n try {\n throw new Error('测试错误');\n } catch (e) {\n console.log(e.stack);\n }\n this.addLog('测试了多种链接格式,查看控制台');\n },\n // 检测运行环境\n detectEnvironment() {\n const isElectron = !!(typeof window !== 'undefined' && window.process && window.process.type);\n const isDev = \"siyuan-widget\" === 'development';\n const isIframe = window.parent !== window;\n const hasPluginApi = !!globalThis.kmindApi;\n const info = {\n isElectron,\n isDevelopment: isDev,\n isIframe,\n hasPluginApi,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n webpack: typeof __webpack_require__ !== 'undefined',\n nodeEnv: \"siyuan-widget\",\n buildMode: Object({\"NODE_ENV\":\"siyuan-widget\",\"VUE_APP_SIYUAN_WIDGET\":\"true\",\"BASE_URL\":\"\"}).VUE_APP_BUILD_MODE\n };\n console.group('环境检测结果');\n console.table(info);\n console.log('详细信息:', info);\n console.groupEnd();\n this.addLog(`环境: ${isElectron ? 'Electron' : 'Browser'}, ${isDev ? 'Dev' : 'Prod'}`);\n },\n removeAssociation(index) {\n if (!this.mindMap || !this.mindMap.associativeLine) return;\n const lineList = this.mindMap.associativeLine.lineList;\n if (index >= 0 && index < lineList.length) {\n const line = lineList[index];\n // 移除SVG元素\n line[0].remove(); // path\n line[1].remove(); // clickPath\n line[2].remove(); // text\n // 从数组中移除\n lineList.splice(index, 1);\n this.addLog('删除关联线');\n this.updateAssociationsData();\n }\n },\n // 测试功能方法\n testDragToEmptySpace() {\n this.addLog('测试拖拽到空白处创建根节点功能');\n this.$message.info('请拖拽任意子节点到空白处停留2秒后放开鼠标');\n },\n testDoubleClickCreate() {\n this.addLog('测试双击创建根节点功能');\n this.$message.info('请在空白处双击鼠标创建新根节点');\n },\n testCrossRootDrag() {\n this.addLog('测试跨根节点拖拽功能');\n this.$message.info('请拖拽节点到其他根节点下成为子节点');\n },\n testGeneralizationWithChildren() {\n if (!this.mindMap) return;\n\n // 创建测试数据\n const testData = {\n data: {\n text: 'A'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }]\n }, {\n data: {\n text: 'A2'\n },\n children: [{\n data: {\n text: 'A2-1'\n }\n }, {\n data: {\n text: 'A2-2'\n }\n }]\n }, {\n data: {\n text: 'A3'\n }\n }]\n };\n this.mindMap.setData(testData);\n\n // 添加带子节点的概要\n setTimeout(() => {\n const rootNode = this.mindMap.renderer.root;\n if (rootNode && rootNode.children && rootNode.children.length >= 2) {\n // 为前两个子节点添加概要\n const targetNodes = [rootNode.children[0], rootNode.children[1]];\n\n // 选中节点\n this.mindMap.renderer.clearActiveNodeList();\n targetNodes.forEach(node => {\n this.mindMap.renderer.addNodeToActiveList(node);\n });\n\n // 添加带子节点的概要\n this.mindMap.execCommand('ADD_GENERALIZATION', {\n text: 'G1',\n children: [{\n data: {\n text: 'G1-1'\n },\n children: [{\n data: {\n text: 'G1-1-1'\n }\n }, {\n data: {\n text: 'G1-1-2'\n }\n }]\n }, {\n data: {\n text: 'G1-2'\n }\n }]\n });\n this.addLog('添加了带子节点的概要');\n this.$message.success('已创建带子节点的概要可以在概要节点上使用Tab键添加更多子节点');\n }\n }, 500);\n this.addLog('加载概要子节点测试数据');\n },\n // 更新信息方法\n updateAllInfo() {\n this.updateBasicInfo();\n this.updateCurrentData();\n this.updateAssociationsData();\n },\n updateBasicInfo() {\n if (this.mindMap) {\n this.isMultiRoot = this.mindMap.isMultiRoot;\n const roots = this.mindMap.getRootNodes();\n this.rootCount = roots.length;\n\n // 更新根节点信息\n this.rootsInfo = roots.map((root, index) => {\n const rootData = root.nodeData || root.getData();\n return {\n text: rootData.data ? rootData.data.text : '根节点',\n theme: rootData.data && rootData.data.theme || 'default',\n layout: rootData.data && rootData.data.layout || 'logicalStructure'\n };\n });\n\n // 如果是多根模式且没有选中的根节点,选择第一个\n if (this.isMultiRoot && this.selectedRootIndex === null && this.rootsInfo.length > 0) {\n this.selectedRootIndex = 0;\n this.selectedTheme = this.rootsInfo[0].theme;\n } else if (!this.isMultiRoot) {\n // 单根模式下获取当前主题\n this.selectedTheme = this.mindMap.getTheme() || 'default';\n }\n\n // 布局相关\n if (this.isMultiRoot && this.selectedLayoutRootIndex === null && this.rootsInfo.length > 0) {\n this.selectedLayoutRootIndex = 0;\n const rootData = roots[0].nodeData || roots[0].getData();\n this.selectedLayout = rootData.data && rootData.data.layout || 'logicalStructure';\n } else if (!this.isMultiRoot) {\n // 单根模式下获取当前布局\n this.selectedLayout = this.mindMap.getLayout() || 'logicalStructure';\n }\n }\n },\n updateCurrentData() {\n if (this.mindMap) {\n this.currentData = this.mindMap.getData();\n }\n },\n updateAssociationsData() {\n if (this.mindMap && this.mindMap.associativeLine) {\n const lineList = this.mindMap.associativeLine.lineList;\n this.associationCount = lineList.length;\n this.associationsData = lineList.map((line, index) => {\n // lineList中每一项是 [path, clickPath, text, fromNode, toNode]\n const [path, clickPath, textElement, fromNode, toNode] = line;\n return {\n id: index,\n // 使用索引作为ID\n fromNodeText: fromNode && fromNode.getData ? fromNode.getData('text') : '未知',\n toNodeText: toNode && toNode.getData ? toNode.getData('text') : '未知',\n text: textElement && textElement.text ? textElement.text() : '无'\n };\n }).filter(item => item.fromNodeText !== '未知' || item.toNodeText !== '未知'); // 过滤掉无效的关联线\n } else {\n this.associationCount = 0;\n this.associationsData = [];\n }\n },\n refreshData() {\n this.updateAllInfo();\n this.addLog('刷新数据');\n },\n fitView() {\n if (this.mindMap && this.mindMap.view) {\n this.mindMap.view.fit();\n this.addLog('适应视图');\n }\n },\n checkAssociativeLineStatus() {\n // 检查关联线创建状态,如果已完成则退出模式\n const checkStatus = () => {\n if (this.isAssociativeMode && this.mindMap && this.mindMap.associativeLine) {\n if (!this.mindMap.associativeLine.isCreatingLine) {\n this.isAssociativeMode = false;\n this.addLog('关联线创建完成,退出创建模式');\n return;\n }\n // 如果还在创建中,继续检查\n setTimeout(checkStatus, 300);\n }\n };\n setTimeout(checkStatus, 300);\n },\n // 主题相关方法\n applyTheme() {\n if (!this.mindMap || !this.selectedTheme) return;\n if (this.isMultiRoot && this.selectedRootIndex !== null) {\n // 多根模式:设置特定根节点的主题\n this.mindMap.setRootTheme(this.selectedRootIndex, this.selectedTheme);\n this.addLog(`设置根节点 ${this.selectedRootIndex + 1} 主题为: ${this.selectedTheme}`);\n } else if (!this.isMultiRoot) {\n // 单根模式:设置整体主题\n this.mindMap.setTheme(this.selectedTheme);\n this.addLog(`设置主题为: ${this.selectedTheme}`);\n }\n this.updateBasicInfo();\n },\n resetTheme() {\n if (!this.mindMap) return;\n if (this.isMultiRoot && this.selectedRootIndex !== null) {\n // 多根模式:重置特定根节点的主题\n this.mindMap.setRootTheme(this.selectedRootIndex, 'default');\n this.addLog(`重置根节点 ${this.selectedRootIndex + 1} 主题为默认`);\n } else if (!this.isMultiRoot) {\n // 单根模式:重置整体主题\n this.mindMap.setTheme('default');\n this.addLog(`重置主题为默认`);\n }\n this.selectedTheme = 'default';\n this.updateBasicInfo();\n },\n // 布局相关方法\n applyLayout() {\n if (!this.mindMap || !this.selectedLayout) return;\n if (this.isMultiRoot && this.selectedLayoutRootIndex !== null) {\n // 多根模式:设置特定根节点的布局\n this.mindMap.setRootLayout(this.selectedLayoutRootIndex, this.selectedLayout);\n this.addLog(`设置根节点 ${this.selectedLayoutRootIndex + 1} 布局为: ${this.selectedLayout}`);\n } else if (!this.isMultiRoot) {\n // 单根模式:设置整体布局\n this.mindMap.setLayout(this.selectedLayout);\n this.addLog(`设置布局为: ${this.selectedLayout}`);\n }\n this.updateBasicInfo();\n },\n resetLayout() {\n if (!this.mindMap) return;\n const defaultLayout = 'logicalStructure';\n if (this.isMultiRoot && this.selectedLayoutRootIndex !== null) {\n // 多根模式:重置特定根节点的布局\n this.mindMap.setRootLayout(this.selectedLayoutRootIndex, defaultLayout);\n this.addLog(`重置根节点 ${this.selectedLayoutRootIndex + 1} 布局为默认`);\n } else if (!this.isMultiRoot) {\n // 单根模式:重置整体布局\n this.mindMap.setLayout(defaultLayout);\n this.addLog(`重置布局为默认`);\n }\n this.selectedLayout = defaultLayout;\n this.updateBasicInfo();\n },\n testPerRootThemes() {\n if (!this.mindMap) return;\n\n // 创建带不同主题的多根数据\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: 'A',\n layout: 'logicalStructure',\n theme: 'classic'\n },\n children: [{\n data: {\n text: 'A1'\n }\n }, {\n data: {\n text: 'A2'\n }\n }]\n }, {\n data: {\n text: 'B',\n layout: 'mindMap',\n theme: 'dark'\n },\n children: [{\n data: {\n text: 'B1'\n }\n }, {\n data: {\n text: 'B2'\n }\n }]\n }, {\n data: {\n text: 'C',\n theme: 'freshGreen'\n },\n children: [{\n data: {\n text: 'C1'\n }\n }, {\n data: {\n text: 'C2'\n }\n }]\n }, {\n data: {\n text: 'D',\n theme: 'freshBlue'\n },\n children: [{\n data: {\n text: 'D1'\n }\n }, {\n data: {\n text: 'D2'\n }\n }]\n }]\n };\n this.mindMap.setData(testData);\n this.addLog('加载多主题测试数据');\n this.$message.success('已加载不同主题的多根节点!');\n },\n // 创建流程图节点\n createFlowChartNode(nodeType) {\n if (!this.mindMap) return;\n\n // 导入 FlowChartBehavior\n const FlowChartBehavior = __webpack_require__(/*! @/../../simple-mind-map/src/core/render/node/flowchart/FlowChartBehavior.js */ \"../simple-mind-map/src/core/render/node/flowchart/FlowChartBehavior.js\").default;\n const {\n FLOWCHART_NODE_TYPES,\n FLOWCHART_NODE_STYLES\n } = __webpack_require__(/*! @/../../simple-mind-map/src/constants/flowchart.js */ \"../simple-mind-map/src/constants/flowchart.js\");\n\n // 获取节点样式\n const nodeStyle = FLOWCHART_NODE_STYLES[nodeType] || FLOWCHART_NODE_STYLES[FLOWCHART_NODE_TYPES.PROCESS];\n\n // 计算新节点位置\n const roots = this.mindMap.getRootNodes();\n const baseX = 200;\n const baseY = 100;\n const offsetX = roots.length * 200;\n\n // 创建流程图节点数据\n const nodeData = {\n data: {\n text: this.getNodeTypeText(nodeType),\n isFlowChart: true,\n customLeft: baseX + offsetX,\n customTop: baseY + Math.random() * 200,\n flowchart: {\n nodeType: nodeType,\n showConnectors: true,\n connectorPositions: ['top', 'right', 'bottom', 'left'],\n preventOverlap: true,\n hideExpandBtn: true,\n hideAddBtn: true\n },\n ...nodeStyle\n },\n children: []\n };\n\n // 添加为新的根节点\n this.mindMap.addRootNode(nodeData);\n this.addLog(`创建${this.getNodeTypeText(nodeType)}节点`);\n this.$message.success(`已创建${this.getNodeTypeText(nodeType)}!`);\n },\n // 获取节点类型文本\n getNodeTypeText(nodeType) {\n const typeTexts = {\n process: '流程',\n decision: '决策',\n start: '开始',\n end: '结束',\n subprocess: '子流程',\n data: '数据',\n document: '文档',\n database: '数据库',\n preparation: '准备'\n };\n return typeTexts[nodeType] || '流程';\n },\n // 转换为流程图节点\n convertToFlowChart() {\n if (!this.mindMap) return;\n const activeNode = this.mindMap.renderer.activeNodeList[0];\n if (!activeNode) {\n this.$message.warning('请先选择一个节点');\n return;\n }\n\n // 使用新的API进行转换\n this.mindMap.convertNodeToFlowChart(activeNode, 'process');\n this.addLog('节点转换为流程图节点');\n this.$message.success('已转换为流程图节点');\n },\n // 转换为普通节点\n convertToNormal() {\n if (!this.mindMap) return;\n const activeNode = this.mindMap.renderer.activeNodeList[0];\n if (!activeNode) {\n this.$message.warning('请先选择一个节点');\n return;\n }\n\n // 只有流程图节点才能转换为普通节点\n if (!activeNode.nodeData.data.isFlowChart) {\n this.$message.warning('只有流程图节点才能转换为普通节点');\n return;\n }\n\n // 使用新的API进行转换\n this.mindMap.convertNodeToNormal(activeNode);\n this.addLog('转换为普通节点');\n this.$message.success('已转换为普通节点');\n },\n // 测试混合模式\n testFlowChartMode() {\n if (!this.mindMap) return;\n\n // 创建混合模式测试数据\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: '项目规划',\n layout: 'mindMap'\n },\n children: [{\n data: {\n text: '需求分析'\n }\n }, {\n data: {\n text: '技术选型'\n }\n }, {\n data: {\n text: '时间规划'\n }\n }]\n }, {\n data: {\n text: '开始',\n isFlowChart: true,\n customLeft: 400,\n customTop: 50,\n flowchart: {\n nodeType: 'start',\n showConnectors: true,\n connectorPositions: ['bottom']\n },\n shape: 'circle',\n backgroundColor: '#e8f5e9',\n borderColor: '#1b5e20'\n },\n children: []\n }, {\n data: {\n text: '需求评审',\n isFlowChart: true,\n customLeft: 400,\n customTop: 150,\n flowchart: {\n nodeType: 'process',\n showConnectors: true,\n connectorPositions: ['top', 'bottom']\n },\n shape: 'rectangle',\n backgroundColor: '#e1f5fe',\n borderColor: '#01579b'\n },\n children: []\n }, {\n data: {\n text: '是否通过',\n isFlowChart: true,\n customLeft: 400,\n customTop: 250,\n flowchart: {\n nodeType: 'decision',\n showConnectors: true,\n connectorPositions: ['top', 'right', 'bottom', 'left']\n },\n shape: 'diamond',\n backgroundColor: '#fff3e0',\n borderColor: '#e65100'\n },\n children: []\n }]\n };\n this.mindMap.setData(testData);\n this.addLog('加载混合模式测试数据');\n this.$message.success('已加载流程图混合模式测试数据!');\n },\n // 测试正交连线\n testOrthogonalLines() {\n if (!this.mindMap) return;\n\n // 创建多个流程图节点用于测试正交连线\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: '开始',\n isFlowChart: true,\n flowchart: {\n nodeType: 'start'\n },\n customLeft: 100,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '处理数据',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 300,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '判断条件',\n isFlowChart: true,\n flowchart: {\n nodeType: 'decision'\n },\n customLeft: 500,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '分支处理1',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 700,\n customTop: 100\n },\n children: []\n }, {\n data: {\n text: '分支处理2',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 700,\n customTop: 300\n },\n children: []\n }, {\n data: {\n text: '结束',\n isFlowChart: true,\n flowchart: {\n nodeType: 'end'\n },\n customLeft: 900,\n customTop: 200\n },\n children: []\n }]\n };\n this.mindMap.setData(testData);\n\n // 自动创建一些关联线来展示正交路径\n setTimeout(() => {\n // 获取所有根节点\n let roots = [];\n if (this.mindMap.renderer.renderTree) {\n if (Array.isArray(this.mindMap.renderer.renderTree)) {\n // 多根模式\n roots = this.mindMap.renderer.renderTree.map(root => root._node).filter(node => node);\n } else if (this.mindMap.renderer.root) {\n // 单根模式\n roots = [this.mindMap.renderer.root];\n }\n }\n if (roots.length >= 6) {\n // 开始 -> 处理数据\n this.mindMap.associativeLine.addLine(roots[0], roots[1]);\n // 处理数据 -> 判断条件\n this.mindMap.associativeLine.addLine(roots[1], roots[2]);\n // 判断条件 -> 分支处理1\n this.mindMap.associativeLine.addLine(roots[2], roots[3]);\n // 判断条件 -> 分支处理2\n this.mindMap.associativeLine.addLine(roots[2], roots[4]);\n // 分支处理1 -> 结束\n this.mindMap.associativeLine.addLine(roots[3], roots[5]);\n // 分支处理2 -> 结束\n this.mindMap.associativeLine.addLine(roots[4], roots[5]);\n this.addLog('创建正交连线测试数据');\n this.$message.success('已创建正交连线测试注意观察连线是90度转角的正交路径');\n }\n }, 500);\n },\n // 测试径向布局\n testRadialLayout() {\n if (!this.mindMap) return;\n\n // 创建适合径向布局的测试数据,包含很多节点\n const testData = {\n data: {\n text: '知识图谱',\n layout: 'radial'\n },\n children: [{\n data: {\n text: '前端技术'\n },\n children: [{\n data: {\n text: 'JavaScript'\n },\n children: [{\n data: {\n text: 'ES6+'\n }\n }, {\n data: {\n text: 'TypeScript'\n }\n }, {\n data: {\n text: 'Node.js'\n }\n }, {\n data: {\n text: 'Deno'\n }\n }]\n }, {\n data: {\n text: 'CSS'\n },\n children: [{\n data: {\n text: 'Flexbox'\n }\n }, {\n data: {\n text: 'Grid'\n }\n }, {\n data: {\n text: 'Animation'\n }\n }]\n }, {\n data: {\n text: 'HTML5'\n }\n }, {\n data: {\n text: 'WebAssembly'\n }\n }]\n }, {\n data: {\n text: '框架'\n },\n children: [{\n data: {\n text: 'Vue'\n }\n }, {\n data: {\n text: 'React'\n }\n }, {\n data: {\n text: 'Angular'\n }\n }, {\n data: {\n text: 'Svelte'\n }\n }, {\n data: {\n text: 'Solid'\n }\n }]\n }, {\n data: {\n text: '工具链'\n },\n children: [{\n data: {\n text: 'Webpack'\n }\n }, {\n data: {\n text: 'Vite'\n }\n }, {\n data: {\n text: 'Rollup'\n }\n }, {\n data: {\n text: 'Parcel'\n }\n }, {\n data: {\n text: 'ESBuild'\n }\n }, {\n data: {\n text: 'SWC'\n }\n }]\n }, {\n data: {\n text: '后端技术'\n },\n children: [{\n data: {\n text: 'Python'\n }\n }, {\n data: {\n text: 'Java'\n }\n }, {\n data: {\n text: 'Go'\n }\n }, {\n data: {\n text: 'Rust'\n }\n }, {\n data: {\n text: 'C++'\n }\n }]\n }, {\n data: {\n text: '数据库'\n },\n children: [{\n data: {\n text: 'MySQL'\n }\n }, {\n data: {\n text: 'PostgreSQL'\n }\n }, {\n data: {\n text: 'MongoDB'\n }\n }, {\n data: {\n text: 'Redis'\n }\n }, {\n data: {\n text: 'Elasticsearch'\n }\n }]\n }, {\n data: {\n text: '云服务'\n },\n children: [{\n data: {\n text: 'AWS'\n }\n }, {\n data: {\n text: 'Azure'\n }\n }, {\n data: {\n text: 'Google Cloud'\n }\n }, {\n data: {\n text: '阿里云'\n }\n }, {\n data: {\n text: '腾讯云'\n }\n }]\n }, {\n data: {\n text: 'DevOps'\n },\n children: [{\n data: {\n text: 'Docker'\n }\n }, {\n data: {\n text: 'Kubernetes'\n }\n }, {\n data: {\n text: 'CI/CD'\n }\n }, {\n data: {\n text: 'Jenkins'\n }\n }]\n }, {\n data: {\n text: 'AI/ML'\n },\n children: [{\n data: {\n text: 'TensorFlow'\n }\n }, {\n data: {\n text: 'PyTorch'\n }\n }, {\n data: {\n text: 'Scikit-learn'\n }\n }, {\n data: {\n text: 'Keras'\n }\n }]\n }]\n };\n\n // 设置为径向布局\n this.mindMap.setLayout('radial');\n this.mindMap.setData(testData);\n this.addLog('加载径向布局测试数据(多节点)');\n this.$message.success('已切换到径向布局模式!注意观察自动调整的半径');\n },\n // 测试径向布局的不同策略\n testRadialLayoutStrategies() {\n if (!this.mindMap) return;\n\n // 弹出选择对话框\n this.$confirm('选择要测试的径向布局策略', '径向布局策略测试', {\n distinguishCancelAndClose: true,\n confirmButtonText: '固定增量',\n cancelButtonText: '指数增长',\n closeButtonText: '加权分配',\n type: 'info'\n }).then(() => {\n // 固定增量策略\n this.mindMap.opt.radialLayoutConfig = {\n startRadius: 150,\n radiusIncrement: 100,\n radiusGrowthStrategy: 'fixed',\n angleDistribution: 'uniform'\n };\n this.testRadialLayout();\n this.addLog('使用固定增量策略');\n this.$message.success('已切换到固定增量策略');\n }).catch(action => {\n if (action === 'cancel') {\n // 指数增长策略\n this.mindMap.opt.radialLayoutConfig = {\n startRadius: 100,\n radiusGrowthStrategy: 'exponential',\n exponentialGrowthFactor: 1.6,\n angleDistribution: 'uniform'\n };\n this.testRadialLayout();\n this.addLog('使用指数增长策略');\n this.$message.success('已切换到指数增长策略');\n } else if (action === 'close') {\n // 加权分配策略\n this.mindMap.opt.radialLayoutConfig = {\n startRadius: 120,\n radiusIncrement: 150,\n radiusGrowthStrategy: 'auto',\n angleDistribution: 'weighted',\n autoAdjustRadius: true\n };\n this.testRadialLayout();\n this.addLog('使用加权分配策略');\n this.$message.success('已切换到加权分配策略(根据子树大小分配角度)');\n }\n });\n },\n resetAll() {\n this.operationLogs = [];\n this.selectedRootIndex = null;\n this.selectedTheme = '';\n this.selectedLayoutRootIndex = null;\n this.selectedLayout = '';\n this.addLog('重置所有状态');\n this.initMindMap();\n },\n // 大括号连接线测试方法\n testBraceLineStyle() {\n if (!this.mindMap) return;\n\n // 创建适合展示大括号连接线的测试数据(单根模式)\n const testData = {\n data: {\n text: 'A'\n },\n children: [{\n data: {\n text: 'A1'\n },\n children: [{\n data: {\n text: 'A1-1'\n }\n }, {\n data: {\n text: 'A1-2'\n }\n }, {\n data: {\n text: 'A1-3'\n }\n }]\n }, {\n data: {\n text: 'A2'\n },\n children: [{\n data: {\n text: 'A2-1'\n }\n }, {\n data: {\n text: 'A2-2'\n }\n }]\n }, {\n data: {\n text: 'A3'\n },\n children: [{\n data: {\n text: 'A3-1'\n }\n }, {\n data: {\n text: 'A3-2'\n }\n }, {\n data: {\n text: 'A3-3'\n }\n }, {\n data: {\n text: 'A3-4'\n }\n }]\n }]\n };\n\n // 设置布局\n this.mindMap.setLayout(this.lineTestLayout);\n // 设置连线样式为大括号\n this.mindMap.setThemeConfig({\n lineStyle: 'brace',\n braceCurveSize: this.braceCurveSize\n });\n // 设置数据(单根模式)\n this.mindMap.setData(testData);\n this.addLog(`加载大括号连接线测试数据,布局: ${this.lineTestLayout}`);\n this.$message.success('已切换到大括号连接线样式!');\n },\n changeLineTestLayout(layout) {\n if (!this.mindMap) return;\n this.mindMap.setLayout(layout);\n this.addLog(`切换布局为: ${layout}`);\n },\n setLineStyle(style) {\n if (!this.mindMap) return;\n this.mindMap.setThemeConfig({\n lineStyle: style\n });\n this.mindMap.render();\n this.addLog(`切换连线样式为: ${style}`);\n this.$message.success(`已切换到${style}连线样式`);\n },\n updateBraceCurveSize() {\n if (!this.mindMap) return;\n const currentStyle = this.mindMap.themeConfig.lineStyle;\n if (currentStyle === 'brace') {\n this.mindMap.setThemeConfig({\n braceCurveSize: this.braceCurveSize\n });\n this.mindMap.render();\n this.addLog(`更新大括号曲线弧度为: ${this.braceCurveSize}px`);\n }\n },\n // 主题预览图生成相关方法\n showThemeGeneratorDialog() {\n this.themeGeneratorDialogVisible = true;\n const themes = [..._simple_mind_map_plugin_themes_themeList__WEBPACK_IMPORTED_MODULE_27__[\"default\"]];\n\n // 在列表开头添加default主题项\n const defaultThemeItem = {\n name: 'Default Theme',\n value: 'default',\n dark: false,\n isBuiltin: true // 标记为内置主题\n };\n\n // 检查列表中是否已经有default主题避免重复\n const hasDefault = themes.some(t => t.value === 'default');\n if (!hasDefault) {\n themes.unshift(defaultThemeItem);\n }\n this.allThemes = themes;\n this.generatedSVGs = [];\n this.generatedCount = 0;\n this.currentThemeName = '';\n this.isGenerating = false;\n // 重置质量设置为默认值\n this.webpQuality = 0.8;\n this.jpgQuality = 0.85;\n },\n // 设置质量预设\n setQualityPreset(preset) {\n switch (preset) {\n case 'high':\n this.webpQuality = 0.95;\n this.jpgQuality = 0.95;\n this.$message.success('已设置为高质量模式(文件较大,质量最佳)');\n break;\n case 'medium':\n this.webpQuality = 0.8;\n this.jpgQuality = 0.85;\n this.$message.success('已设置为平衡模式(质量和大小平衡)');\n break;\n case 'low':\n this.webpQuality = 0.6;\n this.jpgQuality = 0.7;\n this.$message.success('已设置为小文件模式(文件更小,质量尚可)');\n break;\n case 'tiny':\n this.webpQuality = 0.3;\n this.jpgQuality = 0.5;\n this.$message.warning('已设置为极限压缩模式(文件最小,质量较低)');\n break;\n }\n },\n async startGenerating() {\n if (this.isGenerating) return;\n this.isGenerating = true;\n this.generatedSVGs = [];\n this.generatedCount = 0;\n\n // 创建隐藏的容器用于生成预览\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.left = '-9999px';\n container.style.width = '800px';\n container.style.height = '600px';\n document.body.appendChild(container);\n\n // 预览数据 - 使用英文避免乱码\n const previewData = {\n data: {\n text: 'KMIND'\n },\n children: [{\n data: {\n text: 'Subtopic',\n generalization: {\n text: 'Summary'\n }\n },\n children: [{\n data: {\n text: 'Add Content'\n },\n children: []\n }, {\n data: {\n text: 'Add Content'\n },\n children: []\n }]\n }, {\n data: {\n text: 'Subtopic'\n },\n children: [{\n data: {\n text: 'Add Content'\n },\n children: []\n }, {\n data: {\n text: 'Add Content'\n },\n children: []\n }]\n }]\n };\n try {\n // 创建临时的MindMap实例\n const tempMindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: container,\n data: previewData,\n theme: 'default',\n layout: 'logicalStructure',\n readonly: true,\n isShowCreateChildBtnIcon: false,\n mousewheelAction: 'zoom'\n });\n\n // 批量生成每个主题的SVG\n for (let i = 0; i < this.allThemes.length; i++) {\n const theme = this.allThemes[i];\n this.currentThemeName = theme.name;\n\n // 判断是否为default主题需要特殊处理\n const isDefaultTheme = theme.value === 'default';\n\n // 设置主题\n tempMindMap.setTheme(theme.value);\n\n // 等待渲染完成\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // 导出所有格式\n try {\n // 先导出SVG\n const svgDataUrl = await tempMindMap.export('svg', false, 'preview');\n\n // 从data URL提取SVG内容\n let svgContent = '';\n if (svgDataUrl.startsWith('data:image/svg+xml;base64,')) {\n const base64 = svgDataUrl.replace('data:image/svg+xml;base64,', '');\n svgContent = atob(base64);\n } else if (svgDataUrl.startsWith('data:image/svg+xml;charset=utf-8,')) {\n // 处理带charset的情况\n svgContent = decodeURIComponent(svgDataUrl.replace('data:image/svg+xml;charset=utf-8,', ''));\n } else if (svgDataUrl.startsWith('data:image/svg+xml,')) {\n svgContent = decodeURIComponent(svgDataUrl.replace('data:image/svg+xml,', ''));\n }\n\n // 优化SVG确保正确编码\n const parser = new DOMParser();\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\n const svgElement = svgDoc.documentElement;\n\n // 添加必要的属性确保正确渲染\n svgElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n svgElement.setAttribute('width', '400');\n svgElement.setAttribute('height', '300');\n svgElement.setAttribute('viewBox', '0 0 800 600');\n const serializer = new XMLSerializer();\n const optimizedSvg = serializer.serializeToString(svgElement);\n\n // 计算SVG大小\n const svgSize = new Blob([optimizedSvg]).size;\n\n // 导出PNG\n let pngDataUrl = null;\n let pngSize = 0;\n try {\n pngDataUrl = await tempMindMap.export('png', false, 'preview');\n // 计算PNG大小\n if (pngDataUrl) {\n const pngData = atob(pngDataUrl.split(',')[1]);\n pngSize = pngData.length;\n }\n } catch (pngError) {\n console.warn(`生成PNG失败: ${theme.name}`, pngError);\n }\n\n // 导出WebP和JPG通过Canvas\n let webpDataUrl = null;\n let webpSize = 0;\n let jpgDataUrl = null;\n let jpgSize = 0;\n try {\n // 创建临时canvas来转换格式\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n // 从PNG创建图像\n if (pngDataUrl) {\n const img = new Image();\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = pngDataUrl;\n });\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n\n // 生成WebP使用可调节的质量\n webpDataUrl = canvas.toDataURL('image/webp', this.webpQuality);\n if (webpDataUrl && webpDataUrl.startsWith('data:image/webp')) {\n const webpData = atob(webpDataUrl.split(',')[1]);\n webpSize = webpData.length;\n } else {\n // 浏览器不支持WebP\n webpDataUrl = null;\n }\n\n // 生成JPG使用可调节的质量白色背景\n // 先填充白色背景JPG不支持透明\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0);\n jpgDataUrl = canvas.toDataURL('image/jpeg', this.jpgQuality);\n const jpgData = atob(jpgDataUrl.split(',')[1]);\n jpgSize = jpgData.length;\n }\n } catch (error) {\n console.warn(`生成WebP/JPG失败: ${theme.name}`, error);\n }\n this.generatedSVGs.push({\n name: theme.name,\n value: theme.value,\n dark: theme.dark || false,\n isDefault: isDefaultTheme,\n // 标记是否为default主题\n svgContent: optimizedSvg,\n svgSize: svgSize,\n pngDataUrl: pngDataUrl,\n pngSize: pngSize,\n webpDataUrl: webpDataUrl,\n webpSize: webpSize,\n jpgDataUrl: jpgDataUrl,\n jpgSize: jpgSize\n });\n this.generatedCount++;\n } catch (error) {\n console.error(`生成主题 ${theme.name} 失败:`, error);\n this.$message.error(`生成主题 ${theme.name} 失败`);\n }\n\n // 避免阻塞UI\n if (i % 5 === 0) {\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n }\n\n // 清理\n tempMindMap.destroy();\n document.body.removeChild(container);\n this.$message.success(`成功生成 ${this.generatedCount} 个主题预览图`);\n } catch (error) {\n console.error('批量生成失败:', error);\n this.$message.error('批量生成失败: ' + error.message);\n } finally {\n this.isGenerating = false;\n this.currentThemeName = '';\n }\n },\n downloadSingleSVG(theme) {\n const blob = new Blob([theme.svgContent], {\n type: 'image/svg+xml;charset=utf-8'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${theme.value}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n },\n downloadSinglePNG(theme) {\n if (!theme.pngDataUrl) return;\n const a = document.createElement('a');\n a.href = theme.pngDataUrl;\n a.download = `${theme.value}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n },\n downloadAllSVGs() {\n if (this.generatedSVGs.length === 0) return;\n\n // 逐个下载所有SVG\n this.generatedSVGs.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSingleSVG(theme);\n }, index * 200); // 间隔200ms避免浏览器阻止\n });\n this.$message.success(`开始下载 ${this.generatedSVGs.length} 个SVG文件`);\n },\n downloadAllPNGs() {\n const pngThemes = this.generatedSVGs.filter(t => t.pngDataUrl);\n if (pngThemes.length === 0) return;\n\n // 逐个下载所有PNG\n pngThemes.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSinglePNG(theme);\n }, index * 200); // 间隔200ms避免浏览器阻止\n });\n this.$message.success(`开始下载 ${pngThemes.length} 个PNG文件`);\n },\n clearGenerated() {\n this.generatedSVGs = [];\n this.generatedCount = 0;\n this.$message.success('已清空生成的预览图');\n },\n removeGenerated(index) {\n this.generatedSVGs.splice(index, 1);\n this.generatedCount = this.generatedSVGs.length;\n },\n // 格式化文件大小\n formatFileSize(bytes) {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n // 下载WebP格式\n downloadSingleWebP(theme) {\n if (!theme.webpDataUrl) return;\n const a = document.createElement('a');\n a.href = theme.webpDataUrl;\n a.download = `${theme.value}.webp`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n },\n // 下载JPG格式\n downloadSingleJPG(theme) {\n if (!theme.jpgDataUrl) return;\n const a = document.createElement('a');\n a.href = theme.jpgDataUrl;\n a.download = `${theme.value}.jpg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n },\n // 批量下载WebP\n downloadAllWebPs() {\n const webpThemes = this.generatedSVGs.filter(t => t.webpDataUrl);\n if (webpThemes.length === 0) return;\n webpThemes.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSingleWebP(theme);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${webpThemes.length} 个WebP文件`);\n },\n // 批量下载JPG\n downloadAllJPGs() {\n const jpgThemes = this.generatedSVGs.filter(t => t.jpgDataUrl);\n if (jpgThemes.length === 0) return;\n jpgThemes.forEach((theme, index) => {\n setTimeout(() => {\n this.downloadSingleJPG(theme);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${jpgThemes.length} 个JPG文件`);\n },\n // 布局预览图生成相关方法\n showLayoutGeneratorDialog() {\n this.layoutGeneratorDialogVisible = true;\n // 初始化布局列表\n this.allLayouts = this.availableLayouts.map(layout => ({\n ...layout,\n svgData: null,\n svgSize: null,\n pngData: null,\n pngSize: null,\n webpData: null,\n webpSize: null,\n jpgData: null,\n jpgSize: null\n }));\n this.generatedLayoutSVGs = [];\n this.generatedLayoutCount = 0;\n },\n async generateAllLayoutPreviews() {\n if (this.isGeneratingLayouts) return;\n this.isGeneratingLayouts = true;\n this.generatedLayoutCount = 0;\n this.generatedLayoutSVGs = [];\n try {\n // 创建临时容器\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.left = '-9999px';\n container.style.width = '800px';\n container.style.height = '600px';\n document.body.appendChild(container);\n\n // 预览数据 - 使用英文避免编码问题\n const previewData = {\n data: {\n text: 'KMind'\n },\n children: [{\n data: {\n text: 'Subtopic 1'\n },\n children: [{\n data: {\n text: 'Detail 1-1'\n }\n }, {\n data: {\n text: 'Detail 1-2'\n }\n }]\n }, {\n data: {\n text: 'Subtopic 2'\n },\n children: [{\n data: {\n text: 'Detail 2-1'\n }\n }, {\n data: {\n text: 'Detail 2-2'\n }\n }]\n }, {\n data: {\n text: 'Subtopic 3'\n },\n children: [{\n data: {\n text: 'Detail 3-1'\n }\n }, {\n data: {\n text: 'Detail 3-2'\n }\n }]\n }]\n };\n for (let i = 0; i < this.allLayouts.length; i++) {\n const layout = this.allLayouts[i];\n this.currentLayoutName = layout.name;\n try {\n // 创建新的MindMap实例\n const tempMindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: container,\n data: previewData,\n layout: layout.value,\n theme: 'default'\n });\n\n // 等待渲染完成\n await new Promise(resolve => setTimeout(resolve, 200));\n\n // 导出SVG\n const svgData = await tempMindMap.export('svg', false, 'default');\n\n // 计算SVG大小\n const svgBlob = new Blob([svgData], {\n type: 'image/svg+xml'\n });\n const svgSize = svgBlob.size;\n const svgDataUrl = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgData)))}`;\n\n // 导出PNG - 第二个参数设为false避免自动下载\n const pngDataUrl = await tempMindMap.export('png', false, 'default');\n const pngData = atob(pngDataUrl.split(',')[1]);\n const pngSize = pngData.length;\n\n // 生成WebP和JPG\n let webpDataUrl = null;\n let webpSize = 0;\n let jpgDataUrl = null;\n let jpgSize = 0;\n try {\n // 创建图片对象\n const img = new Image();\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = pngDataUrl;\n });\n\n // 创建canvas\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n\n // 导出WebP\n if (canvas.toDataURL('image/webp').indexOf('image/webp') > -1) {\n webpDataUrl = canvas.toDataURL('image/webp', this.layoutWebpQuality);\n const webpData = atob(webpDataUrl.split(',')[1]);\n webpSize = webpData.length;\n }\n\n // 导出JPG\n jpgDataUrl = canvas.toDataURL('image/jpeg', this.layoutJpgQuality);\n const jpgData = atob(jpgDataUrl.split(',')[1]);\n jpgSize = jpgData.length;\n } catch (error) {\n console.warn(`生成WebP/JPG失败: ${layout.name}`, error);\n }\n\n // 更新布局数据\n this.$set(layout, 'svgData', svgDataUrl);\n this.$set(layout, 'svgSize', this.formatFileSize(svgSize));\n this.$set(layout, 'pngData', pngDataUrl);\n this.$set(layout, 'pngSize', this.formatFileSize(pngSize));\n this.$set(layout, 'webpData', webpDataUrl);\n this.$set(layout, 'webpSize', this.formatFileSize(webpSize));\n this.$set(layout, 'jpgData', jpgDataUrl);\n this.$set(layout, 'jpgSize', this.formatFileSize(jpgSize));\n\n // 添加到已生成列表\n this.generatedLayoutSVGs.push({\n ...layout,\n svgContent: svgData,\n svgDataUrl,\n pngDataUrl,\n webpDataUrl,\n jpgDataUrl\n });\n this.generatedLayoutCount++;\n\n // 清理\n tempMindMap.destroy();\n } catch (error) {\n console.error(`生成布局 ${layout.name} 失败:`, error);\n this.$message.error(`生成布局 ${layout.name} 失败`);\n }\n\n // 避免阻塞UI\n if (i % 3 === 0) {\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n }\n\n // 清理容器\n document.body.removeChild(container);\n this.$message.success(`成功生成 ${this.generatedLayoutCount} 个布局预览图`);\n } catch (error) {\n console.error('批量生成布局失败:', error);\n this.$message.error('批量生成失败: ' + error.message);\n } finally {\n this.isGeneratingLayouts = false;\n this.currentLayoutName = '';\n }\n },\n async generateLayoutPreview(layout) {\n if (this.isGeneratingLayouts) return;\n this.isGeneratingLayouts = true;\n this.currentLayoutName = layout.name;\n try {\n // 创建临时容器\n const container = document.createElement('div');\n container.style.position = 'absolute';\n container.style.left = '-9999px';\n container.style.width = '800px';\n container.style.height = '600px';\n document.body.appendChild(container);\n\n // 预览数据\n const previewData = {\n data: {\n text: 'Main Topic'\n },\n children: [{\n data: {\n text: 'Subtopic 1'\n },\n children: [{\n data: {\n text: 'Detail 1-1'\n }\n }, {\n data: {\n text: 'Detail 1-2'\n }\n }]\n }, {\n data: {\n text: 'Subtopic 2'\n },\n children: [{\n data: {\n text: 'Detail 2-1'\n }\n }, {\n data: {\n text: 'Detail 2-2'\n }\n }]\n }]\n };\n\n // 创建MindMap实例\n const tempMindMap = new simple_mind_map__WEBPACK_IMPORTED_MODULE_7__[\"default\"]({\n el: container,\n data: previewData,\n layout: layout.value,\n theme: 'default'\n });\n\n // 等待渲染\n await new Promise(resolve => setTimeout(resolve, 200));\n\n // 导出各种格式\n const svgData = await tempMindMap.export('svg', false, 'default');\n const svgBlob = new Blob([svgData], {\n type: 'image/svg+xml'\n });\n const svgSize = svgBlob.size;\n const svgDataUrl = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgData)))}`;\n\n // 导出PNG - 第二个参数设为false避免自动下载\n const pngDataUrl = await tempMindMap.export('png', false, 'default');\n const pngData = atob(pngDataUrl.split(',')[1]);\n const pngSize = pngData.length;\n\n // 生成WebP和JPG\n let webpDataUrl = null;\n let webpSize = 0;\n let jpgDataUrl = null;\n let jpgSize = 0;\n try {\n const img = new Image();\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n img.src = pngDataUrl;\n });\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n if (canvas.toDataURL('image/webp').indexOf('image/webp') > -1) {\n webpDataUrl = canvas.toDataURL('image/webp', this.layoutWebpQuality);\n const webpData = atob(webpDataUrl.split(',')[1]);\n webpSize = webpData.length;\n }\n jpgDataUrl = canvas.toDataURL('image/jpeg', this.layoutJpgQuality);\n const jpgData = atob(jpgDataUrl.split(',')[1]);\n jpgSize = jpgData.length;\n } catch (error) {\n console.warn('生成WebP/JPG失败:', error);\n }\n\n // 更新数据\n this.$set(layout, 'svgData', svgDataUrl);\n this.$set(layout, 'svgSize', this.formatFileSize(svgSize));\n this.$set(layout, 'pngData', pngDataUrl);\n this.$set(layout, 'pngSize', this.formatFileSize(pngSize));\n this.$set(layout, 'webpData', webpDataUrl);\n this.$set(layout, 'webpSize', this.formatFileSize(webpSize));\n this.$set(layout, 'jpgData', jpgDataUrl);\n this.$set(layout, 'jpgSize', this.formatFileSize(jpgSize));\n\n // 清理\n tempMindMap.destroy();\n document.body.removeChild(container);\n this.$message.success(`成功生成布局 ${layout.name} 的预览图`);\n } catch (error) {\n console.error('生成布局预览失败:', error);\n this.$message.error('生成失败: ' + error.message);\n } finally {\n this.isGeneratingLayouts = false;\n this.currentLayoutName = '';\n }\n },\n downloadLayoutPreview(layout) {\n if (!layout.svgData) return;\n const formats = [];\n if (layout.svgData) {\n const a = document.createElement('a');\n a.href = layout.svgData;\n a.download = `${layout.value}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n formats.push('SVG');\n }\n if (layout.pngData) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.pngData;\n a.download = `${layout.value}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 200);\n formats.push('PNG');\n }\n if (layout.webpData) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.webpData;\n a.download = `${layout.value}.webp`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 400);\n formats.push('WebP');\n }\n if (layout.jpgData) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.jpgData;\n a.download = `${layout.value}.jpg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 600);\n formats.push('JPG');\n }\n this.$message.success(`开始下载 ${layout.name} 的${formats.join('、')}格式`);\n },\n downloadAllLayoutSVGs() {\n if (this.generatedLayoutSVGs.length === 0) return;\n this.generatedLayoutSVGs.forEach((layout, index) => {\n if (layout.svgDataUrl) {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.svgDataUrl;\n a.download = `${layout.value}.svg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n }\n });\n this.$message.success(`开始下载 ${this.generatedLayoutSVGs.length} 个SVG文件`);\n },\n downloadAllLayoutPNGs() {\n const pngLayouts = this.generatedLayoutSVGs.filter(l => l.pngDataUrl);\n if (pngLayouts.length === 0) return;\n pngLayouts.forEach((layout, index) => {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.pngDataUrl;\n a.download = `${layout.value}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${pngLayouts.length} 个PNG文件`);\n },\n downloadAllLayoutWebPs() {\n const webpLayouts = this.generatedLayoutSVGs.filter(l => l.webpDataUrl);\n if (webpLayouts.length === 0) return;\n webpLayouts.forEach((layout, index) => {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.webpDataUrl;\n a.download = `${layout.value}.webp`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${webpLayouts.length} 个WebP文件`);\n },\n downloadAllLayoutJPGs() {\n const jpgLayouts = this.generatedLayoutSVGs.filter(l => l.jpgDataUrl);\n if (jpgLayouts.length === 0) return;\n jpgLayouts.forEach((layout, index) => {\n setTimeout(() => {\n const a = document.createElement('a');\n a.href = layout.jpgDataUrl;\n a.download = `${layout.value}.jpg`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, index * 200);\n });\n this.$message.success(`开始下载 ${jpgLayouts.length} 个JPG文件`);\n },\n clearGeneratedLayouts() {\n this.allLayouts.forEach(layout => {\n this.$set(layout, 'svgData', null);\n this.$set(layout, 'svgSize', null);\n this.$set(layout, 'pngData', null);\n this.$set(layout, 'pngSize', null);\n this.$set(layout, 'webpData', null);\n this.$set(layout, 'webpSize', null);\n this.$set(layout, 'jpgData', null);\n this.$set(layout, 'jpgSize', null);\n });\n this.generatedLayoutSVGs = [];\n this.generatedLayoutCount = 0;\n this.$message.success('已清空生成的布局预览图');\n },\n // 测试吸附和拖拽创建\n testSnapAndDrag() {\n if (!this.mindMap) return;\n\n // 创建几个流程图节点用于测试\n const testData = {\n multiRoot: true,\n roots: [{\n data: {\n text: '拖拽起点',\n isFlowChart: true,\n flowchart: {\n nodeType: 'start'\n },\n customLeft: 200,\n customTop: 200\n },\n children: []\n }, {\n data: {\n text: '目标节点1',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 400,\n customTop: 100\n },\n children: []\n }, {\n data: {\n text: '目标节点2',\n isFlowChart: true,\n flowchart: {\n nodeType: 'process'\n },\n customLeft: 400,\n customTop: 300\n },\n children: []\n }]\n };\n this.mindMap.setData(testData);\n this.$message.info({\n message: '测试说明1. 从节点的连接点拖拽到其他节点会吸附到最近的连接点2. 拖拽到空白处会创建新节点',\n duration: 5000\n });\n this.addLog('加载吸附和拖拽创建测试数据');\n },\n // 测试连接点事件\n testConnectorEvents() {\n if (!this.mindMap) return;\n\n // 监听连接点点击事件\n this.mindMap.on('flowchart_connector_click', data => {\n this.addLog(`连接点点击: 节点 ${data.node.getData('text')}, 位置 ${data.position}`);\n this.$message.info(`点击了 ${data.position} 连接点`);\n });\n\n // 监听连接点拖拽开始事件\n this.mindMap.on('flowchart_connector_drag_start', data => {\n this.addLog(`连接点拖拽开始: 节点 ${data.node.getData('text')}, 位置 ${data.position}`);\n this.$message.success('连接点拖拽开始,可以拖拽创建关联线');\n });\n this.addLog('已启用连接点事件监听');\n this.$message.success('连接点事件监听已启用,请将鼠标悬停在流程图节点上查看连接点');\n\n // 监听流程图连线创建事件\n this.mindMap.on('flowchart_line_created', data => {\n this.addLog(`流程图连线创建: 从 ${data.startNode.getData('text')} 到 ${data.endNode.getData('text')}`);\n this.$message.success('流程图连线创建成功!');\n });\n }\n }\n});\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"b8ac2678-vue-loader-template\"}!./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true":
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"b8ac2678-vue-loader-template"}!./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--7!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true ***!
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n staticClass: \"test-container\"\n }, [_c(\"div\", {\n staticClass: \"test-main\"\n }, [_c(\"div\", {\n staticClass: \"control-panel\"\n }, [_c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"基础操作\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.initMindMap\n }\n }, [_vm._v(\"重新初始化\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.loadSingleRoot\n }\n }, [_vm._v(\"加载单根\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.loadMultiRoot\n }\n }, [_vm._v(\"加载多根\")]), _c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: _vm.toggleMultiRootMode\n }\n }, [_vm._v(\"切换模式\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"根节点操作\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n on: {\n click: _vm.addNewRoot\n }\n }, [_vm._v(\"添加根节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.removeLastRoot\n }\n }, [_vm._v(\"删除最后根节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.addRootWithCustomPosition\n }\n }, [_vm._v(\"添加自定义位置根节点\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"关联线测试\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.enterAssociativeMode\n }\n }, [_vm._v(\"进入关联线模式\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.createCrossRootAssociation\n }\n }, [_vm._v(\"创建跨根关联线\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.showAllAssociations\n }\n }, [_vm._v(\"显示所有关联线\")]), _c(\"el-button\", {\n attrs: {\n type: \"danger\"\n },\n on: {\n click: _vm.clearAllAssociations\n }\n }, [_vm._v(\"清除所有关联线\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"日志系统测试\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.testLoggerDebug\n }\n }, [_vm._v(\"测试 DEBUG\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.testLoggerInfo\n }\n }, [_vm._v(\"测试 INFO\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.testLoggerWarn\n }\n }, [_vm._v(\"测试 WARN\")]), _c(\"el-button\", {\n attrs: {\n type: \"danger\"\n },\n on: {\n click: _vm.testLoggerError\n }\n }, [_vm._v(\"测试 ERROR\")])], 1), _c(\"div\", {\n staticClass: \"button-group\",\n staticStyle: {\n \"margin-top\": \"10px\"\n }\n }, [_c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: _vm.testClickableLinks\n }\n }, [_vm._v(\"测试链接格式\")]), _c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.detectEnvironment\n }\n }, [_vm._v(\"检测环境\")])], 1), _c(\"div\", {\n staticClass: \"association-tips\"\n }, [_c(\"el-alert\", {\n attrs: {\n title: \"关联线使用提示\",\n type: \"info\",\n closable: false,\n \"show-icon\": \"\"\n }\n }, [_c(\"p\", [_vm._v(\"1. 先点击选择起始节点\")]), _c(\"p\", [_vm._v('2. 点击\"进入关联线模式\"')]), _c(\"p\", [_vm._v(\"3. 再点击目标节点创建关联线\")]), _c(\"p\", [_vm._v(\"4. 支持跨根节点创建关联线\")]), _c(\"p\", [_vm._v(\"5. 按ESC退出关联线模式\")])])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"状态信息\")]), _c(\"div\", {\n staticClass: \"status-info\"\n }, [_c(\"el-tag\", {\n attrs: {\n type: _vm.isMultiRoot ? \"success\" : \"info\"\n }\n }, [_vm._v(\" 模式: \" + _vm._s(_vm.isMultiRoot ? \"多根节点\" : \"单根节点\") + \" \")]), _c(\"el-tag\", {\n attrs: {\n type: \"primary\"\n }\n }, [_vm._v(\"根节点数: \" + _vm._s(_vm.rootCount))]), _c(\"el-tag\", {\n attrs: {\n type: \"warning\"\n }\n }, [_vm._v(\"关联线数: \" + _vm._s(_vm.associationCount))]), _c(\"el-tag\", {\n attrs: {\n type: _vm.isAssociativeMode ? \"danger\" : \"info\"\n }\n }, [_vm._v(\" \" + _vm._s(_vm.isAssociativeMode ? \"关联线模式\" : \"普通模式\") + \" \")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"主题设置\")]), _c(\"div\", {\n staticClass: \"theme-controls\"\n }, [_vm.isMultiRoot ? _c(\"div\", [_c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择根节点\",\n size: \"small\"\n },\n model: {\n value: _vm.selectedRootIndex,\n callback: function ($$v) {\n _vm.selectedRootIndex = $$v;\n },\n expression: \"selectedRootIndex\"\n }\n }, _vm._l(_vm.rootsInfo, function (root, index) {\n return _c(\"el-option\", {\n key: index,\n attrs: {\n label: `根节点 ${index + 1}: ${root.text}`,\n value: index\n }\n });\n }), 1)], 1) : _vm._e(), _c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择主题\",\n size: \"small\"\n },\n on: {\n change: _vm.applyTheme\n },\n model: {\n value: _vm.selectedTheme,\n callback: function ($$v) {\n _vm.selectedTheme = $$v;\n },\n expression: \"selectedTheme\"\n }\n }, _vm._l(_vm.availableThemes, function (theme) {\n return _c(\"el-option\", {\n key: theme,\n attrs: {\n label: theme,\n value: theme\n }\n });\n }), 1), _c(\"el-button\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n size: \"small\",\n type: \"primary\"\n },\n on: {\n click: _vm.resetTheme\n }\n }, [_vm._v(\" 重置为默认主题 \")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"布局设置\")]), _c(\"div\", {\n staticClass: \"layout-controls\"\n }, [_vm.isMultiRoot ? _c(\"div\", [_c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择根节点\",\n size: \"small\"\n },\n model: {\n value: _vm.selectedLayoutRootIndex,\n callback: function ($$v) {\n _vm.selectedLayoutRootIndex = $$v;\n },\n expression: \"selectedLayoutRootIndex\"\n }\n }, _vm._l(_vm.rootsInfo, function (root, index) {\n return _c(\"el-option\", {\n key: index,\n attrs: {\n label: `根节点 ${index + 1}: ${root.text}`,\n value: index\n }\n });\n }), 1)], 1) : _vm._e(), _c(\"el-select\", {\n staticStyle: {\n width: \"100%\",\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n placeholder: \"选择布局\",\n size: \"small\"\n },\n on: {\n change: _vm.applyLayout\n },\n model: {\n value: _vm.selectedLayout,\n callback: function ($$v) {\n _vm.selectedLayout = $$v;\n },\n expression: \"selectedLayout\"\n }\n }, _vm._l(_vm.availableLayouts, function (layout) {\n return _c(\"el-option\", {\n key: layout.value,\n attrs: {\n label: layout.label,\n value: layout.value\n }\n });\n }), 1), _c(\"el-button\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n size: \"small\",\n type: \"primary\"\n },\n on: {\n click: _vm.resetLayout\n }\n }, [_vm._v(\" 重置为默认布局 \")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"测试功能\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n on: {\n click: _vm.testDragToEmptySpace\n }\n }, [_vm._v(\"测试拖拽到空白\")]), _c(\"el-button\", {\n on: {\n click: _vm.testDoubleClickCreate\n }\n }, [_vm._v(\"测试双击创建\")]), _c(\"el-button\", {\n on: {\n click: _vm.testCrossRootDrag\n }\n }, [_vm._v(\"测试跨根拖拽\")]), _c(\"el-button\", {\n on: {\n click: _vm.testGeneralizationWithChildren\n }\n }, [_vm._v(\"测试概要子节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.testPerRootThemes\n }\n }, [_vm._v(\"测试多主题\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: _vm.testRadialLayout\n }\n }, [_vm._v(\"测试径向布局\")]), _c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.testRadialLayoutStrategies\n }\n }, [_vm._v(\"测试径向策略\")]), _c(\"el-button\", {\n on: {\n click: _vm.resetAll\n }\n }, [_vm._v(\"重置所有\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"Markdown 导入测试\")]), _c(\"div\", {\n staticClass: \"markdown-test-panel\"\n }, [_c(\"el-input\", {\n staticStyle: {\n \"margin-bottom\": \"8px\"\n },\n attrs: {\n type: \"textarea\",\n rows: 8,\n placeholder: \"在此输入 Markdown 文本进行解析测试\"\n },\n model: {\n value: _vm.markdownTestText,\n callback: function ($$v) {\n _vm.markdownTestText = $$v;\n },\n expression: \"markdownTestText\"\n }\n }), _c(\"input\", {\n ref: \"markdownFileInput\",\n staticStyle: {\n display: \"none\"\n },\n attrs: {\n type: \"file\",\n accept: \".md,text/markdown\"\n },\n on: {\n change: _vm.handleMarkdownFileChange\n }\n }), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.parseMarkdownOld\n }\n }, [_vm._v(\"旧 Markdown 解析\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\",\n type: \"primary\"\n },\n on: {\n click: _vm.parseMarkdownNew\n }\n }, [_vm._v(\"新 Markdown 解析\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.triggerMarkdownFileSelect\n }\n }, [_vm._v(\"导入 Markdown 文件\")])], 1)], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"连接线样式测试\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.testBraceLineStyle\n }\n }, [_vm._v(\"测试大括号连线\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"curve\");\n }\n }\n }, [_vm._v(\"曲线样式\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"straight\");\n }\n }\n }, [_vm._v(\"直线样式\")]), _c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"direct\");\n }\n }\n }, [_vm._v(\"直连样式\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setLineStyle(\"brace\");\n }\n }\n }, [_vm._v(\"大括号样式\")])], 1), _c(\"div\", {\n staticClass: \"line-style-settings\",\n staticStyle: {\n \"margin-top\": \"10px\"\n }\n }, [_c(\"div\", {\n staticStyle: {\n display: \"flex\",\n \"align-items\": \"center\",\n \"margin-bottom\": \"8px\"\n }\n }, [_c(\"span\", {\n staticStyle: {\n \"margin-right\": \"10px\"\n }\n }, [_vm._v(\"布局切换: \")]), _c(\"el-select\", {\n staticStyle: {\n width: \"180px\"\n },\n attrs: {\n placeholder: \"选择布局\",\n size: \"small\"\n },\n on: {\n change: _vm.changeLineTestLayout\n },\n model: {\n value: _vm.lineTestLayout,\n callback: function ($$v) {\n _vm.lineTestLayout = $$v;\n },\n expression: \"lineTestLayout\"\n }\n }, _vm._l(_vm.availableLayouts, function (layout) {\n return _c(\"el-option\", {\n key: layout.value,\n attrs: {\n label: layout.label,\n value: layout.value\n }\n });\n }), 1)], 1), _c(\"div\", {\n staticStyle: {\n display: \"flex\",\n \"align-items\": \"center\"\n }\n }, [_c(\"span\", {\n staticStyle: {\n \"margin-right\": \"10px\"\n }\n }, [_vm._v(\"大括号曲线弧度: \")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"150px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 5,\n max: 30,\n step: 1\n },\n on: {\n change: _vm.updateBraceCurveSize\n },\n model: {\n value: _vm.braceCurveSize,\n callback: function ($$v) {\n _vm.braceCurveSize = $$v;\n },\n expression: \"braceCurveSize\"\n }\n }), _c(\"span\", [_vm._v(_vm._s(_vm.braceCurveSize) + \"px\")])], 1)])]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"主题预览图生成\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: _vm.showThemeGeneratorDialog\n }\n }, [_vm._v(\"批量生成主题预览图\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.showLayoutGeneratorDialog\n }\n }, [_vm._v(\"批量生成布局预览图\")])], 1)]), _c(\"div\", {\n staticClass: \"panel-section\"\n }, [_c(\"h3\", [_vm._v(\"流程图功能\")]), _c(\"div\", {\n staticClass: \"button-group\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"process\");\n }\n }\n }, [_vm._v(\"创建流程节点\")]), _c(\"el-button\", {\n attrs: {\n type: \"warning\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"decision\");\n }\n }\n }, [_vm._v(\"创建决策节点\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"start\");\n }\n }\n }, [_vm._v(\"创建开始节点\")]), _c(\"el-button\", {\n attrs: {\n type: \"danger\"\n },\n on: {\n click: function ($event) {\n return _vm.createFlowChartNode(\"end\");\n }\n }\n }, [_vm._v(\"创建结束节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.convertToFlowChart\n }\n }, [_vm._v(\"转为流程图节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.convertToNormal\n }\n }, [_vm._v(\"转为普通节点\")]), _c(\"el-button\", {\n on: {\n click: _vm.testFlowChartMode\n }\n }, [_vm._v(\"测试混合模式\")]), _c(\"el-button\", {\n on: {\n click: _vm.testConnectorEvents\n }\n }, [_vm._v(\"测试连接点事件\")]), _c(\"el-button\", {\n attrs: {\n type: \"info\"\n },\n on: {\n click: _vm.testOrthogonalLines\n }\n }, [_vm._v(\"测试正交连线\")]), _c(\"el-button\", {\n attrs: {\n type: \"success\"\n },\n on: {\n click: _vm.testSnapAndDrag\n }\n }, [_vm._v(\"测试吸附和拖拽创建\")])], 1)])]), _c(\"div\", {\n staticClass: \"mindmap-area\"\n }, [_c(\"div\", {\n staticClass: \"mindmap-header\"\n }, [_c(\"span\", [_vm._v(\"思维导图\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.fitView\n }\n }, [_vm._v(\"适应视图\")])], 1), _c(\"div\", {\n staticClass: \"mindmap-container\"\n }, [_c(\"div\", {\n ref: \"mindMapContainer\",\n staticClass: \"mindMapContainer\",\n attrs: {\n id: \"testMindMapContainer\"\n }\n })])]), _c(\"el-dialog\", {\n attrs: {\n title: \"批量生成主题预览图\",\n visible: _vm.themeGeneratorDialogVisible,\n width: \"80%\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function ($event) {\n _vm.themeGeneratorDialogVisible = $event;\n }\n }\n }, [_c(\"div\", {\n staticClass: \"theme-generator-content\"\n }, [_c(\"div\", {\n staticClass: \"generator-header\"\n }, [_c(\"el-alert\", {\n attrs: {\n title: `共有 ${_vm.allThemes.length} 个主题,已生成 ${_vm.generatedCount} 个`,\n type: \"info\",\n closable: false\n }\n }), _c(\"div\", {\n staticClass: \"quality-settings\"\n }, [_c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"label\", [_vm._v(\"WebP 质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"200px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"show-tooltip\": true,\n \"format-tooltip\": val => Math.round(val * 100) + \"%\"\n },\n model: {\n value: _vm.webpQuality,\n callback: function ($$v) {\n _vm.webpQuality = $$v;\n },\n expression: \"webpQuality\"\n }\n }), _c(\"span\", {\n staticClass: \"quality-value\"\n }, [_vm._v(_vm._s(Math.round(_vm.webpQuality * 100)) + \"%\")]), _c(\"el-tooltip\", {\n attrs: {\n content: \"较低的质量会减小文件大小,但可能降低图像质量\"\n }\n }, [_c(\"i\", {\n staticClass: \"el-icon-question\",\n staticStyle: {\n \"margin-left\": \"5px\",\n color: \"#909399\"\n }\n })])], 1), _c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"label\", [_vm._v(\"JPG 质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"200px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"show-tooltip\": true,\n \"format-tooltip\": val => Math.round(val * 100) + \"%\"\n },\n model: {\n value: _vm.jpgQuality,\n callback: function ($$v) {\n _vm.jpgQuality = $$v;\n },\n expression: \"jpgQuality\"\n }\n }), _c(\"span\", {\n staticClass: \"quality-value\"\n }, [_vm._v(_vm._s(Math.round(_vm.jpgQuality * 100)) + \"%\")]), _c(\"el-tooltip\", {\n attrs: {\n content: \"JPG不支持透明度会添加白色背景\"\n }\n }, [_c(\"i\", {\n staticClass: \"el-icon-question\",\n staticStyle: {\n \"margin-left\": \"5px\",\n color: \"#909399\"\n }\n })])], 1), _c(\"div\", {\n staticClass: \"quality-presets\"\n }, [_c(\"label\", [_vm._v(\"快速预设:\")]), _c(\"el-button-group\", {\n attrs: {\n size: \"small\"\n }\n }, [_c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"high\");\n }\n }\n }, [_vm._v(\"高质量\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"medium\");\n }\n }\n }, [_vm._v(\"平衡\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"low\");\n }\n }\n }, [_vm._v(\"小文件\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n return _vm.setQualityPreset(\"tiny\");\n }\n }\n }, [_vm._v(\"极限压缩\")])], 1)], 1)]), _c(\"div\", {\n staticClass: \"generator-actions\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\",\n loading: _vm.isGenerating,\n disabled: _vm.isGenerating\n },\n on: {\n click: _vm.startGenerating\n }\n }, [_vm._v(\" \" + _vm._s(_vm.isGenerating ? \"生成中...\" : \"开始生成\") + \" \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0\n },\n on: {\n click: _vm.downloadAllSVGs\n }\n }, [_vm._v(\" 下载所有SVG (\" + _vm._s(_vm.generatedSVGs.length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0,\n type: \"success\"\n },\n on: {\n click: _vm.downloadAllPNGs\n }\n }, [_vm._v(\" 下载所有PNG (\" + _vm._s(_vm.generatedSVGs.filter(t => t.pngDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0,\n type: \"warning\"\n },\n on: {\n click: _vm.downloadAllWebPs\n }\n }, [_vm._v(\" 下载所有WebP (\" + _vm._s(_vm.generatedSVGs.filter(t => t.webpDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedSVGs.length === 0,\n type: \"danger\"\n },\n on: {\n click: _vm.downloadAllJPGs\n }\n }, [_vm._v(\" 下载所有JPG (\" + _vm._s(_vm.generatedSVGs.filter(t => t.jpgDataUrl).length) + \") \")]), _c(\"el-button\", {\n on: {\n click: _vm.clearGenerated\n }\n }, [_vm._v(\"清空\")])], 1)], 1), _vm.isGenerating ? _c(\"div\", {\n staticClass: \"generator-progress\"\n }, [_c(\"el-progress\", {\n attrs: {\n percentage: Math.round(_vm.generatedCount / _vm.allThemes.length * 100),\n status: _vm.generatedCount === _vm.allThemes.length ? \"success\" : \"\"\n }\n }), _c(\"p\", [_vm._v(\"正在生成: \" + _vm._s(_vm.currentThemeName))])], 1) : _vm._e(), _vm.previewMindMapEl ? _c(\"div\", {\n staticClass: \"preview-container\"\n }, [_c(\"div\", {\n ref: \"previewMindMapEl\",\n attrs: {\n id: \"themePreviewMindMap\"\n }\n })]) : _vm._e(), _c(\"div\", {\n staticClass: \"generated-list\"\n }, [_c(\"el-table\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n data: _vm.generatedSVGs,\n height: \"400\"\n }\n }, [_c(\"el-table-column\", {\n attrs: {\n prop: \"name\",\n label: \"主题名称\",\n width: \"150\",\n fixed: \"\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticStyle: {\n display: \"flex\",\n \"align-items\": \"center\"\n }\n }, [_c(\"span\", [_vm._v(_vm._s(scope.row.name))]), scope.row.isDefault ? _c(\"el-tag\", {\n staticStyle: {\n \"margin-left\": \"8px\"\n },\n attrs: {\n type: \"primary\",\n size: \"mini\"\n }\n }, [_vm._v(\" 默认 \")]) : _vm._e()], 1)];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n prop: \"value\",\n label: \"主题值\",\n width: \"120\"\n }\n }), _c(\"el-table-column\", {\n attrs: {\n prop: \"type\",\n label: \"类型\",\n width: \"70\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"el-tag\", {\n attrs: {\n type: scope.row.dark ? \"info\" : \"warning\",\n size: \"small\"\n }\n }, [_vm._v(\" \" + _vm._s(scope.row.dark ? \"深色\" : \"浅色\") + \" \")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"预览\",\n width: \"200\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"el-tabs\", {\n staticStyle: {\n height: \"100px\"\n },\n attrs: {\n type: \"card\"\n }\n }, [_c(\"el-tab-pane\", {\n attrs: {\n label: \"SVG\"\n }\n }, [scope.row.svgContent ? _c(\"div\", {\n staticStyle: {\n width: \"180px\",\n height: \"80px\",\n overflow: \"hidden\"\n },\n domProps: {\n innerHTML: _vm._s(scope.row.svgContent)\n }\n }) : _vm._e()]), scope.row.pngDataUrl ? _c(\"el-tab-pane\", {\n attrs: {\n label: \"PNG\"\n }\n }, [_c(\"img\", {\n staticStyle: {\n width: \"180px\",\n height: \"auto\",\n \"max-height\": \"80px\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: scope.row.pngDataUrl\n }\n })]) : _vm._e(), scope.row.webpDataUrl ? _c(\"el-tab-pane\", {\n attrs: {\n label: \"WebP\"\n }\n }, [_c(\"img\", {\n staticStyle: {\n width: \"180px\",\n height: \"auto\",\n \"max-height\": \"80px\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: scope.row.webpDataUrl\n }\n })]) : _vm._e(), scope.row.jpgDataUrl ? _c(\"el-tab-pane\", {\n attrs: {\n label: \"JPG\"\n }\n }, [_c(\"img\", {\n staticStyle: {\n width: \"180px\",\n height: \"auto\",\n \"max-height\": \"80px\",\n \"object-fit\": \"contain\"\n },\n attrs: {\n src: scope.row.jpgDataUrl\n }\n })]) : _vm._e()], 1)];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"文件大小\",\n width: \"200\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticClass: \"size-info\"\n }, [scope.row.svgSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\"\n }\n }, [_vm._v(\"SVG: \" + _vm._s(_vm.formatFileSize(scope.row.svgSize)))])], 1) : _vm._e(), scope.row.pngSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\",\n type: \"success\"\n }\n }, [_vm._v(\"PNG: \" + _vm._s(_vm.formatFileSize(scope.row.pngSize)))])], 1) : _vm._e(), scope.row.webpSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\",\n type: \"warning\"\n }\n }, [_vm._v(\"WebP: \" + _vm._s(_vm.formatFileSize(scope.row.webpSize)))])], 1) : _vm._e(), scope.row.jpgSize ? _c(\"div\", [_c(\"el-tag\", {\n attrs: {\n size: \"small\",\n type: \"danger\"\n }\n }, [_vm._v(\"JPG: \" + _vm._s(_vm.formatFileSize(scope.row.jpgSize)))])], 1) : _vm._e()])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n fixed: \"right\",\n width: \"240\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticClass: \"action-buttons\"\n }, [_c(\"el-button-group\", [_c(\"el-button\", {\n attrs: {\n size: \"mini\",\n title: \"下载SVG\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSingleSVG(scope.row);\n }\n }\n }, [_vm._v(\" SVG \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n disabled: !scope.row.pngDataUrl,\n type: \"success\",\n title: \"下载PNG\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSinglePNG(scope.row);\n }\n }\n }, [_vm._v(\" PNG \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n disabled: !scope.row.webpDataUrl,\n type: \"warning\",\n title: \"下载WebP\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSingleWebP(scope.row);\n }\n }\n }, [_vm._v(\" WebP \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n disabled: !scope.row.jpgDataUrl,\n type: \"danger\",\n title: \"下载JPG\"\n },\n on: {\n click: function ($event) {\n return _vm.downloadSingleJPG(scope.row);\n }\n }\n }, [_vm._v(\" JPG \")])], 1), _c(\"el-button\", {\n staticStyle: {\n \"margin-left\": \"10px\"\n },\n attrs: {\n size: \"mini\",\n type: \"text\"\n },\n on: {\n click: function ($event) {\n return _vm.removeGenerated(scope.$index);\n }\n }\n }, [_vm._v(\" 删除 \")])], 1)];\n }\n }])\n })], 1)], 1)])]), _c(\"el-dialog\", {\n attrs: {\n title: \"批量生成布局预览图\",\n visible: _vm.layoutGeneratorDialogVisible,\n width: \"80%\",\n \"close-on-click-modal\": false\n },\n on: {\n \"update:visible\": function ($event) {\n _vm.layoutGeneratorDialogVisible = $event;\n }\n }\n }, [_c(\"div\", {\n staticClass: \"layout-generator-content\"\n }, [_c(\"div\", {\n staticClass: \"generator-header\"\n }, [_c(\"el-alert\", {\n attrs: {\n title: `共有 ${_vm.allLayouts.length} 个布局,已生成 ${_vm.generatedLayoutCount} 个`,\n type: \"info\",\n closable: false\n }\n }), _c(\"div\", {\n staticClass: \"generator-controls\"\n }, [_c(\"div\", {\n staticClass: \"quality-controls\"\n }, [_c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"span\", [_vm._v(\"WebP质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"150px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"format-tooltip\": val => `${Math.round(val * 100)}%`\n },\n model: {\n value: _vm.layoutWebpQuality,\n callback: function ($$v) {\n _vm.layoutWebpQuality = $$v;\n },\n expression: \"layoutWebpQuality\"\n }\n }), _c(\"el-button-group\", {\n attrs: {\n size: \"mini\"\n }\n }, [_c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 0.3;\n }\n }\n }, [_vm._v(\"低\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 0.6;\n }\n }\n }, [_vm._v(\"中\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 0.8;\n }\n }\n }, [_vm._v(\"高\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutWebpQuality = 1;\n }\n }\n }, [_vm._v(\"最高\")])], 1)], 1), _c(\"div\", {\n staticClass: \"quality-item\"\n }, [_c(\"span\", [_vm._v(\"JPG质量:\")]), _c(\"el-slider\", {\n staticStyle: {\n width: \"150px\",\n margin: \"0 10px\"\n },\n attrs: {\n min: 0.1,\n max: 1,\n step: 0.05,\n \"format-tooltip\": val => `${Math.round(val * 100)}%`\n },\n model: {\n value: _vm.layoutJpgQuality,\n callback: function ($$v) {\n _vm.layoutJpgQuality = $$v;\n },\n expression: \"layoutJpgQuality\"\n }\n }), _c(\"el-button-group\", {\n attrs: {\n size: \"mini\"\n }\n }, [_c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 0.3;\n }\n }\n }, [_vm._v(\"低\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 0.6;\n }\n }\n }, [_vm._v(\"中\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 0.85;\n }\n }\n }, [_vm._v(\"高\")]), _c(\"el-button\", {\n on: {\n click: function ($event) {\n _vm.layoutJpgQuality = 1;\n }\n }\n }, [_vm._v(\"最高\")])], 1)], 1)]), _c(\"div\", {\n staticClass: \"action-buttons\"\n }, [_c(\"el-button\", {\n attrs: {\n type: \"primary\",\n loading: _vm.isGeneratingLayouts,\n disabled: _vm.isGeneratingLayouts\n },\n on: {\n click: _vm.generateAllLayoutPreviews\n }\n }, [_vm._v(\" \" + _vm._s(_vm.isGeneratingLayouts ? `正在生成 ${_vm.currentLayoutName}...` : \"生成所有布局预览图\") + \" \")]), _c(\"el-button\", {\n on: {\n click: _vm.clearGeneratedLayouts\n }\n }, [_vm._v(\"清空已生成\")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0\n },\n on: {\n click: _vm.downloadAllLayoutSVGs\n }\n }, [_vm._v(\" 下载所有SVG (\" + _vm._s(_vm.generatedLayoutSVGs.length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0,\n type: \"success\"\n },\n on: {\n click: _vm.downloadAllLayoutPNGs\n }\n }, [_vm._v(\" 下载所有PNG (\" + _vm._s(_vm.generatedLayoutSVGs.filter(l => l.pngDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0,\n type: \"warning\"\n },\n on: {\n click: _vm.downloadAllLayoutWebPs\n }\n }, [_vm._v(\" 下载所有WebP (\" + _vm._s(_vm.generatedLayoutSVGs.filter(l => l.webpDataUrl).length) + \") \")]), _c(\"el-button\", {\n attrs: {\n disabled: _vm.generatedLayoutSVGs.length === 0,\n type: \"danger\"\n },\n on: {\n click: _vm.downloadAllLayoutJPGs\n }\n }, [_vm._v(\" 下载所有JPG (\" + _vm._s(_vm.generatedLayoutSVGs.filter(l => l.jpgDataUrl).length) + \") \")])], 1)])], 1), _c(\"div\", {\n staticClass: \"layout-generator-list\"\n }, [_c(\"el-table\", {\n staticStyle: {\n width: \"100%\"\n },\n attrs: {\n data: _vm.allLayouts,\n height: \"400\",\n border: \"\"\n }\n }, [_c(\"el-table-column\", {\n attrs: {\n prop: \"name\",\n label: \"布局名称\",\n width: \"150\"\n }\n }), _c(\"el-table-column\", {\n attrs: {\n prop: \"value\",\n label: \"布局值\",\n width: \"180\"\n }\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"SVG预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.svgData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.svgData,\n alt: \"SVG预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.svgSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"PNG预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.pngData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.pngData,\n alt: \"PNG预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.pngSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"WebP预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.webpData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.webpData,\n alt: \"WebP预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.webpSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"JPG预览\",\n width: \"150\",\n align: \"center\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [scope.row.jpgData ? _c(\"div\", {\n staticClass: \"preview-image\"\n }, [_c(\"img\", {\n staticStyle: {\n \"max-width\": \"120px\",\n \"max-height\": \"80px\"\n },\n attrs: {\n src: scope.row.jpgData,\n alt: \"JPG预览\"\n }\n }), _c(\"div\", {\n staticClass: \"file-size\"\n }, [_vm._v(_vm._s(scope.row.jpgSize))])]) : _c(\"span\", [_vm._v(\"未生成\")])];\n }\n }])\n }), _c(\"el-table-column\", {\n attrs: {\n label: \"操作\",\n width: \"200\",\n fixed: \"right\"\n },\n scopedSlots: _vm._u([{\n key: \"default\",\n fn: function (scope) {\n return [_c(\"div\", {\n staticClass: \"action-buttons\"\n }, [_c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"primary\",\n disabled: _vm.isGeneratingLayouts\n },\n on: {\n click: function ($event) {\n return _vm.generateLayoutPreview(scope.row);\n }\n }\n }, [_vm._v(\" 生成 \")]), _c(\"el-button\", {\n attrs: {\n size: \"mini\",\n type: \"success\",\n disabled: !scope.row.svgData\n },\n on: {\n click: function ($event) {\n return _vm.downloadLayoutPreview(scope.row);\n }\n }\n }, [_vm._v(\" 下载 \")])], 1)];\n }\n }])\n })], 1)], 1)])]), _c(\"div\", {\n staticClass: \"panel-header\"\n }, [_c(\"span\", [_vm._v(\"实时数据\")]), _c(\"el-button\", {\n attrs: {\n size: \"small\"\n },\n on: {\n click: _vm.refreshData\n }\n }, [_vm._v(\"刷新\")])], 1), _c(\"el-tabs\", {\n attrs: {\n type: \"border-card\"\n },\n model: {\n value: _vm.activeTab,\n callback: function ($$v) {\n _vm.activeTab = $$v;\n },\n expression: \"activeTab\"\n }\n }, [_c(\"el-tab-pane\", {\n attrs: {\n label: \"数据结构\",\n name: \"data\"\n }\n }, [_c(\"div\", {\n staticClass: \"data-content\"\n }, [_c(\"pre\", [_vm._v(_vm._s(_vm.formattedData))])])]), _c(\"el-tab-pane\", {\n attrs: {\n label: \"关联线数据\",\n name: \"associations\"\n }\n }, [_c(\"div\", {\n staticClass: \"data-content\"\n }, [_vm.associationsData.length === 0 ? _c(\"div\", {\n staticClass: \"no-data\"\n }, [_vm._v(\" 暂无关联线数据 \")]) : _c(\"div\", _vm._l(_vm.associationsData, function (assoc, index) {\n return _c(\"div\", {\n key: index,\n staticClass: \"association-item\"\n }, [_c(\"div\", {\n staticClass: \"association-info\"\n }, [_c(\"strong\", [_vm._v(\"关联线 \" + _vm._s(index + 1))]), _c(\"p\", [_vm._v(\"起始: \" + _vm._s(assoc.fromNodeText))]), _c(\"p\", [_vm._v(\"目标: \" + _vm._s(assoc.toNodeText))]), _c(\"p\", [_vm._v(\"文本: \" + _vm._s(assoc.text || \"无\"))])]), _c(\"el-button\", {\n attrs: {\n size: \"small\",\n type: \"danger\"\n },\n on: {\n click: function ($event) {\n return _vm.removeAssociation(index);\n }\n }\n }, [_vm._v(\"删除\")])], 1);\n }), 0)])]), _c(\"el-tab-pane\", {\n attrs: {\n label: \"操作日志\",\n name: \"logs\"\n }\n }, [_c(\"div\", {\n staticClass: \"data-content\"\n }, _vm._l(_vm.operationLogs, function (log, index) {\n return _c(\"div\", {\n key: index,\n staticClass: \"log-item\"\n }, [_c(\"span\", {\n staticClass: \"log-time\"\n }, [_vm._v(_vm._s(log.time))]), _c(\"span\", {\n staticClass: \"log-message\"\n }, [_vm._v(_vm._s(log.message))])]);\n }), 0)])], 1)], 1)]);\n};\nvar staticRenderFns = [];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22b8ac2678-vue-loader-template%22%7D!./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/loaders/templateLoader.js??ref--7!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/core-js/internals/an-instance.js":
/*!*******************************************************!*\
!*** ./node_modules/core-js/internals/an-instance.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ \"./node_modules/core-js/internals/object-is-prototype-of.js\");\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n\n\n//# sourceURL=webpack:///./node_modules/core-js/internals/an-instance.js?");
/***/ }),
/***/ "./node_modules/core-js/internals/dom-exception-constants.js":
/*!*******************************************************************!*\
!*** ./node_modules/core-js/internals/dom-exception-constants.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nmodule.exports = {\n IndexSizeError: { s: 'INDEX_SIZE_ERR', c: 1, m: 1 },\n DOMStringSizeError: { s: 'DOMSTRING_SIZE_ERR', c: 2, m: 0 },\n HierarchyRequestError: { s: 'HIERARCHY_REQUEST_ERR', c: 3, m: 1 },\n WrongDocumentError: { s: 'WRONG_DOCUMENT_ERR', c: 4, m: 1 },\n InvalidCharacterError: { s: 'INVALID_CHARACTER_ERR', c: 5, m: 1 },\n NoDataAllowedError: { s: 'NO_DATA_ALLOWED_ERR', c: 6, m: 0 },\n NoModificationAllowedError: { s: 'NO_MODIFICATION_ALLOWED_ERR', c: 7, m: 1 },\n NotFoundError: { s: 'NOT_FOUND_ERR', c: 8, m: 1 },\n NotSupportedError: { s: 'NOT_SUPPORTED_ERR', c: 9, m: 1 },\n InUseAttributeError: { s: 'INUSE_ATTRIBUTE_ERR', c: 10, m: 1 },\n InvalidStateError: { s: 'INVALID_STATE_ERR', c: 11, m: 1 },\n SyntaxError: { s: 'SYNTAX_ERR', c: 12, m: 1 },\n InvalidModificationError: { s: 'INVALID_MODIFICATION_ERR', c: 13, m: 1 },\n NamespaceError: { s: 'NAMESPACE_ERR', c: 14, m: 1 },\n InvalidAccessError: { s: 'INVALID_ACCESS_ERR', c: 15, m: 1 },\n ValidationError: { s: 'VALIDATION_ERR', c: 16, m: 0 },\n TypeMismatchError: { s: 'TYPE_MISMATCH_ERR', c: 17, m: 1 },\n SecurityError: { s: 'SECURITY_ERR', c: 18, m: 1 },\n NetworkError: { s: 'NETWORK_ERR', c: 19, m: 1 },\n AbortError: { s: 'ABORT_ERR', c: 20, m: 1 },\n URLMismatchError: { s: 'URL_MISMATCH_ERR', c: 21, m: 1 },\n QuotaExceededError: { s: 'QUOTA_EXCEEDED_ERR', c: 22, m: 1 },\n TimeoutError: { s: 'TIMEOUT_ERR', c: 23, m: 1 },\n InvalidNodeTypeError: { s: 'INVALID_NODE_TYPE_ERR', c: 24, m: 1 },\n DataCloneError: { s: 'DATA_CLONE_ERR', c: 25, m: 1 }\n};\n\n\n//# sourceURL=webpack:///./node_modules/core-js/internals/dom-exception-constants.js?");
/***/ }),
/***/ "./node_modules/core-js/modules/web.dom-exception.stack.js":
/*!*****************************************************************!*\
!*** ./node_modules/core-js/modules/web.dom-exception.stack.js ***!
\*****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar defineProperty = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f;\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar anInstance = __webpack_require__(/*! ../internals/an-instance */ \"./node_modules/core-js/internals/an-instance.js\");\nvar inheritIfRequired = __webpack_require__(/*! ../internals/inherit-if-required */ \"./node_modules/core-js/internals/inherit-if-required.js\");\nvar normalizeStringArgument = __webpack_require__(/*! ../internals/normalize-string-argument */ \"./node_modules/core-js/internals/normalize-string-argument.js\");\nvar DOMExceptionConstants = __webpack_require__(/*! ../internals/dom-exception-constants */ \"./node_modules/core-js/internals/dom-exception-constants.js\");\nvar clearErrorStack = __webpack_require__(/*! ../internals/error-stack-clear */ \"./node_modules/core-js/internals/error-stack-clear.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar DOM_EXCEPTION = 'DOMException';\nvar Error = getBuiltIn('Error');\nvar NativeDOMException = getBuiltIn(DOM_EXCEPTION);\n\nvar $DOMException = function DOMException() {\n anInstance(this, DOMExceptionPrototype);\n var argumentsLength = arguments.length;\n var message = normalizeStringArgument(argumentsLength < 1 ? undefined : arguments[0]);\n var name = normalizeStringArgument(argumentsLength < 2 ? undefined : arguments[1], 'Error');\n var that = new NativeDOMException(message, name);\n var error = new Error(message);\n error.name = DOM_EXCEPTION;\n defineProperty(that, 'stack', createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));\n inheritIfRequired(that, this, $DOMException);\n return that;\n};\n\nvar DOMExceptionPrototype = $DOMException.prototype = NativeDOMException.prototype;\n\nvar ERROR_HAS_STACK = 'stack' in new Error(DOM_EXCEPTION);\nvar DOM_EXCEPTION_HAS_STACK = 'stack' in new NativeDOMException(1, 2);\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar descriptor = NativeDOMException && DESCRIPTORS && Object.getOwnPropertyDescriptor(global, DOM_EXCEPTION);\n\n// Bun ~ 0.1.1 DOMException have incorrect descriptor and we can't redefine it\n// https://github.com/Jarred-Sumner/bun/issues/399\nvar BUGGY_DESCRIPTOR = !!descriptor && !(descriptor.writable && descriptor.configurable);\n\nvar FORCED_CONSTRUCTOR = ERROR_HAS_STACK && !BUGGY_DESCRIPTOR && !DOM_EXCEPTION_HAS_STACK;\n\n// `DOMException` constructor patch for `.stack` where it's required\n// https://webidl.spec.whatwg.org/#es-DOMException-specialness\n$({ global: true, constructor: true, forced: IS_PURE || FORCED_CONSTRUCTOR }, { // TODO: fix export logic\n DOMException: FORCED_CONSTRUCTOR ? $DOMException : NativeDOMException\n});\n\nvar PolyfilledDOMException = getBuiltIn(DOM_EXCEPTION);\nvar PolyfilledDOMExceptionPrototype = PolyfilledDOMException.prototype;\n\nif (PolyfilledDOMExceptionPrototype.constructor !== PolyfilledDOMException) {\n if (!IS_PURE) {\n defineProperty(PolyfilledDOMExceptionPrototype, 'constructor', createPropertyDescriptor(1, PolyfilledDOMException));\n }\n\n for (var key in DOMExceptionConstants) if (hasOwn(DOMExceptionConstants, key)) {\n var constant = DOMExceptionConstants[key];\n var constantName = constant.s;\n if (!hasOwn(PolyfilledDOMException, constantName)) {\n defineProperty(PolyfilledDOMException, constantName, createPropertyDescriptor(6, constant.c));\n }\n }\n}\n\n\n//# sourceURL=webpack:///./node_modules/core-js/modules/web.dom-exception.stack.js?");
/***/ }),
/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"\\n.test-container[data-v-2f56c616] {\\n height: 100vh;\\n display: flex;\\n flex-direction: column;\\n background: #f5f7fa;\\n}\\n.test-header[data-v-2f56c616] {\\n text-align: center;\\n padding: 15px 20px;\\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\n color: white;\\n flex-shrink: 0;\\n}\\n.test-header h1[data-v-2f56c616] {\\n margin: 0 0 5px 0;\\n font-size: 24px;\\n font-weight: 500;\\n}\\n.test-header p[data-v-2f56c616] {\\n margin: 0;\\n opacity: 0.9;\\n font-size: 14px;\\n}\\n.test-main[data-v-2f56c616] {\\n flex: 1;\\n display: flex;\\n gap: 10px;\\n padding: 10px;\\n overflow: hidden;\\n}\\n\\n/* 左侧控制面板 */\\n.control-panel[data-v-2f56c616] {\\n width: 280px;\\n background: white;\\n border-radius: 8px;\\n padding: 15px;\\n overflow-y: auto;\\n flex-shrink: 0;\\n}\\n.panel-section[data-v-2f56c616] {\\n margin-bottom: 20px;\\n padding-bottom: 15px;\\n border-bottom: 1px solid #f0f0f0;\\n}\\n.panel-section[data-v-2f56c616]:last-child {\\n border-bottom: none;\\n}\\n.panel-section h3[data-v-2f56c616] {\\n margin: 0 0 12px 0;\\n font-size: 14px;\\n color: #333;\\n font-weight: 600;\\n}\\n.button-group[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n.button-group .el-button[data-v-2f56c616] {\\n width: 100%;\\n margin: 0;\\n}\\n.status-info[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n}\\n.association-tips[data-v-2f56c616] {\\n margin-top: 10px;\\n}\\n.association-tips[data-v-2f56c616] .el-alert__content {\\n font-size: 12px;\\n}\\n.association-tips p[data-v-2f56c616] {\\n margin: 2px 0;\\n}\\n\\n/* 中间思维导图区域 */\\n.mindmap-area[data-v-2f56c616] {\\n flex: 1;\\n display: flex;\\n flex-direction: column;\\n background: white;\\n border-radius: 8px;\\n overflow: hidden;\\n}\\n.mindmap-header[data-v-2f56c616] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 10px 15px;\\n background: #f8f9fa;\\n border-bottom: 1px solid #e9ecef;\\n font-weight: 600;\\n color: #333;\\n}\\n.mindmap-container[data-v-2f56c616] {\\n flex: 1;\\n position: relative;\\n overflow: hidden;\\n}\\n.mindMapContainer[data-v-2f56c616] {\\n width: 100%;\\n height: 100%;\\n position: absolute;\\n top: 0;\\n left: 0;\\n}\\n\\n/* 右侧数据面板 */\\n.data-panel[data-v-2f56c616] {\\n width: 320px;\\n background: white;\\n border-radius: 8px;\\n display: flex;\\n flex-direction: column;\\n overflow: hidden;\\n flex-shrink: 0;\\n}\\n.panel-header[data-v-2f56c616] {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n padding: 10px 15px;\\n background: #f8f9fa;\\n border-bottom: 1px solid #e9ecef;\\n font-weight: 600;\\n color: #333;\\n}\\n.data-content[data-v-2f56c616] {\\n height: 400px;\\n overflow-y: auto;\\n padding: 10px;\\n}\\n.data-content pre[data-v-2f56c616] {\\n background: #f8f9fa;\\n padding: 10px;\\n border-radius: 4px;\\n border: 1px solid #e9ecef;\\n font-size: 12px;\\n line-height: 1.4;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n}\\n.no-data[data-v-2f56c616] {\\n text-align: center;\\n color: #999;\\n padding: 20px;\\n}\\n.association-item[data-v-2f56c616] {\\n display: flex;\\n justify-content: space-between;\\n align-items: flex-start;\\n padding: 10px;\\n border: 1px solid #e9ecef;\\n border-radius: 4px;\\n margin-bottom: 8px;\\n}\\n.association-info[data-v-2f56c616] {\\n flex: 1;\\n}\\n.association-info strong[data-v-2f56c616] {\\n color: #333;\\n display: block;\\n margin-bottom: 5px;\\n}\\n.association-info p[data-v-2f56c616] {\\n margin: 2px 0;\\n font-size: 12px;\\n color: #666;\\n}\\n.log-item[data-v-2f56c616] {\\n display: flex;\\n align-items: flex-start;\\n gap: 10px;\\n padding: 5px 0;\\n border-bottom: 1px solid #f0f0f0;\\n font-size: 12px;\\n}\\n.log-time[data-v-2f56c616] {\\n color: #999;\\n font-family: monospace;\\n flex-shrink: 0;\\n}\\n.log-message[data-v-2f56c616] {\\n color: #333;\\n flex: 1;\\n}\\n\\n/* 思维导图相关样式 */\\n[data-v-2f56c616] .smm-mind-map-container {\\n width: 100%;\\n height: 100%;\\n}\\n[data-v-2f56c616] .smm-mind-map-container svg {\\n width: 100%;\\n height: 100%;\\n}\\n\\n/* 主题生成器样式 */\\n.theme-generator-content[data-v-2f56c616] {\\n padding: 10px;\\n}\\n.generator-header[data-v-2f56c616] {\\n margin-bottom: 20px;\\n}\\n.quality-settings[data-v-2f56c616] {\\n margin: 15px 0;\\n padding: 15px;\\n background: #f5f7fa;\\n border-radius: 4px;\\n}\\n.quality-item[data-v-2f56c616] {\\n display: flex;\\n align-items: center;\\n margin-bottom: 15px;\\n}\\n.quality-item label[data-v-2f56c616] {\\n width: 100px;\\n font-weight: 500;\\n color: #606266;\\n}\\n.quality-value[data-v-2f56c616] {\\n width: 50px;\\n text-align: center;\\n font-weight: bold;\\n color: #409eff;\\n}\\n.quality-presets[data-v-2f56c616] {\\n display: flex;\\n align-items: center;\\n padding-top: 10px;\\n border-top: 1px solid #dcdfe6;\\n}\\n.quality-presets label[data-v-2f56c616] {\\n width: 100px;\\n font-weight: 500;\\n color: #606266;\\n}\\n.generator-actions[data-v-2f56c616] {\\n margin-top: 15px;\\n display: flex;\\n gap: 10px;\\n}\\n.generator-progress[data-v-2f56c616] {\\n margin: 20px 0;\\n text-align: center;\\n}\\n.generator-progress p[data-v-2f56c616] {\\n margin-top: 10px;\\n color: #666;\\n}\\n.preview-container[data-v-2f56c616] {\\n display: none; /* 隐藏预览容器 */\\n}\\n.generated-list[data-v-2f56c616] {\\n margin-top: 20px;\\n}\\n.size-info[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n}\\n.size-info div[data-v-2f56c616] {\\n display: flex;\\n align-items: center;\\n}\\n.action-buttons[data-v-2f56c616] {\\n display: flex;\\n flex-direction: column;\\n gap: 5px;\\n align-items: flex-start;\\n}\\n\\n/* 响应式调整 */\\n@media (max-width: 1200px) {\\n.control-panel[data-v-2f56c616],\\n .data-panel[data-v-2f56c616] {\\n width: 250px;\\n}\\n}\\n@media (max-width: 1000px) {\\n.test-main[data-v-2f56c616] {\\n flex-direction: column;\\n}\\n.control-panel[data-v-2f56c616],\\n .data-panel[data-v-2f56c616] {\\n width: 100%;\\n height: 200px;\\n}\\n.mindmap-area[data-v-2f56c616] {\\n min-height: 400px;\\n}\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css":
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/vue-style-loader??ref--7-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css ***!
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css */ \"./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css\");\nif(content.__esModule) content = content.default;\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../node_modules/vue-style-loader/lib/addStylesClient.js */ \"./node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"87171498\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(false) {}\n\n//# sourceURL=webpack:///./src/pages/test.vue?./node_modules/vue-style-loader??ref--7-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src??ref--7-oneOf-1-2!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./src/pages/test.vue":
/*!****************************!*\
!*** ./src/pages/test.vue ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./test.vue?vue&type=template&id=2f56c616&scoped=true */ \"./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true\");\n/* harmony import */ var _test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./test.vue?vue&type=script&lang=js */ \"./src/pages/test.vue?vue&type=script&lang=js\");\n/* empty/unused harmony star reexport *//* harmony import */ var _test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css */ \"./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"2f56c616\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/pages/test.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/pages/test.vue?");
/***/ }),
/***/ "./src/pages/test.vue?vue&type=script&lang=js":
/*!****************************************************!*\
!*** ./src/pages/test.vue?vue&type=script&lang=js ***!
\****************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/babel-loader/lib!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=script&lang=js */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=script&lang=js\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/pages/test.vue?");
/***/ }),
/***/ "./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css":
/*!************************************************************************************!*\
!*** ./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css ***!
\************************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-style-loader??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css */ \"./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/src/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=style&index=0&id=2f56c616&scoped=true&lang=css\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_7_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_7_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_7_oneOf_1_2_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_style_index_0_id_2f56c616_scoped_true_lang_css__WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?");
/***/ }),
/***/ "./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true":
/*!**********************************************************************!*\
!*** ./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true ***!
\**********************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_b8ac2678_vue_loader_template_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_loaders_templateLoader_js_ref_7_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"b8ac2678-vue-loader-template\"}!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/babel-loader/lib!../../node_modules/vue-loader/lib/loaders/templateLoader.js??ref--7!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib??vue-loader-options!./test.vue?vue&type=template&id=2f56c616&scoped=true */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"b8ac2678-vue-loader-template\\\"}!./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/test.vue?vue&type=template&id=2f56c616&scoped=true\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_b8ac2678_vue_loader_template_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_loaders_templateLoader_js_ref_7_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_b8ac2678_vue_loader_template_node_modules_cache_loader_dist_cjs_js_ref_13_0_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_loaders_templateLoader_js_ref_7_node_modules_cache_loader_dist_cjs_js_ref_1_0_node_modules_vue_loader_lib_index_js_vue_loader_options_test_vue_vue_type_template_id_2f56c616_scoped_true__WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/pages/test.vue?");
/***/ })
}]);