UNPKG

@extclp/vexip-ui

Version:

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

1 lines 15.3 kB
{"version":3,"file":"captcha-slider.vue2.mjs","sources":["../../../components/captcha/captcha-slider.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { Icon } from '@/components/icon'\r\nimport { useFieldStore } from '@/components/form'\r\nimport { Renderer } from '@/components/renderer'\r\n\r\nimport { computed, nextTick, ref, watch } from 'vue'\r\n\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 { useMoving, useSetTimeout } from '@vexip-ui/hooks'\r\nimport { boundRange, toFixed } from '@vexip-ui/utils'\r\nimport { captchaSliderProps } from './props'\r\n\r\nimport type { CaptchaSliderSlots } from './symbol'\r\n\r\ndefineOptions({ name: 'CaptchaSlider' })\r\n\r\nconst { idFor, labelId, disabled, loading, size, validateField, getFieldValue, setFieldValue } =\r\n useFieldStore<boolean>(focus)\r\n\r\nconst _props = defineProps(captchaSliderProps)\r\nconst props = useProps('captcha', _props, {\r\n size: createSizeProp(size),\r\n target: {\r\n default: 100,\r\n validator: value => value >= 0 && value <= 100,\r\n },\r\n tip: null,\r\n successTip: null,\r\n tolerance: {\r\n default: 1,\r\n validator: value => value >= 0,\r\n },\r\n disabled: () => disabled.value,\r\n loading: () => loading.value,\r\n loadingIcon: createIconProp(),\r\n loadingLock: false,\r\n loadingEffect: null,\r\n onBeforeTest: {\r\n default: null,\r\n isFunc: true,\r\n },\r\n slots: () => ({}),\r\n})\r\n\r\ndefineSlots<CaptchaSliderSlots>()\r\n\r\nconst nh = useNameHelper('captcha')\r\nconst locale = useLocale('captcha')\r\nconst icons = useIcons()\r\n\r\nconst { timer } = useSetTimeout()\r\n\r\nconst currentLeft = ref(0)\r\nconst testing = ref(false)\r\nconst resetting = ref(false)\r\nconst isSuccess = ref(false)\r\nconst testLoading = ref(false)\r\n\r\nconst track = ref<HTMLElement>()\r\n\r\nconst readonly = computed(() => props.disabled || (props.loading && props.loadingLock))\r\n\r\nlet widthLimit: number\r\n\r\nconst { target: trigger, moving: dragging } = useMoving({\r\n onStart: (_, event) => {\r\n if (\r\n testing.value ||\r\n readonly.value ||\r\n !track.value ||\r\n !trigger.value ||\r\n isSuccess.value ||\r\n resetting.value ||\r\n event.button > 0\r\n ) {\r\n return false\r\n }\r\n\r\n widthLimit = track.value.getBoundingClientRect().width\r\n currentLeft.value = 0\r\n verifyPosition()\r\n trigger.value.focus()\r\n emitEvent(props.onDragStart, currentLeft.value)\r\n },\r\n onMove: state => {\r\n if (testing.value || readonly.value || isSuccess.value || resetting.value) {\r\n return false\r\n }\r\n\r\n currentLeft.value = (state.deltaX / widthLimit) * 100\r\n verifyPosition()\r\n emitEvent(props.onDrag, currentLeft.value)\r\n },\r\n onEnd: async () => {\r\n if (testing.value || readonly.value) return\r\n\r\n testing.value = true\r\n\r\n const matched = matchTarget(currentLeft.value)\r\n let customResult: unknown\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(currentLeft.value, matched)\r\n nextTick(() => {\r\n testLoading.value = false\r\n })\r\n }\r\n\r\n if (currentLeft.value && (customResult === false || (!matched && customResult !== true))) {\r\n resetting.value = true\r\n currentLeft.value = 0\r\n isSuccess.value = false\r\n\r\n setFieldValue(false)\r\n emitEvent(props.onFail)\r\n } else if (matched || customResult === true) {\r\n isSuccess.value = true\r\n\r\n if (customResult && !matched) {\r\n resetting.value = true\r\n currentLeft.value = props.target\r\n }\r\n\r\n setFieldValue(true)\r\n emitEvent(props.onSuccess, currentLeft.value)\r\n }\r\n\r\n validateField()\r\n trigger.value?.blur()\r\n emitEvent(props.onDragEnd, currentLeft.value)\r\n\r\n clearTimeout(timer.testing)\r\n testing.value = false\r\n },\r\n})\r\n\r\nconst isLoading = computed(() => props.loading || testLoading.value)\r\nconst className = computed(() => {\r\n const baseCls = nh.be('slider')\r\n\r\n return {\r\n [baseCls]: true,\r\n [nh.bs('vars')]: true,\r\n [`${baseCls}--success`]: isSuccess.value,\r\n [`${baseCls}--disabled`]: props.disabled,\r\n [`${baseCls}--loading`]: isLoading.value,\r\n [`${baseCls}--${props.size}`]: props.size !== 'default',\r\n }\r\n})\r\nconst fillerStyle = computed(() => {\r\n return {\r\n [nh.cv('filler-transition')]: resetting.value ? 'transform 250ms ease' : undefined,\r\n transform: `scaleX(${currentLeft.value / 100})`,\r\n }\r\n})\r\nconst tipStyle = computed(() => {\r\n return {\r\n [nh.cv('tip-transition')]: resetting.value ? 'background-position 250ms ease' : undefined,\r\n backgroundPosition: `-${currentLeft.value}%`,\r\n }\r\n})\r\nconst triggerStyle = 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\r\nwatch(\r\n () => getFieldValue(),\r\n value => {\r\n if (!value) {\r\n reset()\r\n } else {\r\n if (!matchTarget(currentLeft.value)) {\r\n resetting.value = true\r\n currentLeft.value = props.target\r\n }\r\n\r\n isSuccess.value = true\r\n }\r\n },\r\n)\r\nwatch(readonly, value => value && reset())\r\n\r\ndefineExpose({\r\n idFor,\r\n currentLeft,\r\n resetting,\r\n isSuccess,\r\n dragging,\r\n isLoading,\r\n track,\r\n trigger,\r\n focus,\r\n reset,\r\n})\r\n\r\nfunction verifyPosition() {\r\n currentLeft.value = toFixed(boundRange(currentLeft.value, 0, 100), 3)\r\n}\r\n\r\nfunction reset() {\r\n resetting.value = true\r\n currentLeft.value = 0\r\n isSuccess.value = false\r\n}\r\n\r\nfunction afterReset() {\r\n resetting.value = false\r\n}\r\n\r\nfunction matchTarget(value: number) {\r\n return Math.abs(props.target - value) <= props.tolerance\r\n}\r\n\r\nfunction focus(options?: FocusOptions) {\r\n trigger.value?.focus(options)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n :id=\"idFor\"\r\n ref=\"wrapper\"\r\n :class=\"className\"\r\n tabindex=\"-1\"\r\n role=\"group\"\r\n :aria-labelledby=\"labelId\"\r\n >\r\n <div\r\n :class=\"{\r\n [nh.be('filler')]: true,\r\n [nh.bem('filler', 'loading')]: isLoading,\r\n [nh.bem('filler', 'success')]: isSuccess\r\n }\"\r\n :style=\"fillerStyle\"\r\n ></div>\r\n <div\r\n :class=\"{\r\n [nh.be('tip')]: true,\r\n [nh.bem('tip', 'focused')]: dragging,\r\n [nh.bem('tip', 'loading')]: isLoading,\r\n [nh.bem('tip', 'success')]: isSuccess\r\n }\"\r\n :style=\"tipStyle\"\r\n >\r\n <slot name=\"tip\" :success=\"isSuccess\">\r\n <Renderer :renderer=\"props.slots.tip\" :data=\"{ success: isSuccess }\">\r\n {{ isSuccess ? (props.successTip ?? locale.success) : (props.tip ?? locale.slideEnd) }}\r\n </Renderer>\r\n </slot>\r\n </div>\r\n <div ref=\"track\" :class=\"nh.be('track')\">\r\n <div\r\n ref=\"trigger\"\r\n :class=\"{\r\n [nh.be('trigger')]: true,\r\n [nh.bem('trigger', 'focused')]: dragging,\r\n [nh.bem('trigger', 'loading')]: isLoading,\r\n [nh.bem('trigger', 'success')]: isSuccess\r\n }\"\r\n tabindex=\"0\"\r\n :style=\"triggerStyle\"\r\n @transitionend=\"afterReset\"\r\n >\r\n <slot name=\"trigger\" :success=\"isSuccess\">\r\n <Renderer :renderer=\"props.slots.trigger\" :data=\"{ success: isSuccess }\">\r\n <Icon v-if=\"isSuccess\" v-bind=\"icons.check\"></Icon>\r\n <Icon\r\n v-else-if=\"isLoading\"\r\n v-bind=\"icons.loading\"\r\n :effect=\"props.loadingEffect || icons.loading.effect\"\r\n :icon=\"props.loadingIcon || icons.loading.icon\"\r\n ></Icon>\r\n <Icon v-else v-bind=\"icons.anglesRight\"></Icon>\r\n </Renderer>\r\n </slot>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["idFor","labelId","disabled","loading","size","validateField","getFieldValue","setFieldValue","useFieldStore","focus","props","useProps","__props","createSizeProp","value","createIconProp","nh","useNameHelper","locale","useLocale","icons","useIcons","timer","useSetTimeout","currentLeft","ref","testing","resetting","isSuccess","testLoading","track","readonly","computed","widthLimit","trigger","dragging","useMoving","_","event","verifyPosition","emitEvent","state","matched","matchTarget","customResult","nextTick","_a","isLoading","className","baseCls","fillerStyle","tipStyle","triggerStyle","watch","reset","__expose","toFixed","boundRange","afterReset","options","_createElementBlock","_unref","_createElementVNode","_normalizeClass","_renderSlot","_ctx","_createVNode","Renderer","_createTextVNode","_toDisplayString","_createBlock","Icon","_normalizeProps","_mergeProps","_openBlock"],"mappings":"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"}