vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 44 kB
Source Map (JSON)
{"version":3,"file":"captcha.cjs","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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"}