{"version":3,"file":"watermark.vue2.mjs","sources":["../../../../../../packages/components/watermark/src/watermark.vue"],"sourcesContent":["<template>\r\n  <div ref=\"containerRef\" :class=\"[bem.b()]\">\r\n    <div :class=\"[bem.e('container')]\">\r\n      <slot />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { createNamespace } from '@ll-plus/utils'\r\nimport { nextTick, onMounted, onUnmounted, ref, watch, type Ref } from 'vue'\r\nimport { watermarkProps } from './watermark'\r\n\r\ndefineOptions({ name: 'LlWatermark' })\r\n\r\nconst bem = createNamespace('watermark')\r\n\r\nconst props = defineProps(watermarkProps)\r\n\r\nconst containerRef: Ref<HTMLElement | null> = ref(null)\r\nconst watermarkRef: Ref<HTMLDivElement | null> = ref(null)\r\nconst observer: Ref<MutationObserver | null> = ref(null)\r\nconst resizeObserver: Ref<ResizeObserver | null> = ref(null)\r\n// 创建清理函数数组\r\nconst cleanupFunctions: (() => void)[] = []\r\n// 防抖定时器\r\nlet updateTimer: ReturnType<typeof setTimeout> | null = null\r\n// 是否正在更新\r\nlet isUpdating = false\r\n\r\n// 位置映射表\r\nconst positionMap = {\r\n  topLeft: '10% 0%',\r\n  top: '50% 0%',\r\n  topRight: '90% 0%',\r\n  leftTop: '0% 10%',\r\n  left: '0% 50%',\r\n  leftBottom: '0% 90%',\r\n  rightTop: '100% 10%',\r\n  right: '100% 50%',\r\n  rightBottom: '100% 90%',\r\n  bottomLeft: '10% 100%',\r\n  bottom: '50% 100%',\r\n  bottomRight: '90% 100%',\r\n  center: '50% 50%',\r\n}\r\n\r\n// 计算水印单元尺寸\r\nconst calculateWatermarkSize = (ctx: CanvasRenderingContext2D) => {\r\n  const defaultWidth = 120\r\n  const defaultHeight = 64\r\n\r\n  let width = props.width\r\n  let height = props.height\r\n  if (width > 0) {\r\n    if (height <= 0 && props.content) {\r\n      const contents = Array.isArray(props.content)\r\n        ? props.content\r\n        : [props.content]\r\n      const lineHeight = props.fontSize * 1.5\r\n      height = contents.length * lineHeight + props.fontSize\r\n    } else if (height <= 0) {\r\n      height = defaultHeight\r\n    }\r\n  } else if (height > 0) {\r\n    if (width <= 0 && props.content) {\r\n      const contents = Array.isArray(props.content)\r\n        ? props.content\r\n        : [props.content]\r\n      let maxTextWidth = 0\r\n\r\n      ctx.font = `${props.fontWeight} ${props.fontSize}px ${props.fontFamily}`\r\n\r\n      contents.forEach((text) => {\r\n        const textWidth = ctx.measureText(text).width\r\n        if (textWidth > maxTextWidth) maxTextWidth = textWidth\r\n      })\r\n\r\n      width = maxTextWidth\r\n    } else if (width <= 0) {\r\n      width = defaultWidth\r\n    }\r\n  } else {\r\n    if (props.content) {\r\n      const contents = Array.isArray(props.content)\r\n        ? props.content\r\n        : [props.content]\r\n      let maxTextWidth = 0\r\n\r\n      ctx.font = `${props.fontWeight} ${props.fontSize}px ${props.fontFamily}`\r\n\r\n      contents.forEach((text) => {\r\n        const textWidth = ctx.measureText(text).width\r\n        if (textWidth > maxTextWidth) maxTextWidth = textWidth\r\n      })\r\n\r\n      const lineHeight = props.fontSize * 1.5\r\n      height = contents.length * lineHeight + props.fontSize\r\n      width = maxTextWidth\r\n    } else {\r\n      width = defaultWidth\r\n      height = defaultHeight\r\n    }\r\n  }\r\n\r\n  return {\r\n    width,\r\n    height,\r\n  }\r\n}\r\n\r\n// 创建菱形布局的水印图案\r\nconst createDiamondPattern = async (\r\n  watermarkPattern: string,\r\n  unitWidth: number,\r\n  unitHeight: number,\r\n): Promise<string> => {\r\n  try {\r\n    const img = await loadImage(watermarkPattern)\r\n\r\n    const canvas = document.createElement('canvas')\r\n    const ctx = canvas.getContext('2d')\r\n\r\n    if (!ctx) {\r\n      return watermarkPattern\r\n    }\r\n\r\n    const patternWidth = (unitWidth + props.gap[0]) * 2\r\n    const patternHeight = (unitHeight + props.gap[1]) * 2\r\n\r\n    canvas.width = patternWidth\r\n    canvas.height = patternHeight\r\n\r\n    // 绘制左上角水印单元\r\n    ctx.drawImage(img, 0, 0, unitWidth, unitHeight)\r\n\r\n    // 绘制右下角水印单元(菱形错位布局)\r\n    const offsetX = unitWidth + props.gap[0]\r\n    const offsetY = unitHeight + props.gap[1]\r\n    ctx.drawImage(img, offsetX, offsetY, unitWidth, unitHeight)\r\n\r\n    return canvas.toDataURL('image/png')\r\n  } catch (error) {\r\n    console.error('Failed to create diamond pattern:', error)\r\n    return watermarkPattern\r\n  }\r\n}\r\n\r\n// 生成水印图案\r\nconst generateWatermarkPattern = async (): Promise<{\r\n  dataURL: string\r\n  width: number\r\n  height: number\r\n} | null> => {\r\n  const canvas = document.createElement('canvas')\r\n  const ctx = canvas.getContext('2d')\r\n\r\n  if (!ctx) return null\r\n\r\n  const { width, height } = calculateWatermarkSize(ctx)\r\n\r\n  canvas.width = width\r\n  canvas.height = height\r\n\r\n  // 保存原始状态\r\n  ctx.save()\r\n\r\n  // 应用旋转变换\r\n  ctx.translate(width / 2, height / 2)\r\n  ctx.rotate((Math.PI / 180) * props.rotate)\r\n  ctx.translate(-width / 2, -height / 2)\r\n\r\n  const getImage = async () => {\r\n    try {\r\n      const img = await loadImage(props.image)\r\n      const imgWidth = img.width * props.imageZoom\r\n      const imgHeight = img.height * props.imageZoom\r\n\r\n      const x = (width - imgWidth) / 2\r\n      const y = (height - imgHeight) / 2\r\n\r\n      ctx.globalAlpha = props.imageOpacity\r\n      ctx.drawImage(img, x, y, imgWidth, imgHeight)\r\n      ctx.globalAlpha = 1.0\r\n      console.log('getImage', { ctx })\r\n    } catch (error) {\r\n      console.error('Failed to load watermark image:', error)\r\n    }\r\n  }\r\n\r\n  const getContent = async () => {\r\n    const contents = Array.isArray(props.content)\r\n      ? props.content\r\n      : [props.content]\r\n\r\n    if (!contents.length || (contents.length === 1 && !contents[0])) {\r\n      return\r\n    }\r\n    // 重置 globalAlpha 确保文字透明度正确\r\n    ctx.globalAlpha = 1.0\r\n\r\n    ctx.font = `${props.fontWeight} ${props.fontSize}px ${props.fontFamily}`\r\n    ctx.textAlign = 'center'\r\n    ctx.textBaseline = 'middle'\r\n\r\n    const rgbaColor = hexToRgba(props.fontColor, props.textAlpha)\r\n\r\n    ctx.fillStyle = rgbaColor\r\n\r\n    const lineHeight = props.fontSize * 1.5\r\n    const startY = (height - (contents.length - 1) * lineHeight) / 2\r\n\r\n    contents.forEach((text, index) => {\r\n      if (text) {\r\n        const y = startY + index * lineHeight\r\n        ctx.fillText(text, width / 2, y)\r\n      }\r\n    })\r\n  }\r\n\r\n  // 根据 layer 控制绘制顺序\r\n  // layer=true: 图片在下层,文字在上层\r\n  // layer=false: 文字在下层,图片在上层\r\n  if (props.layer) {\r\n    // 先绘制图片(下层)\r\n    if (props.image) {\r\n      await getImage()\r\n    }\r\n    // 再绘制文字(上层)\r\n    if (props.content) {\r\n      await getContent()\r\n    }\r\n  } else {\r\n    // 先绘制文字(下层)\r\n    if (props.content) {\r\n      await getContent()\r\n    }\r\n    // 再绘制图片(上层)\r\n    if (props.image) {\r\n      await getImage()\r\n    }\r\n  }\r\n\r\n  // 恢复状态\r\n  ctx.restore()\r\n\r\n  const dataURL = canvas.toDataURL('image/png')\r\n\r\n  return {\r\n    dataURL,\r\n    width,\r\n    height,\r\n  }\r\n}\r\n\r\n// 加载图片\r\nconst loadImage = (src: string): Promise<HTMLImageElement> => {\r\n  return new Promise((resolve, reject) => {\r\n    const img = new Image()\r\n    img.crossOrigin = 'anonymous'\r\n    img.src = src\r\n\r\n    img.onload = () => resolve(img)\r\n    img.onerror = reject\r\n  })\r\n}\r\n\r\n// 十六进制颜色转RGBA\r\nconst hexToRgba = (hex: string, alpha: number): string => {\r\n  if (hex.length === 4) {\r\n    const r = parseInt(hex[1] + hex[1], 16)\r\n    const g = parseInt(hex[2] + hex[2], 16)\r\n    const b = parseInt(hex[3] + hex[3], 16)\r\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`\r\n  }\r\n\r\n  if (hex.length === 7) {\r\n    const r = parseInt(hex.slice(1, 3), 16)\r\n    const g = parseInt(hex.slice(3, 5), 16)\r\n    const b = parseInt(hex.slice(5, 7), 16)\r\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`\r\n  }\r\n\r\n  return hex\r\n}\r\n\r\n// 设置防篡改监控\r\nconst setupMutationObserver = () => {\r\n  if (!containerRef.value || !watermarkRef.value) return\r\n\r\n  let originalBackgroundImage = ''\r\n  let originalBackgroundRepeat = ''\r\n  let originalBackgroundSize = ''\r\n  let originalBackgroundPosition = ''\r\n\r\n  const originalStyles = {\r\n    position: watermarkRef.value.style.position,\r\n    top: watermarkRef.value.style.top,\r\n    left: watermarkRef.value.style.left,\r\n    width: watermarkRef.value.style.width,\r\n    height: watermarkRef.value.style.height,\r\n    pointerEvents: watermarkRef.value.style.pointerEvents,\r\n    zIndex: watermarkRef.value.style.zIndex,\r\n    overflow: watermarkRef.value.style.overflow,\r\n    opacity: watermarkRef.value.style.opacity,\r\n    visibility: watermarkRef.value.style.visibility,\r\n    display: watermarkRef.value.style.display,\r\n  }\r\n\r\n  observer.value = new MutationObserver((mutations) => {\r\n    for (const mutation of mutations) {\r\n      if (mutation.removedNodes.length > 0) {\r\n        const removedNodes = Array.from(mutation.removedNodes)\r\n        for (const node of removedNodes) {\r\n          if (node === watermarkRef.value) {\r\n            destroyWatermark(true) // 被篡改时立即销毁\r\n            createWatermark()\r\n            return\r\n          }\r\n        }\r\n      }\r\n\r\n      if (\r\n        mutation.type === 'attributes' &&\r\n        mutation.target === watermarkRef.value\r\n      ) {\r\n        if (watermarkRef.value) {\r\n          Object.entries(originalStyles).forEach(([key, value]) => {\r\n            if (watermarkRef.value) watermarkRef.value.style[key] = value\r\n          })\r\n\r\n          watermarkRef.value.style.backgroundImage = originalBackgroundImage\r\n          watermarkRef.value.style.backgroundRepeat = originalBackgroundRepeat\r\n          watermarkRef.value.style.backgroundSize = originalBackgroundSize\r\n          watermarkRef.value.style.backgroundPosition =\r\n            originalBackgroundPosition\r\n        }\r\n      }\r\n    }\r\n  })\r\n\r\n  nextTick(() => {\r\n    if (watermarkRef.value) {\r\n      originalBackgroundImage = watermarkRef.value.style.backgroundImage\r\n      originalBackgroundRepeat = watermarkRef.value.style.backgroundRepeat\r\n      originalBackgroundSize = watermarkRef.value.style.backgroundSize\r\n      originalBackgroundPosition = watermarkRef.value.style.backgroundPosition\r\n    }\r\n  })\r\n\r\n  observer.value.observe(watermarkRef.value, {\r\n    attributes: true,\r\n    attributeFilter: ['style', 'class'],\r\n  })\r\n\r\n  observer.value.observe(containerRef.value, {\r\n    childList: true,\r\n    subtree: true,\r\n  })\r\n\r\n  const healthCheckInterval = setInterval(() => {\r\n    if (!containerRef.value || !watermarkRef.value) return\r\n\r\n    if (!containerRef.value.contains(watermarkRef.value)) {\r\n      destroyWatermark(true) // 被移除时立即销毁\r\n      createWatermark()\r\n      return\r\n    }\r\n\r\n    const criticalStyles = [\r\n      'position',\r\n      'top',\r\n      'left',\r\n      'width',\r\n      'height',\r\n      'pointerEvents',\r\n      'zIndex',\r\n      'overflow',\r\n      'backgroundImage',\r\n      'backgroundRepeat',\r\n      'backgroundSize',\r\n      'backgroundPosition',\r\n      'opacity',\r\n      'visibility',\r\n      'display',\r\n    ]\r\n\r\n    const computedStyle = window.getComputedStyle(watermarkRef.value)\r\n    const isTampered = criticalStyles.some((style) => {\r\n      const currentValue = computedStyle.getPropertyValue(style)\r\n      const originalValue = originalStyles[style]\r\n      return currentValue !== originalValue\r\n    })\r\n\r\n    if (isTampered) {\r\n      Object.entries(originalStyles).forEach(([key, value]) => {\r\n        if (watermarkRef.value) watermarkRef.value.style[key] = value\r\n      })\r\n\r\n      watermarkRef.value.style.backgroundImage = originalBackgroundImage\r\n      watermarkRef.value.style.backgroundRepeat = originalBackgroundRepeat\r\n      watermarkRef.value.style.backgroundSize = originalBackgroundSize\r\n      watermarkRef.value.style.backgroundPosition = originalBackgroundPosition\r\n    }\r\n  }, 1000)\r\n\r\n  cleanupFunctions.push(() => {\r\n    clearInterval(healthCheckInterval)\r\n    if (observer.value) {\r\n      observer.value.disconnect()\r\n      observer.value = null\r\n    }\r\n  })\r\n}\r\n\r\n// 设置响应式调整\r\nconst setupResponsive = () => {\r\n  if (!containerRef.value || !props.responsive) return\r\n\r\n  resizeObserver.value = new ResizeObserver(() => {\r\n    createWatermark()\r\n  })\r\n\r\n  resizeObserver.value.observe(containerRef.value)\r\n}\r\n\r\n// 销毁水印（优化版：不立即移除，而是淡出）\r\nconst destroyWatermark = (immediate = false) => {\r\n  if (watermarkRef.value && !immediate) {\r\n    // 淡出动画\r\n    watermarkRef.value.style.opacity = '0'\r\n\r\n    setTimeout(() => {\r\n      removeWatermarkDOM()\r\n    }, 200)\r\n  } else {\r\n    removeWatermarkDOM()\r\n  }\r\n}\r\n\r\n// 实际移除 DOM 的函数\r\nconst removeWatermarkDOM = () => {\r\n  if (containerRef.value) {\r\n    const watermarks = containerRef.value.querySelectorAll(\r\n      `.${bem.e('content')}`,\r\n    )\r\n    watermarks.forEach((watermark) => {\r\n      if (watermark.parentNode === containerRef.value) {\r\n        containerRef.value?.removeChild(watermark)\r\n      }\r\n    })\r\n  }\r\n\r\n  watermarkRef.value = null\r\n\r\n  if (observer.value) {\r\n    observer.value.disconnect()\r\n    observer.value = null\r\n  }\r\n\r\n  if (resizeObserver.value) {\r\n    resizeObserver.value.disconnect()\r\n    resizeObserver.value = null\r\n  }\r\n\r\n  cleanupFunctions.forEach((cleanup) => cleanup())\r\n  cleanupFunctions.length = 0\r\n}\r\n\r\n// 创建水印元素（优化版：瞬间切换，无残影）\r\nconst createWatermark = async () => {\r\n  if (!containerRef.value || isUpdating) return\r\n\r\n  isUpdating = true\r\n\r\n  try {\r\n    // 创建新水印元素\r\n    const watermarkDiv = document.createElement('div')\r\n    watermarkDiv.className = bem.e('content')\r\n\r\n    watermarkDiv.style.position = 'absolute'\r\n    watermarkDiv.style.top = '0'\r\n    watermarkDiv.style.left = '0'\r\n    watermarkDiv.style.width = '100%'\r\n    watermarkDiv.style.height = '100%'\r\n    watermarkDiv.style.pointerEvents = 'none'\r\n    watermarkDiv.style.zIndex = props.zIndex.toString()\r\n    watermarkDiv.style.opacity = '1'\r\n\r\n    // 先生成水印图案（包含异步图片加载）\r\n    const watermarkPattern = await generateWatermarkPattern()\r\n\r\n    if (watermarkPattern) {\r\n      if (props.single) {\r\n        watermarkDiv.style.backgroundImage = `url(${watermarkPattern.dataURL})`\r\n        watermarkDiv.style.backgroundRepeat = 'no-repeat'\r\n\r\n        const scaledWidth = watermarkPattern.width * props.singleScale\r\n        const scaledHeight = watermarkPattern.height * props.singleScale\r\n\r\n        watermarkDiv.style.backgroundSize = `${scaledWidth}px ${scaledHeight}px`\r\n        watermarkDiv.style.backgroundPosition = positionMap[props.position]\r\n      } else {\r\n        const diamondPattern = await createDiamondPattern(\r\n          watermarkPattern.dataURL,\r\n          watermarkPattern.width,\r\n          watermarkPattern.height,\r\n        )\r\n        watermarkDiv.style.backgroundImage = `url(${diamondPattern})`\r\n        watermarkDiv.style.backgroundRepeat = 'repeat'\r\n        watermarkDiv.style.backgroundPosition = `${props.offset[0]}px ${props.offset[1]}px`\r\n      }\r\n    }\r\n\r\n    // 新水印准备好后，再移除旧水印（关键：避免闪动）\r\n    const oldWatermark = watermarkRef.value\r\n    if (oldWatermark && oldWatermark.parentNode) {\r\n      oldWatermark.parentNode.removeChild(oldWatermark)\r\n    }\r\n\r\n    // 添加新水印\r\n    if (containerRef.value) {\r\n      containerRef.value.appendChild(watermarkDiv)\r\n    }\r\n\r\n    watermarkRef.value = watermarkDiv\r\n\r\n    // 设置监控\r\n    if (props.monitor) {\r\n      setupMutationObserver()\r\n    }\r\n\r\n    isUpdating = false\r\n  } catch (error) {\r\n    console.error('Failed to create watermark:', error)\r\n    isUpdating = false\r\n  }\r\n}\r\n\r\n// 防抖更新水印\r\nconst debouncedUpdate = () => {\r\n  // 清除之前的定时器\r\n  if (updateTimer) {\r\n    clearTimeout(updateTimer)\r\n  }\r\n\r\n  // 设置新的定时器\r\n  updateTimer = setTimeout(() => {\r\n    nextTick(() => {\r\n      createWatermark()\r\n    })\r\n  }, 150) // 100ms 防抖延迟\r\n}\r\n\r\n// 监听属性变化\r\nwatch(\r\n  () => [\r\n    props.content,\r\n    props.image,\r\n    props.width,\r\n    props.height,\r\n    props.rotate,\r\n    props.zIndex,\r\n    props.gap,\r\n    props.offset,\r\n    props.fontSize,\r\n    props.fontColor,\r\n    props.textAlpha,\r\n    props.fontFamily,\r\n    props.fontWeight,\r\n    props.imageOpacity,\r\n    props.imageZoom,\r\n    props.single,\r\n    props.position,\r\n    props.singleScale,\r\n    props.layer,\r\n  ],\r\n  () => {\r\n    debouncedUpdate()\r\n  },\r\n  {\r\n    deep: true,\r\n  },\r\n)\r\n\r\nonMounted(() => {\r\n  nextTick(createWatermark)\r\n  setupResponsive()\r\n})\r\n\r\nonUnmounted(() => {\r\n  // 清理防抖定时器\r\n  if (updateTimer) {\r\n    clearTimeout(updateTimer)\r\n  }\r\n  destroyWatermark(true) // 卸载时立即销毁\r\n})\r\ndefineExpose({ containerRef })\r\n</script>\r\n"],"names":["_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot"],"mappings":"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"}