UNPKG

vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

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