{"version":3,"file":"button.mjs","names":[],"sources":["../../../../src/components/button/src/button.tsx"],"sourcesContent":["import { computed, defineComponent, onBeforeUnmount, reactive, shallowRef, watch, withModifiers } from \"vue\";\nimport { Eleme } from \"@element-plus/icons-vue\";\nimport { ElButton, buttonEmits, buttonProps } from \"element-plus\";\nimport { useOverlay } from \"../../../hooks\";\nimport { callOptionalFunction, definePropType, makeSlots, useExpose, useProps, useRender } from \"../../../utils\";\nimport { createLoadingTasks } from \"../../../utils/loading-tasks\";\nimport type { ButtonInstance } from \"element-plus\";\nimport type { Component } from \"vue\";\n\n/** FaButton 的运行时 Props 定义 */\nexport const faButtonProps = {\n\t// eslint-disable-next-line @typescript-eslint/no-deprecated -- Element Plus 2.x 尚未提供可替代的公开运行时 props 定义。\n\t...buttonProps,\n\t/**\n\t * 自定义加载图标\n\t *\n\t * 未指定时使用 `Eleme`。\n\t */\n\tloadingIcon: {\n\t\ttype: definePropType<string | Component>([String, Object, Function]),\n\t\tdefault: () => Eleme,\n\t},\n\t/** 禁用加载 */\n\tdisabledLoading: Boolean,\n};\n\n/** FaButton 的运行时 Emits 定义 */\nexport const faButtonEmits = {\n\t...buttonEmits,\n\t/**\n\t * 点击事件；未禁用内部加载时，调用方完成后应调用 done。\n\t * @param event - 鼠标事件\n\t * @param done - 完成本次交互并隐藏内部加载状态的回调\n\t */\n\tclick: (event: MouseEvent, done: () => void = () => undefined) => event instanceof MouseEvent && typeof done === \"function\",\n};\n\n/** FaButton 的插槽参数 */\nexport interface FaButtonSlots extends Record<string, unknown> {\n\t/** 默认内容插槽 */\n\tdefault: never;\n\t/** 自定义加载中组件 */\n\tloading: never;\n\t/** 自定义图标组件 */\n\ticon: never;\n}\n\nexport default defineComponent({\n\tname: \"FaButton\",\n\tprops: faButtonProps,\n\temits: faButtonEmits,\n\tslots: makeSlots<FaButtonSlots>(),\n\tsetup(props, { slots, emit, expose }) {\n\t\tconst buttonRef = shallowRef<ButtonInstance | null>(null);\n\n\t\tconst state = reactive({\n\t\t\tloading: false,\n\t\t});\n\n\t\t// 组件只持有一个遮罩，所有内部任务结束后才释放。\n\t\tlet ownsOverlay = false;\n\t\tlet disposed = false;\n\t\tlet releaseExternal: (() => void) | undefined;\n\t\tlet releaseManual: (() => void) | undefined;\n\n\t\tconst loadingTasks = createLoadingTasks((loading) => {\n\t\t\tstate.loading = loading;\n\t\t\tif (loading && !ownsOverlay) {\n\t\t\t\tuseOverlay.show(0);\n\t\t\t\townsOverlay = true;\n\t\t\t} else if (!loading && ownsOverlay) {\n\t\t\t\townsOverlay = false;\n\t\t\t\tuseOverlay.hide();\n\t\t\t}\n\t\t});\n\n\t\t// 手动关闭只释放手动任务，不能结束内部异步任务。\n\t\tconst manualLoading = computed({\n\t\t\tget: () => state.loading,\n\t\t\tset: (value: boolean) => {\n\t\t\t\tif (value) {\n\t\t\t\t\treleaseManual ??= loadingTasks.begin();\n\t\t\t\t} else {\n\t\t\t\t\treleaseManual?.();\n\t\t\t\t\treleaseManual = undefined;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\tconst handleLoading = async (loadingFunction: () => void | Promise<void>) => {\n\t\t\tif (disposed) return;\n\t\t\tconst done = loadingTasks.begin();\n\t\t\ttry {\n\t\t\t\tawait callOptionalFunction(loadingFunction);\n\t\t\t} finally {\n\t\t\t\tdone();\n\t\t\t}\n\t\t};\n\n\t\tconst handleClick = (event: MouseEvent) => {\n\t\t\tif (disposed) return;\n\t\t\tif (props.disabledLoading) {\n\t\t\t\temit(\"click\", event);\n\t\t\t} else {\n\t\t\t\tconst done = loadingTasks.begin();\n\t\t\t\temit(\"click\", event, done);\n\t\t\t}\n\t\t};\n\n\t\t// 外部受控状态与内部任务独立；false 只能释放外部持有的 Loading。\n\t\twatch(\n\t\t\t[() => props.loading, () => props.disabledLoading],\n\t\t\t([loading, disabledLoading]) => {\n\t\t\t\tif (loading && !disabledLoading) {\n\t\t\t\t\treleaseExternal ??= loadingTasks.begin();\n\t\t\t\t} else {\n\t\t\t\t\treleaseExternal?.();\n\t\t\t\t\treleaseExternal = undefined;\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ immediate: true }\n\t\t);\n\t\tonBeforeUnmount(() => {\n\t\t\tdisposed = true;\n\t\t\tloadingTasks.dispose();\n\t\t});\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-deprecated -- 透传范围必须与继承的 Element Plus 2.x 运行时 props 保持一致。\n\t\tconst elButtonProps = useProps(props, buttonProps, [\"loading\"]);\n\n\t\tuseRender(() => (\n\t\t\t<ElButton\n\t\t\t\t{...elButtonProps.value}\n\t\t\t\tref={buttonRef}\n\t\t\t\tclass=\"fa-button\"\n\t\t\t\tloading={state.loading}\n\t\t\t\tonClick={withModifiers((event: Event) => handleClick(event as MouseEvent), [\"prevent\"])}\n\t\t\t>\n\t\t\t\t{{\n\t\t\t\t\tdefault: () => slots.default?.(),\n\t\t\t\t\t...(slots.loading && { loading: () => slots.loading?.() ?? [] }),\n\t\t\t\t\t...(slots.icon && { icon: () => slots.icon?.() ?? [] }),\n\t\t\t\t}}\n\t\t\t</ElButton>\n\t\t));\n\n\t\treturn useExpose(expose, {\n\t\t\t/** 按钮 html 元素 */\n\t\t\tref: computed(() => buttonRef.value?.ref),\n\t\t\t/** 按钮尺寸 */\n\t\t\tsize: computed(() => buttonRef.value?.size),\n\t\t\t/** 按钮类型 */\n\t\t\ttype: computed(() => buttonRef.value?.type),\n\t\t\t/** 按钮已禁用 */\n\t\t\tdisabled: computed(() => buttonRef.value?.disabled),\n\t\t\t/** 是否在两个字符之间插入空格 */\n\t\t\tshouldAddSpace: computed(() => buttonRef.value?.shouldAddSpace),\n\t\t\t/** 聚合加载状态；手动写入只管理手动任务，不关闭仍在执行的内部任务。 */\n\t\t\tloading: manualLoading,\n\t\t\t/** 执行独立的加载任务；并发调用分别完成，卸载后不再启动新任务。 */\n\t\t\tdoLoading: handleLoading,\n\t\t});\n\t},\n});\n"],"mappings":";;;;;;;;;;;;AAUA,MAAa,gBAAgB;CAE5B,GAAG;;;;;;CAMH,aAAa;EACZ,MAAM,eAAmC;GAAC;GAAQ;GAAQ;EAAQ,CAAC;EACnE,eAAe;CAChB;;CAEA,iBAAiB;AAClB;;AAGA,MAAa,gBAAgB;CAC5B,GAAG;;;;;;CAMH,QAAQ,OAAmB,aAAyB,KAAA,MAAc,iBAAiB,cAAc,OAAO,SAAS;AAClH;AAYA,IAAA,iBAAe,gBAAgB;CAC9B,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO,UAAyB;CAChC,MAAM,OAAO,EAAE,OAAO,MAAM,UAAU;EACrC,MAAM,YAAY,WAAkC,IAAI;EAExD,MAAM,QAAQ,SAAS,EACtB,SAAS,MACV,CAAC;EAGD,IAAI,cAAc;EAClB,IAAI,WAAW;EACf,IAAI;EACJ,IAAI;EAEJ,MAAM,eAAe,oBAAoB,YAAY;GACpD,MAAM,UAAU;GAChB,IAAI,WAAW,CAAC,aAAa;IAC5B,WAAW,KAAK,CAAC;IACjB,cAAc;GACf,OAAO,IAAI,CAAC,WAAW,aAAa;IACnC,cAAc;IACd,WAAW,KAAK;GACjB;EACD,CAAC;EAGD,MAAM,gBAAgB,SAAS;GAC9B,WAAW,MAAM;GACjB,MAAM,UAAmB;IACxB,IAAI,OACH,kBAAkB,aAAa,MAAM;SAC/B;KACN,gBAAgB;KAChB,gBAAgB,KAAA;IACjB;GACD;EACD,CAAC;EAED,MAAM,gBAAgB,OAAO,oBAAgD;GAC5E,IAAI,UAAU;GACd,MAAM,OAAO,aAAa,MAAM;GAChC,IAAI;IACH,MAAM,qBAAqB,eAAe;GAC3C,UAAU;IACT,KAAK;GACN;EACD;EAEA,MAAM,eAAe,UAAsB;GAC1C,IAAI,UAAU;GACd,IAAI,MAAM,iBACT,KAAK,SAAS,KAAK;QAGnB,KAAK,SAAS,OADD,aAAa,MACL,CAAI;EAE3B;EAGA,MACC,OAAO,MAAM,eAAe,MAAM,eAAe,IAChD,CAAC,SAAS,qBAAqB;GAC/B,IAAI,WAAW,CAAC,iBACf,oBAAoB,aAAa,MAAM;QACjC;IACN,kBAAkB;IAClB,kBAAkB,KAAA;GACnB;EACD,GACA,EAAE,WAAW,KAAK,CACnB;EACA,sBAAsB;GACrB,WAAW;GACX,aAAa,QAAQ;EACtB,CAAC;EAGD,MAAM,gBAAgB,SAAS,OAAO,aAAa,CAAC,SAAS,CAAC;EAE9D,gBAAU,YAAA,UAAA,WAEJ,cAAc,OAAK;GAAA,OAClB;GAAS,SAAA;GAAA,WAEL,MAAM;GAAO,WACb,eAAe,UAAiB,YAAY,KAAmB,GAAG,CAAC,SAAS,CAAC;EAAC,CAAA,GAAA;GAGtF,eAAe,MAAM,UAAU;GAC/B,GAAI,MAAM,WAAW,EAAE,eAAe,MAAM,UAAU,KAAK,CAAA,EAAG;GAC9D,GAAI,MAAM,QAAQ,EAAE,YAAY,MAAM,OAAO,KAAK,CAAA,EAAG;EAAE,CAAA,CAGzD;EAED,OAAO,UAAU,QAAQ;;GAExB,KAAK,eAAe,UAAU,OAAO,GAAG;;GAExC,MAAM,eAAe,UAAU,OAAO,IAAI;;GAE1C,MAAM,eAAe,UAAU,OAAO,IAAI;;GAE1C,UAAU,eAAe,UAAU,OAAO,QAAQ;;GAElD,gBAAgB,eAAe,UAAU,OAAO,cAAc;;GAE9D,SAAS;;GAET,WAAW;EACZ,CAAC;CACF;AACD,CAAC"}