{"version":3,"file":"captcha.mjs","sources":["../../../components/captcha/captcha.tsx"],"sourcesContent":["import { Button } from '@/components/button'\r\nimport { Icon } from '@/components/icon'\r\nimport { Spin } from '@/components/spin'\r\nimport { Tooltip } from '@/components/tooltip'\r\nimport { useFieldStore } from '@/components/form'\r\nimport { Renderer } from '@/components/renderer'\r\n\r\nimport {\r\n  Transition,\r\n  TransitionGroup,\r\n  computed,\r\n  defineComponent,\r\n  nextTick,\r\n  onMounted,\r\n  reactive,\r\n  ref,\r\n  renderSlot,\r\n  shallowRef,\r\n  toRef,\r\n  watch,\r\n} from 'vue'\r\n\r\nimport CaptchaSlider from './captcha-slider.vue'\r\nimport {\r\n  createIconProp,\r\n  createSizeProp,\r\n  emitEvent,\r\n  useIcons,\r\n  useLocale,\r\n  useNameHelper,\r\n  useProps,\r\n} from '@vexip-ui/config'\r\nimport { createSlotRender, useSetTimeout } from '@vexip-ui/hooks'\r\nimport {\r\n  ensureArray,\r\n  isClient,\r\n  isNull,\r\n  nextFrameOnce,\r\n  random,\r\n  randomHardColor,\r\n} from '@vexip-ui/utils'\r\nimport { captchaProps } from './props'\r\nimport { heartPath, puzzlePath, shieldPath, squarePath } from './hollow-paths'\r\n\r\nimport type { CaptchaSliderExposed } from '@/components/captcha-slider'\r\nimport type { SuccessEvent } from './symbol'\r\n\r\nexport default defineComponent({\r\n  name: 'Captcha',\r\n  props: captchaProps,\r\n  emits: ['update:visible'],\r\n  setup(_props, { slots, expose }) {\r\n    const { idFor, labelId, disabled, loading, validateField, setFieldValue } = useFieldStore<\r\n      number | number[]\r\n    >(focus)\r\n\r\n    const props = useProps('captcha', _props, {\r\n      type: 'slide',\r\n      slideTarget: {\r\n        default: null,\r\n        validator: value => {\r\n          if (isNull(value)) return true\r\n\r\n          if (Array.isArray(value)) {\r\n            return value[0] >= 0 && value[0] <= 100 && value[1] >= 0 && value[1] <= 100\r\n          } else {\r\n            return value >= 0 && value <= 100\r\n          }\r\n        },\r\n      },\r\n      title: null,\r\n      tip: null,\r\n      successTip: null,\r\n      failTip: null,\r\n      image: null,\r\n      tolerance: {\r\n        default: 1,\r\n        validator: value => value >= 0,\r\n      },\r\n      canvasSize: () => [1000, 600],\r\n      refreshIcon: createIconProp(),\r\n      disabled: () => disabled.value,\r\n      loading: () => loading.value,\r\n      loadingIcon: createIconProp(),\r\n      loadingEffect: null,\r\n      onBeforeTest: {\r\n        default: null,\r\n        isFunc: true,\r\n      },\r\n      texts: {\r\n        default: () => [],\r\n        validator: value => !value.find(text => text.length > 1),\r\n      },\r\n      failLimit: 0,\r\n      remotePoint: false,\r\n      useTrigger: false,\r\n      triggerSize: createSizeProp(),\r\n      triggerText: null,\r\n      transfer: false,\r\n      hideDelay: {\r\n        default: 3000,\r\n        validator: value => value >= 0,\r\n      },\r\n      hollowShape: {\r\n        default: squarePath,\r\n        isFunc: true,\r\n      },\r\n      slots: () => ({}),\r\n    })\r\n\r\n    const nh = useNameHelper('captcha')\r\n    const locale = useLocale('captcha')\r\n    const icons = useIcons()\r\n\r\n    const { timer } = useSetTimeout()\r\n\r\n    const currentTarget = ref(parseTarget(props.slideTarget))\r\n    const dragging = ref(false)\r\n    const pointers = reactive<number[][]>([])\r\n    const testLoading = ref(false)\r\n    const success = ref(false)\r\n    const failed = ref(false)\r\n    const failedCount = ref(0)\r\n    const visible = ref(false)\r\n\r\n    const wrapper = ref<HTMLElement>()\r\n    const canvas = ref<HTMLCanvasElement>()\r\n    const subCanvas = ref<HTMLCanvasElement>()\r\n    const slider = ref<CaptchaSliderExposed>()\r\n\r\n    const track = computed(() => slider.value?.track)\r\n\r\n    const isSuccess = computed(() => !!slider.value?.isSuccess || success.value)\r\n    const currentLeft = computed(() => slider.value?.currentLeft || 0)\r\n    const resetting = computed(() => slider.value?.resetting)\r\n\r\n    const usedTarget = computed(() => currentTarget.value[0])\r\n\r\n    const imageLoading = ref(false)\r\n    const imagePromise = shallowRef(Promise.resolve())\r\n\r\n    const pointerTargets: number[][] = []\r\n\r\n    const fontRate = 0.108\r\n\r\n    let imageLoaded = false\r\n    let image: HTMLImageElement | undefined\r\n    let memoryCanvas: HTMLCanvasElement | undefined\r\n\r\n    const isLoading = computed(() => props.loading || imageLoading.value || testLoading.value)\r\n    const failLocked = computed(() => props.failLimit > 0 && failedCount.value >= props.failLimit)\r\n    const className = computed(() => {\r\n      return [\r\n        nh.b(),\r\n        nh.bs('vars'),\r\n        nh.bm(props.type),\r\n        {\r\n          [nh.bm('success')]: isSuccess.value,\r\n          [nh.bm('fail')]: !isSuccess.value && failed.value,\r\n          [nh.bm('dragging')]: dragging.value,\r\n          [nh.bm('disabled')]: props.disabled,\r\n          [nh.bm('loading')]: isLoading.value,\r\n          [nh.bm('fail-locked')]: failLocked.value,\r\n        },\r\n      ]\r\n    })\r\n    const subCanvasStyle = computed(() => {\r\n      return {\r\n        left: `${currentLeft.value}%`,\r\n        [nh.cv('trigger-transition')]: resetting.value ? 'left 250ms ease' : undefined,\r\n      }\r\n    })\r\n    const canvasSize = computed(() => {\r\n      return [props.canvasSize[0] || 1000, props.canvasSize[1] || 600]\r\n    })\r\n    const actionLocked = computed(() => props.disabled || isSuccess.value || isLoading.value)\r\n\r\n    watch(\r\n      () => props.slideTarget,\r\n      value => {\r\n        currentTarget.value = parseTarget(value)\r\n      },\r\n    )\r\n    watch([() => props.image, wrapper], async () => {\r\n      image = undefined\r\n      await (imagePromise.value = loadImage())\r\n      drawImageNextFrame()\r\n    })\r\n    watch(\r\n      [\r\n        currentTarget,\r\n        () => props.canvasSize[0],\r\n        () => props.canvasSize[1],\r\n        () => props.hollowShape,\r\n      ],\r\n      drawImageNextFrame,\r\n    )\r\n    watch(\r\n      [() => props.type, () => props.remotePoint],\r\n      () => {\r\n        if (\r\n          props.type !== 'slide' &&\r\n          props.remotePoint &&\r\n          typeof props.onBeforeTest !== 'function'\r\n        ) {\r\n          console.warn(\r\n            \"[vexip-ui:Captcha] You should specify 'on-before-test' prop to valid the captcha \" +\r\n              \"if you are using the 'point' type in remote\",\r\n          )\r\n        }\r\n      },\r\n      { immediate: true },\r\n    )\r\n    watch(\r\n      [() => props.type, () => props.texts, () => props.texts.length, () => props.remotePoint],\r\n      () => {\r\n        if (props.type === 'point' && props.texts.length && !props.remotePoint && image) {\r\n          drawImageNextFrame()\r\n        }\r\n      },\r\n    )\r\n    watch(visible, async value => {\r\n      if (value) {\r\n        await (imagePromise.value = loadImage())\r\n        drawImageNextFrame()\r\n      }\r\n    })\r\n    watch(isSuccess, value => {\r\n      if (value && props.useTrigger && visible.value) {\r\n        clearTimeout(timer.hideTrigger)\r\n\r\n        timer.hideTrigger = setTimeout(() => {\r\n          visible.value = false\r\n        }, props.hideDelay)\r\n      }\r\n    })\r\n\r\n    onMounted(async () => {\r\n      await (imagePromise.value = loadImage())\r\n      drawImage()\r\n    })\r\n\r\n    expose({\r\n      dragging,\r\n      resetting,\r\n      isSuccess,\r\n      imageLoading,\r\n      imagePromise,\r\n      wrapper,\r\n      canvas,\r\n      subCanvas,\r\n      slider,\r\n      reset,\r\n    })\r\n\r\n    // 避免多次触发时发生竞态问题\r\n    let loadFlag: string\r\n\r\n    async function loadImage() {\r\n      if (image) return\r\n\r\n      imageLoading.value = true\r\n      loadFlag = `${Date.now()}${Math.round(Math.random() * 10e6)}`\r\n\r\n      const flag = loadFlag\r\n      const src = typeof props.image === 'function' ? await props.image() : props.image\r\n\r\n      await new Promise<void>(resolve => {\r\n        if (!isClient || flag !== loadFlag || !src) {\r\n          resolve()\r\n          return\r\n        }\r\n\r\n        image = new Image()\r\n        imageLoaded = false\r\n        image.src = src\r\n\r\n        if (src.trim().startsWith('data:image')) {\r\n          imageLoaded = true\r\n          resolve()\r\n        } else {\r\n          image.onload = () => {\r\n            imageLoaded = true\r\n            resolve()\r\n          }\r\n        }\r\n      }).finally(() => {\r\n        imageLoading.value = false\r\n      })\r\n    }\r\n\r\n    function drawImageWithTexts() {\r\n      const canvasEl = canvas.value\r\n      const ctx = canvasEl?.getContext?.('2d')\r\n\r\n      if (!image || !canvasEl || !ctx) return\r\n\r\n      const { width, height } = canvasEl\r\n\r\n      ctx.drawImage(image, 0, 0, width, height)\r\n\r\n      if (!props.texts.length || props.remotePoint) return\r\n\r\n      pointerTargets.length = 0\r\n\r\n      const fontSize = Math.max(width, height) * fontRate\r\n\r\n      ctx.textBaseline = 'middle'\r\n      ctx.textAlign = 'center'\r\n      ctx.font = `bold ${fontSize}px sans-serif`\r\n      ctx.lineWidth = 2\r\n      ctx.strokeStyle = '#fff'\r\n\r\n      const drawText = (\r\n        text: string,\r\n        x: number,\r\n        y: number,\r\n        radian = 0,\r\n        color = randomHardColor(),\r\n      ) => {\r\n        ctx.save()\r\n        ctx.translate(x, y)\r\n        radian && ctx.rotate(radian * Math.PI)\r\n        ctx.fillStyle = color\r\n        ctx.fillText(text, 0, 0)\r\n        ctx.strokeText(text, 0, 0)\r\n        ctx.restore()\r\n      }\r\n\r\n      const metrics = ctx.measureText(props.texts[0])\r\n      const xLimit = Math.max(fontSize, metrics.width) * 1.2\r\n      const yLimit =\r\n        Math.max(fontSize, metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent) * 1.2\r\n\r\n      let prevX = -2 * fontSize\r\n      let prevY = -2 * fontSize\r\n\r\n      for (const text of props.texts) {\r\n        let x = prevX\r\n        let y = prevY\r\n\r\n        while (Math.abs(x - prevX) < xLimit && Math.abs(y - prevY) < yLimit) {\r\n          x = width * 0.1 + Math.random() * width * 0.8\r\n          y = height * 0.1 + Math.random() * height * 0.8\r\n        }\r\n\r\n        prevX = x\r\n        prevY = y\r\n\r\n        pointerTargets.push([(x / width) * 100, (y / height) * 100])\r\n        drawText(text, x, y, Math.random() * 2)\r\n      }\r\n    }\r\n\r\n    function getHollowProcess() {\r\n      if (typeof props.hollowShape === 'function') return props.hollowShape\r\n\r\n      switch (props.hollowShape) {\r\n        case 'puzzle':\r\n          return puzzlePath\r\n        case 'shield':\r\n          return shieldPath\r\n        case 'heart':\r\n          return heartPath\r\n        default:\r\n          return squarePath\r\n      }\r\n    }\r\n\r\n    function drawImage() {\r\n      const canvasEl = canvas.value\r\n      const ctx = canvasEl?.getContext?.('2d')\r\n      const subCanvasEl = subCanvas.value\r\n      const subCtx = subCanvasEl?.getContext?.('2d')\r\n\r\n      if (!image || !imageLoaded || !canvasEl || !ctx || !props.image) return\r\n\r\n      if (props.type === 'point') {\r\n        drawImageWithTexts()\r\n        return\r\n      }\r\n\r\n      if (!subCanvasEl || !subCtx || !track.value) return\r\n\r\n      if (!memoryCanvas) {\r\n        if (!isClient) return\r\n\r\n        memoryCanvas = document.createElement('canvas')\r\n      }\r\n\r\n      memoryCanvas.width = canvasEl.width\r\n      memoryCanvas.height = canvasEl.height\r\n\r\n      const pathCtx = memoryCanvas.getContext('2d')\r\n\r\n      if (!pathCtx) return\r\n\r\n      ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)\r\n      subCtx.clearRect(0, 0, subCanvasEl.width, subCanvasEl.height)\r\n      pathCtx.clearRect(0, 0, memoryCanvas.width, memoryCanvas.height)\r\n\r\n      const canvasRect = canvasEl.getBoundingClientRect()\r\n      const trackRect = track.value.getBoundingClientRect()\r\n      // 滑动时以轨道为准，所以需要补正 canvas 宽度和 track 宽度的差值\r\n      const widthFix = ((canvasRect.width - trackRect.width) / canvasRect.width) * canvasEl.width\r\n\r\n      const targetX = widthFix / 2 + currentTarget.value[0] * (canvasEl.width - widthFix) * 0.01\r\n      const targetY = currentTarget.value[1] * canvasEl.height * 0.01\r\n\r\n      const hollowProcess = getHollowProcess()\r\n\r\n      pathCtx.beginPath()\r\n      pathCtx.strokeStyle = 'rgba(255, 255, 255, 0.5)'\r\n      pathCtx.lineWidth = 4\r\n\r\n      const [clipX, clipY, clipWidth, clipHeight] = hollowProcess({\r\n        ctx: pathCtx,\r\n        x: targetX,\r\n        y: targetY,\r\n        width: props.canvasSize[0],\r\n        height: props.canvasSize[1],\r\n      })\r\n\r\n      pathCtx.stroke()\r\n      pathCtx.clip()\r\n      pathCtx.drawImage(image, 0, 0, canvasEl.width, canvasEl.height)\r\n\r\n      // 中心点偏移修正\r\n      const xLeftWidth = targetX - clipX\r\n      const translateFix = ((clipWidth * 0.5 - xLeftWidth) / clipWidth) * 100\r\n\r\n      subCanvasEl.style.transform = `translate3d(${translateFix - 50}%, 0, 0)`\r\n      subCanvasEl.width = clipWidth\r\n\r\n      subCtx.drawImage(\r\n        memoryCanvas,\r\n        clipX,\r\n        clipY,\r\n        clipWidth,\r\n        clipHeight,\r\n        0,\r\n        clipY,\r\n        clipWidth,\r\n        clipHeight,\r\n      )\r\n\r\n      ctx.save()\r\n      ctx.beginPath()\r\n      ctx.fillStyle = 'rgba(255, 255, 255, 0.75)'\r\n      ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)'\r\n      ctx.lineWidth = 10\r\n\r\n      hollowProcess({\r\n        ctx,\r\n        x: targetX,\r\n        y: targetY,\r\n        width: props.canvasSize[0],\r\n        height: props.canvasSize[1],\r\n      })\r\n\r\n      ctx.stroke()\r\n      ctx.fill()\r\n      ctx.restore()\r\n      ctx.globalCompositeOperation = 'destination-over'\r\n      ctx.drawImage(image, 0, 0, canvasEl.width, canvasEl.height)\r\n    }\r\n\r\n    function drawImageNextFrame() {\r\n      nextFrameOnce(drawImage)\r\n    }\r\n\r\n    async function reset(newImage?: string | (() => Promise<string>)) {\r\n      if (newImage) {\r\n        image = undefined\r\n        await (imagePromise.value = loadImage())\r\n        drawImage()\r\n      }\r\n\r\n      success.value = false\r\n      failed.value = false\r\n      failedCount.value = 0\r\n      currentTarget.value = parseTarget()\r\n      pointers.length = 0\r\n\r\n      slider.value?.reset()\r\n      props.type === 'point' && drawImageWithTexts()\r\n    }\r\n\r\n    function parseTarget(target = props.slideTarget) {\r\n      if (isNull(target)) return [random(75, 25), random(75, 25)]\r\n\r\n      const [targetX = random(75, 25), targetY = random(75, 25)] = ensureArray(target)\r\n\r\n      return [targetX, targetY]\r\n    }\r\n\r\n    function focus(options?: FocusOptions) {\r\n      slider.value?.focus(options)\r\n    }\r\n\r\n    function handleDragStart(percent: number) {\r\n      dragging.value = true\r\n      emitEvent(props.onDragStart, percent)\r\n    }\r\n\r\n    function handleDrag(percent: number) {\r\n      emitEvent(props.onDrag, percent)\r\n    }\r\n\r\n    function handleDragEnd(percent: number) {\r\n      dragging.value = false\r\n      emitEvent(props.onDragEnd, percent)\r\n    }\r\n\r\n    function handleSlideSuccess(percent: number) {\r\n      success.value = true\r\n      failed.value = false\r\n\r\n      emitEvent(props.onSuccess as SuccessEvent, percent)\r\n      setFieldValue(percent)\r\n      validateField()\r\n    }\r\n\r\n    function handleSlideFail() {\r\n      failed.value = true\r\n      ++failedCount.value\r\n\r\n      emitEvent(props.onFail)\r\n    }\r\n\r\n    function handleRefresh() {\r\n      !actionLocked.value && emitEvent(props.onRefresh)\r\n    }\r\n\r\n    function stopPropagation(event: Event) {\r\n      event.stopPropagation()\r\n    }\r\n\r\n    async function verifyPointers() {\r\n      if (isLoading.value) return\r\n\r\n      pointers.length = props.texts.length\r\n\r\n      let result = props.remotePoint\r\n      let customResult: unknown\r\n\r\n      if (!props.remotePoint && canvas.value) {\r\n        const { width, height } = canvas.value\r\n        const fontSize = Math.max(width, height) * fontRate\r\n        const xTolerance = (fontSize / width) * 50 + props.tolerance\r\n        const yTolerance = (fontSize / height) * 50 + props.tolerance\r\n\r\n        result = true\r\n\r\n        for (let i = 0, len = pointers.length; i < len; ++i) {\r\n          const [x, y] = pointers[i]\r\n          const [targetX, targetY] = pointerTargets[i]\r\n\r\n          if (Math.abs(x - targetX) > xTolerance || Math.abs(y - targetY) > yTolerance) {\r\n            result = false\r\n            break\r\n          }\r\n        }\r\n      }\r\n\r\n      if (typeof props.onBeforeTest === 'function') {\r\n        nextTick(() => {\r\n          testLoading.value = true\r\n        })\r\n        customResult = await (props.onBeforeTest as any)(pointers.flat())\r\n        nextTick(() => {\r\n          testLoading.value = false\r\n        })\r\n      }\r\n\r\n      if (!result || customResult === false) {\r\n        success.value = false\r\n        pointers.length = 0\r\n        failed.value = true\r\n        ++failedCount.value\r\n\r\n        emitEvent(props.onFail)\r\n      } else {\r\n        success.value = true\r\n        failed.value = false\r\n\r\n        emitEvent(props.onSuccess as SuccessEvent, pointers.flat())\r\n      }\r\n    }\r\n\r\n    function handleImageClick(event: MouseEvent) {\r\n      if (props.type !== 'point' || actionLocked.value || !canvas.value) return\r\n\r\n      const { clientWidth: canvasWidth, clientHeight: canvasHeight } = canvas.value\r\n      const { offsetX, offsetY } = event\r\n\r\n      pointers.push([(offsetX / canvasWidth) * 100, (offsetY / canvasHeight) * 100])\r\n\r\n      if (pointers.length >= props.texts.length) {\r\n        nextTick(verifyPointers)\r\n      }\r\n    }\r\n\r\n    function cancelPointer(index: number, event: Event) {\r\n      event.stopPropagation()\r\n\r\n      if (actionLocked.value || index !== pointers.length - 1) return\r\n\r\n      pointers.pop()\r\n    }\r\n\r\n    function handleTrigger() {\r\n      if (!isSuccess.value) {\r\n        visible.value = true\r\n      }\r\n    }\r\n\r\n    function renderImage() {\r\n      return (\r\n        <div\r\n          class={[nh.be('image'), actionLocked.value && nh.bem('image', 'locked')]}\r\n          onClick={handleImageClick}\r\n        >\r\n          {props.image && (\r\n            <div class={nh.be('image-inner')}>\r\n              <canvas\r\n                ref={canvas}\r\n                class={nh.be('canvas')}\r\n                width={canvasSize.value[0]}\r\n                height={canvasSize.value[1]}\r\n              ></canvas>\r\n              {props.type === 'slide' && (\r\n                <div class={nh.be('sub-image')}>\r\n                  <canvas\r\n                    ref={subCanvas}\r\n                    class={nh.be('sub-canvas')}\r\n                    height={canvasSize.value[1]}\r\n                    style={subCanvasStyle.value}\r\n                  ></canvas>\r\n                </div>\r\n              )}\r\n            </div>\r\n          )}\r\n          {props.type === 'point' && (\r\n            <TransitionGroup name={nh.ns('fade')} appear>\r\n              {pointers.map(([x, y], index) => (\r\n                <span\r\n                  key={index}\r\n                  class={nh.be('pointer')}\r\n                  style={{ top: `${y}%`, left: `${x}%` }}\r\n                  onClick={cancelPointer.bind(null, index)}\r\n                >\r\n                  {index + 1}\r\n                </span>\r\n              ))}\r\n            </TransitionGroup>\r\n          )}\r\n          <Transition name={nh.ns('fade')}>\r\n            {(isSuccess.value || failed.value) && (\r\n              <div\r\n                class={[\r\n                  nh.be('image-tip'),\r\n                  nh.bem('image-tip', isSuccess.value ? 'success' : 'fail'),\r\n                ]}\r\n                onClick={stopPropagation}\r\n              >\r\n                {isSuccess.value\r\n                  ? (props.successTip ?? locale.value.success)\r\n                  : (props.failTip ?? locale.value.fail)}\r\n              </div>\r\n            )}\r\n          </Transition>\r\n        </div>\r\n      )\r\n    }\r\n\r\n    function renderSlider() {\r\n      return (\r\n        <CaptchaSlider\r\n          ref={slider}\r\n          class={nh.bem('slider', 'inner')}\r\n          target={usedTarget.value}\r\n          tolerance={props.tolerance}\r\n          loading={isLoading.value}\r\n          loading-icon={props.loadingIcon}\r\n          loading-lock\r\n          loading-effect={props.loadingEffect}\r\n          disabled={props.disabled || failLocked.value}\r\n          onBeforeTest={props.onBeforeTest}\r\n          onSuccess={handleSlideSuccess}\r\n          onFail={handleSlideFail}\r\n          onDragStart={handleDragStart}\r\n          onDrag={handleDrag}\r\n          onDragEnd={handleDragEnd}\r\n        >\r\n          {{\r\n            tip: () =>\r\n              renderSlot(slots, 'tip', { success: isSuccess.value }, () => [\r\n                <Renderer renderer={props.slots.tip} data={{ success: isSuccess.value }}>\r\n                  {props.tip ?? locale.value.slide}\r\n                </Renderer>,\r\n              ]),\r\n          }}\r\n        </CaptchaSlider>\r\n      )\r\n    }\r\n\r\n    function renderTextList() {\r\n      return (\r\n        <div class={nh.be('text-list')}>\r\n          <div class={nh.be('tip')}>\r\n            {renderSlot(slots, 'tip', { success: isSuccess.value }, () => [\r\n              <Renderer renderer={props.slots.tip} data={{ success: isSuccess.value }}>\r\n                {props.tip ?? locale.value.pointInOrder}\r\n              </Renderer>,\r\n            ])}\r\n          </div>\r\n          <span>{':'}</span>\r\n          {renderSlot(slots, 'texts', { texts: toRef(props, 'texts') }, () => [\r\n            <Renderer renderer={props.slots.texts} data={{ texts: toRef(props, 'texts') }}>\r\n              {props.texts.map((text, index) => (\r\n                <span key={index} class={nh.be('text')}>\r\n                  {text}\r\n                </span>\r\n              ))}\r\n            </Renderer>,\r\n          ])}\r\n        </div>\r\n      )\r\n    }\r\n\r\n    function renderFooter() {\r\n      if (props.type === 'slide') return renderSlider()\r\n      if (props.type === 'point') return renderTextList()\r\n\r\n      return null\r\n    }\r\n\r\n    function renderPanel() {\r\n      return (\r\n        <div\r\n          ref={wrapper}\r\n          id={idFor.value}\r\n          class={className.value}\r\n          tabindex={-1}\r\n          role={'application'}\r\n          aria-labelledby={labelId.value}\r\n        >\r\n          <div class={nh.be('header')}>\r\n            <div class={nh.be('title')}>\r\n              {renderSlot(slots, 'title', { success: isSuccess.value }, () => [\r\n                <Renderer renderer={props.slots.title} data={{ success: isSuccess.value }}>\r\n                  {props.title ?? locale.value.doCaptcha}\r\n                </Renderer>,\r\n              ])}\r\n            </div>\r\n            <span role={'none'} style={'flex: auto'}></span>\r\n            <button\r\n              class={[\r\n                nh.be('action'),\r\n                nh.be('refresh'),\r\n                actionLocked.value && nh.bem('action', 'disabled'),\r\n              ]}\r\n              type={'button'}\r\n              onClick={handleRefresh}\r\n            >\r\n              {renderSlot(slots, 'refresh', undefined, () => [\r\n                <Renderer renderer={props.slots.refresh}>\r\n                  <Icon\r\n                    {...icons.value.refresh}\r\n                    icon={props.refreshIcon || icons.value.refresh.icon}\r\n                  ></Icon>\r\n                </Renderer>,\r\n              ])}\r\n            </button>\r\n          </div>\r\n          <Spin active={isLoading.value || slider.value?.isLoading} delay={false}>\r\n            {{\r\n              default: renderImage,\r\n              icon: createSlotRender(slots, ['loading-icon', 'loadingIcon'], () => (\r\n                <Renderer renderer={props.slots.loadingIcon}></Renderer>\r\n              )),\r\n            }}\r\n          </Spin>\r\n          {renderFooter()}\r\n        </div>\r\n      )\r\n    }\r\n\r\n    function renderTrigger() {\r\n      return renderSlot(\r\n        slots,\r\n        'trigger',\r\n        { visible: visible.value, success: isSuccess.value },\r\n        () => [\r\n          <Renderer\r\n            renderer={props.slots.trigger}\r\n            data={{ visible: visible.value, success: isSuccess.value }}\r\n          >\r\n            <Button\r\n              class={[nh.be('button'), isSuccess.value && nh.bem('button', 'success')]}\r\n              type={isSuccess.value ? 'success' : 'primary'}\r\n              size={props.triggerSize}\r\n              block\r\n              loading={visible.value && !isSuccess.value}\r\n              icon={isSuccess.value ? icons.value.success.icon : null}\r\n              onClick={handleTrigger}\r\n            >\r\n              {props.triggerText ??\r\n                (isSuccess.value ? locale.value.completed : locale.value.trigger)}\r\n            </Button>\r\n          </Renderer>,\r\n        ],\r\n      )\r\n    }\r\n\r\n    return () => {\r\n      if (props.useTrigger) {\r\n        return (\r\n          <Tooltip\r\n            class={nh.bs('wrapper')}\r\n            visible={visible.value}\r\n            trigger={'custom'}\r\n            raw\r\n            wrapper\r\n            transfer={props.transfer}\r\n          >\r\n            {{\r\n              trigger: renderTrigger,\r\n              default: renderPanel,\r\n            }}\r\n          </Tooltip>\r\n        )\r\n      }\r\n\r\n      return renderPanel()\r\n    }\r\n  },\r\n})\r\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","defineComponent","name","props","captchaProps","emits","setup","_props","slots","expose","idFor","labelId","disabled","loading","validateField","setFieldValue","useFieldStore","focus","useProps","type","slideTarget","default","validator","value","isNull","Array","isArray","title","tip","successTip","failTip","image","tolerance","canvasSize","refreshIcon","createIconProp","loadingIcon","loadingEffect","onBeforeTest","isFunc","texts","find","text","length","failLimit","remotePoint","useTrigger","triggerSize","createSizeProp","triggerText","transfer","hideDelay","hollowShape","squarePath","nh","useNameHelper","locale","useLocale","icons","useIcons","timer","useSetTimeout","currentTarget","ref","parseTarget","dragging","pointers","reactive","testLoading","success","failed","failedCount","visible","wrapper","canvas","subCanvas","slider","track","computed","isSuccess","currentLeft","resetting","usedTarget","imageLoading","imagePromise","shallowRef","Promise","resolve","pointerTargets","fontRate","imageLoaded","memoryCanvas","isLoading","failLocked","className","b","bs","bm","subCanvasStyle","left","cv","undefined","actionLocked","watch","loadImage","drawImageNextFrame","console","warn","immediate","clearTimeout","hideTrigger","setTimeout","onMounted","drawImage","reset","loadFlag","Date","now","Math","round","random","flag","src","isClient","Image","trim","startsWith","onload","finally","drawImageWithTexts","canvasEl","ctx","getContext","width","height","fontSize","max","textBaseline","textAlign","font","lineWidth","strokeStyle","drawText","x","y","radian","color","randomHardColor","save","translate","rotate","PI","fillStyle","fillText","strokeText","restore","metrics","measureText","xLimit","yLimit","fontBoundingBoxAscent","fontBoundingBoxDescent","prevX","prevY","abs","push","getHollowProcess","puzzlePath","shieldPath","heartPath","subCanvasEl","subCtx","document","createElement","pathCtx","clearRect","canvasRect","getBoundingClientRect","trackRect","widthFix","targetX","targetY","hollowProcess","beginPath","clipX","clipY","clipWidth","clipHeight","stroke","clip","xLeftWidth","translateFix","style","transform","fill","globalCompositeOperation","nextFrameOnce","newImage","target","ensureArray","options","handleDragStart","percent","emitEvent","onDragStart","handleDrag","onDrag","handleDragEnd","onDragEnd","handleSlideSuccess","onSuccess","handleSlideFail","onFail","handleRefresh","onRefresh","stopPropagation","event","verifyPointers","result","customResult","xTolerance","yTolerance","i","len","nextTick","flat","handleImageClick","clientWidth","canvasWidth","clientHeight","canvasHeight","offsetX","offsetY","cancelPointer","index","pop","handleTrigger","renderImage","_slot","_createVNode","be","bem","TransitionGroup","ns","map","top","bind","Transition","fail","renderSlider","CaptchaSlider","renderSlot","Renderer","slide","renderTextList","pointInOrder","toRef","_slot2","renderFooter","renderPanel","doCaptcha","refresh","Icon","_mergeProps","icon","Spin","createSlotRender","renderTrigger","trigger","Button","completed","Tooltip"],"mappings":"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"}