{"version":3,"file":"switch.vue2.mjs","sources":["../../../../../../packages/components/switch/src/switch.vue"],"sourcesContent":["<script lang=\"ts\">\n  import { computed, defineComponent, nextTick, onMounted, ref, watch } from 'vue'\n  import type { CSSProperties, StyleValue } from 'vue'\n  import { addUnit, NOOP } from '../../../shared/utils'\n  import { BnIconLoading } from '../../icon'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import { isBoolean, isPromise } from '../../../utils/is'\n  import { useFormItem } from '../../form/src/hooks/use-form-item'\n  import { switchProps } from './props'\n\n  export default defineComponent({\n    name: getComponentNamespace('Switch'),\n    components: {\n      BnIconLoading\n    },\n    props: switchProps,\n    emits: ['update:modelValue', 'input', 'change'],\n    setup(props, { emit }) {\n      const ns = getNamespace('switch')\n      const inputRef = ref<HTMLInputElement>()\n      const { formItem } = useFormItem()\n      const isLoading = ref(false)\n\n      const cls = computed(() => [\n        ns,\n        checked.value && 'is-checked',\n        mergeDisabled.value && 'is-disabled'\n      ])\n\n      const coreCls = computed(() => [`${ns}__core`, `${ns}__core-${props.type}`])\n\n      const blockCls = computed(() => [`${ns}__block`, `${ns}__block-${props.type}`])\n\n      // moduleValue value 控制模式\n      const isControlled = ref(props.modelValue !== false)\n      // TODO: 后期和form表单关联\n      const mergeDisabled = computed(() => props.disabled)\n\n      // 用这个值控制checkbox状态\n      const actualValue = computed(() => {\n        return isControlled.value ? props.modelValue : props.value\n      })\n\n      // switch状态控制\n      const checked = computed(() => actualValue.value === props.trueValue)\n\n      const inlineLabel = computed(() => (checked.value ? props.activeText : props.inactiveText))\n\n      const coreStyle = computed<CSSProperties>(() => {\n        const style: StyleValue = {\n          width: addUnit(props.width),\n          '--bn-switch-inactive-color': props.inactiveColor,\n          '--bn-switch-active-color': props.activeColor\n        }\n        return style\n      })\n\n      const switchValue = () => {\n        if (mergeDisabled.value) return\n\n        const { beforeChange } = props\n        if (!beforeChange) {\n          handleChange()\n          return\n        }\n        const beforeChangeRes = beforeChange()\n\n        if (isPromise(beforeChangeRes)) {\n          isLoading.value = true\n          beforeChangeRes\n            .then((value: boolean) => {\n              value && handleChange()\n            })\n            .finally(() => {\n              isLoading.value = false\n            })\n          return\n        }\n        if (isBoolean(beforeChangeRes)) {\n          beforeChangeRes && handleChange()\n        }\n      }\n\n      const handleChange = () => {\n        const val = checked.value ? props.falseValue : props.trueValue\n        emit('update:modelValue', val)\n        emit('input', val)\n        emit('change', val)\n        nextTick(() => {\n          inputRef.value!.checked = checked.value\n        })\n      }\n\n      watch(checked, (val) => {\n        inputRef.value!.checked = val\n        if (props.validateEvent) {\n          formItem?.validate?.('change').catch(NOOP)\n        }\n      })\n\n      watch(\n        () => props.modelValue,\n        () => {\n          isControlled.value = true\n        }\n      )\n\n      watch(\n        () => props.value,\n        () => {\n          isControlled.value = false\n        }\n      )\n\n      onMounted(() => {\n        if (![props.trueValue, props.falseValue].includes(actualValue.value)) {\n          emit('update:modelValue', props.falseValue)\n          emit('input', props.falseValue)\n          emit('change', props.falseValue)\n        }\n      })\n\n      return {\n        ns,\n        cls,\n        coreStyle,\n        coreCls,\n        blockCls,\n        mergeDisabled,\n        switchValue,\n        handleChange,\n        checked,\n        inputRef,\n        isLoading,\n        inlineLabel\n      }\n    }\n  })\n</script>\n\n<template>\n  <div :class=\"cls\" @click.prevent=\"switchValue\">\n    <input\n      ref=\"inputRef\"\n      :class=\"[`${ns}__input`]\"\n      type=\"checkbox\"\n      role=\"switch\"\n      :aria-checked=\"checked\"\n      :aria-disabled=\"mergeDisabled\"\n      :name=\"name\"\n      :true-value=\"trueValue\"\n      :false-value=\"falseValue\"\n      :disabled=\"mergeDisabled\"\n      @change=\"handleChange\"\n      @keydown.enter=\"switchValue\"\n    />\n    <span\n      v-if=\"!inlinePrompt\"\n      :class=\"[{ 'is-active': !checked }, `${ns}__label ${ns}__label--left`]\"\n    >\n      {{ inactiveText }}\n    </span>\n    <span :class=\"coreCls\" :style=\"coreStyle\">\n      <span v-if=\"inlinePrompt && type !== 'line'\" :class=\"[`${ns}__inline`]\">\n        <slot name=\"inline\" :checked=\"checked\"\n          ><span class=\"is-text\">{{ inlineLabel }}</span></slot\n        >\n      </span>\n      <span :class=\"blockCls\">\n        <slot v-if=\"isLoading\" name=\"loading\">\n          <BnIconLoading :size=\"14\" :style=\"{ color: 'var(--bn-switch-active-color)' }\" />\n        </slot>\n      </span>\n    </span>\n    <span\n      v-if=\"!inlinePrompt\"\n      :class=\"[`${ns}__label ${ns}__label--right`, { 'is-active': checked }]\"\n    >\n      {{ activeText }}\n    </span>\n  </div>\n</template>\n"],"names":[],"mappings":"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"}