{"version":3,"file":"captcha-slider.mjs","sources":["../../../../../../packages/components/captcha/src/captcha-slider.vue"],"sourcesContent":["<template>\n  <div ref=\"wrapper\" :class=\"className\" tabindex=\"-1\" role=\"group\">\n    <div\n      :class=\"{\n        [ns.e('filler')]: true,\n        [ns.em('filler', 'loading')]: isLoading,\n        [ns.em('filler', 'success')]: isSuccess,\n      }\"\n      :style=\"fillerStyle\"\n    />\n    <div\n      :class=\"{\n        [ns.e('tip')]: true,\n        [ns.em('tip', 'focused')]: dragging,\n        [ns.em('tip', 'loading')]: isLoading,\n        [ns.em('tip', 'success')]: isSuccess,\n      }\"\n      :style=\"tipStyle\"\n    >\n      <slot name=\"tip\" :success=\"isSuccess\">\n        {{\n          isSuccess\n            ? props.successTip ?? textInfo.success\n            : props.tip ?? textInfo.slideEnd\n        }}\n      </slot>\n    </div>\n    <div ref=\"track\" :class=\"ns.e('track')\">\n      <div\n        ref=\"trigger\"\n        :class=\"{\n          [ns.e('trigger')]: true,\n          [ns.em('trigger', 'focused')]: dragging,\n          [ns.em('trigger', 'loading')]: isLoading,\n          [ns.em('trigger', 'success')]: isSuccess,\n        }\"\n        tabindex=\"0\"\n        :style=\"triggerStyle\"\n        @transitionend=\"afterReset\"\n      >\n        <slot name=\"trigger\" :success=\"isSuccess\">\n          <LtIcon :size=\"12\">\n            <Check v-if=\"isSuccess\" />\n            <Loading v-else-if=\"isLoading\" />\n            <DArrowRight v-else />\n          </LtIcon>\n        </slot>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue'\nimport { useNamespace } from '@lit-element/hooks'\nimport { LtIcon } from '@lit-element/components/icon'\nimport { Check, DArrowRight, Loading } from '@inte-cloud/icons-vue'\nimport { boundRange, toFixed } from './hooks/number'\nimport { useMoving } from './hooks/moving'\nimport { useSetTimeout } from './hooks/useSetTimeout'\nimport { captchaSliderProps, textInfo } from './data'\n\ndefineOptions({ name: 'LtCaptchaSlider' })\n\nconst props = defineProps(captchaSliderProps)\n\nconst ns = useNamespace('captcha')\n\nconst { timer } = useSetTimeout()\n\nconst currentLeft = ref(0)\nconst testing = ref(false)\nconst resetting = ref(false)\nconst isSuccess = ref(false)\nconst testLoading = ref(false)\n\nconst track = ref<HTMLElement>()\n\nconst readonly = computed(() => {\n  return props.disabled || (props.loading && props.loadingLock)\n})\n\nlet widthLimit: number\n\nconst { target: trigger, moving: dragging } = useMoving({\n  onStart: (_, event) => {\n    resetting.value = false\n    if (\n      testing.value ||\n      readonly.value ||\n      !track.value ||\n      !trigger.value ||\n      isSuccess.value ||\n      resetting.value ||\n      event.button > 0\n    ) {\n      return false\n    }\n\n    widthLimit = track.value.getBoundingClientRect().width\n    currentLeft.value = 0\n    verifyPosition()\n    trigger.value.focus()\n    props.onDragStart?.(currentLeft.value)\n  },\n  onMove: (state) => {\n    if (testing.value || readonly.value || isSuccess.value || resetting.value) {\n      return false\n    }\n\n    currentLeft.value = (state.deltaX / widthLimit) * 100\n    verifyPosition()\n    props.onDrag?.(currentLeft.value)\n  },\n  onEnd: async () => {\n    if (testing.value || readonly.value) return\n\n    testing.value = true\n\n    const matched = matchTarget(currentLeft.value)\n    let customResult: unknown\n\n    if (typeof props.onBeforeTest === 'function') {\n      nextTick(() => {\n        testLoading.value = true\n      })\n      customResult = await props.onBeforeTest(currentLeft.value, matched)\n      nextTick(() => {\n        testLoading.value = false\n      })\n    }\n\n    if (\n      currentLeft.value &&\n      (customResult === false || (!matched && customResult !== true))\n    ) {\n      resetting.value = true\n      currentLeft.value = 0\n      isSuccess.value = false\n      props.onFail?.()\n    } else if (matched || customResult === true) {\n      isSuccess.value = true\n\n      if (customResult && !matched) {\n        resetting.value = true\n        currentLeft.value = props.target\n      }\n      props.onSuccess?.(currentLeft.value)\n    }\n\n    trigger.value?.blur()\n    props.onDragEnd?.(currentLeft.value)\n    clearTimeout(timer.testing)\n    testing.value = false\n  },\n})\n\nconst isLoading = computed(() => props.loading || testLoading.value)\nconst className = computed(() => {\n  const baseCls = ns.e('slider')\n\n  return {\n    [baseCls]: true,\n    [ns.b('vars')]: true,\n    [`${baseCls}--success`]: isSuccess.value,\n    [`${baseCls}--disabled`]: props.disabled,\n    [`${baseCls}--loading`]: isLoading.value,\n    [`${baseCls}--${props.size}`]: props.size !== 'default',\n  }\n})\nconst fillerStyle = computed(() => {\n  return {\n    [`--${ns.b('filler-transition')}`]: resetting.value\n      ? 'transform 250ms ease'\n      : undefined,\n    transform: `scaleX(${currentLeft.value / 100})`,\n  }\n})\nconst tipStyle = computed(() => {\n  return {\n    transition: resetting.value ? 'background-position 250ms ease' : undefined,\n    backgroundPosition: `-${currentLeft.value}%`,\n  }\n})\nconst triggerStyle = computed(() => {\n  return {\n    left: `${currentLeft.value}%`,\n    transition: resetting.value ? 'left 250ms ease' : undefined,\n  }\n})\n\nwatch(readonly, (value) => {\n  if (value) {\n    reset()\n  }\n})\n\ndefineExpose({\n  currentLeft,\n  resetting,\n  isSuccess,\n  dragging,\n  isLoading,\n  track,\n  trigger,\n  focus,\n  reset,\n})\n\nfunction verifyPosition() {\n  currentLeft.value = toFixed(boundRange(currentLeft.value, 0, 100), 3)\n}\n\nfunction reset() {\n  resetting.value = true\n  currentLeft.value = 0\n  isSuccess.value = false\n}\n\nfunction afterReset() {\n  resetting.value = false\n}\n\nfunction matchTarget(value: number) {\n  return Math.abs(props.target - value) <= props.tolerance\n}\n\nfunction focus(options?: FocusOptions) {\n  trigger.value?.focus(options)\n}\n</script>\n"],"names":[],"mappings":"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"}