yys-editor 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yys-editor.es.js","sources":["../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_freeGlobal.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_root.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Symbol.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getRawTag.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_objectToString.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseGetTag.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isObjectLike.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArray.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isObject.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isFunction.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_coreJsData.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isMasked.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_toSource.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsNative.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getValue.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getNative.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_WeakMap.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isLength.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArrayLike.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isPrototype.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsArguments.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArguments.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/stubFalse.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isBuffer.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsTypedArray.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseUnary.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nodeUtil.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isTypedArray.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_overArg.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nativeKeys.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseKeys.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Map.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_DataView.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Promise.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Set.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getTag.js","../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isEmpty.js","../../node_modules/.pnpm/@logicflow+core@2.1.11/node_modules/@logicflow/core/es/keyboard/shortcut.js","../src/ts/schema.ts","../src/ts/nodeStyle.ts","../src/ts/useNodeAppearance.ts","../src/components/flow/nodes/yys/PropertySelectNode.vue","../src/components/flow/nodes/common/ImageNode.vue","../src/components/flow/nodes/common/AssetSelectorNode.vue","../src/components/flow/nodes/common/TextNode.vue","../src/components/flow/nodes/common/TextNodeModel.ts","../src/components/flow/nodes/common/VectorNode.vue","../src/components/flow/nodes/common/VectorNodeModel.ts","../src/ts/useDialogs.ts","../src/ts/useLogicFlow.ts","../src/components/flow/panels/PropertyRulePanel.vue","../src/components/flow/panels/ImagePanel.vue","../src/components/flow/panels/TextPanel.vue","../src/components/flow/panels/StylePanel.vue","../src/configs/selectorPresets.ts","../src/components/flow/panels/AssetSelectorPanel.vue","../src/components/flow/panels/VectorPanel.vue","../src/types/nodeTypes.ts","../src/components/flow/PropertyPanel.vue","../src/ts/useGlobalMessage.ts","../src/ts/useCanvasSettings.ts","../src/components/flow/FlowEditor.vue","../../../../assets/Other/Contact.png","../src/ts/useStore.ts","../src/components/Toolbar.vue","../src/components/flow/ComponentsPanel.vue","../src/YysEditorEmbed.vue"],"sourcesContent":["/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","import baseKeys from './_baseKeys.js';\nimport getTag from './_getTag.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLike from './isArrayLike.js';\nimport isBuffer from './isBuffer.js';\nimport isPrototype from './_isPrototype.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nexport default isEmpty;\n","var __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport { isEmpty } from 'lodash-es';\nimport { map } from 'lodash-es';\nvar selected = null;\nexport function translateNodeData(nodeData, distance) {\n var _a, _b;\n nodeData.x += distance;\n nodeData.y += distance;\n if (!isEmpty(nodeData.text)) {\n nodeData.text.x += distance;\n nodeData.text.y += distance;\n }\n if (!isEmpty((_a = nodeData.properties) === null || _a === void 0 ? void 0 : _a._label)) {\n (_b = nodeData.properties) === null || _b === void 0 ? void 0 : _b._label.forEach(function (label) {\n label.x += distance;\n label.y += distance;\n });\n }\n return nodeData;\n}\nexport function translateEdgeData(edgeData, distance) {\n if (edgeData.startPoint) {\n edgeData.startPoint.x += distance;\n edgeData.startPoint.y += distance;\n }\n if (edgeData.endPoint) {\n edgeData.endPoint.x += distance;\n edgeData.endPoint.y += distance;\n }\n if (edgeData.pointsList && edgeData.pointsList.length > 0) {\n edgeData.pointsList.forEach(function (point) {\n point.x += distance;\n point.y += distance;\n });\n }\n if (!isEmpty(edgeData.text)) {\n edgeData.text.x += distance;\n edgeData.text.y += distance;\n }\n return edgeData;\n}\nexport function transformNodeData(nodeData, distance) {\n var x = nodeData.x, y = nodeData.y, text = nodeData.text;\n // 重新计算 text 的位置,保证粘贴后 text 位置和复制的原节点相对位置一致\n var nextText = text\n ? {\n x: text.x + distance,\n y: text.y + distance,\n value: text.value,\n }\n : undefined;\n return __assign(__assign({}, nodeData), { id: '', x: x + distance, y: y + distance, text: nextText });\n}\nexport function transformEdgeData(edgeData, distance) {\n var startPoint = edgeData.startPoint, endPoint = edgeData.endPoint, pointsList = edgeData.pointsList, text = edgeData.text, edgeConfig = __rest(edgeData\n // 清除原始边的 id\n , [\"startPoint\", \"endPoint\", \"pointsList\", \"text\"]);\n // 清除原始边的 id\n edgeConfig.id = '';\n // 重新计算边的位置,包括 startPoint、endPoint、pointsList 以及 text\n // TODO: 看这个是否可以提出一个通用方法,用于重新计算边的位置\n var nextStartPoint = {\n x: startPoint.x + distance,\n y: startPoint.y + distance,\n };\n var nextEndPoint = {\n x: endPoint.x + distance,\n y: endPoint.y + distance,\n };\n var newPointsList = map(pointsList, function (point) {\n return {\n x: point.x + distance,\n y: point.y + distance,\n };\n });\n var nextText = text\n ? __assign(__assign({}, text), { x: text.x + distance, y: text.y + distance }) : undefined;\n return __assign(__assign({}, edgeConfig), { startPoint: nextStartPoint, endPoint: nextEndPoint, pointsList: newPointsList, text: nextText });\n}\nvar TRANSLATION_DISTANCE = 40;\nvar CHILDREN_TRANSLATION_DISTANCE = 40;\nexport function initDefaultShortcut(lf, graph) {\n var keyboard = lf.keyboard;\n var keyboardOptions = keyboard.options.keyboard;\n // 复制\n keyboard.on(['cmd + c', 'ctrl + c'], function () {\n CHILDREN_TRANSLATION_DISTANCE = TRANSLATION_DISTANCE;\n if (!(keyboardOptions === null || keyboardOptions === void 0 ? void 0 : keyboardOptions.enabled))\n return true;\n if (graph.textEditElement)\n return true;\n var guards = lf.options.guards;\n var elements = graph.getSelectElements(false);\n var enabledClone = guards && guards.beforeClone ? guards.beforeClone(elements) : true;\n if (!enabledClone ||\n (elements.nodes.length === 0 && elements.edges.length === 0)) {\n selected = null;\n return true;\n }\n selected = elements;\n selected.nodes.forEach(function (node) {\n return translateNodeData(node, TRANSLATION_DISTANCE);\n });\n selected.edges.forEach(function (edge) {\n return translateEdgeData(edge, TRANSLATION_DISTANCE);\n });\n return false;\n });\n // 粘贴\n keyboard.on(['cmd + v', 'ctrl + v'], function () {\n if (!(keyboardOptions === null || keyboardOptions === void 0 ? void 0 : keyboardOptions.enabled))\n return true;\n if (graph.textEditElement)\n return true;\n if (selected && (selected.nodes || selected.edges)) {\n lf.clearSelectElements();\n var addElements = lf.addElements(selected, CHILDREN_TRANSLATION_DISTANCE);\n if (!addElements)\n return true;\n addElements.nodes.forEach(function (node) { return lf.selectElementById(node.id, true); });\n addElements.edges.forEach(function (edge) { return lf.selectElementById(edge.id, true); });\n selected.nodes.forEach(function (node) {\n return translateNodeData(node, TRANSLATION_DISTANCE);\n });\n selected.edges.forEach(function (edge) {\n return translateEdgeData(edge, TRANSLATION_DISTANCE);\n });\n CHILDREN_TRANSLATION_DISTANCE =\n CHILDREN_TRANSLATION_DISTANCE + TRANSLATION_DISTANCE;\n }\n return false;\n });\n // undo\n keyboard.on(['cmd + z', 'ctrl + z'], function () {\n if (!(keyboardOptions === null || keyboardOptions === void 0 ? void 0 : keyboardOptions.enabled))\n return true;\n if (graph.textEditElement)\n return true;\n lf.undo();\n return false;\n });\n // redo\n keyboard.on(['cmd + y', 'ctrl + y'], function () {\n if (!(keyboardOptions === null || keyboardOptions === void 0 ? void 0 : keyboardOptions.enabled))\n return true;\n if (graph.textEditElement)\n return true;\n lf.redo();\n return false;\n });\n // delete\n keyboard.on(['backspace'], function () {\n if (!(keyboardOptions === null || keyboardOptions === void 0 ? void 0 : keyboardOptions.enabled))\n return true;\n if (graph.textEditElement)\n return true;\n var elements = graph.getSelectElements(true);\n lf.clearSelectElements();\n elements.edges.forEach(function (edge) { return edge.id && lf.deleteEdge(edge.id); });\n elements.nodes.forEach(function (node) { return node.id && lf.deleteNode(node.id); });\n return false;\n });\n}\n","export const CURRENT_SCHEMA_VERSION = '1.0.0';\r\n\r\nexport interface Transform {\r\n SCALE_X: number;\r\n SCALE_Y: number;\r\n TRANSLATE_X: number;\r\n TRANSLATE_Y: number;\r\n}\r\n\r\nexport interface NodeStyle {\r\n // Size and transform\r\n width: number;\r\n height: number;\r\n rotate?: number; // deg\r\n\r\n // Shape/appearance\r\n fill?: string;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n radius?: number | [number, number, number, number];\r\n opacity?: number; // 0..1\r\n\r\n // Shadow\r\n shadow?: {\r\n color?: string;\r\n blur?: number;\r\n offsetX?: number;\r\n offsetY?: number;\r\n };\r\n\r\n // Text style for text node or nodes with text\r\n textStyle?: {\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n fontWeight?: number | string;\r\n lineHeight?: number;\r\n align?: 'left' | 'center' | 'right';\r\n verticalAlign?: 'top' | 'middle' | 'bottom';\r\n letterSpacing?: number;\r\n padding?: [number, number, number, number];\r\n background?: string;\r\n };\r\n}\r\n\r\nexport interface NodeMeta {\r\n z?: number;\r\n locked?: boolean;\r\n visible?: boolean;\r\n groupId?: string;\r\n name?: string;\r\n createdAt?: number;\r\n updatedAt?: number;\r\n}\r\n\r\nexport interface NodeProperties {\r\n style: NodeStyle;\r\n meta?: NodeMeta;\r\n image?: { url: string; fit?: 'fill'|'contain'|'cover' };\r\n text?: { content: string; rich?: boolean };\r\n vector?: {\r\n kind: 'path' | 'rect' | 'ellipse' | 'polygon' | 'svg';\r\n svgContent?: string;\r\n path?: string;\r\n points?: Array<[number, number]>;\r\n tileWidth: number;\r\n tileHeight: number;\r\n fill?: string;\r\n stroke?: string;\r\n strokeWidth?: number;\r\n };\r\n shikigami?: { name: string; avatar: string; rarity: string };\r\n yuhun?: { name: string; type: string; avatar: string; shortName?: string };\r\n property?: Record<string, any>;\r\n}\r\n\r\nexport interface GraphNode {\r\n id: string;\r\n type: string;\r\n x?: number;\r\n y?: number;\r\n width?: number;\r\n height?: number;\r\n properties: NodeProperties;\r\n}\r\n\r\nexport interface GraphEdge {\r\n id: string;\r\n type?: string;\r\n sourceNodeId: string;\r\n targetNodeId: string;\r\n properties?: Record<string, any>;\r\n}\r\n\r\nexport interface GraphDocument { nodes: GraphNode[]; edges: GraphEdge[]; }\r\n\r\nexport interface RootDocument {\r\n schemaVersion: string;\r\n fileList: FlowFile[];\r\n activeFile: string;\r\n // 可以缺省,旧数据会在加载时通过名称回退\r\n activeFileId?: string;\r\n}\r\n\r\nexport const DefaultNodeStyle: NodeStyle = {\r\n width: 180,\r\n height: 120,\r\n rotate: 0,\r\n fill: '#ffffff',\r\n stroke: '#dcdfe6',\r\n strokeWidth: 1,\r\n radius: 4,\r\n opacity: 1,\r\n shadow: { color: 'rgba(0,0,0,0.1)', blur: 4, offsetX: 0, offsetY: 2 },\r\n textStyle: {\r\n color: '#303133',\r\n fontFamily: 'system-ui',\r\n fontSize: 14,\r\n fontWeight: 400,\r\n lineHeight: 1.4,\r\n align: 'left',\r\n verticalAlign: 'top',\r\n letterSpacing: 0,\r\n padding: [8, 8, 8, 8],\r\n },\r\n};\r\n\r\nfunction ensureTransform(t?: Partial<Transform>): Transform {\r\n return {\r\n SCALE_X: t?.SCALE_X ?? 1,\r\n SCALE_Y: t?.SCALE_Y ?? 1,\r\n TRANSLATE_X: t?.TRANSLATE_X ?? 0,\r\n TRANSLATE_Y: t?.TRANSLATE_Y ?? 0,\r\n };\r\n}\r\n\r\n// Migration to v1 root document\r\nexport function migrateToV1(input: any): RootDocument {\r\n const now = Date.now();\r\n\r\n // Normalize a single node into the v1 shape (properties.style + meta, width/height mirrored)\r\n const migrateNode = (node: any): GraphNode => {\r\n const n: any = { ...node };\r\n const props: any = n.properties ?? {};\r\n const style: any = props.style ?? {};\r\n const meta: any = props.meta ?? {};\r\n\r\n // Prefer explicit style width/height; otherwise fall back to scattered fields\r\n const propWidth = props.width ?? props.w;\r\n const propHeight = props.height ?? props.h;\r\n\r\n if (style.width == null) {\r\n if (propWidth != null) {\r\n style.width = propWidth;\r\n } else if (n.width != null) {\r\n style.width = n.width;\r\n }\r\n }\r\n if (style.height == null) {\r\n if (propHeight != null) {\r\n style.height = propHeight;\r\n } else if (n.height != null) {\r\n style.height = n.height;\r\n }\r\n }\r\n\r\n // Ensure meta defaults\r\n if (meta.visible == null) meta.visible = true;\r\n if (meta.locked == null) meta.locked = false;\r\n\r\n props.style = style;\r\n props.meta = meta;\r\n n.properties = props;\r\n\r\n // Mirror back to node width/height for render engines that still read from the node itself\r\n if (style.width != null) n.width = style.width;\r\n if (style.height != null) n.height = style.height;\r\n\r\n return n as GraphNode;\r\n };\r\n\r\n const ensureGraphDocument = (f: any): GraphDocument => {\r\n const raw = (f?.graphRawData && typeof f.graphRawData === 'object')\r\n ? f.graphRawData\r\n : { nodes: [], edges: [] };\r\n const nodes = Array.isArray(raw.nodes) ? raw.nodes.map(migrateNode) : [];\r\n const edges = Array.isArray(raw.edges) ? raw.edges : [];\r\n return { nodes, edges };\r\n };\r\n const wrap = (files: any[], activeName?: string): RootDocument => {\r\n const normalizedFiles = files.map((f, i) => ({\r\n label: f?.label ?? `File ${i + 1}`,\r\n name: f?.name ?? `File ${i + 1}`,\r\n visible: f?.visible ?? true,\r\n type: f?.type ?? 'FLOW',\r\n graphRawData: ensureGraphDocument(f),\r\n transform: ensureTransform(f?.transform),\r\n createdAt: f?.createdAt ?? now,\r\n updatedAt: f?.updatedAt ?? now,\r\n id: f?.id,\r\n }));\r\n\r\n const fallbackName = normalizedFiles[0]?.name ?? 'File 1';\r\n const resolvedActiveName = activeName ?? fallbackName;\r\n const activeFile = normalizedFiles.find(f => f.name === resolvedActiveName) ?? normalizedFiles[0];\r\n\r\n return {\r\n schemaVersion: CURRENT_SCHEMA_VERSION,\r\n fileList: normalizedFiles,\r\n activeFile: resolvedActiveName,\r\n activeFileId: activeFile?.id,\r\n };\r\n };\r\n\r\n if (!input) {\r\n return wrap([{ label: 'File 1', name: 'File 1', visible: true, type: 'FLOW' }]);\r\n }\r\n\r\n if (Array.isArray(input)) {\r\n return wrap(input);\r\n }\r\n\r\n if (typeof input === 'object' && 'fileList' in input) {\r\n const active = (input as any).activeFile;\r\n const files = (input as any).fileList ?? [];\r\n const root = wrap(files, active);\r\n // Preserve version if present\r\n root.schemaVersion = (input as any).schemaVersion || CURRENT_SCHEMA_VERSION;\r\n return root;\r\n }\r\n\r\n // Oldest shape: treat input as groups array and wrap\r\n return wrap([{ label: 'File 1', name: 'File 1', visible: true, type: 'FLOW', groups: input }]);\r\n}\r\n","import type { CSSProperties } from 'vue';\r\nimport { DefaultNodeStyle, type NodeStyle } from './schema';\r\n\r\nconst toNumber = (value: any, fallback: number | undefined): number | undefined => {\r\n const num = Number(value);\r\n if (Number.isFinite(num)) return num;\r\n return fallback;\r\n};\r\n\r\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\r\n\r\nconst normalizeRadius = (radius: NodeStyle['radius']): NodeStyle['radius'] => {\r\n const defaultRadius = DefaultNodeStyle.radius ?? 0;\r\n if (Array.isArray(radius)) {\r\n const fallback = Array.isArray(DefaultNodeStyle.radius)\r\n ? DefaultNodeStyle.radius\r\n : [defaultRadius, defaultRadius, defaultRadius, defaultRadius];\r\n return [\r\n toNumber(radius[0], fallback[0]) ?? 0,\r\n toNumber(radius[1], fallback[1]) ?? 0,\r\n toNumber(radius[2], fallback[2]) ?? 0,\r\n toNumber(radius[3], fallback[3]) ?? 0\r\n ];\r\n }\r\n return toNumber(radius, defaultRadius) ?? defaultRadius;\r\n};\r\n\r\nexport function normalizeNodeStyle(\r\n style?: Partial<NodeStyle>,\r\n sizeFallback?: { width?: number; height?: number }\r\n): NodeStyle {\r\n const incoming = style ?? {};\r\n const width = toNumber(incoming.width, sizeFallback?.width ?? DefaultNodeStyle.width) ?? DefaultNodeStyle.width;\r\n const height =\r\n toNumber(incoming.height, sizeFallback?.height ?? DefaultNodeStyle.height) ?? DefaultNodeStyle.height;\r\n\r\n const shadow = incoming.shadow ?? {};\r\n const textStyle = incoming.textStyle;\r\n const hasTextStyle = textStyle != null;\r\n\r\n const resolvedOpacity = incoming.opacity != null\r\n ? clamp(toNumber(incoming.opacity, DefaultNodeStyle.opacity ?? 1) ?? 1, 0, 1)\r\n : DefaultNodeStyle.opacity ?? 1;\r\n\r\n return {\r\n ...DefaultNodeStyle,\r\n ...incoming,\r\n width,\r\n height,\r\n opacity: resolvedOpacity,\r\n radius: normalizeRadius(incoming.radius),\r\n strokeWidth: toNumber(incoming.strokeWidth, DefaultNodeStyle.strokeWidth) ?? DefaultNodeStyle.strokeWidth,\r\n shadow: {\r\n ...DefaultNodeStyle.shadow,\r\n ...shadow,\r\n blur: toNumber(shadow.blur, DefaultNodeStyle.shadow?.blur) ?? DefaultNodeStyle.shadow?.blur,\r\n offsetX: toNumber(shadow.offsetX, DefaultNodeStyle.shadow?.offsetX) ?? DefaultNodeStyle.shadow?.offsetX,\r\n offsetY: toNumber(shadow.offsetY, DefaultNodeStyle.shadow?.offsetY) ?? DefaultNodeStyle.shadow?.offsetY\r\n },\r\n textStyle: hasTextStyle\r\n ? {\r\n color: textStyle?.color,\r\n fontFamily: textStyle?.fontFamily,\r\n fontSize: textStyle?.fontSize != null\r\n ? toNumber(textStyle.fontSize, DefaultNodeStyle.textStyle?.fontSize)\r\n : undefined,\r\n fontWeight: textStyle?.fontWeight,\r\n lineHeight: textStyle?.lineHeight,\r\n align: textStyle?.align,\r\n verticalAlign: textStyle?.verticalAlign,\r\n letterSpacing: textStyle?.letterSpacing,\r\n padding: textStyle?.padding,\r\n background: textStyle?.background\r\n }\r\n : textStyle\r\n };\r\n}\r\n\r\nexport function normalizePropertiesWithStyle<T extends Record<string, any>>(\r\n props: T,\r\n sizeFallback?: { width?: number; height?: number }\r\n): T & { style: NodeStyle } {\r\n const normalizedStyle = normalizeNodeStyle(props?.style, sizeFallback);\r\n return {\r\n ...props,\r\n style: normalizedStyle,\r\n width: normalizedStyle.width,\r\n height: normalizedStyle.height\r\n };\r\n}\r\n\r\nexport function styleEquals(a?: Partial<NodeStyle>, b?: Partial<NodeStyle>): boolean {\r\n return JSON.stringify(normalizeNodeStyle(a)) === JSON.stringify(normalizeNodeStyle(b));\r\n}\r\n\r\nexport function radiusToCss(radius?: NodeStyle['radius']): string | undefined {\r\n if (radius == null) return undefined;\r\n if (Array.isArray(radius)) {\r\n return radius.map((r) => `${r}px`).join(' ');\r\n }\r\n return `${radius}px`;\r\n}\r\n\r\nexport function buildBoxShadow(shadow?: NodeStyle['shadow']): string | undefined {\r\n if (!shadow || shadow.color == null) return undefined;\r\n const blur = toNumber(shadow.blur, 0) ?? 0;\r\n const offsetX = toNumber(shadow.offsetX, 0) ?? 0;\r\n const offsetY = toNumber(shadow.offsetY, 0) ?? 0;\r\n return `${offsetX}px ${offsetY}px ${blur}px ${shadow.color}`;\r\n}\r\n\r\nexport function toContainerStyle(style: NodeStyle): CSSProperties {\r\n return {\r\n background: style.fill,\r\n borderColor: style.stroke,\r\n borderWidth: style.stroke ? `${style.strokeWidth ?? 1}px` : undefined,\r\n borderStyle: style.stroke ? 'solid' : undefined,\r\n borderRadius: radiusToCss(style.radius),\r\n boxShadow: buildBoxShadow(style.shadow),\r\n opacity: style.opacity ?? 1\r\n };\r\n}\r\n\r\nexport function toTextStyle(style: NodeStyle): CSSProperties {\r\n const text = style.textStyle ?? {};\r\n return {\r\n color: text.color,\r\n fontFamily: text.fontFamily,\r\n fontSize: text.fontSize != null ? `${text.fontSize}px` : undefined,\r\n fontWeight: text.fontWeight,\r\n lineHeight: text.lineHeight as CSSProperties['lineHeight'],\r\n textAlign: text.align\r\n };\r\n}\r\n\r\nexport function extractStyleFromNode(node?: any): NodeStyle {\r\n const props = node?.properties ?? {};\r\n return normalizeNodeStyle(props.style, { width: props.width ?? node?.width, height: props.height ?? node?.height });\r\n}\r\n","import { computed, inject, onBeforeUnmount, onMounted, ref } from 'vue';\r\nimport { EventType } from '@logicflow/core';\r\nimport { normalizeNodeStyle, toContainerStyle, toTextStyle, type NodeStyle } from './nodeStyle';\r\n\r\ntype PropsChangeHandler = (props: any, node: any) => void;\r\n\r\nexport function useNodeAppearance(options?: { onPropsChange?: PropsChangeHandler }) {\r\n const getNode = inject('getNode') as (() => any) | undefined;\r\n const getGraph = inject('getGraph') as (() => any) | undefined;\r\n\r\n const style = ref<NodeStyle>(normalizeNodeStyle());\r\n\r\n const syncFromProps = (props?: any, node?: any) => {\r\n const target = props ?? node?.properties ?? {};\r\n // 优先使用 node 的实际尺寸,因为用户缩放时 node.width/height 会先更新\r\n const currentWidth = node?.width ?? target.width;\r\n const currentHeight = node?.height ?? target.height;\r\n\r\n style.value = normalizeNodeStyle(target.style, {\r\n width: currentWidth,\r\n height: currentHeight\r\n });\r\n options?.onPropsChange?.(target, node);\r\n };\r\n\r\n let offChange: (() => void) | null = null;\r\n\r\n onMounted(() => {\r\n const node = getNode?.();\r\n const graph = getGraph?.();\r\n\r\n syncFromProps(node?.properties, node);\r\n\r\n const handler = (eventData: any) => {\r\n if (eventData.id === node?.id) {\r\n syncFromProps(eventData.properties, node);\r\n }\r\n };\r\n graph?.eventCenter.on(EventType.NODE_PROPERTIES_CHANGE, handler);\r\n offChange = () => graph?.eventCenter.off(EventType.NODE_PROPERTIES_CHANGE, handler);\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n offChange?.();\r\n });\r\n\r\n const containerStyle = computed(() => toContainerStyle(style.value));\r\n const textStyle = computed(() => toTextStyle(style.value));\r\n\r\n return {\r\n style,\r\n containerStyle,\r\n textStyle,\r\n syncFromProps\r\n };\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { ref } from 'vue';\r\nimport { useNodeAppearance } from '@/ts/useNodeAppearance';\r\n\r\nconst currentProperty = ref({ type: '未选择', priority: '可选' });\r\n\r\nconst { containerStyle, textStyle } = useNodeAppearance({\r\n onPropsChange(props) {\r\n if (props.property) {\r\n currentProperty.value = props.property;\r\n }\r\n }\r\n});\r\n\r\n// 辅助函数\r\nconst getPropertyTypeName = () => {\r\n const typeMap: Record<string, string> = {\r\n 'attack': '攻击',\r\n 'health': '生命',\r\n 'defense': '防御',\r\n 'speed': '速度',\r\n 'crit': '暴击率',\r\n 'critDmg': '暴击伤害',\r\n 'effectHit': '效果命中',\r\n 'effectResist': '效果抵抗',\r\n '未选择': '未选择'\r\n };\r\n return typeMap[currentProperty.value.type] || currentProperty.value.type;\r\n};\r\nconst getPriorityName = () => {\r\n const priorityMap: Record<string, string> = {\r\n 'required': '必须',\r\n 'recommended': '推荐',\r\n 'optional': '可选'\r\n };\r\n return priorityMap[currentProperty.value.priority] || currentProperty.value.priority;\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-node\" :class=\"[currentProperty.priority ? `priority-${currentProperty.priority}` : '']\">\r\n <div class=\"node-content\" :style=\"containerStyle\">\r\n <div class=\"node-header\">\r\n <div class=\"node-title\" :style=\"textStyle\">属性要求</div>\r\n </div>\r\n <div class=\"node-body\">\r\n <div class=\"property-main\">\r\n <div class=\"property-type\" :style=\"textStyle\">{{ getPropertyTypeName() }}</div>\r\n <div v-if=\"currentProperty.type !== '未选择'\" class=\"property-value\" :style=\"textStyle\">{{ currentProperty.value }}</div>\r\n <div v-else class=\"property-placeholder\" :style=\"textStyle\">点击设置属性</div>\r\n </div>\r\n <div class=\"property-details\" v-if=\"currentProperty.type !== '未选择'\">\r\n <div class=\"property-priority\" :style=\"textStyle\">优先级: {{ getPriorityName() }}</div>\r\n <div class=\"property-description\" v-if=\"currentProperty.description\" :style=\"textStyle\">\r\n {{ currentProperty.description }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.property-node {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n min-width: 180px;\r\n min-height: 180px;\r\n}\r\n.node-content {\r\n position: relative;\r\n background-color: white;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 4px;\r\n padding: 0;\r\n cursor: pointer;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n width: 100%;\r\n height: 100%;\r\n min-width: 180px;\r\n min-height: 180px;\r\n}\r\n.node-header {\r\n padding: 8px 10px;\r\n background-color: #f0f7ff;\r\n border-bottom: 1px solid #dcdfe6;\r\n border-radius: 4px 4px 0 0;\r\n}\r\n.node-title {\r\n font-weight: bold;\r\n font-size: 14px;\r\n}\r\n.node-body {\r\n padding: 10px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n.property-main {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n width: 100%;\r\n margin-bottom: 8px;\r\n}\r\n.property-type {\r\n font-size: 16px;\r\n font-weight: bold;\r\n margin-bottom: 5px;\r\n}\r\n.property-value {\r\n font-size: 16px;\r\n color: #409eff;\r\n font-weight: bold;\r\n margin-bottom: 5px;\r\n}\r\n.property-placeholder {\r\n width: 120px;\r\n height: 40px;\r\n border: 1px dashed #c0c4cc;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #909399;\r\n font-size: 12px;\r\n border-radius: 4px;\r\n margin: 8px 0;\r\n transition: width 0.2s, height 0.2s;\r\n}\r\n.property-details {\r\n width: 100%;\r\n border-top: 1px dashed #ebeef5;\r\n padding-top: 8px;\r\n}\r\n.property-priority {\r\n font-size: 12px;\r\n color: #606266;\r\n margin-bottom: 5px;\r\n}\r\n.property-description {\r\n font-size: 11px;\r\n color: #606266;\r\n margin-top: 5px;\r\n border-top: 1px dashed #ebeef5;\r\n padding-top: 5px;\r\n word-break: break-all;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { ref } from 'vue';\r\nimport { useNodeAppearance } from '@/ts/useNodeAppearance';\r\n\r\ntype FitMode = 'contain' | 'cover' | 'fill';\r\n\r\nconst imageUrl = ref('');\r\nconst fit = ref<FitMode>('contain');\r\n\r\nconst { containerStyle } = useNodeAppearance({\r\n onPropsChange(props) {\r\n imageUrl.value = props.image?.url ?? props.url ?? '';\r\n fit.value = props.image?.fit ?? props.fit ?? 'contain';\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"image-node\" :style=\"containerStyle\">\r\n <div class=\"image-wrapper\">\r\n <img v-if=\"imageUrl\" :src=\"imageUrl\" alt=\"图片节点\" :style=\"{ objectFit: fit }\" draggable=\"false\" />\r\n <div v-else class=\"placeholder\">\r\n <div class=\"placeholder-text\">未上传图片</div>\r\n <div class=\"placeholder-hint\">在右侧属性面板上传或填写 URL</div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.image-node {\r\n width: 100%;\r\n height: 100%;\r\n min-width: 150px;\r\n min-height: 120px;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 6px;\r\n background: #fff;\r\n overflow: hidden;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\r\n display: flex;\r\n}\r\n\r\n.image-wrapper {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #f8fafc;\r\n}\r\n\r\n.image-wrapper img {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.placeholder {\r\n color: #909399;\r\n text-align: center;\r\n line-height: 1.4;\r\n padding: 12px;\r\n}\r\n\r\n.placeholder-text {\r\n font-weight: 600;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.placeholder-hint {\r\n font-size: 12px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref, inject, onMounted, onBeforeUnmount } from 'vue';\r\nimport { toTextStyle } from '@/ts/nodeStyle';\r\nimport { useNodeAppearance } from '@/ts/useNodeAppearance';\r\n\r\nconst currentAsset = ref({ name: '未选择资产', avatar: '', library: 'shikigami' });\r\nconst getNode = inject('getNode') as (() => any) | undefined;\r\nconst zIndex = ref(1);\r\nlet intervalId: number | null = null;\r\n\r\n// 使用轮询方式定期更新 zIndex\r\nonMounted(() => {\r\n const node = getNode?.();\r\n if (node) {\r\n zIndex.value = node.zIndex ?? 1;\r\n\r\n // 每 100ms 检查一次 zIndex 是否变化\r\n intervalId = window.setInterval(() => {\r\n const currentZIndex = node.zIndex ?? 1;\r\n if (zIndex.value !== currentZIndex) {\r\n zIndex.value = currentZIndex;\r\n }\r\n }, 100);\r\n }\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n if (intervalId !== null) {\r\n clearInterval(intervalId);\r\n }\r\n});\r\n\r\nconst { containerStyle, textStyle } = useNodeAppearance({\r\n onPropsChange(props) {\r\n if (props.selectedAsset) {\r\n currentAsset.value = props.selectedAsset;\r\n }\r\n if (props.assetLibrary && !props.selectedAsset) {\r\n // 如果切换了资产库但没有选中资产,更新占位文本\r\n currentAsset.value = {\r\n name: '未选择资产',\r\n avatar: '',\r\n library: props.assetLibrary\r\n };\r\n }\r\n }\r\n});\r\n\r\nconst mergedContainerStyle = computed(() => ({ ...containerStyle.value, boxSizing: 'border-box' }));\r\n</script>\r\n\r\n<template>\r\n <div class=\"node-content\" :style=\"mergedContainerStyle\">\r\n <div class=\"zindex-badge\">{{ zIndex }}</div>\r\n <img\r\n v-if=\"currentAsset.avatar\"\r\n :src=\"currentAsset.avatar\"\r\n :alt=\"currentAsset.name\"\r\n class=\"asset-image\"\r\n draggable=\"false\"\r\n />\r\n <div v-else class=\"placeholder-text\" :style=\"textStyle\">点击选择资产</div>\r\n <div class=\"name-text\" :style=\"textStyle\">{{ currentAsset.name }}</div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.node-content {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n position: relative;\r\n}\r\n.zindex-badge {\r\n position: absolute;\r\n top: 4px;\r\n right: 4px;\r\n background: rgba(64, 158, 255, 0.9);\r\n color: white;\r\n font-size: 12px;\r\n font-weight: bold;\r\n padding: 2px 6px;\r\n border-radius: 10px;\r\n z-index: 10;\r\n pointer-events: none;\r\n}\r\n.asset-image {\r\n width: 85%;\r\n height: 85%;\r\n object-fit: cover;\r\n}\r\n.placeholder-text {\r\n color: #909399;\r\n font-size: 12px;\r\n}\r\n.name-text {\r\n font-size: 14px;\r\n text-align: center;\r\n margin-top: 8px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\n// LogicFlow 会自动处理文本节点的渲染和编辑\r\n</script>\r\n\r\n<template>\r\n <div class=\"text-content\">\r\n <!-- LogicFlow 会自动渲染 text 内容 -->\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.text-content {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n outline: none;\r\n word-break: break-word;\r\n padding: 4px;\r\n box-sizing: border-box;\r\n cursor: text;\r\n}\r\n\r\n.text-content:focus {\r\n background: rgba(64, 158, 255, 0.1);\r\n border-radius: 2px;\r\n}\r\n</style>\r\n","import { HtmlNodeModel } from '@logicflow/core';\r\n\r\nclass TextNodeModel extends HtmlNodeModel {\r\n initNodeData(data: any) {\r\n super.initNodeData(data);\r\n\r\n // 从 data 中读取宽高,支持调整大小后的持久化\r\n if (data.properties?.width) {\r\n this.width = data.properties.width;\r\n } else {\r\n this.width = 200;\r\n }\r\n\r\n if (data.properties?.height) {\r\n this.height = data.properties.height;\r\n } else {\r\n this.height = 120;\r\n }\r\n\r\n // 计算 Label 宽度\r\n const labelWidth = this.width - 20;\r\n\r\n // 初始化或更新 Label 配置\r\n if (data.properties?._label) {\r\n // 如果已有 _label 配置,更新其宽度和坐标\r\n // 处理数组情况(兼容旧数据)\r\n let currentLabel = data.properties._label;\r\n if (Array.isArray(currentLabel)) {\r\n currentLabel = currentLabel[0] || {};\r\n }\r\n\r\n this.setProperty('_label', {\r\n value: currentLabel.value || '双击编辑文本',\r\n content: currentLabel.content || currentLabel.value || '双击编辑文本',\r\n x: data.x,\r\n y: data.y,\r\n labelWidth: labelWidth,\r\n textOverflowMode: 'wrap',\r\n editable: true,\r\n draggable: false,\r\n });\r\n } else if (data.properties?.text) {\r\n // 如果有 text 属性但没有 _label,创建 _label\r\n this.setProperty('_label', {\r\n value: data.properties.text,\r\n content: data.properties.text,\r\n x: data.x,\r\n y: data.y,\r\n labelWidth: labelWidth,\r\n textOverflowMode: 'wrap',\r\n editable: true,\r\n draggable: false,\r\n });\r\n } else {\r\n // 如果都没有,初始化一个默认的 label\r\n this.setProperty('_label', {\r\n value: '双击编辑文本',\r\n content: '双击编辑文本',\r\n x: data.x,\r\n y: data.y,\r\n labelWidth: labelWidth,\r\n textOverflowMode: 'wrap',\r\n editable: true,\r\n draggable: false,\r\n });\r\n }\r\n }\r\n\r\n setAttributes() {\r\n // 设置默认尺寸(如果 initNodeData 中没有设置)\r\n if (!this.width) {\r\n this.width = 200;\r\n }\r\n if (!this.height) {\r\n this.height = 120;\r\n }\r\n }\r\n\r\n // 监听节点大小变化,更新 Label 宽度\r\n resize(deltaX: number, deltaY: number) {\r\n const result = super.resize?.(deltaX, deltaY);\r\n\r\n // 持久化宽高到 properties\r\n this.setProperty('width', this.width);\r\n this.setProperty('height', this.height);\r\n\r\n // 更新 Label 宽度和坐标\r\n let currentLabel = this.properties._label || {};\r\n if (Array.isArray(currentLabel)) {\r\n currentLabel = currentLabel[0] || {};\r\n }\r\n\r\n this.setProperty('_label', {\r\n value: currentLabel.value || '双击编辑文本',\r\n content: currentLabel.content || currentLabel.value || '双击编辑文本',\r\n x: this.x,\r\n y: this.y,\r\n labelWidth: this.width - 20,\r\n textOverflowMode: 'wrap',\r\n editable: true,\r\n draggable: false,\r\n });\r\n\r\n return result;\r\n }\r\n\r\n // 当文本被编辑后,同步到 properties\r\n updateText(value: string) {\r\n super.updateText(value);\r\n this.setProperty('text', value);\r\n\r\n // 同时更新 _label 中的 value\r\n let currentLabel = this.properties._label || {};\r\n if (Array.isArray(currentLabel)) {\r\n currentLabel = currentLabel[0] || {};\r\n }\r\n\r\n this.setProperty('_label', {\r\n value: value,\r\n content: value,\r\n x: this.x,\r\n y: this.y,\r\n labelWidth: this.width - 20,\r\n textOverflowMode: 'wrap',\r\n editable: true,\r\n draggable: false,\r\n });\r\n }\r\n}\r\n\r\nexport default TextNodeModel;\r\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue';\r\nimport { useNodeAppearance } from '@/ts/useNodeAppearance';\r\n\r\nconst vectorConfig = ref({\r\n kind: 'rect',\r\n svgContent: '',\r\n path: '',\r\n tileWidth: 50,\r\n tileHeight: 50,\r\n fill: '#409EFF',\r\n stroke: '#303133',\r\n strokeWidth: 1\r\n});\r\n\r\nconst nodeSize = ref({ width: 200, height: 200 });\r\n\r\nconst { containerStyle } = useNodeAppearance({\r\n onPropsChange(props, node) {\r\n // 同步矢量配置\r\n if (props.vector) {\r\n Object.assign(vectorConfig.value, props.vector);\r\n }\r\n // 同步节点尺寸\r\n if (node) {\r\n nodeSize.value.width = node.width;\r\n nodeSize.value.height = node.height;\r\n }\r\n }\r\n});\r\n\r\n// 生成唯一的 pattern ID\r\nconst patternId = computed(() => `vector-pattern-${Math.random().toString(36).substr(2, 9)}`);\r\n\r\n// 生成 SVG 内容\r\nconst svgContent = computed(() => {\r\n const { kind, path, tileWidth, tileHeight, fill, stroke, strokeWidth } = vectorConfig.value;\r\n\r\n let shapeElement = '';\r\n switch (kind) {\r\n case 'rect':\r\n shapeElement = `<rect x=\"0\" y=\"0\" width=\"${tileWidth}\" height=\"${tileHeight}\"\r\n fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" />`;\r\n break;\r\n case 'ellipse':\r\n shapeElement = `<ellipse cx=\"${tileWidth/2}\" cy=\"${tileHeight/2}\"\r\n rx=\"${tileWidth/2 - strokeWidth}\" ry=\"${tileHeight/2 - strokeWidth}\"\r\n fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" />`;\r\n break;\r\n case 'path':\r\n shapeElement = `<path d=\"${path || 'M 0 0'}\" fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" />`;\r\n break;\r\n case 'svg':\r\n shapeElement = vectorConfig.value.svgContent || '';\r\n break;\r\n case 'polygon':\r\n // 默认三角形\r\n const points = `0,${tileHeight} ${tileWidth/2},0 ${tileWidth},${tileHeight}`;\r\n shapeElement = `<polygon points=\"${points}\" fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" />`;\r\n break;\r\n }\r\n\r\n return `\r\n <svg width=\"${nodeSize.value.width}\" height=\"${nodeSize.value.height}\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <defs>\r\n <pattern id=\"${patternId.value}\"\r\n x=\"0\" y=\"0\"\r\n width=\"${tileWidth}\"\r\n height=\"${tileHeight}\"\r\n patternUnits=\"userSpaceOnUse\">\r\n ${shapeElement}\r\n </pattern>\r\n </defs>\r\n <rect width=\"100%\" height=\"100%\" fill=\"url(#${patternId.value})\" />\r\n </svg>\r\n `;\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"vector-node\" :style=\"containerStyle\">\r\n <div class=\"vector-content\" v-html=\"svgContent\"></div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.vector-node {\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 4px;\r\n}\r\n\r\n.vector-content {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.vector-content :deep(svg) {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n</style>\r\n","import { HtmlNodeModel } from '@logicflow/core';\r\n\r\nclass VectorNodeModel extends HtmlNodeModel {\r\n initNodeData(data: any) {\r\n super.initNodeData(data);\r\n\r\n // 从 properties 读取宽高\r\n if (data.properties?.width) {\r\n this.width = data.properties.width;\r\n } else {\r\n this.width = 200;\r\n }\r\n\r\n if (data.properties?.height) {\r\n this.height = data.properties.height;\r\n } else {\r\n this.height = 200;\r\n }\r\n\r\n // 初始化默认矢量配置\r\n if (!data.properties?.vector) {\r\n this.setProperty('vector', {\r\n kind: 'rect',\r\n tileWidth: 50,\r\n tileHeight: 50,\r\n fill: '#409EFF',\r\n stroke: '#303133',\r\n strokeWidth: 1\r\n });\r\n }\r\n }\r\n\r\n resize(deltaX: number, deltaY: number) {\r\n const result = super.resize?.(deltaX, deltaY);\r\n\r\n // 持久化宽高到 properties\r\n this.setProperty('width', this.width);\r\n this.setProperty('height', this.height);\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default VectorNodeModel;\r\n","import { reactive } from 'vue'\r\nimport type { SelectorConfig } from '@/types/selector'\r\n\r\nconst dialogs = reactive({\r\n property: { show: false, data: null, node: null, callback: null },\r\n generic: { show: false, config: null, callback: null }\r\n})\r\n\r\nfunction openDialog(type: string, data = null, node = null, callback = null) {\r\n dialogs[type].show = true\r\n dialogs[type].data = data\r\n dialogs[type].node = node\r\n dialogs[type].callback = callback\r\n}\r\n\r\nfunction closeDialog(type: string) {\r\n dialogs[type].show = false\r\n dialogs[type].data = null\r\n dialogs[type].node = null\r\n dialogs[type].callback = null\r\n}\r\n\r\nfunction openGenericSelector(config: SelectorConfig, callback: (item: any) => void) {\r\n dialogs.generic.show = true\r\n dialogs.generic.config = config\r\n dialogs.generic.callback = callback\r\n}\r\n\r\nfunction closeGenericSelector() {\r\n dialogs.generic.show = false\r\n dialogs.generic.config = null\r\n dialogs.generic.callback = null\r\n}\r\n\r\nexport function useDialogs() {\r\n return {\r\n dialogs,\r\n openDialog,\r\n closeDialog,\r\n openGenericSelector,\r\n closeGenericSelector\r\n }\r\n} ","import type LogicFlow from '@logicflow/core';\r\n\r\nlet logicFlowInstance: LogicFlow | null = null;\r\n\r\nexport function setLogicFlowInstance(lf: LogicFlow) {\r\n logicFlowInstance = lf;\r\n}\r\n\r\nexport function getLogicFlowInstance(): LogicFlow | null {\r\n return logicFlowInstance;\r\n}\r\n\r\nexport function destroyLogicFlowInstance() {\r\n logicFlowInstance?.destroy();\r\n logicFlowInstance = null;\r\n} ","<script setup lang=\"ts\">\r\nimport { useDialogs } from '@/ts/useDialogs';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\n\r\nconst props = defineProps<{\r\n node: any;\r\n}>();\r\n\r\nconst { openDialog } = useDialogs();\r\n\r\nconst handleOpenDialog = () => {\r\n const lf = getLogicFlowInstance();\r\n const node = props.node;\r\n if (!lf || !node) return;\r\n\r\n const currentData = node.properties?.property;\r\n openDialog('property', currentData, node, (updatedData) => {\r\n lf.setProperties(node.id, {\r\n ...node.properties,\r\n property: updatedData\r\n });\r\n });\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">属性设置</div>\r\n <div class=\"property-item\">\r\n <el-button type=\"primary\" @click=\"handleOpenDialog\" style=\"width: 100%\">设置属性</el-button>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { reactive, watch } from 'vue';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\nimport { normalizeNodeStyle } from '@/ts/nodeStyle';\r\n\r\ntype FitMode = 'contain' | 'cover' | 'fill';\r\n\r\nconst props = defineProps<{\r\n node: any;\r\n}>();\r\n\r\ntype ImageForm = {\r\n url: string;\r\n fit: FitMode;\r\n width: number;\r\n height: number;\r\n};\r\n\r\nconst imageForm = reactive<ImageForm>({\r\n url: '',\r\n fit: 'contain',\r\n width: 180,\r\n height: 120\r\n});\r\n\r\nconst parseNumber = (value: any, fallback: number) => {\r\n const num = Number(value);\r\n return Number.isFinite(num) ? num : fallback;\r\n};\r\n\r\nconst getImageProps = (node?: any): ImageForm => {\r\n const props = node?.properties ?? {};\r\n const style = normalizeNodeStyle(props.style, { width: props.width ?? node?.width, height: props.height ?? node?.height });\r\n return {\r\n url: props.image?.url ?? props.url ?? '',\r\n fit: (props.image?.fit ?? props.fit ?? 'contain') as FitMode,\r\n width: parseNumber(style.width, 180),\r\n height: parseNumber(style.height, 120)\r\n };\r\n};\r\n\r\nwatch(\r\n () => props.node,\r\n (node) => {\r\n if (!node) {\r\n imageForm.url = '';\r\n imageForm.fit = 'contain';\r\n imageForm.width = 180;\r\n imageForm.height = 120;\r\n return;\r\n }\r\n const next = getImageProps(node);\r\n imageForm.url = next.url || '';\r\n imageForm.fit = next.fit;\r\n imageForm.width = next.width;\r\n imageForm.height = next.height;\r\n },\r\n { immediate: true, deep: true }\r\n);\r\n\r\nconst applyImageChanges = (partial: Partial<ImageForm>) => {\r\n const lf = getLogicFlowInstance();\r\n const node = props.node;\r\n if (!lf || !node) return;\r\n\r\n const baseProps = node.properties || {};\r\n const merged = { ...getImageProps(node), ...partial };\r\n const currentStyle = normalizeNodeStyle(baseProps.style, { width: baseProps.width ?? node.width, height: baseProps.height ?? node.height });\r\n const nextStyle = normalizeNodeStyle(\r\n { ...currentStyle, width: merged.width, height: merged.height },\r\n { width: merged.width, height: merged.height }\r\n );\r\n\r\n const nextProps = {\r\n ...baseProps,\r\n ...merged,\r\n style: nextStyle,\r\n width: nextStyle.width,\r\n height: nextStyle.height,\r\n image: {\r\n ...(baseProps.image || {}),\r\n url: merged.url,\r\n fit: merged.fit\r\n },\r\n url: merged.url\r\n };\r\n\r\n Object.assign(imageForm, merged);\r\n lf.setProperties(node.id, nextProps);\r\n};\r\n\r\nconst handleImageUpload = (e: Event) => {\r\n const input = e.target as HTMLInputElement;\r\n const file = input?.files?.[0];\r\n if (!file) return;\r\n const reader = new FileReader();\r\n reader.onload = (evt) => {\r\n const result = evt.target?.result as string;\r\n if (result) {\r\n applyImageChanges({ url: result });\r\n }\r\n if (input) input.value = '';\r\n };\r\n reader.readAsDataURL(file);\r\n};\r\n\r\nconst handleImageUrlChange = () => {\r\n applyImageChanges({ url: imageForm.url });\r\n};\r\n\r\nconst handleSizeChange = () => {\r\n applyImageChanges({ width: imageForm.width, height: imageForm.height });\r\n};\r\n\r\nconst handleFitChange = (val: FitMode) => {\r\n applyImageChanges({ fit: val });\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">图片设置</div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">图片 URL</div>\r\n <div class=\"property-value\">\r\n <el-input\r\n v-model=\"imageForm.url\"\r\n size=\"small\"\r\n placeholder=\"输入图片链接或上传文件\"\r\n style=\"width: 100%;\"\r\n @change=\"handleImageUrlChange\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">上传文件</div>\r\n <div class=\"property-value upload-row\">\r\n <input class=\"upload-input\" type=\"file\" accept=\"image/*\" @change=\"handleImageUpload\" />\r\n <span class=\"upload-hint\">本地上传将以 base64 保存</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">显示模式</div>\r\n <div class=\"property-value\">\r\n <el-select\r\n v-model=\"imageForm.fit\"\r\n size=\"small\"\r\n style=\"width: 100%;\"\r\n @change=\"handleFitChange\"\r\n >\r\n <el-option label=\"自适应\" value=\"contain\" />\r\n <el-option label=\"填充\" value=\"cover\" />\r\n <el-option label=\"拉伸\" value=\"fill\" />\r\n </el-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item size-item\">\r\n <div class=\"property-label\">宽 / 高</div>\r\n <div class=\"property-value size-inputs\">\r\n <el-input-number\r\n v-model=\"imageForm.width\"\r\n :min=\"40\"\r\n :max=\"1000\"\r\n size=\"small\"\r\n style=\"width: 120px;\"\r\n @change=\"handleSizeChange\"\r\n />\r\n <span class=\"size-divider\">×</span>\r\n <el-input-number\r\n v-model=\"imageForm.height\"\r\n :min=\"40\"\r\n :max=\"1000\"\r\n size=\"small\"\r\n style=\"width: 120px;\"\r\n @change=\"handleSizeChange\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"imageForm.url\" class=\"property-item\">\r\n <div class=\"property-label\">预览</div>\r\n <div class=\"property-value image-preview\">\r\n <img :src=\"imageForm.url\" alt=\"预览\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.property-value.upload-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n text-align: left;\r\n}\r\n\r\n.upload-input {\r\n flex: 1;\r\n}\r\n\r\n.upload-hint {\r\n color: #909399;\r\n font-size: 12px;\r\n}\r\n\r\n.size-item .property-value {\r\n text-align: left;\r\n}\r\n\r\n.size-inputs {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n}\r\n\r\n.size-divider {\r\n color: #909399;\r\n font-size: 12px;\r\n}\r\n\r\n.image-preview {\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 6px;\r\n background: #fafafa;\r\n text-align: center;\r\n}\r\n\r\n.image-preview img {\r\n max-width: 100%;\r\n max-height: 140px;\r\n display: block;\r\n margin: 0 auto;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nconst props = defineProps<{\r\n node: any;\r\n}>();\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">文本节点</div>\r\n <div class=\"property-item\">\r\n <label class=\"property-label\">内容</label>\r\n <div class=\"property-value\">\r\n {{ props.node?.properties?.text || '未设置' }}\r\n </div>\r\n </div>\r\n <div class=\"property-item\">\r\n <div class=\"property-note\">\r\n 💡 提示:双击画布中的节点即可编辑文字\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { reactive, watch } from 'vue';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\nimport { normalizeNodeStyle, type NodeStyle } from '@/ts/nodeStyle';\r\n\r\nconst props = defineProps<{\r\n node: any;\r\n}>();\r\n\r\ntype StyleForm = {\r\n fill: string;\r\n stroke: string;\r\n strokeWidth: number;\r\n radius: number;\r\n shadowColor: string;\r\n shadowBlur: number;\r\n shadowOffsetX: number;\r\n shadowOffsetY: number;\r\n opacity: number;\r\n textAlign: 'left' | 'center' | 'right';\r\n lineHeight: number;\r\n fontWeight: number | string;\r\n};\r\n\r\nconst form = reactive<StyleForm>({\r\n fill: '#ffffff',\r\n stroke: '#dcdfe6',\r\n strokeWidth: 1,\r\n radius: 4,\r\n shadowColor: 'rgba(0,0,0,0.1)',\r\n shadowBlur: 4,\r\n shadowOffsetX: 0,\r\n shadowOffsetY: 2,\r\n opacity: 1,\r\n textAlign: 'left',\r\n lineHeight: 1.4,\r\n fontWeight: 400\r\n});\r\n\r\nconst syncFromNode = (node?: any) => {\r\n if (!node) return;\r\n const baseProps = node.properties ?? {};\r\n const style = normalizeNodeStyle(baseProps.style, { width: baseProps.width ?? node.width, height: baseProps.height ?? node.height });\r\n form.fill = style.fill ?? form.fill;\r\n form.stroke = style.stroke ?? form.stroke;\r\n form.strokeWidth = style.strokeWidth ?? form.strokeWidth;\r\n form.radius = typeof style.radius === 'number' ? style.radius : style.radius?.[0] ?? form.radius;\r\n form.shadowColor = style.shadow?.color ?? form.shadowColor;\r\n form.shadowBlur = style.shadow?.blur ?? form.shadowBlur;\r\n form.shadowOffsetX = style.shadow?.offsetX ?? form.shadowOffsetX;\r\n form.shadowOffsetY = style.shadow?.offsetY ?? form.shadowOffsetY;\r\n form.opacity = style.opacity ?? form.opacity;\r\n form.textAlign = (style.textStyle?.align as StyleForm['textAlign']) ?? form.textAlign;\r\n form.lineHeight = style.textStyle?.lineHeight ?? form.lineHeight;\r\n form.fontWeight = style.textStyle?.fontWeight ?? form.fontWeight;\r\n};\r\n\r\nwatch(\r\n () => props.node,\r\n (node) => {\r\n if (node) {\r\n syncFromNode(node);\r\n }\r\n },\r\n { immediate: true, deep: true }\r\n);\r\n\r\nconst getShadowFromForm = () => ({\r\n color: form.shadowColor,\r\n blur: form.shadowBlur,\r\n offsetX: form.shadowOffsetX,\r\n offsetY: form.shadowOffsetY\r\n});\r\n\r\nconst applyStyle = (partial: Partial<NodeStyle>) => {\r\n const lf = getLogicFlowInstance();\r\n const node = props.node;\r\n if (!lf || !node) return;\r\n\r\n const baseProps = node.properties || {};\r\n const currentStyle = normalizeNodeStyle(baseProps.style, { width: baseProps.width ?? node.width, height: baseProps.height ?? node.height });\r\n const mergedStyleInput: Partial<NodeStyle> = {\r\n ...currentStyle,\r\n ...partial,\r\n shadow: partial.shadow ? { ...currentStyle.shadow, ...partial.shadow } : currentStyle.shadow,\r\n textStyle: partial.textStyle ? { ...currentStyle.textStyle, ...partial.textStyle } : currentStyle.textStyle\r\n };\r\n const nextStyle = normalizeNodeStyle(mergedStyleInput, { width: currentStyle.width, height: currentStyle.height });\r\n\r\n lf.setProperties(node.id, {\r\n ...baseProps,\r\n style: nextStyle,\r\n width: nextStyle.width,\r\n height: nextStyle.height\r\n });\r\n};\r\n\r\nconst applyShadow = (override?: Partial<NodeStyle['shadow']>) => {\r\n applyStyle({ shadow: { ...getShadowFromForm(), ...(override || {}) } });\r\n};\r\n\r\nconst applyTextStyle = (override?: Partial<NodeStyle['textStyle']>) => {\r\n applyStyle({\r\n textStyle: {\r\n ...((props.node?.properties?.style?.textStyle as NodeStyle['textStyle']) || {}),\r\n align: form.textAlign,\r\n lineHeight: form.lineHeight,\r\n fontWeight: form.fontWeight,\r\n ...(override || {})\r\n }\r\n });\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">样式</div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">填充</div>\r\n <div class=\"property-value\">\r\n <el-color-picker v-model=\"form.fill\" size=\"small\" @change=\"(val: string) => applyStyle({ fill: val })\" />\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">描边</div>\r\n <div class=\"property-value row\">\r\n <el-color-picker v-model=\"form.stroke\" size=\"small\" @change=\"(val: string) => applyStyle({ stroke: val })\" />\r\n <el-input-number\r\n v-model=\"form.strokeWidth\"\r\n :min=\"0\"\r\n :max=\"20\"\r\n size=\"small\"\r\n controls-position=\"right\"\r\n @change=\"(val) => applyStyle({ stroke: form.stroke, strokeWidth: Number(val) || 0 })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">圆角</div>\r\n <div class=\"property-value\">\r\n <el-input-number\r\n v-model=\"form.radius\"\r\n :min=\"0\"\r\n :max=\"200\"\r\n size=\"small\"\r\n controls-position=\"right\"\r\n @change=\"(val) => applyStyle({ radius: Number(val) || 0 })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">阴影</div>\r\n <div class=\"property-value shadow-grid\">\r\n <el-color-picker v-model=\"form.shadowColor\" size=\"small\" @change=\"(val: string) => applyShadow({ color: val })\" />\r\n <el-input-number\r\n v-model=\"form.shadowBlur\"\r\n :min=\"0\"\r\n :max=\"50\"\r\n size=\"small\"\r\n controls-position=\"right\"\r\n @change=\"(val) => applyShadow({ blur: Number(val) || 0 })\"\r\n />\r\n <el-input-number\r\n v-model=\"form.shadowOffsetX\"\r\n :min=\"-100\"\r\n :max=\"100\"\r\n size=\"small\"\r\n controls-position=\"right\"\r\n @change=\"(val) => applyShadow({ offsetX: Number(val) || 0 })\"\r\n />\r\n <el-input-number\r\n v-model=\"form.shadowOffsetY\"\r\n :min=\"-100\"\r\n :max=\"100\"\r\n size=\"small\"\r\n controls-position=\"right\"\r\n @change=\"(val) => applyShadow({ offsetY: Number(val) || 0 })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">透明度</div>\r\n <div class=\"property-value slider-row\">\r\n <el-slider\r\n v-model=\"form.opacity\"\r\n :min=\"0\"\r\n :max=\"1\"\r\n :step=\"0.05\"\r\n show-input\r\n :show-input-controls=\"false\"\r\n @change=\"(val) => applyStyle({ opacity: Number(val) || 0 })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">文字对齐</div>\r\n <div class=\"property-value\">\r\n <el-select\r\n v-model=\"form.textAlign\"\r\n size=\"small\"\r\n style=\"width: 100%;\"\r\n @change=\"(val) => applyTextStyle({ align: val as StyleForm['textAlign'] })\"\r\n >\r\n <el-option label=\"左对齐\" value=\"left\" />\r\n <el-option label=\"居中\" value=\"center\" />\r\n <el-option label=\"右对齐\" value=\"right\" />\r\n </el-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">行高 / 字重</div>\r\n <div class=\"property-value row\">\r\n <el-input-number\r\n v-model=\"form.lineHeight\"\r\n :min=\"0.8\"\r\n :max=\"3\"\r\n :step=\"0.1\"\r\n size=\"small\"\r\n controls-position=\"right\"\r\n @change=\"(val) => applyTextStyle({ lineHeight: Number(val) || 1 })\"\r\n />\r\n <el-select\r\n v-model=\"form.fontWeight\"\r\n size=\"small\"\r\n style=\"flex: 1;\"\r\n @change=\"(val) => applyTextStyle({ fontWeight: val as number | string })\"\r\n >\r\n <el-option label=\"细(300)\" :value=\"300\" />\r\n <el-option label=\"常规(400)\" :value=\"400\" />\r\n <el-option label=\"中等(500)\" :value=\"500\" />\r\n <el-option label=\"半粗(600)\" :value=\"600\" />\r\n <el-option label=\"粗体(700)\" :value=\"700\" />\r\n </el-select>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.shadow-grid {\r\n display: grid;\r\n grid-template-columns: repeat(4, minmax(0, 1fr));\r\n gap: 8px;\r\n}\r\n\r\n.slider-row {\r\n padding-right: 4px;\r\n}\r\n</style>\r\n","/**\r\n * 选择器预设配置\r\n * 定义各种资产类型的选择器配置\r\n */\r\n\r\nimport type { SelectorConfig } from '@/types/selector'\r\nimport shikigamiData from '@/data/Shikigami.json'\r\nimport yuhunData from '@/data/Yuhun.json'\r\n\r\n// 阴阳师数据\r\nconst onmyojiData = [\r\n { id: '10', name: '晴明', avatar: '/assets/downloaded_images/hero_10_10.png' },\r\n { id: '11', name: '神乐', avatar: '/assets/downloaded_images/hero_11_11.png' },\r\n { id: '12', name: '八百比丘尼', avatar: '/assets/downloaded_images/hero_12_12.png' },\r\n { id: '13', name: '源博雅', avatar: '/assets/downloaded_images/hero_13_13.png' },\r\n { id: '15', name: '不知火', avatar: '/assets/downloaded_images/hero_15_15.png' },\r\n { id: '16', name: '鬼灯', avatar: '/assets/downloaded_images/hero_16_16.png' }\r\n]\r\n\r\n// 阴阳师技能数据\r\nconst onmyojiSkillData = [\r\n // 晴明的技能\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1003', name: '言灵·守', avatar: '/assets/downloaded_images/hero_10_skill_1003.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1004', name: '言灵·盾', avatar: '/assets/downloaded_images/hero_10_skill_1004.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1005', name: '言灵·星', avatar: '/assets/downloaded_images/hero_10_skill_1005.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1007', name: '言灵·缚', avatar: '/assets/downloaded_images/hero_10_skill_1007.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1008', name: '言灵·风', avatar: '/assets/downloaded_images/hero_10_skill_1008.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1009', name: '言灵·火', avatar: '/assets/downloaded_images/hero_10_skill_1009.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '1011', name: '言灵·水', avatar: '/assets/downloaded_images/hero_10_skill_1011.png' },\r\n { onmyojiId: '10', onmyojiName: '晴明', skillId: '9001', name: '通用技能', avatar: '/assets/downloaded_images/hero_10_skill_9001.png' },\r\n\r\n // 神乐的技能\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1101', name: '神乐铃·治愈', avatar: '/assets/downloaded_images/hero_11_skill_1101.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1102', name: '神乐铃·盾御', avatar: '/assets/downloaded_images/hero_11_skill_1102.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1103', name: '神乐铃·反弹', avatar: '/assets/downloaded_images/hero_11_skill_1103.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1104', name: '神乐铃·净化', avatar: '/assets/downloaded_images/hero_11_skill_1104.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1105', name: '神乐铃·复苏', avatar: '/assets/downloaded_images/hero_11_skill_1105.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1107', name: '神乐铃·庇护', avatar: '/assets/downloaded_images/hero_11_skill_1107.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '1111', name: '神乐铃·祈愿', avatar: '/assets/downloaded_images/hero_11_skill_1111.png' },\r\n { onmyojiId: '11', onmyojiName: '神乐', skillId: '9011', name: '通用技能', avatar: '/assets/downloaded_images/hero_11_skill_9011.png' },\r\n\r\n // 八百比丘尼的技能\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1201', name: '技能1', avatar: '/assets/downloaded_images/hero_12_skill_1201.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1202', name: '技能2', avatar: '/assets/downloaded_images/hero_12_skill_1202.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1203', name: '技能3', avatar: '/assets/downloaded_images/hero_12_skill_1203.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1204', name: '技能4', avatar: '/assets/downloaded_images/hero_12_skill_1204.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1205', name: '技能5', avatar: '/assets/downloaded_images/hero_12_skill_1205.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1206', name: '技能6', avatar: '/assets/downloaded_images/hero_12_skill_1206.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '1207', name: '技能7', avatar: '/assets/downloaded_images/hero_12_skill_1207.png' },\r\n { onmyojiId: '12', onmyojiName: '八百比丘尼', skillId: '9021', name: '通用技能', avatar: '/assets/downloaded_images/hero_12_skill_9021.png' },\r\n\r\n // 源博雅的技能\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '1301', name: '技能1', avatar: '/assets/downloaded_images/hero_13_skill_1301.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '1302', name: '技能2', avatar: '/assets/downloaded_images/hero_13_skill_1302.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '1303', name: '技能3', avatar: '/assets/downloaded_images/hero_13_skill_1303.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '1304', name: '技能4', avatar: '/assets/downloaded_images/hero_13_skill_1304.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '1305', name: '技能5', avatar: '/assets/downloaded_images/hero_13_skill_1305.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '9031', name: '通用技能1', avatar: '/assets/downloaded_images/hero_13_skill_9031.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '9032', name: '通用技能2', avatar: '/assets/downloaded_images/hero_13_skill_9032.png' },\r\n { onmyojiId: '13', onmyojiName: '源博雅', skillId: '9033', name: '通用技能3', avatar: '/assets/downloaded_images/hero_13_skill_9033.png' },\r\n\r\n // 不知火的技能\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1501', name: '技能1', avatar: '/assets/downloaded_images/hero_15_skill_1501.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1502', name: '技能2', avatar: '/assets/downloaded_images/hero_15_skill_1502.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1503', name: '技能3', avatar: '/assets/downloaded_images/hero_15_skill_1503.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1504', name: '技能4', avatar: '/assets/downloaded_images/hero_15_skill_1504.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1505', name: '技能5', avatar: '/assets/downloaded_images/hero_15_skill_1505.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1506', name: '技能6', avatar: '/assets/downloaded_images/hero_15_skill_1506.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1507', name: '技能7', avatar: '/assets/downloaded_images/hero_15_skill_1507.png' },\r\n { onmyojiId: '15', onmyojiName: '不知火', skillId: '1508', name: '技能8', avatar: '/assets/downloaded_images/hero_15_skill_1508.png' },\r\n\r\n // 鬼灯的技能\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1601', name: '技能1', avatar: '/assets/downloaded_images/hero_16_skill_1601.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1602', name: '技能2', avatar: '/assets/downloaded_images/hero_16_skill_1602.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1603', name: '技能3', avatar: '/assets/downloaded_images/hero_16_skill_1603.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1604', name: '技能4', avatar: '/assets/downloaded_images/hero_16_skill_1604.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1605', name: '技能5', avatar: '/assets/downloaded_images/hero_16_skill_1605.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1606', name: '技能6', avatar: '/assets/downloaded_images/hero_16_skill_1606.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1607', name: '技能7', avatar: '/assets/downloaded_images/hero_16_skill_1607.png' },\r\n { onmyojiId: '16', onmyojiName: '鬼灯', skillId: '1608', name: '技能8', avatar: '/assets/downloaded_images/hero_16_skill_1608.png' }\r\n]\r\n\r\nexport const SELECTOR_PRESETS: Record<string, SelectorConfig> = {\r\n shikigami: {\r\n title: '请选择式神',\r\n dataSource: shikigamiData,\r\n groupField: 'rarity',\r\n groups: [\r\n { label: '全部', name: 'ALL' },\r\n { label: 'UR', name: 'UR' },\r\n { label: 'SP', name: 'SP' },\r\n { label: 'SSR', name: 'SSR' },\r\n { label: 'SR', name: 'SR' },\r\n { label: 'R', name: 'R' },\r\n { label: 'N', name: 'N' },\r\n { label: '联动', name: 'L' },\r\n { label: '呱太', name: 'G' }\r\n ],\r\n itemRender: {\r\n imageField: 'avatar',\r\n labelField: 'name'\r\n }\r\n },\r\n\r\n yuhun: {\r\n title: '请选择御魂',\r\n dataSource: yuhunData,\r\n groupField: 'type',\r\n groups: [\r\n { label: '全部', name: 'ALL' },\r\n { label: '攻击类', name: 'attack' },\r\n { label: '暴击类', name: 'Crit' },\r\n { label: '生命类', name: 'Health' },\r\n { label: '防御类', name: 'Defense' },\r\n { label: '效果命中', name: 'Effect' },\r\n { label: '效果抵抗', name: 'EffectResist' },\r\n { label: '特殊类', name: 'Special' }\r\n ],\r\n itemRender: {\r\n imageField: 'avatar',\r\n labelField: 'name'\r\n }\r\n },\r\n\r\n onmyoji: {\r\n title: '请选择阴阳师',\r\n dataSource: onmyojiData,\r\n groupField: null,\r\n groups: [\r\n { label: '全部', name: 'ALL' }\r\n ],\r\n itemRender: {\r\n imageField: 'avatar',\r\n labelField: 'name'\r\n }\r\n },\r\n\r\n onmyojiSkill: {\r\n title: '请选择阴阳师技能',\r\n dataSource: onmyojiSkillData,\r\n groupField: 'onmyojiName',\r\n groups: [\r\n { label: '全部', name: 'ALL' },\r\n { label: '晴明', name: '晴明' },\r\n { label: '神乐', name: '神乐' },\r\n { label: '八百比丘尼', name: '八百比丘尼' },\r\n { label: '源博雅', name: '源博雅' },\r\n { label: '不知火', name: '不知火' },\r\n { label: '鬼灯', name: '鬼灯' }\r\n ],\r\n itemRender: {\r\n imageField: 'avatar',\r\n labelField: 'name'\r\n }\r\n }\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\nimport { useDialogs } from '@/ts/useDialogs';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\nimport { SELECTOR_PRESETS } from '@/configs/selectorPresets';\r\n\r\nconst props = defineProps<{\r\n node: any;\r\n}>();\r\n\r\nconst { openGenericSelector } = useDialogs();\r\n\r\n// 当前选中的资产库\r\nconst currentLibrary = computed(() => props.node.properties?.assetLibrary || 'shikigami');\r\n\r\n// 当前选中的资产\r\nconst currentAsset = computed(() => {\r\n return props.node.properties?.selectedAsset || { name: '未选择' };\r\n});\r\n\r\n// 打开选择器\r\nconst handleOpenSelector = () => {\r\n const lf = getLogicFlowInstance();\r\n const node = props.node;\r\n if (!lf || !node) return;\r\n\r\n const library = currentLibrary.value;\r\n const config = SELECTOR_PRESETS[library];\r\n\r\n if (!config) {\r\n console.error('未找到资产库配置:', library);\r\n return;\r\n }\r\n\r\n // 设置当前选中项\r\n config.currentItem = node.properties?.selectedAsset;\r\n\r\n openGenericSelector(config, (selectedItem) => {\r\n lf.setProperties(node.id, {\r\n ...node.properties,\r\n selectedAsset: selectedItem,\r\n assetLibrary: library\r\n });\r\n });\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">资产属性</div>\r\n\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">当前选择</div>\r\n <span>{{ currentAsset.name }}</span>\r\n <el-button type=\"primary\" @click=\"handleOpenSelector\" style=\"width: 100%; margin-top: 8px\">\r\n 选择资产\r\n </el-button>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.property-section {\r\n padding: 12px;\r\n}\r\n\r\n.section-header {\r\n font-weight: bold;\r\n margin-bottom: 12px;\r\n padding-bottom: 8px;\r\n border-bottom: 1px solid #e4e7ed;\r\n}\r\n\r\n.property-item {\r\n margin-bottom: 16px;\r\n}\r\n\r\n.property-label {\r\n font-size: 14px;\r\n color: #606266;\r\n margin-bottom: 8px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { reactive, watch } from 'vue';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\n\r\nconst props = defineProps<{ node: any }>();\r\n\r\nconst form = reactive({\r\n kind: 'rect',\r\n tileWidth: 50,\r\n tileHeight: 50,\r\n fill: '#409EFF',\r\n stroke: '#303133',\r\n strokeWidth: 1,\r\n path: '',\r\n svgContent: ''\r\n});\r\n\r\n// 从节点同步数据\r\nwatch(\r\n () => props.node,\r\n (node) => {\r\n if (node?.properties?.vector) {\r\n Object.assign(form, node.properties.vector);\r\n }\r\n },\r\n { immediate: true, deep: true }\r\n);\r\n\r\n// 应用更改\r\nconst applyChanges = (partial: Record<string, any>) => {\r\n const lf = getLogicFlowInstance();\r\n if (!lf || !props.node) return;\r\n\r\n const currentVector = props.node.properties?.vector || {};\r\n lf.setProperties(props.node.id, {\r\n ...props.node.properties,\r\n vector: {\r\n ...currentVector,\r\n ...partial\r\n }\r\n });\r\n};\r\n\r\nconst kindOptions = [\r\n { label: '矩形', value: 'rect' },\r\n { label: '椭圆', value: 'ellipse' },\r\n { label: '多边形', value: 'polygon' },\r\n { label: '路径', value: 'path' },\r\n { label: '自定义SVG', value: 'svg' }\r\n];\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">矢量配置</div>\r\n\r\n <!-- 图形类型 -->\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">图形类型</div>\r\n <div class=\"property-value\">\r\n <el-select\r\n v-model=\"form.kind\"\r\n size=\"small\"\r\n @change=\"() => applyChanges({ kind: form.kind })\"\r\n >\r\n <el-option\r\n v-for=\"opt in kindOptions\"\r\n :key=\"opt.value\"\r\n :label=\"opt.label\"\r\n :value=\"opt.value\"\r\n />\r\n </el-select>\r\n </div>\r\n </div>\r\n\r\n <!-- 平铺尺寸 -->\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">平铺尺寸 (宽×高)</div>\r\n <div class=\"property-value row\">\r\n <el-input-number\r\n v-model=\"form.tileWidth\"\r\n :min=\"10\"\r\n :max=\"500\"\r\n size=\"small\"\r\n @change=\"() => applyChanges({ tileWidth: form.tileWidth })\"\r\n />\r\n <span>×</span>\r\n <el-input-number\r\n v-model=\"form.tileHeight\"\r\n :min=\"10\"\r\n :max=\"500\"\r\n size=\"small\"\r\n @change=\"() => applyChanges({ tileHeight: form.tileHeight })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 填充颜色 -->\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">填充颜色</div>\r\n <div class=\"property-value\">\r\n <el-color-picker\r\n v-model=\"form.fill\"\r\n size=\"small\"\r\n @change=\"() => applyChanges({ fill: form.fill })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 描边颜色 -->\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">描边颜色</div>\r\n <div class=\"property-value\">\r\n <el-color-picker\r\n v-model=\"form.stroke\"\r\n size=\"small\"\r\n @change=\"() => applyChanges({ stroke: form.stroke })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 描边宽度 -->\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">描边宽度</div>\r\n <div class=\"property-value\">\r\n <el-input-number\r\n v-model=\"form.strokeWidth\"\r\n :min=\"0\"\r\n :max=\"20\"\r\n size=\"small\"\r\n @change=\"() => applyChanges({ strokeWidth: form.strokeWidth })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Path 数据(仅当 kind='path' 时显示) -->\r\n <div v-if=\"form.kind === 'path'\" class=\"property-item\">\r\n <div class=\"property-label\">Path 数据</div>\r\n <div class=\"property-value\">\r\n <el-input\r\n v-model=\"form.path\"\r\n type=\"textarea\"\r\n :rows=\"3\"\r\n size=\"small\"\r\n placeholder=\"M 0 0 L 50 50 Z\"\r\n @change=\"() => applyChanges({ path: form.path })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- SVG 内容(仅当 kind='svg' 时显示) -->\r\n <div v-if=\"form.kind === 'svg'\" class=\"property-item\">\r\n <div class=\"property-label\">SVG 内容</div>\r\n <div class=\"property-value\">\r\n <el-input\r\n v-model=\"form.svgContent\"\r\n type=\"textarea\"\r\n :rows=\"5\"\r\n size=\"small\"\r\n placeholder=\"<rect x='0' y='0' width='50' height='50' />\"\r\n @change=\"() => applyChanges({ svgContent: form.svgContent })\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.property-section {\r\n margin-bottom: 20px;\r\n background-color: white;\r\n border-radius: 4px;\r\n border: 1px solid #dcdfe6;\r\n}\r\n\r\n.section-header {\r\n font-weight: bold;\r\n padding: 10px;\r\n background-color: #ecf5ff;\r\n border-bottom: 1px solid #dcdfe6;\r\n}\r\n\r\n.property-item {\r\n padding: 10px;\r\n border-bottom: 1px solid #f0f0f0;\r\n}\r\n\r\n.property-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.property-label {\r\n font-size: 13px;\r\n color: #606266;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.property-value {\r\n width: 100%;\r\n}\r\n\r\n.row {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n</style>\r\n","/**\r\n * 节点类型系统\r\n * 将节点分为三大类:布局容器、图形资产、结构化文本\r\n */\r\n\r\nexport enum NodeCategory {\r\n LAYOUT = 'layout', // 布局容器\r\n ASSET = 'asset', // 图形资产\r\n TEXT = 'text' // 结构化文本\r\n}\r\n\r\nexport enum NodeType {\r\n // 布局容器类\r\n RECT = 'rect',\r\n ELLIPSE = 'ellipse',\r\n\r\n // 图形资产类(统一入口,内部切换资产库)\r\n ASSET_SELECTOR = 'assetSelector',\r\n IMAGE_UPLOAD = 'imageUpload',\r\n\r\n // 结构化文本类\r\n TEXT_NODE = 'textNode',\r\n\r\n // 特殊节点(保持独立)\r\n PROPERTY_SELECT = 'propertySelect'\r\n}\r\n\r\nexport interface AssetLibrary {\r\n id: string\r\n label: string\r\n selectorPreset: string\r\n}\r\n\r\nexport const ASSET_LIBRARIES: AssetLibrary[] = [\r\n { id: 'shikigami', label: '式神', selectorPreset: 'shikigami' },\r\n { id: 'yuhun', label: '御魂', selectorPreset: 'yuhun' },\r\n { id: 'onmyoji', label: '阴阳师', selectorPreset: 'onmyoji' },\r\n { id: 'onmyojiSkill', label: '阴阳师技能', selectorPreset: 'onmyojiSkill' }\r\n // 未来可扩展:技能图标、装备等\r\n]\r\n\r\nexport interface NodeTypeConfig {\r\n type: NodeType\r\n category: NodeCategory\r\n label: string\r\n description: string\r\n icon?: string\r\n defaultProps?: Record<string, any>\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue';\r\nimport PropertyRulePanel from './panels/PropertyRulePanel.vue';\r\nimport ImagePanel from './panels/ImagePanel.vue';\r\nimport TextPanel from './panels/TextPanel.vue';\r\nimport StylePanel from './panels/StylePanel.vue';\r\nimport AssetSelectorPanel from './panels/AssetSelectorPanel.vue';\r\nimport VectorPanel from './panels/VectorPanel.vue';\r\nimport { ASSET_LIBRARIES } from '@/types/nodeTypes';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\n\r\nconst props = defineProps({\r\n height: {\r\n type: String,\r\n default: '100%'\r\n },\r\n node: {\r\n type: Object,\r\n default: null\r\n }\r\n});\r\n\r\nconst selectedNode = computed(() => props.node);\r\nconst hasNodeSelected = computed(() => !!selectedNode.value);\r\n\r\nconst nodeType = computed(() => {\r\n if (!selectedNode.value) return '';\r\n return selectedNode.value.type || 'default';\r\n});\r\n\r\nconst activeTab = ref('game');\r\n\r\nconst panelMap: Record<string, any> = {\r\n propertySelect: PropertyRulePanel,\r\n imageNode: ImagePanel,\r\n textNode: TextPanel,\r\n assetSelector: AssetSelectorPanel,\r\n vectorNode: VectorPanel\r\n};\r\n\r\nconst panelComponent = computed(() => panelMap[nodeType.value] || null);\r\n\r\n// 判断是否支持节点类型切换(仅资产选择器节点支持)\r\nconst supportsTypeSwitch = computed(() => nodeType.value === 'assetSelector');\r\n\r\n// 当前资产库类型\r\nconst currentAssetLibrary = computed({\r\n get: () => selectedNode.value?.properties?.assetLibrary || 'shikigami',\r\n set: (value) => {\r\n const lf = getLogicFlowInstance();\r\n if (!lf || !selectedNode.value) return;\r\n\r\n lf.setProperties(selectedNode.value.id, {\r\n ...selectedNode.value.properties,\r\n assetLibrary: value,\r\n selectedAsset: null // 切换类型时清空已选资产\r\n });\r\n }\r\n});\r\n</script>\r\n\r\n<template>\r\n <div class=\"property-panel\" :style=\"{ height }\">\r\n <div class=\"panel-header\">\r\n <h3>属性编辑</h3>\r\n </div>\r\n\r\n <div v-if=\"!hasNodeSelected\" class=\"no-selection\">\r\n <p>请选择一个节点以编辑其属性</p>\r\n </div>\r\n\r\n <div v-else class=\"property-content\">\r\n <!-- Tab 切换 -->\r\n <el-tabs v-model=\"activeTab\" class=\"property-tabs\">\r\n <!-- 游戏属性 Tab -->\r\n <el-tab-pane label=\"游戏属性\" name=\"game\">\r\n <div class=\"property-section\">\r\n <div class=\"section-header\">基本信息</div>\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">节点ID</div>\r\n <div class=\"property-value\">{{ selectedNode.id }}</div>\r\n </div>\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">节点类型</div>\r\n <div class=\"property-value\">{{ nodeType }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- 节点类型切换(仅资产选择器支持) -->\r\n <div v-if=\"supportsTypeSwitch\" class=\"property-section\">\r\n <div class=\"section-header\">节点类型</div>\r\n <div class=\"property-item\">\r\n <div class=\"property-label\">资产类型</div>\r\n <el-select v-model=\"currentAssetLibrary\" placeholder=\"选择资产类型\" style=\"width: 100%\">\r\n <el-option\r\n v-for=\"lib in ASSET_LIBRARIES\"\r\n :key=\"lib.id\"\r\n :label=\"lib.label\"\r\n :value=\"lib.id\"\r\n />\r\n </el-select>\r\n </div>\r\n </div>\r\n\r\n <!-- 特定节点属性面板 -->\r\n <component v-if=\"panelComponent\" :is=\"panelComponent\" :node=\"selectedNode\" />\r\n <div v-else class=\"property-section\">\r\n <div class=\"section-header\">暂无特定属性</div>\r\n <div class=\"property-item\">\r\n <div class=\"property-value\">当前节点类型无需额外配置。</div>\r\n </div>\r\n </div>\r\n </el-tab-pane>\r\n\r\n <!-- 图像属性 Tab -->\r\n <el-tab-pane label=\"图像属性\" name=\"style\">\r\n <StylePanel :node=\"selectedNode\" />\r\n </el-tab-pane>\r\n </el-tabs>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.property-panel {\r\n background-color: #f5f7fa;\r\n border-left: 1px solid #e4e7ed;\r\n width: 280px;\r\n display: flex;\r\n flex-direction: column;\r\n overflow-y: auto;\r\n}\r\n\r\n.panel-header {\r\n padding: 10px;\r\n border-bottom: 1px solid #e4e7ed;\r\n background-color: #e4e7ed;\r\n}\r\n\r\n.panel-header h3 {\r\n margin: 0;\r\n font-size: 16px;\r\n color: #303133;\r\n}\r\n\r\n.no-selection {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n color: #909399;\r\n font-size: 14px;\r\n padding: 20px;\r\n text-align: center;\r\n}\r\n\r\n.property-content {\r\n padding: 10px;\r\n flex: 1;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.property-tabs {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.property-tabs :deep(.el-tabs__content) {\r\n flex: 1;\r\n overflow-y: auto;\r\n}\r\n\r\n.property-section {\r\n margin-bottom: 20px;\r\n background-color: white;\r\n border-radius: 4px;\r\n border: 1px solid #dcdfe6;\r\n overflow: hidden;\r\n}\r\n\r\n.section-header {\r\n font-weight: bold;\r\n padding: 10px;\r\n background-color: #ecf5ff;\r\n border-bottom: 1px solid #dcdfe6;\r\n}\r\n\r\n.property-item {\r\n padding: 10px;\r\n border-bottom: 1px solid #f0f0f0;\r\n}\r\n\r\n.property-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.property-label {\r\n font-size: 13px;\r\n color: #606266;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.property-value {\r\n font-size: 14px;\r\n word-break: break-all;\r\n}\r\n</style>\r\n","import { ElMessage } from 'element-plus';\r\n\r\nexport function useGlobalMessage() {\r\n const showMessage = (type: 'success' | 'warning' | 'info' | 'error', message: string) => {\r\n ElMessage({\r\n type,\r\n message,\r\n });\r\n };\r\n\r\n return {\r\n showMessage,\r\n };\r\n}","import { ref } from 'vue';\r\n\r\n// Shared canvas control state between FlowEditor and Toolbar.\r\nconst selectionEnabled = ref(true);\r\nconst snapGridEnabled = ref(true);\r\nconst snaplineEnabled = ref(true);\r\n\r\nexport function useCanvasSettings() {\r\n return {\r\n selectionEnabled,\r\n snapGridEnabled,\r\n snaplineEnabled\r\n };\r\n}\r\n","<template>\r\n <div class=\"editor-layout\" :style=\"{ height }\">\r\n <!-- 中间流程图区域 -->\r\n <div class=\"flow-container\" :class=\"{ 'snapline-disabled': !snaplineEnabled }\">\r\n <div class=\"flow-controls\">\r\n <div class=\"control-row toggles\">\r\n <label class=\"control-toggle\">\r\n <input type=\"checkbox\" v-model=\"selectionEnabled\" />\r\n <span>框选</span>\r\n </label>\r\n <label class=\"control-toggle\">\r\n <input type=\"checkbox\" v-model=\"snapGridEnabled\" />\r\n <span>吸附网格</span>\r\n </label>\r\n <label class=\"control-toggle\">\r\n <input type=\"checkbox\" v-model=\"snaplineEnabled\" />\r\n <span>对齐线</span>\r\n </label>\r\n <span class=\"control-hint\">已选 {{ selectedCount }}</span>\r\n <button class=\"control-button\" type=\"button\" @click=\"showAllNodes\">显示全部</button>\r\n </div>\r\n <div class=\"control-row\">\r\n <div class=\"control-label\">对齐</div>\r\n <div class=\"control-buttons\">\r\n <button\r\n v-for=\"btn in alignmentButtons\"\r\n :key=\"btn.key\"\r\n class=\"control-button\"\r\n type=\"button\"\r\n :disabled=\"selectedCount < 2\"\r\n @click=\"() => alignSelected(btn.key)\"\r\n >\r\n {{ btn.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"control-row\">\r\n <div class=\"control-label\">分布</div>\r\n <div class=\"control-buttons\">\r\n <button\r\n v-for=\"btn in distributeButtons\"\r\n :key=\"btn.key\"\r\n class=\"control-button\"\r\n type=\"button\"\r\n :disabled=\"selectedCount < 3\"\r\n @click=\"() => distributeSelected(btn.key)\"\r\n >\r\n {{ btn.label }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"container\" ref=\"containerRef\" :style=\"{ height: '100%' }\"></div>\r\n </div>\r\n <!-- 右侧属性面板 -->\r\n <PropertyPanel :height=\"height\" :node=\"selectedNode\" :lf=\"lf\" />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\r\nimport LogicFlow, { EventType } from '@logicflow/core';\r\nimport type { Position, NodeData, EdgeData, BaseNodeModel, GraphModel, GraphData } from '@logicflow/core';\r\nimport '@logicflow/core/lib/style/index.css';\r\nimport { Menu, Label, Snapshot, SelectionSelect, MiniMap, Control } from '@logicflow/extension';\r\nimport '@logicflow/extension/lib/style/index.css';\r\nimport '@logicflow/core/es/index.css';\r\nimport '@logicflow/extension/es/index.css';\r\nimport { translateEdgeData, translateNodeData } from '@logicflow/core/es/keyboard/shortcut';\r\n\r\nimport { register } from '@logicflow/vue-node-registry';\r\nimport PropertySelectNode from './nodes/yys/PropertySelectNode.vue';\r\nimport ImageNode from './nodes/common/ImageNode.vue';\r\nimport AssetSelectorNode from './nodes/common/AssetSelectorNode.vue';\r\nimport TextNode from './nodes/common/TextNode.vue';\r\nimport TextNodeModel from './nodes/common/TextNodeModel';\r\nimport VectorNode from './nodes/common/VectorNode.vue';\r\nimport VectorNodeModel from './nodes/common/VectorNodeModel';\r\nimport PropertyPanel from './PropertyPanel.vue';\r\nimport { useGlobalMessage } from '@/ts/useGlobalMessage';\r\nimport { setLogicFlowInstance, destroyLogicFlowInstance } from '@/ts/useLogicFlow';\r\nimport { normalizePropertiesWithStyle, normalizeNodeStyle, styleEquals } from '@/ts/nodeStyle';\r\nimport { useCanvasSettings } from '@/ts/useCanvasSettings';\r\n\r\ntype AlignType = 'left' | 'right' | 'top' | 'bottom' | 'hcenter' | 'vcenter';\r\ntype DistributeType = 'horizontal' | 'vertical';\r\n\r\nconst MOVE_STEP = 2;\r\nconst MOVE_STEP_LARGE = 10;\r\nconst COPY_TRANSLATION = 40;\r\n\r\nconst props = defineProps<{\r\n height?: string;\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst lf = ref<LogicFlow | null>(null);\r\nconst selectedCount = ref(0);\r\nconst { selectionEnabled, snapGridEnabled, snaplineEnabled } = useCanvasSettings();\r\nconst alignmentButtons: { key: AlignType; label: string }[] = [\r\n { key: 'left', label: '左对齐' },\r\n { key: 'right', label: '右对齐' },\r\n { key: 'top', label: '上对齐' },\r\n { key: 'bottom', label: '下对齐' },\r\n { key: 'hcenter', label: '水平居中' },\r\n { key: 'vcenter', label: '垂直居中' }\r\n];\r\nconst distributeButtons: { key: DistributeType; label: string }[] = [\r\n { key: 'horizontal', label: '水平等距' },\r\n { key: 'vertical', label: '垂直等距' }\r\n];\r\nconst { showMessage } = useGlobalMessage();\r\n\r\n// 当前选中节点\r\nconst selectedNode = ref<any>(null);\r\nconst copyBuffer = ref<GraphData | null>(null);\r\nlet nextPasteDistance = COPY_TRANSLATION;\r\n\r\nfunction isInputLike(event?: KeyboardEvent) {\r\n const target = event?.target as HTMLElement | null;\r\n if (!target) return false;\r\n const tag = target.tagName?.toLowerCase();\r\n return ['input', 'textarea', 'select', 'option'].includes(tag) || target.isContentEditable;\r\n}\r\n\r\nfunction shouldSkipShortcut(event?: KeyboardEvent) {\r\n const lfInstance = lf.value as any;\r\n if (!lfInstance) return true;\r\n if (lfInstance.keyboard?.disabled) return true;\r\n if (lfInstance.graphModel?.textEditElement) return true;\r\n if (isInputLike(event)) return true;\r\n return false;\r\n}\r\n\r\nfunction ensureMeta(meta?: Record<string, any>) {\r\n const next: Record<string, any> = meta ? { ...meta } : {};\r\n if (next.visible == null) next.visible = true;\r\n if (next.locked == null) next.locked = false;\r\n return next;\r\n}\r\n\r\nfunction applyMetaToModel(model: BaseNodeModel, metaInput?: Record<string, any>) {\r\n const lfInstance = lf.value;\r\n const meta = ensureMeta(metaInput ?? (model.getProperties?.() as any)?.meta ?? (model as any)?.properties?.meta);\r\n model.visible = meta.visible !== false;\r\n model.draggable = !meta.locked;\r\n model.setHittable?.(!meta.locked);\r\n model.setHitable?.(!meta.locked);\r\n model.setIsShowAnchor?.(!meta.locked);\r\n model.setRotatable?.(!meta.locked);\r\n model.setResizable?.(!meta.locked);\r\n\r\n if (lfInstance) {\r\n const connectedEdges = lfInstance.getNodeEdges(model.id);\r\n connectedEdges.forEach((edgeModel) => {\r\n edgeModel.visible = meta.visible !== false;\r\n });\r\n }\r\n}\r\n\r\nfunction applyStyleToModel(model: BaseNodeModel, styleInput?: Record<string, any>) {\r\n // 只有当 style 中明确指定了 width/height 时才更新 model\r\n // 避免用默认值覆盖用户的手动缩放操作\r\n if (styleInput?.width != null && model.width !== styleInput.width) {\r\n model.width = styleInput.width;\r\n }\r\n if (styleInput?.height != null && model.height !== styleInput.height) {\r\n model.height = styleInput.height;\r\n }\r\n}\r\n\r\nfunction normalizeNodeModel(model: BaseNodeModel) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n\r\n const props = (model.getProperties?.() as any) ?? (model as any)?.properties ?? {};\r\n const incomingMeta = ensureMeta(props.meta);\r\n\r\n // 优先使用 model 的实际尺寸(用户可能刚刚手动缩放了节点)\r\n const normalized = normalizePropertiesWithStyle(\r\n { ...props, meta: incomingMeta },\r\n { width: model.width, height: model.height }\r\n );\r\n\r\n const currentMeta = ensureMeta((model as any)?.properties?.meta);\r\n const metaChanged =\r\n currentMeta.visible !== incomingMeta.visible ||\r\n currentMeta.locked !== incomingMeta.locked ||\r\n currentMeta.groupId !== incomingMeta.groupId;\r\n\r\n // 只检查 style 的其他属性变化,不检查 width/height\r\n // 因为 width/height 应该由 LogicFlow 的缩放控制,而不是由 properties 控制\r\n const styleChanged = !styleEquals(props.style, normalized.style);\r\n\r\n if (metaChanged || styleChanged) {\r\n // 同步 style 到 properties,但保持 width/height 与 model 一致\r\n lfInstance.setProperties(model.id, {\r\n ...normalized,\r\n width: model.width,\r\n height: model.height\r\n });\r\n }\r\n applyMetaToModel(model, normalized.meta);\r\n // 不再调用 applyStyleToModel,因为 width/height 应该由 LogicFlow 控制\r\n}\r\n\r\nfunction normalizeAllNodes() {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n lfInstance.graphModel?.nodes.forEach((model: BaseNodeModel) => normalizeNodeModel(model));\r\n\r\n // 清除新节点标记\r\n const allNodes = lfInstance.graphModel?.nodes || [];\r\n allNodes.forEach(node => {\r\n delete (node as any)._isNewNode;\r\n });\r\n}\r\n\r\nfunction updateNodeMeta(model: BaseNodeModel, updater: (meta: Record<string, any>) => Record<string, any>) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n const props = (model.getProperties?.() as any) ?? (model as any)?.properties ?? {};\r\n const nextMeta = updater(ensureMeta(props.meta));\r\n lfInstance.setProperties(model.id, { ...props, meta: nextMeta });\r\n applyMetaToModel(model, nextMeta);\r\n}\r\n\r\nfunction getSelectedNodeModelsFiltered(options?: { includeHidden?: boolean; includeLocked?: boolean }) {\r\n const includeHidden = options?.includeHidden ?? false;\r\n const includeLocked = options?.includeLocked ?? false;\r\n const graphModel = lf.value?.graphModel;\r\n if (!graphModel) return [];\r\n return graphModel.selectNodes.filter((model: BaseNodeModel) => {\r\n const meta = ensureMeta((model.getProperties?.() as any)?.meta ?? (model as any)?.properties?.meta);\r\n if (!includeHidden && meta.visible === false) return false;\r\n if (!includeLocked && meta.locked) return false;\r\n return true;\r\n });\r\n}\r\n\r\nfunction getSelectedNodeModels() {\r\n const graphModel = lf.value?.graphModel;\r\n if (!graphModel) return [];\r\n return [...graphModel.selectNodes];\r\n}\r\n\r\nfunction collectGroupNodeIds(models: BaseNodeModel[]) {\r\n const graphModel = lf.value?.graphModel;\r\n if (!graphModel) return [];\r\n const ids = new Set<string>();\r\n models.forEach((model) => {\r\n const meta = ensureMeta((model.getProperties?.() as any)?.meta ?? (model as any)?.properties?.meta);\r\n if (meta.locked) return;\r\n if (meta.groupId) {\r\n graphModel.nodes.forEach((node) => {\r\n const peerMeta = ensureMeta((node.getProperties?.() as any)?.meta ?? (node as any)?.properties?.meta);\r\n if (peerMeta.groupId === meta.groupId && !peerMeta.locked) {\r\n ids.add(node.id);\r\n }\r\n });\r\n } else {\r\n ids.add(model.id);\r\n }\r\n });\r\n return Array.from(ids);\r\n}\r\n\r\nfunction moveSelectedNodes(deltaX: number, deltaY: number) {\r\n const graphModel = lf.value?.graphModel;\r\n if (!graphModel) return;\r\n const targets = collectGroupNodeIds(getSelectedNodeModelsFiltered());\r\n if (!targets.length) return;\r\n graphModel.moveNodes(targets, deltaX, deltaY);\r\n}\r\n\r\n// ========== 图层命令 ==========\r\nfunction bringToFront(nodeId?: string) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n const targetId = nodeId || selectedNode.value?.id;\r\n if (!targetId) return;\r\n\r\n // 诊断日志:查看所有节点的 zIndex\r\n const allNodes = lfInstance.graphModel.nodes;\r\n console.log('[置于顶层] 目标节点ID:', targetId);\r\n console.log('[置于顶层] 所有节点的 zIndex:', allNodes.map(n => ({ id: n.id, zIndex: n.zIndex })));\r\n\r\n lfInstance.setElementZIndex(targetId, 'top');\r\n\r\n // 操作后再次查看\r\n console.log('[置于顶层] 操作后所有节点的 zIndex:', allNodes.map(n => ({ id: n.id, zIndex: n.zIndex })));\r\n}\r\n\r\nfunction sendToBack(nodeId?: string) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n const targetId = nodeId || selectedNode.value?.id;\r\n if (!targetId) return;\r\n\r\n const currentNode = lfInstance.getNodeModelById(targetId);\r\n if (!currentNode) return;\r\n\r\n const allNodes = lfInstance.graphModel.nodes;\r\n console.log('[置于底层] 目标节点ID:', targetId);\r\n console.log('[置于底层] 所有节点的 zIndex:', allNodes.map(n => ({ id: n.id, zIndex: n.zIndex })));\r\n\r\n // 修复:找到所有节点中最小的 zIndex,然后设置为比它更小\r\n const allZIndexes = allNodes.map(n => n.zIndex).filter(z => z !== undefined);\r\n const minZIndex = allZIndexes.length > 0 ? Math.min(...allZIndexes) : 1;\r\n const newZIndex = minZIndex - 1;\r\n\r\n currentNode.setZIndex(newZIndex);\r\n\r\n // 操作后再次查看\r\n console.log('[置于底层] 操作后所有节点的 zIndex:', allNodes.map(n => ({ id: n.id, zIndex: n.zIndex })));\r\n}\r\n\r\nfunction bringForward(nodeId?: string) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n const targetId = nodeId || selectedNode.value?.id;\r\n if (!targetId) return;\r\n\r\n const currentNode = lfInstance.getNodeModelById(targetId);\r\n if (!currentNode) return;t\r\n\r\n const currentZIndex = currentNode.zIndex;\r\n currentNode.setZIndex(currentZIndex + 1);\r\n}\r\n\r\nfunction sendBackward(nodeId?: string) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n const targetId = nodeId || selectedNode.value?.id;\r\n if (!targetId) return;\r\n\r\n const currentNode = lfInstance.getNodeModelById(targetId);\r\n if (!currentNode) return;\r\n\r\n const currentZIndex = currentNode.zIndex;\r\n currentNode.setZIndex(currentZIndex - 1);\r\n}\r\n\r\n// ========== 删除操作 ==========\r\nfunction deleteSelectedElements(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return true;\r\n\r\n const { edges } = lfInstance.getSelectElements(true);\r\n const nodes = getSelectedNodeModelsFiltered({ includeHidden: false, includeLocked: true });\r\n const lockedNodes = nodes.filter((node) => ensureMeta((node as any).properties?.meta).locked);\r\n edges.forEach((edge) => edge.id && lfInstance.deleteEdge(edge.id));\r\n nodes\r\n .filter((node) => {\r\n const meta = ensureMeta((node as any).properties?.meta);\r\n return !meta.locked && meta.visible !== false;\r\n })\r\n .forEach((node) => node.id && lfInstance.deleteNode(node.id));\r\n\r\n if (lockedNodes.length) {\r\n showMessage('warning', '部分节点已锁定,未删除');\r\n }\r\n updateSelectedCount();\r\n selectedNode.value = null;\r\n return false;\r\n}\r\n\r\nfunction deleteNode(nodeId: string) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n const node = lfInstance.getNodeModelById(nodeId);\r\n if (!node) return;\r\n\r\n const meta = ensureMeta((node as any).properties?.meta);\r\n if (meta.locked) {\r\n showMessage('warning', '节点已锁定,无法删除');\r\n return;\r\n }\r\n\r\n lfInstance.deleteNode(nodeId);\r\n}\r\n\r\nfunction toggleLockSelected(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const models = getSelectedNodeModels();\r\n if (!models.length) {\r\n showMessage('info', '请选择节点后再执行锁定/解锁');\r\n return true;\r\n }\r\n const hasUnlocked = models.some((model) => !ensureMeta((model.getProperties?.() as any)?.meta).locked);\r\n models.forEach((model) => {\r\n updateNodeMeta(model, (meta) => ({ ...meta, locked: hasUnlocked ? true : false }));\r\n });\r\n return false;\r\n}\r\n\r\nfunction toggleVisibilitySelected(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const models = getSelectedNodeModelsFiltered({ includeLocked: true });\r\n if (!models.length) {\r\n showMessage('info', '请选择节点后再执行显示/隐藏');\r\n return true;\r\n }\r\n const hasVisible = models.some((model) => ensureMeta((model.getProperties?.() as any)?.meta).visible !== false);\r\n models.forEach((model) => {\r\n updateNodeMeta(model, (meta) => ({ ...meta, visible: !hasVisible ? true : false }));\r\n });\r\n if (hasVisible) {\r\n selectedNode.value = null;\r\n }\r\n updateSelectedCount();\r\n return false;\r\n}\r\n\r\nfunction showAllNodes() {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n let changed = 0;\r\n lfInstance.graphModel?.nodes.forEach((model: BaseNodeModel) => {\r\n const props = (model.getProperties?.() as any) ?? (model as any)?.properties ?? {};\r\n const meta = ensureMeta(props.meta);\r\n if (meta.visible === false) {\r\n meta.visible = true;\r\n lfInstance.setProperties(model.id, { ...props, meta });\r\n applyMetaToModel(model, meta);\r\n changed += 1;\r\n }\r\n });\r\n if (changed > 0) {\r\n showMessage('success', `已显示 ${changed} 个节点`);\r\n } else {\r\n showMessage('info', '没有隐藏的节点');\r\n }\r\n updateSelectedCount();\r\n}\r\n\r\nfunction groupSelectedNodes(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const models = getSelectedNodeModelsFiltered();\r\n if (models.length < 2) {\r\n showMessage('warning', '请选择至少两个未锁定的节点进行分组');\r\n return true;\r\n }\r\n const groupId = `group_${Date.now().toString(36)}`;\r\n models.forEach((model) => {\r\n updateNodeMeta(model, (meta) => ({ ...meta, groupId }));\r\n });\r\n return false;\r\n}\r\n\r\nfunction ungroupSelectedNodes(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const models = getSelectedNodeModels();\r\n if (!models.length) {\r\n showMessage('info', '请选择节点后再执行解组');\r\n return true;\r\n }\r\n models.forEach((model) => {\r\n updateNodeMeta(model, (meta) => {\r\n const nextMeta = { ...meta };\r\n delete nextMeta.groupId;\r\n return nextMeta;\r\n });\r\n });\r\n return false;\r\n}\r\n\r\nfunction handleArrowMove(direction: 'left' | 'right' | 'up' | 'down', event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const step = (event?.shiftKey ? MOVE_STEP_LARGE : MOVE_STEP) * (direction === 'left' || direction === 'up' ? -1 : 1);\r\n if (direction === 'left' || direction === 'right') {\r\n moveSelectedNodes(step, 0);\r\n } else {\r\n moveSelectedNodes(0, step);\r\n }\r\n return false;\r\n}\r\n\r\nfunction remapGroupIds(nodes: GraphData['nodes']) {\r\n const map = new Map<string, string>();\r\n const seed = Date.now().toString(36);\r\n nodes.forEach((node, index) => {\r\n const meta = ensureMeta((node as any).properties?.meta);\r\n if (meta.groupId) {\r\n if (!map.has(meta.groupId)) {\r\n map.set(meta.groupId, `group_${seed}_${index}`);\r\n }\r\n meta.groupId = map.get(meta.groupId);\r\n }\r\n (node as any).properties = { ...(node as any).properties, meta };\r\n });\r\n}\r\n\r\nfunction handleCopy(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return true;\r\n const elements = lfInstance.getSelectElements(false);\r\n if (!elements.nodes.length && !elements.edges.length) {\r\n copyBuffer.value = null;\r\n return true;\r\n }\r\n const nodes = elements.nodes.map((node) => translateNodeData(JSON.parse(JSON.stringify(node)), COPY_TRANSLATION));\r\n const edges = elements.edges.map((edge) => translateEdgeData(JSON.parse(JSON.stringify(edge)), COPY_TRANSLATION));\r\n remapGroupIds(nodes);\r\n copyBuffer.value = { nodes, edges };\r\n nextPasteDistance = COPY_TRANSLATION;\r\n return false;\r\n}\r\n\r\nfunction handlePaste(event?: KeyboardEvent) {\r\n if (shouldSkipShortcut(event)) return true;\r\n const lfInstance = lf.value;\r\n if (!lfInstance || !copyBuffer.value) return true;\r\n\r\n lfInstance.clearSelectElements();\r\n const added = lfInstance.addElements(copyBuffer.value, nextPasteDistance);\r\n if (added) {\r\n added.nodes.forEach((model) => {\r\n normalizeNodeModel(model);\r\n lfInstance.selectElementById(model.id, true);\r\n });\r\n added.edges.forEach((edge) => lfInstance.selectElementById(edge.id, true));\r\n copyBuffer.value.nodes.forEach((node) => translateNodeData(node, COPY_TRANSLATION));\r\n copyBuffer.value.edges.forEach((edge) => translateEdgeData(edge, COPY_TRANSLATION));\r\n nextPasteDistance += COPY_TRANSLATION;\r\n updateSelectedCount(lfInstance.graphModel);\r\n }\r\n return false;\r\n}\r\n\r\nfunction handleNodeDrag(args: { data: NodeData; deltaX: number; deltaY: number }) {\r\n const { data, deltaX, deltaY } = args;\r\n if (!deltaX && !deltaY) return;\r\n const graphModel = lf.value?.graphModel;\r\n if (!graphModel) return;\r\n const model = graphModel.getNodeModelById(data.id);\r\n if (!model) return;\r\n const targets = collectGroupNodeIds([model]).filter((id) => id !== model.id);\r\n if (!targets.length) return;\r\n graphModel.moveNodes(targets, deltaX, deltaY);\r\n}\r\n\r\nfunction updateSelectedCount(model?: GraphModel) {\r\n const lfInstance = lf.value;\r\n const graphModel = model ?? lfInstance?.graphModel;\r\n selectedCount.value = graphModel?.selectNodes.length ?? 0;\r\n}\r\n\r\nfunction applySelectionSelect(enabled: boolean) {\r\n const lfInstance = lf.value as any;\r\n if (!lfInstance) return;\r\n if (enabled) {\r\n lfInstance.openSelectionSelect?.();\r\n } else {\r\n lfInstance.closeSelectionSelect?.();\r\n }\r\n}\r\n\r\nfunction applySnapGrid(enabled: boolean) {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n lfInstance.updateEditConfig({ snapGrid: enabled });\r\n}\r\n\r\nfunction getSelectedRects() {\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return [];\r\n const actionable = getSelectedNodeModelsFiltered();\r\n return actionable.map((model: BaseNodeModel) => {\r\n const bounds = model.getBounds();\r\n const width = bounds.maxX - bounds.minX;\r\n const height = bounds.maxY - bounds.minY;\r\n return {\r\n model,\r\n bounds,\r\n width,\r\n height,\r\n centerX: (bounds.maxX + bounds.minX) / 2,\r\n centerY: (bounds.maxY + bounds.minY) / 2\r\n };\r\n });\r\n}\r\n\r\nfunction alignSelected(direction: AlignType) {\r\n const rects = getSelectedRects();\r\n if (rects.length < 2) {\r\n showMessage('warning', '请选择至少两个节点再执行对齐');\r\n return;\r\n }\r\n\r\n const minX = Math.min(...rects.map((item) => item.bounds.minX));\r\n const maxX = Math.max(...rects.map((item) => item.bounds.maxX));\r\n const minY = Math.min(...rects.map((item) => item.bounds.minY));\r\n const maxY = Math.max(...rects.map((item) => item.bounds.maxY));\r\n const centerX = (minX + maxX) / 2;\r\n const centerY = (minY + maxY) / 2;\r\n\r\n rects.forEach(({ model, width, height }) => {\r\n let targetX = model.x;\r\n let targetY = model.y;\r\n\r\n switch (direction) {\r\n case 'left':\r\n targetX = minX + width / 2;\r\n break;\r\n case 'right':\r\n targetX = maxX - width / 2;\r\n break;\r\n case 'hcenter':\r\n targetX = centerX;\r\n break;\r\n case 'top':\r\n targetY = minY + height / 2;\r\n break;\r\n case 'bottom':\r\n targetY = maxY - height / 2;\r\n break;\r\n case 'vcenter':\r\n targetY = centerY;\r\n break;\r\n }\r\n\r\n model.moveTo(targetX, targetY);\r\n });\r\n}\r\n\r\nfunction distributeSelected(type: DistributeType) {\r\n const rects = getSelectedRects();\r\n if (rects.length < 3) {\r\n showMessage('warning', '请选择至少三个节点再执行分布');\r\n return;\r\n }\r\n\r\n const sorted = [...rects].sort((a, b) =>\r\n type === 'horizontal' ? a.bounds.minX - b.bounds.minX : a.bounds.minY - b.bounds.minY\r\n );\r\n const first = sorted[0];\r\n const last = sorted[sorted.length - 1];\r\n\r\n if (type === 'horizontal') {\r\n const totalWidth = sorted.reduce((sum, item) => sum + item.width, 0);\r\n const gap = (last.bounds.maxX - first.bounds.minX - totalWidth) / (sorted.length - 1);\r\n let cursor = first.bounds.minX + first.width;\r\n\r\n for (let i = 1; i < sorted.length - 1; i += 1) {\r\n cursor += gap;\r\n const item = sorted[i];\r\n item.model.moveTo(cursor + item.width / 2, item.centerY);\r\n cursor += item.width;\r\n }\r\n } else {\r\n const totalHeight = sorted.reduce((sum, item) => sum + item.height, 0);\r\n const gap = (last.bounds.maxY - first.bounds.minY - totalHeight) / (sorted.length - 1);\r\n let cursor = first.bounds.minY + first.height;\r\n\r\n for (let i = 1; i < sorted.length - 1; i += 1) {\r\n cursor += gap;\r\n const item = sorted[i];\r\n item.model.moveTo(item.centerX, cursor + item.height / 2);\r\n cursor += item.height;\r\n }\r\n }\r\n}\r\n\r\n// 注册自定义节点\r\nfunction registerNodes(lfInstance: LogicFlow) {\r\n register({ type: 'propertySelect', component: PropertySelectNode }, lfInstance);\r\n\r\n register({ type: 'imageNode', component: ImageNode }, lfInstance);\r\n register({ type: 'assetSelector', component: AssetSelectorNode }, lfInstance);\r\n register({ type: 'textNode', component: TextNode, model: TextNodeModel }, lfInstance);\r\n register({ type: 'vectorNode', component: VectorNode, model: VectorNodeModel }, lfInstance);\r\n}\r\n\r\n// 初始化 LogicFlow\r\nonMounted(() => {\r\n lf.value = new LogicFlow({\r\n container: containerRef.value,\r\n grid: { type: 'dot', size: 10 },\r\n allowResize: true,\r\n allowRotate: true,\r\n overlapMode: -1,\r\n snapline: snaplineEnabled.value,\r\n keyboard: {\r\n enabled: true\r\n },\r\n style: {\r\n text: {\r\n color: '#333333',\r\n fontSize: 14,\r\n background: {\r\n fill: '#ffffff',\r\n stroke: '#dcdfe6',\r\n strokeWidth: 1,\r\n radius: 4\r\n }\r\n },\r\n nodeText: {\r\n color: '#333333',\r\n fontSize: 14\r\n }\r\n },\r\n plugins: [Menu, Label, Snapshot, SelectionSelect, MiniMap, Control],\r\n pluginsOptions: {\r\n label: {\r\n isMultiple: false, // 每个节点只允许一个 label\r\n // 不设置全局 labelWidth,让每个节点自己控制\r\n // textOverflowMode -> 'ellipsis' | 'wrap' | 'clip' | 'nowrap' | 'default'\r\n textOverflowMode: 'wrap',\r\n },\r\n miniMap: {\r\n isShowHeader: false,\r\n isShowCloseIcon: true,\r\n width: 200,\r\n height: 140,\r\n rightPosition: 16,\r\n bottomPosition: 16\r\n }\r\n },\r\n });\r\n\r\n const lfInstance = lf.value;\r\n if (!lfInstance) return;\r\n\r\n lfInstance.keyboard.off(['cmd + c', 'ctrl + c']);\r\n lfInstance.keyboard.off(['cmd + v', 'ctrl + v']);\r\n lfInstance.keyboard.off(['backspace']);\r\n\r\n const bindShortcut = (keys: string | string[], handler: (event?: KeyboardEvent) => boolean | void) => {\r\n lfInstance.keyboard.on(keys, (event: KeyboardEvent) => handler(event));\r\n };\r\n\r\n bindShortcut(['del', 'backspace'], deleteSelectedElements);\r\n bindShortcut(['left'], (event) => handleArrowMove('left', event));\r\n bindShortcut(['right'], (event) => handleArrowMove('right', event));\r\n bindShortcut(['up'], (event) => handleArrowMove('up', event));\r\n bindShortcut(['down'], (event) => handleArrowMove('down', event));\r\n bindShortcut(['cmd + c', 'ctrl + c'], handleCopy);\r\n bindShortcut(['cmd + v', 'ctrl + v'], handlePaste);\r\n bindShortcut(['cmd + g', 'ctrl + g'], groupSelectedNodes);\r\n bindShortcut(['cmd + u', 'ctrl + u'], ungroupSelectedNodes);\r\n bindShortcut(['cmd + l', 'ctrl + l'], toggleLockSelected);\r\n bindShortcut(['cmd + shift + h', 'ctrl + shift + h'], toggleVisibilitySelected);\r\n\r\n lfInstance.extension.menu.addMenuConfig({\r\n nodeMenu: [\r\n {\r\n text: '置于顶层',\r\n callback(node: NodeData) {\r\n bringToFront(node.id);\r\n }\r\n },\r\n {\r\n text: '上移一层',\r\n callback(node: NodeData) {\r\n bringForward(node.id);\r\n }\r\n },\r\n {\r\n text: '下移一层',\r\n callback(node: NodeData) {\r\n sendBackward(node.id);\r\n }\r\n },\r\n {\r\n text: '置于底层',\r\n callback(node: NodeData) {\r\n sendToBack(node.id);\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '复制 (Ctrl+C)',\r\n callback() {\r\n handleCopy();\r\n }\r\n },\r\n {\r\n text: '粘贴 (Ctrl+V)',\r\n callback() {\r\n handlePaste();\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '组合 (Ctrl+G)',\r\n callback() {\r\n groupSelectedNodes();\r\n }\r\n },\r\n {\r\n text: '解组 (Ctrl+U)',\r\n callback() {\r\n ungroupSelectedNodes();\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '锁定/解锁 (Ctrl+L)',\r\n callback() {\r\n toggleLockSelected();\r\n }\r\n },\r\n {\r\n text: '显示/隐藏 (Ctrl+Shift+H)',\r\n callback() {\r\n toggleVisibilitySelected();\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '删除节点 (Del)',\r\n callback(node: NodeData) {\r\n deleteNode(node.id);\r\n }\r\n }\r\n ],\r\n edgeMenu: [\r\n {\r\n text: '删除边',\r\n callback(edge: EdgeData) {\r\n lfInstance.deleteEdge(edge.id);\r\n }\r\n }\r\n ],\r\n graphMenu: [\r\n {\r\n text: '添加节点',\r\n callback(data: Position) {\r\n lfInstance.addNode({\r\n type: 'rect',\r\n x: data.x,\r\n y: data.y\r\n });\r\n }\r\n },\r\n {\r\n text: '粘贴 (Ctrl+V)',\r\n callback(data: Position) {\r\n handlePaste();\r\n }\r\n }\r\n ]\r\n });\r\n\r\n // 配置多选时的右键菜单(选区菜单)\r\n lfInstance.extension.menu.setMenuByType({\r\n type: 'lf:defaultSelectionMenu',\r\n menu: [\r\n {\r\n text: '复制 (Ctrl+C)',\r\n callback() {\r\n handleCopy();\r\n }\r\n },\r\n {\r\n text: '粘贴 (Ctrl+V)',\r\n callback() {\r\n handlePaste();\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '组合 (Ctrl+G)',\r\n callback() {\r\n groupSelectedNodes();\r\n }\r\n },\r\n {\r\n text: '解组 (Ctrl+U)',\r\n callback() {\r\n ungroupSelectedNodes();\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '锁定/解锁 (Ctrl+L)',\r\n callback() {\r\n toggleLockSelected();\r\n }\r\n },\r\n {\r\n text: '显示/隐藏 (Ctrl+Shift+H)',\r\n callback() {\r\n toggleVisibilitySelected();\r\n }\r\n },\r\n {\r\n text: '---' // 分隔线\r\n },\r\n {\r\n text: '删除选中 (Del)',\r\n callback() {\r\n deleteSelectedElements();\r\n }\r\n }\r\n ]\r\n });\r\n\r\n registerNodes(lfInstance);\r\n setLogicFlowInstance(lfInstance);\r\n\r\n // 监听所有可能的节点添加事件\r\n lfInstance.on(EventType.NODE_ADD, ({ data }) => {\r\n const model = lfInstance.getNodeModelById(data.id);\r\n if (model) {\r\n normalizeNodeModel(model);\r\n // 设置新节点的 zIndex 为 1000\r\n model.setZIndex(1000);\r\n // 标记这个节点是新创建的,避免被 normalizeAllNodes 重置\r\n (model as any)._isNewNode = true;\r\n }\r\n });\r\n\r\n // 监听 DND 添加节点事件\r\n lfInstance.on('node:dnd-add', ({ data }) => {\r\n const model = lfInstance.getNodeModelById(data.id);\r\n if (model) {\r\n // 设置新节点的 zIndex 为 1000\r\n model.setZIndex(1000);\r\n // 标记这个节点是新创建的\r\n (model as any)._isNewNode = true;\r\n }\r\n });\r\n\r\n lfInstance.on(EventType.GRAPH_RENDERED, () => {\r\n normalizeAllNodes();\r\n });\r\n\r\n // 监听节点点击事件,更新选中节点\r\n lfInstance.on(EventType.NODE_CLICK, ({ data }) => {\r\n selectedNode.value = data;\r\n });\r\n\r\n // 监听空白点击事件,取消选中\r\n lfInstance.on(EventType.BLANK_CLICK, () => {\r\n selectedNode.value = null;\r\n updateSelectedCount();\r\n });\r\n\r\n // 节点属性改变,如果当前节点是选中节点,则同步更新 selectedNode\r\n lfInstance.on(EventType.NODE_PROPERTIES_CHANGE, (data) => {\r\n const nodeId = data.id;\r\n if (selectedNode.value && nodeId === selectedNode.value.id) {\r\n if (data.properties) {\r\n selectedNode.value = {\r\n ...selectedNode.value,\r\n properties: data.properties\r\n };\r\n }\r\n }\r\n const model = lfInstance.getNodeModelById(nodeId);\r\n if (model) normalizeNodeModel(model);\r\n });\r\n\r\n lfInstance.on('selection:selected', () => updateSelectedCount());\r\n lfInstance.on('selection:drop', () => updateSelectedCount());\r\n});\r\n\r\nwatch(selectionEnabled, (enabled) => {\r\n applySelectionSelect(enabled);\r\n});\r\n\r\nwatch(snapGridEnabled, (enabled) => {\r\n applySnapGrid(enabled);\r\n});\r\n\r\nwatch(snaplineEnabled, (enabled) => {\r\n const lfInstance = lf.value as any;\r\n if (!lfInstance) return;\r\n if (!enabled) {\r\n lfInstance.snaplineModel?.clearSnapline?.();\r\n }\r\n});\r\n\r\n// 销毁 LogicFlow\r\nonBeforeUnmount(() => {\r\n lf.value?.destroy();\r\n lf.value = null;\r\n destroyLogicFlowInstance();\r\n});\r\n\r\n\r\n\r\n\r\n</script>\r\n\r\n<style scoped>\r\n.editor-layout {\r\n display: flex;\r\n height: 100%;\r\n}\r\n.flow-container {\r\n flex: 1;\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n.container {\r\n width: 100%;\r\n min-height: 300px;\r\n background: #fff;\r\n height: 100%;\r\n}\r\n.flow-controls {\r\n position: absolute;\r\n top: 10px;\r\n left: 10px;\r\n z-index: 10;\r\n background: rgba(255, 255, 255, 0.95);\r\n border: 1px solid #ebeef5;\r\n border-radius: 8px;\r\n padding: 10px;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\r\n max-width: 460px;\r\n font-size: 12px;\r\n}\r\n.control-row {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n margin-bottom: 6px;\r\n}\r\n.control-row:last-child {\r\n margin-bottom: 0;\r\n}\r\n.control-label {\r\n font-weight: 600;\r\n color: #303133;\r\n}\r\n.control-buttons {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 6px;\r\n}\r\n.control-button {\r\n border: 1px solid #dcdfe6;\r\n background: #fff;\r\n border-radius: 4px;\r\n padding: 4px 8px;\r\n cursor: pointer;\r\n font-size: 12px;\r\n color: #303133;\r\n}\r\n.control-button:hover:enabled {\r\n background: #f5f7fa;\r\n}\r\n.control-button:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n.control-toggle {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n color: #606266;\r\n}\r\n.control-hint {\r\n color: #909399;\r\n}\r\n.context-menu {\r\n position: fixed;\r\n background: white;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 4px;\r\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\r\n padding: 5px 0;\r\n z-index: 9999;\r\n min-width: 120px;\r\n user-select: none;\r\n}\r\n.menu-item {\r\n padding: 8px 16px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n color: #606266;\r\n white-space: nowrap;\r\n}\r\n.menu-item:hover {\r\n background-color: #f5f7fa;\r\n color: #409eff;\r\n}\r\n\r\n.snapline-disabled .lf-snapline {\r\n display: none;\r\n}\r\n</style>\r\n","export default \"__VITE_PUBLIC_ASSET__f93243ed__\"","import {defineStore} from 'pinia';\r\nimport {ref, computed} from 'vue';\r\n// import type { Edge, Node, ViewportTransform } from '@vue-flow/core';\r\nimport {ElMessageBox} from \"element-plus\";\r\nimport {useGlobalMessage} from \"./useGlobalMessage\";\r\nimport {getLogicFlowInstance} from \"./useLogicFlow\";\r\nimport {CURRENT_SCHEMA_VERSION, migrateToV1, RootDocument} from \"./schema\";\r\n\r\nconst {showMessage} = useGlobalMessage();\r\n\r\n// localStorage 防抖定时器\r\nlet localStorageDebounceTimer: NodeJS.Timeout | null = null;\r\nconst LOCALSTORAGE_DEBOUNCE_DELAY = 1000; // 1秒防抖\r\n\r\ntype PersistedRoot = RootDocument;\r\n\r\ninterface FlowFile {\r\n id: string; // stable identity, do not rely on name for selection\r\n label: string;\r\n name: string;\r\n visible: boolean;\r\n type: string;\r\n graphRawData?: object;\r\n transform?: {\r\n \"SCALE_X\": number,\r\n \"SCALE_Y\": number,\r\n \"TRANSLATE_X\": number,\r\n \"TRANSLATE_Y\": number\r\n };\r\n}\r\n\r\nfunction getDefaultState() {\r\n const id = 'f_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\r\n return {\r\n \"fileList\": [\r\n {\r\n \"id\": id,\r\n \"label\": \"File 1\",\r\n \"name\": \"File 1\",\r\n \"visible\": true,\r\n \"type\": \"FLOW\",\r\n \"graphRawData\": {\r\n \"nodes\": [],\r\n \"edges\": []\r\n },\r\n \"transform\": {\r\n \"SCALE_X\": 1,\r\n \"SCALE_Y\": 1,\r\n \"TRANSLATE_X\": 0,\r\n \"TRANSLATE_Y\": 0\r\n }\r\n }\r\n ],\r\n // legacy: kept for compatibility, actual selection uses activeFileId\r\n \"activeFile\": \"File 1\",\r\n \"activeFileId\": id\r\n } as any;\r\n}\r\n\r\nfunction clearFilesStoreLocalStorage() {\r\n localStorage.removeItem('filesStore');\r\n}\r\n\r\nfunction loadStateFromLocalStorage() {\r\n try {\r\n const data = localStorage.getItem('filesStore');\r\n return data ? JSON.parse(data) : null;\r\n } catch (error) {\r\n console.error('从 localStorage 加载数据失败:', error);\r\n return null;\r\n }\r\n}\r\n\r\nfunction saveStateToLocalStorage(state: any) {\r\n // 清除之前的防抖定时器\r\n if (localStorageDebounceTimer) {\r\n clearTimeout(localStorageDebounceTimer);\r\n }\r\n\r\n // 设置新的防抖定时器\r\n localStorageDebounceTimer = setTimeout(() => {\r\n try {\r\n localStorage.setItem('filesStore', JSON.stringify(state));\r\n console.log('数据已防抖保存到 localStorage');\r\n } catch (error) {\r\n console.error('保存到 localStorage 失败:', error);\r\n // 如果 localStorage 满了,尝试清理一些数据\r\n try {\r\n localStorage.clear();\r\n localStorage.setItem('filesStore', JSON.stringify(state));\r\n } catch (clearError) {\r\n console.error('清理 localStorage 后仍无法保存:', clearError);\r\n }\r\n }\r\n }, LOCALSTORAGE_DEBOUNCE_DELAY);\r\n}\r\n\r\n\r\nexport const useFilesStore = defineStore('files', () => {\r\n // Helper: generate stable ids\r\n const genId = () => 'f_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\r\n\r\n // 文件列表状态(以 id 作为主键)\r\n const fileList = ref<FlowFile[]>([]);\r\n const activeFileId = ref<string>('');\r\n\r\n // 计算属性:获取可见的文件\r\n const visibleFiles = computed(() => {\r\n return fileList.value.filter(file => file.visible);\r\n });\r\n\r\n // 根据传入列表补全缺省字段并补齐 id\r\n const normalizeList = (list: any[]): FlowFile[] => {\r\n return (list || []).map((f: any, i: number) => ({\r\n id: f?.id || genId(),\r\n label: f?.label ?? f?.name ?? `File ${i + 1}`,\r\n name: f?.name ?? f?.label ?? `File ${i + 1}`,\r\n visible: f?.visible ?? true,\r\n type: f?.type ?? 'FLOW',\r\n graphRawData: (f?.graphRawData && typeof f.graphRawData === 'object') ? f.graphRawData : { nodes: [], edges: [] },\r\n transform: f?.transform ?? {\r\n SCALE_X: 1,\r\n SCALE_Y: 1,\r\n TRANSLATE_X: 0,\r\n TRANSLATE_Y: 0\r\n },\r\n }));\r\n };\r\n\r\n const findById = (id?: string) => fileList.value.find(f => f.id === id);\r\n const findByName = (name?: string) => fileList.value.find(f => f.name === name);\r\n\r\n // 导入数据(兼容旧格式 activeFile/name)\r\n const importData = (data: any) => {\r\n try {\r\n // 如果已有 schemaVersion,则视为 v1 RootDocument;否则通过迁移器补齐\r\n const root: PersistedRoot = (data && typeof data === 'object' && (data as any).schemaVersion)\r\n ? (data as PersistedRoot)\r\n : migrateToV1(data) as PersistedRoot;\r\n\r\n const normalized = normalizeList(root.fileList || []);\r\n fileList.value = normalized;\r\n\r\n // 选中逻辑:优先 activeFileId -> 其次 activeFile(name) -> 首个\r\n let nextActiveId: string | undefined = undefined;\r\n const idFromData = (data as any).activeFileId ?? root.activeFileId;\r\n if (idFromData && normalized.some(f => f.id === idFromData)) {\r\n nextActiveId = idFromData;\r\n } else {\r\n const nameFromData = (data as any).activeFile ?? root.activeFile;\r\n if (nameFromData) {\r\n const byName = normalized.find(f => f.name === nameFromData);\r\n nextActiveId = byName?.id;\r\n }\r\n }\r\n activeFileId.value = nextActiveId || normalized[0]?.id || '';\r\n\r\n showMessage('success', '数据导入成功');\r\n } catch (error) {\r\n console.error('Failed to import file', error);\r\n showMessage('error', '数据导入失败');\r\n }\r\n };\r\n\r\n // 导出数据(同时携带 activeFile 与 activeFileId 以兼容旧版)\r\n const exportData = () => {\r\n try {\r\n const activeName = findById(activeFileId.value)?.name || '';\r\n const dataStr = JSON.stringify({\r\n schemaVersion: CURRENT_SCHEMA_VERSION,\r\n fileList: fileList.value,\r\n activeFileId: activeFileId.value,\r\n activeFile: activeName,\r\n }, null, 2);\r\n const blob = new Blob([dataStr], {type: 'application/json;charset=utf-8'});\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = 'yys-editor-files.json';\r\n link.click();\r\n URL.revokeObjectURL(url);\r\n showMessage('success', '数据导出成功');\r\n } catch (error) {\r\n console.error('导出数据失败:', error);\r\n showMessage('error', '数据导出失败');\r\n }\r\n };\r\n\r\n // 启动自动恢复;如有保存的数据则直接恢复;否则用默认\r\n const initializeWithPrompt = () => {\r\n const savedStateRaw = loadStateFromLocalStorage();\r\n const defaultState = getDefaultState();\r\n\r\n if (savedStateRaw && (savedStateRaw as any).fileList) {\r\n // 若已有 schemaVersion,则视为 v1;否则通过迁移器补齐到 RootDocument 形态\r\n const root: PersistedRoot = ((savedStateRaw as any).schemaVersion)\r\n ? (savedStateRaw as PersistedRoot)\r\n : migrateToV1(savedStateRaw) as PersistedRoot;\r\n\r\n const normalized = normalizeList(root.fileList || []);\r\n fileList.value = normalized;\r\n\r\n let next: string | undefined;\r\n const idFromData = (savedStateRaw as any).activeFileId ?? root.activeFileId;\r\n if (idFromData && normalized.some(f => f.id === idFromData)) {\r\n next = idFromData;\r\n } else {\r\n const nameFromData = (savedStateRaw as any).activeFile ?? root.activeFile;\r\n if (nameFromData) {\r\n next = normalized.find(f => f.name === nameFromData)?.id;\r\n }\r\n }\r\n activeFileId.value = next || normalized[0]?.id || '';\r\n showMessage('success', '已恢复上次工作区');\r\n return;\r\n }\r\n\r\n // 无保存数据:使用默认\r\n fileList.value = normalizeList(defaultState.fileList);\r\n activeFileId.value = fileList.value[0]?.id || '';\r\n };\r\n\r\n // 提供重置接口:清空本地并回到默认\r\n const resetWorkspace = () => {\r\n clearFilesStoreLocalStorage();\r\n const def = getDefaultState();\r\n fileList.value = normalizeList(def.fileList);\r\n activeFileId.value = fileList.value[0]?.id || '';\r\n showMessage('success', '已重置工作区');\r\n };\r\n\r\n // 设置自动更新\r\n const setupAutoSave = () => {\r\n console.log('自动更新功能已启动,每30秒更新一次');\r\n setInterval(() => {\r\n updateTab(); // 使用统一的更新方法\r\n }, 30000); // 设置间隔时间为30秒\r\n };\r\n\r\n // 添加新文件\r\n const addTab = () => {\r\n // 添加文件前先保存\r\n updateTab();\r\n\r\n requestAnimationFrame(() => {\r\n const newFileName = `File ${fileList.value.length + 1}`;\r\n const newFile: FlowFile = {\r\n id: genId(),\r\n label: newFileName,\r\n name: newFileName,\r\n visible: true,\r\n type: 'FLOW',\r\n graphRawData: {},\r\n transform: {\r\n SCALE_X: 1,\r\n SCALE_Y: 1,\r\n TRANSLATE_X: 0,\r\n TRANSLATE_Y: 0\r\n }\r\n };\r\n fileList.value.push(newFile);\r\n activeFileId.value = newFile.id;\r\n });\r\n };\r\n\r\n // 关闭文件标签\r\n const removeTab = (fileId: string | undefined) => {\r\n if (!fileId) return;\r\n\r\n const index = fileList.value.findIndex(file => file.id === fileId);\r\n if (index === -1) return;\r\n\r\n fileList.value.splice(index, 1);\r\n\r\n // 如果关闭的是当前活动文件,则切换到其他文件\r\n if (activeFileId.value === fileId) {\r\n activeFileId.value = fileList.value[Math.max(0, index - 1)]?.id || '';\r\n }\r\n\r\n // 关闭文件后立即更新\r\n // updateTab();\r\n };\r\n\r\n // 更新指定 Tab - 内存操作即时,localStorage 操作防抖\r\n const updateTab = (fileId?: string) => {\r\n try {\r\n const targetId = fileId || activeFileId.value;\r\n\r\n // 先同步 LogicFlow 数据到内存\r\n syncLogicFlowDataToStore(targetId);\r\n\r\n // 再保存到 localStorage(带防抖)\r\n const state: PersistedRoot = {\r\n schemaVersion: CURRENT_SCHEMA_VERSION,\r\n fileList: fileList.value as any,\r\n activeFileId: activeFileId.value,\r\n activeFile: findById(activeFileId.value)?.name || ''\r\n };\r\n saveStateToLocalStorage(state);\r\n } catch (error) {\r\n console.error('更新 Tab 失败:', error);\r\n showMessage('error', '数据更新失败');\r\n }\r\n };\r\n\r\n // 获取当前 Tab 数据(优先按 id,兼容按 name)\r\n const getTab = (fileKey?: string) => {\r\n const targetId = fileKey || activeFileId.value;\r\n return findById(targetId) || findByName(fileKey || '');\r\n };\r\n\r\n // 同步 LogicFlow 画布数据到 store 的内部方法\r\n const syncLogicFlowDataToStore = (fileId?: string) => {\r\n const logicFlowInstance = getLogicFlowInstance();\r\n const targetId = fileId || activeFileId.value;\r\n\r\n if (logicFlowInstance && targetId) {\r\n try {\r\n // 获取画布最新数据\r\n const graphData = logicFlowInstance.getGraphRawData();\r\n const transform = logicFlowInstance.getTransform();\r\n\r\n if (graphData) {\r\n // 手动添加 zIndex 信息到每个节点\r\n const enrichedGraphData = {\r\n ...graphData,\r\n nodes: (graphData.nodes || []).map((node: any) => {\r\n const model = logicFlowInstance.getNodeModelById(node.id);\r\n const zIndex = model?.zIndex ?? node.zIndex ?? 1;\r\n return {\r\n ...node,\r\n zIndex: zIndex\r\n };\r\n })\r\n };\r\n\r\n // 直接保存原始数据到 GraphRawData\r\n const file = findById(targetId);\r\n if (file) {\r\n file.graphRawData = enrichedGraphData;\r\n file.transform = transform;\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('同步画布数据失败:', error);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n importData,\r\n exportData,\r\n\r\n initializeWithPrompt,\r\n resetWorkspace,\r\n setupAutoSave,\r\n\r\n addTab,\r\n removeTab,\r\n updateTab,\r\n getTab,\r\n\r\n fileList,\r\n activeFileId,\r\n visibleFiles,\r\n };\r\n});\r\n","<template>\r\n <div class=\"toolbar\">\r\n <div>\r\n <el-button icon=\"Upload\" type=\"primary\" @click=\"handleImport\">{{ t('import') }}</el-button>\r\n <el-button icon=\"Download\" type=\"primary\" @click=\"handleExport\">{{ t('export') }}</el-button>\r\n <el-button icon=\"View\" type=\"success\" @click=\"handlePreviewData\">数据预览</el-button>\r\n <el-button icon=\"Share\" type=\"primary\" @click=\"prepareCapture\">{{ t('prepareCapture') }}</el-button>\r\n <el-button icon=\"Setting\" type=\"primary\" @click=\"state.showWatermarkDialog = true\">{{ t('setWatermark') }}</el-button>\r\n <el-button type=\"info\" @click=\"loadExample\">{{ t('loadExample') }}</el-button>\r\n <el-button type=\"info\" @click=\"showUpdateLog\">{{ t('updateLog') }}</el-button>\r\n <el-button type=\"warning\" @click=\"showFeedbackForm\">{{ t('feedback') }}</el-button>\r\n <el-button type=\"danger\" @click=\"handleResetWorkspace\">重置工作区</el-button>\r\n <el-button type=\"warning\" plain @click=\"handleClearCanvas\">清空画布</el-button>\r\n </div>\r\n <div class=\"toolbar-controls\">\r\n <el-switch\r\n v-model=\"selectionEnabled\"\r\n size=\"small\"\r\n inline-prompt\r\n active-text=\"框选开\"\r\n inactive-text=\"框选关\"\r\n />\r\n <el-switch\r\n v-model=\"snapGridEnabled\"\r\n size=\"small\"\r\n inline-prompt\r\n active-text=\"吸附开\"\r\n inactive-text=\"吸附关\"\r\n />\r\n <el-switch\r\n v-model=\"snaplineEnabled\"\r\n size=\"small\"\r\n inline-prompt\r\n active-text=\"对齐线开\"\r\n inactive-text=\"对齐线关\"\r\n />\r\n </div>\r\n\r\n <!-- 更新日志对话框 -->\r\n <el-dialog v-model=\"state.showUpdateLogDialog\" title=\"更新日志\" width=\"60%\">\r\n <ul>\r\n <li v-for=\"(log, index) in updateLogs\" :key=\"index\">\r\n <strong>版本 {{ log.version }} - {{ log.date }}</strong>\r\n <ul>\r\n <li v-for=\"(change, idx) in log.changes\" :key=\"idx\">{{ change }}</li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </el-dialog>\r\n\r\n <!-- 问题反馈对话框 -->\r\n <el-dialog v-model=\"state.showFeedbackFormDialog\" title=\"更新日志\" width=\"60%\">\r\n <span style=\"font-size: 24px;\">备注阴阳师</span>\r\n <br/>\r\n <img src=\"/assets/Other/Contact.png\"\r\n style=\"cursor: pointer; vertical-align: bottom; width: 200px; height: auto;\"/>\r\n </el-dialog>\r\n\r\n <!-- 预览弹窗 -->\r\n <el-dialog id=\"preview-container\" v-model=\"state.previewVisible\" width=\"80%\" height=\"80%\"\r\n :before-close=\"handleClose\">\r\n <div style=\"max-height: 500px; overflow-y: auto;\">\r\n <img v-if=\"state.previewImage\" :src=\"state.previewImage\" alt=\"Preview\" style=\"width: 100%; display: block;\"/>\r\n </div>\r\n <span slot=\"footer\" class=\"dialog-footer\">\r\n <el-button @click=\"state.previewVisible = false\">取 消</el-button>\r\n <el-button type=\"primary\" @click=\"downloadImage\">下 载</el-button>\r\n </span>\r\n </el-dialog>\r\n\r\n <!-- 水印设置弹窗 -->\r\n <el-dialog v-model=\"state.showWatermarkDialog\" title=\"设置水印\" width=\"30%\">\r\n <el-form>\r\n <el-form-item label=\"水印文字\">\r\n <el-input v-model=\"watermark.text\"></el-input>\r\n </el-form-item>\r\n <el-form-item label=\"字体大小\">\r\n <el-input-number v-model=\"watermark.fontSize\" :min=\"10\" :max=\"100\"></el-input-number>\r\n </el-form-item>\r\n <el-form-item label=\"颜色\">\r\n <el-color-picker v-model=\"watermark.color\"></el-color-picker>\r\n </el-form-item>\r\n <el-form-item label=\"水印行数\">\r\n <el-input-number v-model=\"watermark.rows\" :min=\"1\" :max=\"10\"></el-input-number>\r\n </el-form-item>\r\n <el-form-item label=\"水印列数\">\r\n <el-input-number v-model=\"watermark.cols\" :min=\"1\" :max=\"10\"></el-input-number>\r\n </el-form-item>\r\n <el-form-item label=\"角度\">\r\n <el-input-number v-model=\"watermark.angle\" :min=\"-90\" :max=\"90\"></el-input-number>\r\n </el-form-item>\r\n </el-form>\r\n <template #footer>\r\n <span class=\"dialog-footer\">\r\n <el-button @click=\"state.showWatermarkDialog = false\">取消</el-button>\r\n <el-button type=\"primary\" @click=\"applyWatermarkSettings\">确认</el-button>\r\n </span>\r\n </template>\r\n </el-dialog>\r\n\r\n <!-- 数据预览对话框 -->\r\n <el-dialog v-model=\"state.showDataPreviewDialog\" title=\"数据预览\" width=\"70%\">\r\n <div style=\"max-height: 600px; overflow-y: auto;\">\r\n <pre style=\"background: #f5f5f5; padding: 16px; border-radius: 4px; font-size: 12px; line-height: 1.5;\">{{ state.previewDataContent }}</pre>\r\n </div>\r\n <template #footer>\r\n <span class=\"dialog-footer\">\r\n <el-button @click=\"state.showDataPreviewDialog = false\">关闭</el-button>\r\n <el-button type=\"primary\" @click=\"copyDataToClipboard\">复制到剪贴板</el-button>\r\n </span>\r\n </template>\r\n </el-dialog>\r\n\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive, onMounted } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport updateLogs from \"../data/updateLog.json\"\r\nimport { useFilesStore } from \"@/ts/useStore\";\r\nimport { ElMessageBox } from \"element-plus\";\r\nimport { useGlobalMessage } from \"@/ts/useGlobalMessage\";\r\nimport { getLogicFlowInstance } from \"@/ts/useLogicFlow\";\r\nimport { useCanvasSettings } from '@/ts/useCanvasSettings';\r\n\r\nconst filesStore = useFilesStore();\r\nconst { showMessage } = useGlobalMessage();\r\nconst { selectionEnabled, snapGridEnabled, snaplineEnabled } = useCanvasSettings();\r\n\r\n// 获取当前的 i18n 实例\r\nconst {t} = useI18n();\r\n\r\n// 定义响应式数据\r\nconst state = reactive({\r\n previewImage: null, // 用于存储预览图像的数据URL\r\n previewVisible: false, // 控制预览弹窗的显示状态\r\n showWatermarkDialog: false, // 控制水印设置弹窗的显示状态,\r\n showUpdateLogDialog: false, // 控制更新日志对话框的显示状态\r\n showFeedbackFormDialog: false, // 控制反馈表单对话框的显示状态\r\n showDataPreviewDialog: false, // 控制数据预览对话框的显示状态\r\n previewDataContent: '', // 存储预览的数据内容\r\n});\r\n\r\n// 重新渲染 LogicFlow 画布的通用方法\r\nconst refreshLogicFlowCanvas = (message?: string) => {\r\n setTimeout(() => {\r\n const logicFlowInstance = getLogicFlowInstance();\r\n if (logicFlowInstance) {\r\n // 获取当前活动文件的数据\r\n const currentFileData = filesStore.getTab(filesStore.activeFileId);\r\n if (currentFileData) {\r\n // 清空画布并重新渲染\r\n logicFlowInstance.clearData();\r\n // 注意:此处根据你的画布 API 传入 graphRawData 或整个文件数据\r\n const data = (currentFileData as any).graphRawData || currentFileData;\r\n logicFlowInstance.render(data);\r\n console.log(message || 'LogicFlow 画布已重新渲染');\r\n }\r\n }\r\n }, 100); // 延迟一点确保数据更新完成\r\n};\r\n\r\nconst loadExample = () => {\r\n ElMessageBox.confirm(\r\n '加载样例会覆盖当前数据,是否覆盖?',\r\n '提示',\r\n {\r\n confirmButtonText: '覆盖',\r\n cancelButtonText: '取消',\r\n type: 'warning',\r\n }\r\n ).then(() => {\r\n // 使用默认状态作为示例\r\n const defaultState = {\r\n fileList: [{\r\n \"label\": \"示例文件\",\r\n \"name\": \"example\",\r\n \"visible\": true,\r\n \"type\": \"FLOW\",\r\n \"groups\": [\r\n {\r\n \"shortDescription\": \"示例组\",\r\n \"groupInfo\": [{}, {}, {}, {}, {}],\r\n \"details\": \"这是一个示例文件\"\r\n }\r\n ],\r\n \"flowData\": {\r\n \"nodes\": [],\r\n \"edges\": [],\r\n \"viewport\": { \"x\": 0, \"y\": 0, \"zoom\": 1 }\r\n }\r\n }],\r\n activeFile: \"example\"\r\n };\r\n filesStore.importData(defaultState);\r\n refreshLogicFlowCanvas('LogicFlow 画布已重新渲染(示例数据)');\r\n showMessage('success', '数据已恢复');\r\n }).catch(() => {\r\n showMessage('info', '选择了不恢复旧数据');\r\n });\r\n}\r\n\r\nconst CURRENT_APP_VERSION = updateLogs[0].version;\r\nconst showUpdateLog = () => {\r\n state.showUpdateLogDialog = !state.showUpdateLogDialog;\r\n};\r\n\r\nonMounted(() => {\r\n const lastVersion = localStorage.getItem('appVersion');\r\n\r\n if (lastVersion !== CURRENT_APP_VERSION) {\r\n // 如果版本号不同,则显示更新日志对话框\r\n state.showUpdateLogDialog = true;\r\n // 更新本地存储中的版本号为当前版本\r\n localStorage.setItem('appVersion', CURRENT_APP_VERSION);\r\n }\r\n});\r\n\r\n\r\nconst showFeedbackForm = () => {\r\n state.showFeedbackFormDialog = !state.showFeedbackFormDialog;\r\n};\r\n\r\nconst handleExport = () => {\r\n // 导出前先更新当前数据,确保不丢失最新修改\r\n filesStore.updateTab();\r\n\r\n // 延迟一点确保更新完成后再导出\r\n setTimeout(() => {\r\n filesStore.exportData();\r\n }, 2000);\r\n};\r\n\r\nconst handlePreviewData = () => {\r\n // 预览前先更新当前数据\r\n filesStore.updateTab();\r\n\r\n // 延迟一点确保更新完成后再预览\r\n setTimeout(() => {\r\n try {\r\n const activeName = filesStore.fileList.find(f => f.id === filesStore.activeFileId)?.name || '';\r\n const dataObj = {\r\n schemaVersion: 1,\r\n fileList: filesStore.fileList,\r\n activeFileId: filesStore.activeFileId,\r\n activeFile: activeName,\r\n };\r\n state.previewDataContent = JSON.stringify(dataObj, null, 2);\r\n state.showDataPreviewDialog = true;\r\n } catch (error) {\r\n console.error('生成预览数据失败:', error);\r\n showMessage('error', '数据预览失败');\r\n }\r\n }, 100);\r\n};\r\n\r\nconst copyDataToClipboard = async () => {\r\n try {\r\n await navigator.clipboard.writeText(state.previewDataContent);\r\n showMessage('success', '已复制到剪贴板');\r\n } catch (error) {\r\n console.error('复制失败:', error);\r\n showMessage('error', '复制失败');\r\n }\r\n};\r\n\r\nconst handleImport = () => {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = '.json';\r\n input.onchange = (e) => {\r\n const target = e.target as HTMLInputElement;\r\n const file = target.files?.[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n try {\r\n const target = e.target as FileReader;\r\n const data = JSON.parse(target.result as string);\r\n filesStore.importData(data);\r\n // refreshLogicFlowCanvas('LogicFlow 画布已重新渲染(导入数据)');\r\n } catch (error) {\r\n console.error('Failed to import file', error);\r\n showMessage('error', '文件格式错误');\r\n }\r\n };\r\n reader.readAsText(file);\r\n }\r\n };\r\n input.click();\r\n};\r\n\r\nconst handleResetWorkspace = () => {\r\n ElMessageBox.confirm('确定重置当前工作区?该操作不可撤销', '提示', {\r\n confirmButtonText: '重置',\r\n cancelButtonText: '取消',\r\n type: 'warning',\r\n }).then(() => {\r\n filesStore.resetWorkspace();\r\n }).catch(() => {\r\n // 用户取消\r\n });\r\n};\r\n\r\nconst handleClearCanvas = () => {\r\n ElMessageBox.confirm('仅清空当前画布,不影响其他文件,确定继续?', '提示', {\r\n confirmButtonText: '清空',\r\n cancelButtonText: '取消',\r\n type: 'warning',\r\n }).then(() => {\r\n const lfInstance = getLogicFlowInstance();\r\n const activeId = filesStore.activeFileId;\r\n const activeFile = filesStore.getTab(activeId);\r\n\r\n if (lfInstance) {\r\n lfInstance.clearData();\r\n lfInstance.render({ nodes: [], edges: [] });\r\n lfInstance.zoom(1, [0, 0]);\r\n }\r\n\r\n if (activeFile) {\r\n activeFile.graphRawData = { nodes: [], edges: [] };\r\n activeFile.transform = {\r\n SCALE_X: 1,\r\n SCALE_Y: 1,\r\n TRANSLATE_X: 0,\r\n TRANSLATE_Y: 0\r\n };\r\n filesStore.updateTab(activeId);\r\n }\r\n\r\n showMessage('success', '当前画布已清空');\r\n }).catch(() => {\r\n // 用户取消\r\n });\r\n};\r\n\r\nconst watermark = reactive({\r\n text: localStorage.getItem('watermark.text') || '示例水印',\r\n fontSize: Number(localStorage.getItem('watermark.fontSize')) || 30,\r\n color: localStorage.getItem('watermark.color') || 'rgba(184, 184, 184, 0.3)',\r\n angle: Number(localStorage.getItem('watermark.angle')) || -20,\r\n rows: Number(localStorage.getItem('watermark.rows')) || 1,\r\n cols: Number(localStorage.getItem('watermark.cols')) || 1,\r\n});\r\n\r\nconst applyWatermarkSettings = () => {\r\n // 保存水印设置到 localStorage\r\n localStorage.setItem('watermark.text', watermark.text);\r\n localStorage.setItem('watermark.fontSize', String(watermark.fontSize));\r\n localStorage.setItem('watermark.color', watermark.color);\r\n localStorage.setItem('watermark.angle', String(watermark.angle));\r\n localStorage.setItem('watermark.rows', String(watermark.rows));\r\n localStorage.setItem('watermark.cols', String(watermark.cols));\r\n\r\n state.showWatermarkDialog = false;\r\n};\r\n\r\n\r\nconst addWatermarkToImage = (base64: string) => {\r\n const rows = Math.max(1, Number(watermark.rows) || 1);\r\n const cols = Math.max(1, Number(watermark.cols) || 1);\r\n const angle = (Number(watermark.angle) * Math.PI) / 180;\r\n\r\n return new Promise<string>((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n if (!ctx) {\r\n reject(new Error('无法创建画布上下文'));\r\n return;\r\n }\r\n\r\n ctx.drawImage(img, 0, 0);\r\n ctx.font = `${watermark.fontSize}px sans-serif`;\r\n ctx.fillStyle = watermark.color;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n\r\n const rowStep = canvas.height / rows;\r\n const colStep = canvas.width / cols;\r\n\r\n for (let r = 0; r < rows; r++) {\r\n for (let c = 0; c < cols; c++) {\r\n const x = (c + 0.5) * colStep;\r\n const y = (r + 0.5) * rowStep;\r\n ctx.save();\r\n ctx.translate(x, y);\r\n ctx.rotate(angle);\r\n ctx.fillText(watermark.text, 0, 0);\r\n ctx.restore();\r\n }\r\n }\r\n\r\n resolve(canvas.toDataURL('image/png'));\r\n };\r\n img.onerror = () => reject(new Error('快照加载失败'));\r\n img.src = base64;\r\n });\r\n};\r\n\r\nconst captureLogicFlowSnapshot = async () => {\r\n const logicFlowInstance = getLogicFlowInstance() as any;\r\n if (!logicFlowInstance || typeof logicFlowInstance.getSnapshotBase64 !== 'function') {\r\n showMessage('error', '未找到 LogicFlow 实例,无法截图');\r\n return null;\r\n }\r\n\r\n const snapshotResult = await logicFlowInstance.getSnapshotBase64(\r\n undefined,\r\n undefined,\r\n {\r\n fileType: 'png',\r\n backgroundColor: '#ffffff',\r\n partial: false,\r\n padding: 20,\r\n },\r\n );\r\n\r\n const base64 = typeof snapshotResult === 'string' ? snapshotResult : snapshotResult?.data;\r\n if (!base64) {\r\n showMessage('error', '未获取到截图数据');\r\n return null;\r\n }\r\n\r\n return addWatermarkToImage(base64);\r\n};\r\n\r\nconst prepareCapture = async () => {\r\n try {\r\n const img = await captureLogicFlowSnapshot();\r\n if (!img) return;\r\n state.previewImage = img;\r\n state.previewVisible = true;\r\n } catch (e) {\r\n showMessage('error', '截图失败: ' + (e?.message || e));\r\n }\r\n};\r\n\r\nconst downloadImage = () => {\r\n if (state.previewImage) {\r\n const link = document.createElement('a');\r\n link.href = state.previewImage;\r\n link.download = 'screenshot.png';\r\n link.click();\r\n state.previewVisible = false;\r\n }\r\n};\r\n\r\nconst handleClose = (done) => {\r\n state.previewImage = null; // 清除预览图像\r\n done(); // 关闭弹窗\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.toolbar {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 48px;\r\n background: #f8f8f8;\r\n align-items: center;\r\n padding: 0 8px;\r\n z-index: 100;\r\n}\r\n\r\n.toolbar-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin-top: 6px;\r\n}\r\n\r\n.title {\r\n flex-grow: 1;\r\n text-align: center;\r\n font-size: 16px;\r\n}\r\n\r\n.left, .right {\r\n flex-basis: 120px;\r\n display: flex;\r\n gap: 8px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { ref } from 'vue';\r\nimport { getLogicFlowInstance } from '@/ts/useLogicFlow';\r\n\r\n// 使用嵌套结构定义组件分组\r\nconst componentGroups = [\r\n {\r\n id: 'basic',\r\n title: '基础组件',\r\n components: [\r\n {\r\n id: 'rect',\r\n name: '长方形',\r\n type: 'rect',\r\n description: '基础长方形节点',\r\n data: {\r\n width: 150,\r\n height: 150,\r\n style: { background: '#fff', border: '2px solid black' }\r\n }\r\n },\r\n {\r\n id: 'ellipse',\r\n name: '圆形',\r\n type: 'ellipse',\r\n description: '基础圆形节点',\r\n data: {\r\n width: 150,\r\n height: 150,\r\n style: { background: '#fff', border: '2px solid black', borderRadius: '50%' }\r\n }\r\n },\r\n {\r\n id: 'image',\r\n name: '图片',\r\n type: 'imageNode',\r\n description: '可上传图片的节点',\r\n data: {\r\n url: '',\r\n width: 180,\r\n height: 120\r\n }\r\n },\r\n {\r\n id: 'text',\r\n name: '文字编辑框',\r\n type: 'textNode',\r\n description: '可编辑文本的节点',\r\n data: {\r\n text: '双击编辑文字',\r\n width: 200,\r\n height: 120\r\n }\r\n },\r\n {\r\n id: 'vector',\r\n name: '矢量图块',\r\n type: 'vectorNode',\r\n description: '可平铺的矢量图形,用于边框装饰',\r\n data: {\r\n vector: {\r\n kind: 'rect',\r\n tileWidth: 50,\r\n tileHeight: 50,\r\n fill: '#409EFF',\r\n stroke: '#303133',\r\n strokeWidth: 1\r\n },\r\n width: 200,\r\n height: 200\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n id: 'yys',\r\n title: '阴阳师',\r\n components: [\r\n {\r\n id: 'asset-selector',\r\n name: '资产选择器',\r\n type: 'assetSelector',\r\n description: '通用资产选择器(式神/御魂等)',\r\n data: {\r\n assetLibrary: 'shikigami',\r\n selectedAsset: null\r\n }\r\n },\r\n {\r\n id: 'shikigami-select',\r\n name: '式神选择器',\r\n type: 'assetSelector',\r\n description: '用于选择式神的组件',\r\n data: {\r\n assetLibrary: 'shikigami',\r\n selectedAsset: null\r\n }\r\n },\r\n {\r\n id: 'yuhun-select',\r\n name: '御魂选择器',\r\n type: 'assetSelector',\r\n description: '用于选择御魂的组件',\r\n data: {\r\n assetLibrary: 'yuhun',\r\n selectedAsset: null\r\n }\r\n },\r\n {\r\n id: 'property-select',\r\n name: '属性选择器',\r\n type: 'propertySelect',\r\n description: '用于设置属性要求的组件',\r\n data: {\r\n property: {\r\n type: '未选择',\r\n priority: 'optional',\r\n description: '',\r\n value: 0,\r\n valueType: '',\r\n levelRequired: \"40\",\r\n skillRequiredMode: \"all\",\r\n skillRequired: [\"5\", \"5\", \"5\"],\r\n yuhun: {\r\n yuhunSetEffect: [],\r\n target: \"1\",\r\n property2: [\"Attack\"],\r\n property4: [\"Attack\"],\r\n property6: [\"Crit\", \"CritDamage\"],\r\n },\r\n expectedDamage: 0,\r\n survivalRate: 50,\r\n damageType: \"balanced\"\r\n }\r\n }\r\n },\r\n {\r\n id: 'onmyoji-select',\r\n name: '阴阳师选择器',\r\n type: 'assetSelector',\r\n description: '用于选择阴阳师的组件',\r\n data: {\r\n assetLibrary: 'onmyoji',\r\n selectedAsset: null\r\n }\r\n },\r\n {\r\n id: 'onmyoji-skill-select',\r\n name: '阴阳师技能选择器',\r\n type: 'assetSelector',\r\n description: '用于选择阴阳师技能的组件',\r\n data: {\r\n assetLibrary: 'onmyojiSkill',\r\n selectedAsset: null\r\n }\r\n }\r\n ]\r\n },\r\n // 可以轻松添加新的游戏组件组\r\n {\r\n id: 'other-game',\r\n title: '其他游戏',\r\n components: []\r\n }\r\n];\r\n\r\n// 处理组件点击 - 可选:可直接创建节点\r\nconst handleComponentClick = (component) => {\r\n // 可选:实现点击直接添加节点到画布\r\n};\r\n\r\nconst handleMouseDown = (e, component) => {\r\n e.preventDefault(); // 阻止文字选中\r\n const lf = getLogicFlowInstance();\r\n if (!lf) return;\r\n lf.dnd.startDrag({\r\n type: component.type,\r\n properties: component.data\r\n });\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"components-panel\">\r\n <h3>组件库</h3>\r\n <!-- 使用两层遍历生成界面元素 -->\r\n <div \r\n v-for=\"group in componentGroups\" \r\n :key=\"group.id\"\r\n class=\"components-group\"\r\n >\r\n <div class=\"group-title\">{{ group.title }}</div>\r\n <div class=\"components-list\">\r\n <div\r\n v-for=\"component in group.components\"\r\n :key=\"component.id\"\r\n class=\"component-item\"\r\n @click=\"handleComponentClick(component)\"\r\n @mousedown=\"(e) => handleMouseDown(e, component)\"\r\n >\r\n <div class=\"component-icon\">\r\n <i class=\"el-icon-plus\"></i>\r\n </div>\r\n <div class=\"component-info\">\r\n <div class=\"component-name\">{{ component.name }}</div>\r\n <div class=\"component-desc\">{{ component.description }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.components-panel {\r\n padding: 10px;\r\n background-color: #f5f7fa;\r\n border-bottom: 1px solid #e4e7ed;\r\n margin-bottom: 10px;\r\n width: 200px;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.components-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n}\r\n\r\n.component-item {\r\n display: flex;\r\n align-items: center;\r\n padding: 8px;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n background-color: white;\r\n transition: all 0.3s;\r\n}\r\n\r\n.component-item:hover {\r\n background-color: #f2f6fc;\r\n border-color: #c6e2ff;\r\n}\r\n\r\n.component-icon {\r\n width: 40px;\r\n height: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #ecf5ff;\r\n border-radius: 4px;\r\n margin-right: 10px;\r\n}\r\n\r\n.component-info {\r\n flex: 1;\r\n}\r\n\r\n.component-name {\r\n font-weight: bold;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.component-desc {\r\n font-size: 12px;\r\n color: #909399;\r\n}\r\n\r\n.components-group {\r\n margin-bottom: 18px;\r\n}\r\n\r\n.group-title {\r\n font-weight: bold;\r\n font-size: 15px;\r\n margin-bottom: 6px;\r\n color: #333;\r\n}\r\n</style> ","<template>\n <div\n class=\"yys-editor-embed\"\n :class=\"{ 'preview-mode': mode === 'preview', 'edit-mode': mode === 'edit' }\"\n :style=\"containerStyle\"\n >\n <!-- 编辑模式:完整 UI -->\n <template v-if=\"mode === 'edit'\">\n <!-- 工具栏 -->\n <Toolbar\n v-if=\"showToolbar\"\n :is-embed=\"true\"\n @save=\"handleSave\"\n @cancel=\"handleCancel\"\n />\n\n <!-- 主内容区 -->\n <div class=\"editor-content\" :style=\"{ height: contentHeight }\">\n <!-- 左侧组件库 -->\n <ComponentsPanel v-if=\"showComponentPanel\" />\n\n <!-- 中间画布 + 右侧属性面板 -->\n <FlowEditor\n ref=\"flowEditorRef\"\n :height=\"contentHeight\"\n />\n </div>\n </template>\n\n <!-- 预览模式:只有画布(只读) -->\n <template v-else>\n <div class=\"preview-container\" :style=\"{ height: containerHeight }\">\n <div class=\"container\" ref=\"previewContainerRef\"></div>\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount, provide } from 'vue'\nimport { createPinia } from 'pinia'\nimport LogicFlow from '@logicflow/core'\nimport '@logicflow/core/lib/style/index.css'\nimport { Snapshot, MiniMap, Control } from '@logicflow/extension'\nimport '@logicflow/extension/lib/style/index.css'\n\nimport FlowEditor from './components/flow/FlowEditor.vue'\nimport Toolbar from './components/Toolbar.vue'\nimport ComponentsPanel from './components/flow/ComponentsPanel.vue'\nimport { useFilesStore } from '@/ts/useStore'\nimport { setLogicFlowInstance, destroyLogicFlowInstance, getLogicFlowInstance } from '@/ts/useLogicFlow'\nimport { register } from '@logicflow/vue-node-registry'\nimport ImageNode from './components/flow/nodes/common/ImageNode.vue'\nimport AssetSelectorNode from './components/flow/nodes/common/AssetSelectorNode.vue'\nimport TextNode from './components/flow/nodes/common/TextNode.vue'\nimport TextNodeModel from './components/flow/nodes/common/TextNodeModel'\nimport VectorNode from './components/flow/nodes/common/VectorNode.vue'\nimport VectorNodeModel from './components/flow/nodes/common/VectorNodeModel'\n\n// 类型定义\nexport interface GraphData {\n nodes: NodeData[]\n edges: EdgeData[]\n}\n\nexport interface NodeData {\n id: string\n type: string\n x: number\n y: number\n properties?: Record<string, any>\n text?: { value: string }\n}\n\nexport interface EdgeData {\n id: string\n type: string\n sourceNodeId: string\n targetNodeId: string\n properties?: Record<string, any>\n}\n\nexport interface EditorConfig {\n grid?: boolean\n snapline?: boolean\n keyboard?: boolean\n theme?: 'light' | 'dark'\n locale?: 'zh' | 'ja' | 'en'\n}\n\n// Props\nconst props = withDefaults(defineProps<{\n data?: GraphData\n mode?: 'preview' | 'edit'\n width?: string | number\n height?: string | number\n showToolbar?: boolean\n showPropertyPanel?: boolean\n showComponentPanel?: boolean\n config?: EditorConfig\n}>(), {\n mode: 'edit',\n width: '100%',\n height: '600px',\n showToolbar: true,\n showPropertyPanel: true,\n showComponentPanel: true,\n config: () => ({\n grid: true,\n snapline: true,\n keyboard: true,\n theme: 'light',\n locale: 'zh'\n })\n})\n\n// Emits\nconst emit = defineEmits<{\n 'update:data': [data: GraphData]\n 'save': [data: GraphData]\n 'cancel': []\n 'error': [error: Error]\n}>()\n\n// 创建局部 Pinia 实例(状态隔离)\nconst localPinia = createPinia()\nprovide('pinia', localPinia)\n\n// Refs\nconst flowEditorRef = ref<InstanceType<typeof FlowEditor>>()\nconst previewContainerRef = ref<HTMLElement | null>(null)\nconst previewLf = ref<LogicFlow | null>(null)\n\n// Computed\nconst containerStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height\n}))\n\nconst containerHeight = computed(() => {\n return typeof props.height === 'number' ? `${props.height}px` : props.height\n})\n\nconst contentHeight = computed(() => {\n if (props.showToolbar) {\n const toolbarHeight = 48\n const totalHeight = typeof props.height === 'number' ? props.height : 600\n return `${totalHeight - toolbarHeight}px`\n }\n return containerHeight.value\n})\n\n// 初始化预览模式的 LogicFlow\nconst initPreviewMode = () => {\n if (!previewContainerRef.value) return\n\n // 注册自定义节点\n register({\n type: 'imageNode',\n component: ImageNode\n })\n register({\n type: 'assetSelector',\n component: AssetSelectorNode\n })\n register({\n type: 'textNode',\n component: TextNode,\n model: TextNodeModel\n })\n register({\n type: 'vectorNode',\n component: VectorNode,\n model: VectorNodeModel\n })\n\n // 创建 LogicFlow 实例(只读模式)\n previewLf.value = new LogicFlow({\n container: previewContainerRef.value,\n width: previewContainerRef.value.offsetWidth,\n height: previewContainerRef.value.offsetHeight,\n grid: false,\n keyboard: {\n enabled: false\n },\n // 禁用所有交互\n isSilentMode: true,\n stopScrollGraph: true,\n stopZoomGraph: true,\n stopMoveGraph: true,\n adjustNodePosition: false,\n plugins: [Snapshot, MiniMap, Control]\n })\n\n // 渲染数据\n if (props.data) {\n previewLf.value.render(props.data)\n }\n}\n\n// Methods\nconst handleSave = () => {\n try {\n const data = getGraphData()\n if (data) {\n emit('save', data)\n }\n } catch (error) {\n emit('error', error as Error)\n }\n}\n\nconst handleCancel = () => {\n emit('cancel')\n}\n\n// 公开方法(供父组件调用)\nconst getGraphData = (): GraphData | null => {\n if (props.mode === 'edit') {\n const lfInstance = getLogicFlowInstance()\n if (lfInstance) {\n return lfInstance.getGraphRawData() as GraphData\n }\n } else if (props.mode === 'preview' && previewLf.value) {\n return previewLf.value.getGraphRawData() as GraphData\n }\n return null\n}\n\nconst setGraphData = (data: GraphData) => {\n if (props.mode === 'edit') {\n const lfInstance = getLogicFlowInstance()\n if (lfInstance) {\n lfInstance.render(data)\n }\n } else if (props.mode === 'preview' && previewLf.value) {\n previewLf.value.render(data)\n }\n}\n\ndefineExpose({\n getGraphData,\n setGraphData\n})\n\n// 监听 data 变化\nwatch(() => props.data, (newData) => {\n if (newData) {\n setGraphData(newData)\n }\n}, { deep: true })\n\n// 监听模式变化\nwatch(() => props.mode, (newMode) => {\n if (newMode === 'preview') {\n // 切换到预览模式,初始化预览 LogicFlow\n setTimeout(() => {\n initPreviewMode()\n }, 100)\n }\n})\n\n// 初始化\nonMounted(() => {\n if (props.mode === 'preview') {\n initPreviewMode()\n } else if (props.mode === 'edit') {\n // 编辑模式由 FlowEditor 组件初始化\n // 等待 FlowEditor 初始化完成后加载数据\n setTimeout(() => {\n if (props.data) {\n setGraphData(props.data)\n }\n }, 500)\n }\n})\n\n// 清理\nonBeforeUnmount(() => {\n if (previewLf.value) {\n previewLf.value.destroy()\n previewLf.value = null\n }\n destroyLogicFlowInstance()\n})\n</script>\n\n<style scoped>\n.yys-editor-embed {\n display: flex;\n flex-direction: column;\n background: #f5f5f5;\n overflow: hidden;\n position: relative;\n}\n\n.editor-content {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n.preview-mode {\n background: transparent;\n}\n\n.preview-container {\n width: 100%;\n height: 100%;\n position: relative;\n}\n\n.preview-container .container {\n width: 100%;\n height: 100%;\n}\n\n/* 预览模式下隐藏所有控制元素 */\n.preview-mode :deep(.lf-control),\n.preview-mode :deep(.lf-mini-map),\n.preview-mode :deep(.lf-menu) {\n display: none !important;\n}\n\n/* 预览模式下禁用鼠标交互 */\n.preview-mode :deep(.lf-canvas-overlay) {\n pointer-events: none;\n}\n</style>\n"],"names":["freeGlobal","freeSelf","root","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","value","isOwn","tag","unmasked","result","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","isArray","isObject","type","asyncTag","funcTag","genTag","proxyTag","isFunction","coreJsData","maskSrcKey","uid","isMasked","func","funcProto","funcToString","toSource","reRegExpChar","reIsHostCtor","reIsNative","baseIsNative","pattern","getValue","object","key","getNative","WeakMap","MAX_SAFE_INTEGER","isLength","isArrayLike","isPrototype","Ctor","proto","argsTag","baseIsArguments","propertyIsEnumerable","isArguments","stubFalse","freeExports","freeModule","moduleExports","Buffer","nativeIsBuffer","isBuffer","arrayTag","boolTag","dateTag","errorTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","typedArrayTags","baseIsTypedArray","baseUnary","freeProcess","nodeUtil","types","nodeIsTypedArray","isTypedArray","overArg","transform","arg","nativeKeys","baseKeys","Map","DataView","Promise","Set","promiseTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ctorString","isEmpty","translateNodeData","nodeData","distance","_a","_b","label","translateEdgeData","edgeData","point","CURRENT_SCHEMA_VERSION","DefaultNodeStyle","ensureTransform","t","migrateToV1","input","now","migrateNode","node","n","props","style","meta","propWidth","propHeight","ensureGraphDocument","f","raw","nodes","edges","wrap","files","activeName","normalizedFiles","i","fallbackName","resolvedActiveName","activeFile","active","toNumber","fallback","num","clamp","min","max","normalizeRadius","radius","defaultRadius","normalizeNodeStyle","sizeFallback","incoming","width","height","shadow","textStyle","hasTextStyle","resolvedOpacity","_c","_d","_e","_f","_g","normalizePropertiesWithStyle","normalizedStyle","styleEquals","b","radiusToCss","r","buildBoxShadow","blur","offsetX","offsetY","toContainerStyle","toTextStyle","text","useNodeAppearance","options","getNode","inject","getGraph","ref","syncFromProps","target","currentWidth","currentHeight","offChange","onMounted","graph","handler","eventData","EventType","onBeforeUnmount","containerStyle","computed","currentProperty","getPropertyTypeName","getPriorityName","_createElementBlock","_normalizeClass","_createElementVNode","_unref","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","_openBlock","_hoisted_4","imageUrl","fit","_cache","currentAsset","zIndex","intervalId","currentZIndex","mergedContainerStyle","TextNodeModel","HtmlNodeModel","data","labelWidth","currentLabel","deltaX","deltaY","vectorConfig","nodeSize","patternId","svgContent","kind","path","tileWidth","tileHeight","fill","stroke","strokeWidth","shapeElement","VectorNodeModel","dialogs","reactive","openDialog","callback","closeDialog","openGenericSelector","config","closeGenericSelector","useDialogs","logicFlowInstance","setLogicFlowInstance","lf","getLogicFlowInstance","destroyLogicFlowInstance","__props","handleOpenDialog","currentData","updatedData","_createVNode","_component_el_button","imageForm","parseNumber","getImageProps","watch","next","applyImageChanges","partial","baseProps","merged","currentStyle","nextStyle","nextProps","handleImageUpload","e","file","reader","evt","handleImageUrlChange","handleSizeChange","handleFitChange","val","_component_el_input","$event","_hoisted_5","_hoisted_6","_hoisted_7","_component_el_select","_component_el_option","_hoisted_8","_hoisted_9","_component_el_input_number","_hoisted_10","_hoisted_11","form","syncFromNode","_h","getShadowFromForm","applyStyle","mergedStyleInput","applyShadow","override","applyTextStyle","_component_el_color_picker","_component_el_slider","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","onmyojiData","onmyojiSkillData","SELECTOR_PRESETS","shikigamiData","yuhunData","currentLibrary","handleOpenSelector","library","selectedItem","applyChanges","currentVector","kindOptions","_Fragment","_renderList","opt","ASSET_LIBRARIES","selectedNode","hasNodeSelected","nodeType","activeTab","panelMap","PropertyRulePanel","ImagePanel","TextPanel","AssetSelectorPanel","VectorPanel","panelComponent","supportsTypeSwitch","currentAssetLibrary","_component_el_tabs","_component_el_tab_pane","lib","_createBlock","_resolveDynamicComponent","StylePanel","useGlobalMessage","message","ElMessage","selectionEnabled","snapGridEnabled","snaplineEnabled","useCanvasSettings","MOVE_STEP","MOVE_STEP_LARGE","COPY_TRANSLATION","containerRef","selectedCount","alignmentButtons","distributeButtons","showMessage","copyBuffer","nextPasteDistance","isInputLike","event","shouldSkipShortcut","lfInstance","ensureMeta","applyMetaToModel","model","metaInput","edgeModel","normalizeNodeModel","incomingMeta","normalized","currentMeta","metaChanged","styleChanged","normalizeAllNodes","updateNodeMeta","updater","nextMeta","getSelectedNodeModelsFiltered","includeHidden","includeLocked","graphModel","getSelectedNodeModels","collectGroupNodeIds","models","ids","peerMeta","moveSelectedNodes","targets","bringToFront","nodeId","targetId","allNodes","sendToBack","currentNode","allZIndexes","z","newZIndex","bringForward","sendBackward","deleteSelectedElements","lockedNodes","edge","updateSelectedCount","deleteNode","toggleLockSelected","hasUnlocked","toggleVisibilitySelected","hasVisible","showAllNodes","changed","groupSelectedNodes","groupId","ungroupSelectedNodes","handleArrowMove","direction","step","remapGroupIds","map","seed","index","handleCopy","elements","handlePaste","added","applySelectionSelect","enabled","applySnapGrid","getSelectedRects","bounds","alignSelected","rects","minX","item","maxX","minY","maxY","centerX","centerY","targetX","targetY","distributeSelected","sorted","a","first","last","totalWidth","sum","gap","cursor","totalHeight","registerNodes","register","PropertySelectNode","ImageNode","AssetSelectorNode","TextNode","VectorNode","LogicFlow","Menu","Label","Snapshot","SelectionSelect","MiniMap","Control","bindShortcut","keys","btn","PropertyPanel","_imports_0","localStorageDebounceTimer","LOCALSTORAGE_DEBOUNCE_DELAY","getDefaultState","id","clearFilesStoreLocalStorage","loadStateFromLocalStorage","error","saveStateToLocalStorage","state","clearError","useFilesStore","defineStore","genId","fileList","activeFileId","visibleFiles","normalizeList","list","findById","findByName","name","importData","nextActiveId","idFromData","nameFromData","byName","exportData","dataStr","blob","url","link","initializeWithPrompt","savedStateRaw","defaultState","resetWorkspace","def","setupAutoSave","updateTab","addTab","newFileName","newFile","removeTab","fileId","syncLogicFlowDataToStore","getTab","fileKey","graphData","enrichedGraphData","filesStore","useI18n","refreshLogicFlowCanvas","currentFileData","loadExample","ElMessageBox","CURRENT_APP_VERSION","updateLogs","showUpdateLog","showFeedbackForm","handleExport","handlePreviewData","dataObj","copyDataToClipboard","handleImport","handleResetWorkspace","handleClearCanvas","activeId","watermark","applyWatermarkSettings","addWatermarkToImage","base64","rows","cols","angle","resolve","reject","img","canvas","ctx","rowStep","colStep","c","x","y","captureLogicFlowSnapshot","snapshotResult","prepareCapture","downloadImage","handleClose","done","_component_el_switch","_component_el_dialog","log","change","idx","_component_el_form","_component_el_form_item","componentGroups","handleComponentClick","component","handleMouseDown","group","emit","__emit","localPinia","createPinia","provide","flowEditorRef","previewContainerRef","previewLf","containerHeight","contentHeight","initPreviewMode","handleSave","getGraphData","handleCancel","setGraphData","__expose","newData","newMode","Toolbar","ComponentsPanel","FlowEditor"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]}