Add loading prop to button

This commit is contained in:
marzban-dev
2026-05-02 12:27:53 +03:30
parent dbd1879f7e
commit 83b368102d
+21 -6
View File
@@ -6,14 +6,16 @@ type Props = {
startIcon?: string; startIcon?: string;
endIcon?: string; endIcon?: string;
loading?: boolean; loading?: boolean;
disabled?: boolean;
}; };
// props // props
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
variant: "solid", variant: "solid",
size: "lg", size: "lg",
disabled: false,
}); });
const { variant, size, loading } = toRefs(props); const { variant, size, loading, disabled } = toRefs(props);
// computed // computed
const classes = computed(() => { const classes = computed(() => {
@@ -32,17 +34,30 @@ const classes = computed(() => {
"btn-md": size.value === "md", "btn-md": size.value === "md",
}, },
{ {
"pointer-events-none opacity-80 cursor-not-allowed": loading.value, "pointer-events-none cursor-not-allowed": loading.value || disabled.value,
}, },
]; ];
}); });
</script> </script>
<template> <template>
<button :class="classes" :disabled="loading"> <button
<Icon v-if="!loading && startIcon" :name="startIcon" /> :class="classes"
:disabled="loading || disabled"
>
<Icon
v-if="!loading && startIcon"
:name="startIcon"
/>
<slot v-if="!loading" /> <slot v-if="!loading" />
<Icon v-if="!loading && endIcon" :name="endIcon" /> <Icon
<Icon v-if="loading" name="ci:svg-spinners-3-dots-fade" class="my-0.5" /> v-if="!loading && endIcon"
:name="endIcon"
/>
<Icon
v-if="loading"
name="ci:svg-spinners-3-dots-fade"
class="my-0.5"
/>
</button> </button>
</template> </template>