{"version":3,"file":"SVGElement.cjs","sources":["../../../src/elements/SVGElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\nimport { DEFAULT_ELEMENT_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { ElementType } from '../types/enums.js';\nimport { toPixels } from '../utils/unit-converter.js';\nimport { parseSVGAnimations, convertSVGAnimationToFunction } from '../utils/svg-animation-parser.js';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport paper from '@chnak/paper';\n\n/**\n * SVG 元素 - 支持导入和渲染 SVG 文件\n */\nexport class SVGElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.SVG;\n    // 重新合并配置\n    this.config = deepMerge({}, DEFAULT_ELEMENT_CONFIG, config);\n    \n    // SVG 文件路径或 SVG 字符串\n    this.src = config.src || config.path || '';\n    this.svgString = config.svgString || null;\n    \n    // 加载状态\n    this.loaded = false;\n    this.loading = false;\n    this._loadingPromise = null; // 加载 Promise，用于避免重复加载\n    this.svgItem = null;\n    this.svgContent = null;\n    this._loadedCallbackCalled = false; // 标记 loaded 回调是否已调用\n    this._svgInitialScaleApplied = false; // 标记 SVG 初始缩放是否已应用\n    \n    // 尺寸和位置\n    this.width = config.width || 100;\n    this.height = config.height || 100;\n    \n    // 缩放和适配\n    this.fit = config.fit || 'contain'; // contain, cover, fill, scale-down, none\n    this.preserveAspectRatio = config.preserveAspectRatio !== undefined ? config.preserveAspectRatio : true;\n    \n    // SVG 内部元素动画配置\n    this.elementAnimations = new Map(); // selector -> animation config\n    this.cachedElements = new Map(); // selector -> element reference\n    \n    // SVG 原生动画支持\n    this.enableSVGAnimations = config.enableSVGAnimations !== undefined ? config.enableSVGAnimations : true;\n    this.svgAnimations = []; // 解析出的 SVG 原生动画\n    \n    // 回调函数\n    this.onLoaded = config.onLoaded || config.loaded || null; // (svgElement, time) => void\n    this.onRender = config.onRender || config.render || null; // (svgElement, time) => void\n  }\n\n  /**\n   * 加载 SVG 文件或字符串\n   */\n  async load() {\n    if (this.loaded && this.svgContent) {\n      return;\n    }\n\n    // 如果正在加载，返回现有的 Promise\n    if (this.loading && this._loadingPromise) {\n      return this._loadingPromise;\n    }\n\n    this.loading = true;\n    \n    // 创建加载 Promise\n    this._loadingPromise = (async () => {\n      try {\n        // 如果提供了 SVG 字符串，直接使用\n        if (this.svgString) {\n          this.svgContent = this.svgString;\n        } else if (this.src) {\n          // 从文件加载\n          const svgPath = path.isAbsolute(this.src) ? this.src : path.resolve(this.src);\n          if (await fs.pathExists(svgPath)) {\n            this.svgContent = await fs.readFile(svgPath, 'utf-8');\n          } else {\n            throw new Error(`SVG 文件不存在: ${svgPath}`);\n          }\n        } else {\n          throw new Error('SVG 元素需要提供 src 或 svgString');\n        }\n\n        // 如果启用了 SVG 原生动画支持，解析动画（但不立即应用，等待 onLoaded 回调）\n        if (this.enableSVGAnimations && this.svgContent) {\n          try {\n            this.svgAnimations = parseSVGAnimations(this.svgContent);\n            // 注意：动画将在 _callOnLoaded 中通过 animateElement 方法自动添加\n          } catch (error) {\n            console.warn('[SVGElement] 解析 SVG 动画失败:', error);\n          }\n        }\n\n        this.loaded = true;\n        this.loading = false;\n        this._loadingPromise = null;\n      } catch (error) {\n        this.loading = false;\n        this._loadingPromise = null;\n        console.error('[SVGElement] 加载 SVG 失败:', error);\n        throw error;\n      }\n    })();\n\n    return this._loadingPromise;\n  }\n\n  /**\n   * 检查是否已初始化\n   */\n  isInitialized() {\n    return this.loaded && this.svgContent !== null;\n  }\n\n  /**\n   * 初始化 SVG（统一使用 initialize 方法）\n   */\n  async initialize() {\n    // 如果已经加载，直接返回\n    if (this.loaded && this.svgContent) {\n      return;\n    }\n    \n    // 如果正在加载，等待加载完成\n    if (this.loading && this._loadingPromise) {\n      await this._loadingPromise;\n      return;\n    }\n    \n    // 开始加载\n    await this.load();\n  }\n\n  /**\n   * 渲染 SVG 元素（使用 Paper.js）\n   * @param {paper.Layer} layer - Paper.js 图层\n   * @param {number} time - 当前时间（秒）\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  async render(layer, time, paperInstance = null) {\n    if (!this.visible) return null;\n\n    // 检查时间范围\n    if (!this.isActiveAtTime(time)) {\n      return null;\n    }\n\n    // 如果还没加载，尝试加载\n    if (!this.loaded || !this.svgContent) {\n      await this.initialize();\n    }\n\n    if (!this.svgContent) {\n      console.warn(`[SVGElement] SVG 内容为空，无法渲染。loaded: ${this.loaded}, svgString: ${!!this.svgString}, src: ${this.src}`);\n      return null;\n    }\n\n    // 获取 Paper.js 实例\n    const { paper: p, project } = this.getPaperInstance(paperInstance);\n\n    // 优先使用元素的 canvasWidth/canvasHeight，如果没有则使用 project.view.viewSize\n    const viewSize = project && project.view && project.view.viewSize \n      ? project.view.viewSize \n      : { width: 1920, height: 1080 };\n    const context = { \n      width: this.canvasWidth || viewSize.width, \n      height: this.canvasHeight || viewSize.height \n    };\n    const state = this.getStateAtTime(time, context);\n\n    // 转换位置和尺寸单位\n    // 使用 BaseElement 的通用方法转换尺寸\n    let width = state.width || this.width;\n    let height = state.height || this.height;\n    const size = this.convertSize(width, height, context);\n    width = size.width;\n    height = size.height;\n    \n    // state.x 和 state.y 已经在 getStateAtTime 中转换了单位\n    const x = state.x || 0;\n    const y = state.y || 0;\n\n    // 使用 BaseElement 的通用方法计算位置（包括 anchor 对齐）\n    const { x: rectX, y: rectY } = this.calculatePosition(state, context, {\n      elementWidth: width,\n      elementHeight: height,\n    });\n\n    try {\n      // 检查 project 是否可用\n      if (!project) {\n        console.warn('[SVGElement] project 不可用');\n        return null;\n      }\n      \n      // 检查缓存的 svgItem 是否仍然有效（属于当前的 project）\n      let svgItem = this.svgItem;\n      const isItemValid = svgItem && svgItem.project === project && svgItem.parent;\n      \n      // 如果 svgItem 无效或不存在，需要重新导入\n      if (!isItemValid) {\n        // 如果 svgItem 存在但不属于当前 project，清除它\n        if (svgItem && svgItem.project !== project) {\n          this.svgItem = null;\n          svgItem = null;\n        }\n        \n        // 尝试导入 SVG\n        if (typeof project.importSVG === 'function') {\n          try {\n            // 方法1：直接导入 SVG 字符串\n            svgItem = project.importSVG(this.svgContent, {\n              expandShapes: true,\n            });\n          } catch (importError) {\n            console.error('[SVGElement] SVG 导入失败:', importError);\n            console.error('[SVGElement] SVG 内容长度:', this.svgContent?.length);\n            return null;\n          }\n        } else {\n          // 如果 importSVG 不可用，尝试其他方法\n          console.warn('[SVGElement] paper.project.importSVG 不可用，尝试使用其他方法');\n          return null;\n        }\n\n        if (!svgItem) {\n          console.warn('[SVGElement] SVG 导入失败，svgItem 为 null');\n          return null;\n        }\n\n        // 保存引用\n        this.svgItem = svgItem;\n        \n        // 如果是第一次渲染，调用 loaded 回调\n        // 使用 _callOnLoaded 方法以确保正确传递 paperInstance\n        this._callOnLoaded(time, svgItem, paperInstance);\n        \n        // 缓存 SVG 内部元素（如果已配置动画）\n        if (this.elementAnimations.size > 0) {\n          this._cacheElements(svgItem);\n        }\n        \n        // 重置缩放标志，因为这是新的 item\n        this._svgInitialScaleApplied = false;\n      }\n\n      // 获取 SVG 的原始尺寸（使用缓存的或重新计算）\n      const bounds = svgItem.bounds;\n      const svgWidth = bounds.width || width;\n      const svgHeight = bounds.height || height;\n\n      // 根据 fit 模式计算缩放\n      let scaleX = 1;\n      let scaleY = 1;\n\n      if (this.fit === 'contain') {\n        // 保持宽高比，完整显示\n        const scale = Math.min(width / svgWidth, height / svgHeight);\n        scaleX = scaleY = scale;\n      } else if (this.fit === 'cover') {\n        // 保持宽高比，填充整个区域\n        const scale = Math.max(width / svgWidth, height / svgHeight);\n        scaleX = scaleY = scale;\n      } else if (this.fit === 'fill') {\n        // 拉伸填充\n        scaleX = width / svgWidth;\n        scaleY = height / svgHeight;\n      } else if (this.fit === 'scale-down') {\n        // 如果 SVG 比容器大，则缩小；否则保持原尺寸\n        const scale = Math.min(1, Math.min(width / svgWidth, height / svgHeight));\n        scaleX = scaleY = scale;\n      }\n      // 'none' 模式保持原始尺寸\n\n      // 应用缩放（只在第一次导入时应用，后续不再修改整体缩放）\n      if (!this._svgInitialScaleApplied) {\n        if (scaleX !== 1 || scaleY !== 1) {\n          svgItem.scale(scaleX, scaleY);\n        }\n        this._svgInitialScaleApplied = true;\n      }\n\n      // 计算位置（rectX 和 rectY 已经考虑了 anchor 对齐）\n      const scaledWidth = svgWidth * scaleX;\n      const scaledHeight = svgHeight * scaleY;\n      // rectX 和 rectY 已经是考虑了 anchor 的左上角位置，所以直接使用\n      const itemX = rectX;\n      const itemY = rectY;\n\n      svgItem.position = new p.Point(itemX + scaledWidth / 2, itemY + scaledHeight / 2);\n\n      // 应用变换（旋转、缩放等，位置已经设置了）\n      this.applyTransform(svgItem, state, {\n        applyPosition: false, // 位置已经设置了\n        paperInstance: paperInstance,\n      });\n\n      // 添加到 layer（如果还没有添加）\n      if (!svgItem.parent) {\n        layer.addChild(svgItem);\n      }\n\n      // 应用内部元素的动画（每次渲染都要应用，传递 paperInstance）\n      this._applyElementAnimations(time, paperInstance);\n      \n      // 调用 render 回调（使用 _callOnRender 方法以确保正确传递 paperInstance）\n      this._callOnRender(time, svgItem, paperInstance);\n\n      return svgItem;\n    } catch (error) {\n      console.error('[SVGElement] 渲染 SVG 失败:', error);\n      return null;\n    }\n  }\n\n  /**\n   * 查找 SVG 内部的元素\n   * @param {string} selector - 选择器，支持：\n   *   - ID: \"#elementId\"\n   *   - 类名: \".className\"\n   *   - 标签名: \"path\", \"circle\", \"rect\" 等\n   *   - 属性选择器: \"[data-name='value']\"\n   * @returns {paper.Item|null} 找到的元素，如果未找到返回 null\n   */\n  findElement(selector) {\n    if (!this.svgItem) {\n      return null;\n    }\n    \n    // 检查缓存\n    if (this.cachedElements.has(selector)) {\n      return this.cachedElements.get(selector);\n    }\n    \n    const element = this._findElementInItem(this.svgItem, selector);\n    if (element) {\n      this.cachedElements.set(selector, element);\n    }\n    return element;\n  }\n\n  /**\n   * 查找 SVG 内部的多个元素\n   * @param {string} selector - 选择器\n   * @returns {paper.Item[]} 找到的元素数组\n   */\n  findElements(selector) {\n    if (!this.svgItem) {\n      return [];\n    }\n    \n    const elements = [];\n    this._findElementsInItem(this.svgItem, selector, elements);\n    return elements;\n  }\n\n  /**\n   * 为 SVG 内部元素添加动画配置\n   * @param {string} selector - 元素选择器\n   * @param {Object|Function} animationConfig - 动画配置对象或函数\n   *   如果是对象，格式：{ x, y, rotation, scaleX, scaleY, opacity, fillColor, strokeColor, ... }\n   *   如果是函数，格式：(relativeTime, element, svgElement, info) => ({ x, y, ... })\n   *   info 包含：{ absoluteTime, relativeTime, startTime, duration, progress }\n   */\n  animateElement(selector, animationConfig) {\n    // 如果同一个选择器已有动画，合并它们\n    if (this.elementAnimations.has(selector)) {\n      const existingAnim = this.elementAnimations.get(selector);\n      // 合并动画属性\n      if (typeof animationConfig === 'function' && typeof existingAnim === 'function') {\n        const mergedAnim = (relativeTime, element, svgElement, context) => {\n          const props1 = existingAnim(relativeTime, element, svgElement, context);\n          const props2 = animationConfig(relativeTime, element, svgElement, context);\n          return { ...props1, ...props2 };\n        };\n        this.elementAnimations.set(selector, mergedAnim);\n      } else if (typeof animationConfig === 'object' && typeof existingAnim === 'object') {\n        this.elementAnimations.set(selector, { ...existingAnim, ...animationConfig });\n      } else {\n        // 如果类型不匹配，使用新的配置\n        this.elementAnimations.set(selector, animationConfig);\n      }\n    } else {\n      this.elementAnimations.set(selector, animationConfig);\n    }\n    // 清除缓存，以便重新查找元素\n    this.cachedElements.delete(selector);\n  }\n  \n  /**\n   * 重写 _callOnLoaded 方法，在调用用户回调之前自动应用 SVG 原生动画\n   * @param {number} time - 当前时间（秒）\n   * @param {paper.Item} paperItem - Paper.js 项目（如果已创建）\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  _callOnLoaded(time, paperItem = null, paperInstance = null) {\n    // 如果启用了 SVG 原生动画支持，且已解析到动画，自动应用\n    if (this.enableSVGAnimations && this.svgAnimations && this.svgAnimations.length > 0) {\n      // 将 SVG 动画转换为 animateElement 调用\n      for (const svgAnim of this.svgAnimations) {\n        const animFunction = convertSVGAnimationToFunction(svgAnim);\n        // 使用 animateElement 方法添加动画\n        this.animateElement(svgAnim.selector, animFunction);\n      }\n    }\n    \n    // 调用父类的 _callOnLoaded 方法（会调用用户的 onLoaded 回调）\n    super._callOnLoaded(time, paperItem, paperInstance);\n  }\n\n  /**\n   * 移除元素的动画配置\n   * @param {string} selector - 元素选择器\n   */\n  removeElementAnimation(selector) {\n    this.elementAnimations.delete(selector);\n    this.cachedElements.delete(selector);\n  }\n\n  /**\n   * 清除所有元素动画配置\n   */\n  clearElementAnimations() {\n    this.elementAnimations.clear();\n    this.cachedElements.clear();\n  }\n\n  /**\n   * 在 SVG 项目中递归查找元素\n   * @private\n   */\n  _findElementInItem(item, selector) {\n    if (!item) return null;\n    \n    // 检查当前元素是否匹配\n    if (this._matchesSelector(item, selector)) {\n      return item;\n    }\n    \n    // 递归检查子元素\n    if (item.children && item.children.length > 0) {\n      for (const child of item.children) {\n        const found = this._findElementInItem(child, selector);\n        if (found) return found;\n      }\n    }\n    \n    return null;\n  }\n\n  /**\n   * 检查元素是否是某个父元素的后代\n   * @private\n   */\n  _isDescendantOf(child, parent) {\n    let current = child;\n    while (current && current.parent) {\n      if (current.parent === parent) {\n        return true;\n      }\n      current = current.parent;\n    }\n    return false;\n  }\n\n  /**\n   * 在 SVG 项目中递归查找所有匹配的元素\n   * @private\n   */\n  _findElementsInItem(item, selector, results) {\n    if (!item) return;\n    \n    // 检查当前元素是否匹配\n    if (this._matchesSelector(item, selector)) {\n      results.push(item);\n    }\n    \n    // 递归检查子元素\n    if (item.children && item.children.length > 0) {\n      for (const child of item.children) {\n        this._findElementsInItem(child, selector, results);\n      }\n    }\n  }\n\n  /**\n   * 检查元素是否匹配选择器\n   * @private\n   */\n  _matchesSelector(item, selector) {\n    if (!selector || !item) return false;\n    \n    // ID 选择器: #elementId\n    if (selector.startsWith('#')) {\n      const id = selector.substring(1);\n      return item.id === id || item.data?.id === id || item.name === id;\n    }\n    \n    // 类名选择器: .className\n    if (selector.startsWith('.')) {\n      const className = selector.substring(1);\n      const classAttr = item.data?.class || item.data?.className;\n      if (typeof classAttr === 'string') {\n        return classAttr.split(/\\s+/).includes(className);\n      }\n      return false;\n    }\n    \n    // 属性选择器: [data-name='value']\n    const attrMatch = selector.match(/\\[([^\\]]+)\\]/);\n    if (attrMatch) {\n      const attrStr = attrMatch[1];\n      const [attrName, attrValue] = attrStr.split('=').map(s => s.trim().replace(/['\"]/g, ''));\n      const itemValue = item.data?.[attrName];\n      return itemValue === attrValue || itemValue === attrValue;\n    }\n    \n    // 标签名选择器: path, circle, rect 等\n    // Paper.js 中，SVG 元素的类型可以通过 className 或 name 获取\n    const itemType = item.className || item.name || '';\n    return itemType.toLowerCase() === selector.toLowerCase();\n  }\n\n  /**\n   * 缓存所有需要动画的元素\n   * @private\n   */\n  _cacheElements(svgItem) {\n    for (const selector of this.elementAnimations.keys()) {\n      if (!this.cachedElements.has(selector)) {\n        const element = this._findElementInItem(svgItem, selector);\n        if (element) {\n          this.cachedElements.set(selector, element);\n        }\n      }\n    }\n  }\n\n  /**\n   * 应用内部元素的动画\n   * @private\n   * @param {number} time - 当前时间\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  _applyElementAnimations(time, paperInstance = null) {\n    // 获取 Paper.js 实例\n    const { paper: p } = this.getPaperInstance(paperInstance);\n    if (!this.svgItem || this.elementAnimations.size === 0) {\n      return;\n    }\n    \n    // 确保元素已缓存\n    if (this.cachedElements.size < this.elementAnimations.size) {\n      this._cacheElements(this.svgItem);\n    }\n    \n    // 计算相对于元素开始时间的相对时间\n    const relativeTime = time - (this.startTime || 0);\n    const elementDuration = this.duration || 0;\n    \n    for (const [selector, animationConfig] of this.elementAnimations.entries()) {\n      let element = this.cachedElements.get(selector);\n      \n      // 如果缓存中没有，尝试重新查找\n      if (!element) {\n        element = this._findElementInItem(this.svgItem, selector);\n        if (element) {\n          this.cachedElements.set(selector, element);\n        } else {\n          // 调试：输出未找到的元素\n          if (this._debugMode) {\n            console.warn(`[SVGElement] 未找到元素: ${selector}`);\n          }\n          continue;\n        }\n      }\n      \n      // 保存元素的原始状态（第一次）\n      // 注意：只在第一次保存，之后不再更新，以确保位置基准稳定\n      if (!element._originalPosition) {\n        // 保存当前实际位置作为原始位置\n        const currentPos = element.position ? element.position.clone() : new p.Point(0, 0);\n        element._originalPosition = currentPos;\n      }\n      if (!element._originalScaling) {\n        element._originalScaling = element.scaling ? element.scaling.clone() : new p.Point(1, 1);\n      }\n      if (element._originalOpacity === undefined) {\n        element._originalOpacity = element.opacity !== undefined ? element.opacity : 1;\n      }\n      \n      // 确保元素位置始终基于原始位置（防止被其他操作改变）\n      // 如果当前没有应用 x/y 动画，保持原始位置\n      // 注意：这个检查需要在获取 props 之前进行，所以先检查动画配置类型\n      const hasPositionAnimation = typeof animationConfig === 'function' \n        ? false // 函数类型需要调用后才能知道，这里先假设没有\n        : (typeof animationConfig === 'object' && (typeof animationConfig.x === 'number' || typeof animationConfig.y === 'number'));\n      \n      if (!hasPositionAnimation && element._originalPosition && element.position) {\n        // 检查位置是否被意外改变（允许小的浮点误差）\n        const currentPos = element.position;\n        const origPos = element._originalPosition;\n        const distance = Math.sqrt(\n          Math.pow(currentPos.x - origPos.x, 2) + \n          Math.pow(currentPos.y - origPos.y, 2)\n        );\n        // 如果位置偏差超过 1 像素，可能是被意外改变了，需要恢复\n        if (distance > 1) {\n          element.position = element._originalPosition.clone();\n        }\n      }\n      \n      let props;\n      \n      // 如果动画配置是函数，调用它获取属性\n      if (typeof animationConfig === 'function') {\n        try {\n          // 传入相对时间、元素、SVGElement 实例、以及元素的开始时间和时长\n          props = animationConfig(relativeTime, element, this, {\n            absoluteTime: time,\n            relativeTime: relativeTime,\n            startTime: this.startTime || 0,\n            duration: elementDuration,\n            progress: elementDuration > 0 ? Math.max(0, Math.min(1, relativeTime / elementDuration)) : 0,\n          });\n        } catch (e) {\n          console.warn(`[SVGElement] 动画函数执行失败 (${selector}):`, e);\n          continue;\n        }\n      } else {\n        // 如果是对象，直接使用\n        props = animationConfig;\n      }\n      \n      if (!props || typeof props !== 'object') {\n        continue;\n      }\n      \n      // 应用属性（传递 paperInstance）\n      this._applyPropertiesToElement(element, props, time, paperInstance);\n      \n      // 应用属性后，如果动画没有改变位置，确保位置保持原始值\n      // 这样可以防止在设置 visible 或其他属性时位置被意外改变\n      if (typeof props.x !== 'number' && typeof props.y !== 'number') {\n        if (element._originalPosition && element.position) {\n          // 检查位置是否被意外改变（允许小的浮点误差）\n          const currentPos = element.position;\n          const origPos = element._originalPosition;\n          const distance = Math.sqrt(\n            Math.pow(currentPos.x - origPos.x, 2) + \n            Math.pow(currentPos.y - origPos.y, 2)\n          );\n          // 如果位置偏差超过 1 像素，可能是被意外改变了，需要恢复\n          if (distance > 1) {\n            element.position = element._originalPosition.clone();\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * 将属性应用到元素\n   * @private\n   * @param {paper.Item} element - Paper.js 元素\n   * @param {Object} props - 属性对象\n   * @param {number} time - 当前时间\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  _applyPropertiesToElement(element, props, time, paperInstance = null) {\n    // 获取 Paper.js 实例\n    const { paper: p } = this.getPaperInstance(paperInstance);\n    \n    // 位置\n    if (typeof props.x === 'number' || typeof props.y === 'number') {\n      // 使用原始位置作为基准\n      const originalPos = element._originalPosition || (element.position ? element.position.clone() : new p.Point(0, 0));\n      if (!element._originalPosition) {\n        element._originalPosition = originalPos.clone();\n      }\n      \n      const newX = typeof props.x === 'number' ? (originalPos.x + props.x) : originalPos.x;\n      const newY = typeof props.y === 'number' ? (originalPos.y + props.y) : originalPos.y;\n      element.position = new p.Point(newX, newY);\n    }\n    \n    // 旋转\n    if (typeof props.rotation === 'number') {\n      element.rotation = props.rotation;\n    }\n    \n    // 缩放\n    if (typeof props.scaleX === 'number' || typeof props.scaleY === 'number') {\n      const originalScale = element._originalScaling || new p.Point(1, 1);\n      const newScaleX = typeof props.scaleX === 'number' ? props.scaleX : originalScale.x;\n      const newScaleY = typeof props.scaleY === 'number' ? props.scaleY : originalScale.y;\n      // 设置绝对缩放值\n      element.scaling = new p.Point(newScaleX, newScaleY);\n    } else if (typeof props.scale === 'number') {\n      // 统一缩放\n      const originalScale = element._originalScaling || new p.Point(1, 1);\n      element.scaling = new p.Point(originalScale.x * props.scale, originalScale.y * props.scale);\n    }\n    \n    // 不透明度\n    if (typeof props.opacity === 'number') {\n      const opacity = Math.max(0, Math.min(1, props.opacity));\n      \n      // 保存当前位置，防止在设置 visible 时位置被改变\n      const savedPosition = element.position ? element.position.clone() : null;\n      \n      // 对于 Group 元素，设置 visible 和 opacity\n      // 注意：在 Paper.js 中，Group 的 visible=false 会隐藏所有子元素\n      // 但是我们需要确保子元素也被正确设置\n      if (opacity === 0) {\n        // 隐藏元素及其所有子元素\n        element.visible = false;\n        element.opacity = 0;\n        // 递归设置所有子元素\n        if (element.children && element.children.length > 0) {\n          const hideChildren = (item) => {\n            if (item.children && item.children.length > 0) {\n              for (const child of item.children) {\n                child.visible = false;\n                child.opacity = 0;\n                hideChildren(child);\n              }\n            }\n          };\n          hideChildren(element);\n        }\n      } else {\n        // 显示元素\n        element.visible = true;\n        element.opacity = opacity;\n        // 递归设置所有子元素\n        if (element.children && element.children.length > 0) {\n          const showChildren = (item) => {\n            if (item.children && item.children.length > 0) {\n              for (const child of item.children) {\n                child.visible = true;\n                child.opacity = opacity;\n                showChildren(child);\n              }\n            }\n          };\n          showChildren(element);\n        }\n      }\n      \n      // 恢复位置，防止在设置 visible 时位置被改变\n      if (savedPosition) {\n        element.position = savedPosition;\n      }\n    }\n    \n    // 填充颜色\n    if (props.fillColor !== undefined) {\n      if (props.fillColor === null) {\n        element.fillColor = null;\n      } else {\n        element.fillColor = props.fillColor;\n      }\n    }\n    \n    // 描边颜色\n    if (props.strokeColor !== undefined) {\n      if (props.strokeColor === null) {\n        element.strokeColor = null;\n      } else {\n        element.strokeColor = props.strokeColor;\n      }\n    }\n    \n    // 描边宽度\n    if (typeof props.strokeWidth === 'number') {\n      element.strokeWidth = props.strokeWidth;\n    }\n  }\n\n  /**\n   * 销毁元素\n   */\n  destroy() {\n    if (this.svgItem) {\n      this.svgItem.remove();\n      this.svgItem = null;\n    }\n    this.svgContent = null;\n    this.loaded = false;\n    this.loading = false;\n    this._loadingPromise = null;\n    this._loadedCallbackCalled = false;\n    this.elementAnimations.clear();\n    this.cachedElements.clear();\n    this.onLoaded = null;\n    this.onRender = null;\n    super.destroy();\n  }\n}\n\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_ELEMENT_CONFIG","parseSVGAnimations","convertSVGAnimationToFunction"],"mappings":"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"}