{"version":3,"file":"button.vue.mjs","sources":["../../../../../../packages/components/button/src/button.vue"],"sourcesContent":["<script lang=\"ts\">\n  import { getCurrentInstance, reactive, computed, defineComponent } from 'vue'\n  import { getComponentNamespace, getNamespace } from '../../../utils/global-config'\n  import { isArray, isFunction, isPromise } from '../../../utils/is'\n  import { definePropType } from '../../../utils/vue-utils'\n\n  // 方便添加动画\n  import LoadingIcon from './LoadingIcon'\n\n  export default defineComponent({\n    name: getComponentNamespace('Button'),\n    components: {\n      LoadingIcon\n    },\n    props: {\n      disabled: Boolean,\n      block: Boolean,\n      loading: Boolean,\n      loadingFill: {\n        type: Boolean,\n        default: false\n      },\n      shape: {\n        type: definePropType<'circle' | 'round'>(String),\n        default: undefined\n      },\n      link: {\n        type: Boolean,\n        default: false\n      },\n      type: {\n        type: definePropType<'primary' | 'success' | 'danger' | 'warning' | 'strong' | 'card'>(\n          String\n        ),\n        default: undefined\n      },\n      plain: {\n        type: Boolean,\n        default: false\n      },\n      size: {\n        type: definePropType<'mini' | 'small' | 'large' | 'normal'>(String),\n        default: 'normal'\n      },\n      border: {\n        type: Boolean,\n        default: true\n      }\n    },\n    emits: ['click'],\n    setup(props) {\n      const state = reactive({\n        clicked: false\n      })\n\n      const ns = getNamespace('button')\n      const cls = computed(() => {\n        const _cls = [\n          ns,\n          props.type && `${ns}--${props.type}`,\n          props.disabled && `is-disabled`,\n          props.block && `is-block`,\n          props.plain && 'is-plain',\n          props.shape && `is-${props.shape}`,\n          props.link && `is-link`,\n          props.size && `is-${props.size}`,\n          !props.border && `is-hide-border`,\n          isLoading.value && `is-loading`\n        ]\n\n        return _cls\n      })\n\n      const isLoading = computed(() => {\n        return props.loading || state.clicked\n      })\n\n      const instance = getCurrentInstance()\n\n      const execFn = (fn: Function, event: PointerEvent) => {\n        const ret = fn(event)\n        if (isPromise(ret)) {\n          state.clicked = true\n          ret.finally(() => {\n            state.clicked = false\n          })\n        }\n      }\n\n      const handleClick = async (event: PointerEvent) => {\n        // 为了兼容打开弹出层，按下entry键会重复激活弹出层\n        ;(event.target as HTMLElement).blur?.()\n\n        if (isLoading.value) return\n        const clickFn = instance?.vnode?.props?.onClick\n        // 外部注入事件，此时按钮又绑定事件。那么这里就是一个数组。\n        if (isArray(clickFn)) {\n          clickFn.forEach((fn) => execFn(fn, event))\n        } else if (isFunction(clickFn)) {\n          execFn(clickFn, event)\n        }\n      }\n      return {\n        ns,\n        cls,\n        handleClick,\n        isLoading\n      }\n    }\n  })\n</script>\n\n<template>\n  <button :class=\"cls\" type=\"button\" :disabled=\"disabled\" :hover=\"!disabled\" @click=\"handleClick\">\n    <slot></slot>\n    <LoadingIcon :loading=\"isLoading\" :ns=\"ns\" />\n  </button>\n</template>\n"],"names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","isLoading","_createVNode"],"mappings":";;;;;;iCAiHEA,iBAGS,aAAA,CAAA,CAAA;EAHiB,OAAAC,SAAA,EAAQ,EAAAC,kBAAA,CAAA,QAAA,EAAA;AAAA,IAAE,KAAA,EAAkBC,cAAA,CAAA,IAAA,CAAA,GAAA,CAAA;AAAA,IAAG,IAAK,EAAA,QAAA;AAAA,IAAc,UAAK,IAAA,CAAA,QAAA;AAAA,IAAA,KAAA,EAAA,CAAA,IAAA,CAAA,QAAA;AAAA,IAC/E,OAAa,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,OAAA,CAAA,CAAA,GAAA,CAAA,GAAA,IAAA,KAAA,IAAA,CAAA,WAAA,IAAA,IAAA,CAAA,WAAA,CAAA,GAAA,IAAA,CAAA,CAAA;AAAA,GACb,EAAA;AAAA,IAAAC,UAAA,CAAuBC,IAAS,CAAA,MAAA,EAAA,SAAA,CAAA;AAAA,IAASC,YAAA,sBAAA,EAAA;AAAA,MAAA,SAAA,IAAA,CAAA,SAAA;AAAA;;;;;;;;"}