Make bootstrap icons offline and add them to ci: prefix icons

This commit is contained in:
marzban-dev
2026-04-25 21:18:04 +03:30
parent fb3425fd0b
commit 83accfef52
76 changed files with 134 additions and 98 deletions
@@ -45,7 +45,7 @@ const emit = defineEmits<Emits>();
class="bg-blue-500 rounded-md p-0.5 text-center bottom-4 left-4 text-slate-200 text-[10px] lg:text-xs absolute"
>
<Icon
name="bi:check"
name="ci:bi-check"
size="20"
class="**:fill-white"
/>
@@ -127,7 +127,7 @@ const handleDeleteAddress = (id: number) => {
class="size-8 bg-slate-200/50 rounded-sm flex-center me-2 opacity-0 group-hover:opacity-100 transition-opacity"
>
<Icon
name="bi:trash"
name="ci:bi-trash"
class="**:fill-red-500"
/>
</button>
@@ -150,14 +150,14 @@ watch(
<Modal
v-model="isShow"
:title="!!address ? 'ویرایش آدرس' : 'افزودن آدرس'"
:icon="!!address ? 'bi:pen' : 'ci:plus'"
:icon="!!address ? 'ci:bi-pen' : 'ci:plus'"
:iconSize="!!address ? '20' : '32'"
contectClass="w-full max-lg:container lg:!w-[70vw]"
@close="closeModal"
>
<template #trigger>
<Button
:end-icon="!!address ? 'bi:pen' : 'ci:plus'"
:end-icon="!!address ? 'ci:bi-pen' : 'ci:plus'"
size="md"
class="rounded-full transition-all"
:variant="!!address ? 'ghost' : 'solid'"
@@ -49,7 +49,7 @@ const { data: cart, isLoading: cartIsLoading } = useGetCartOrders();
>
<span class="text-sm text-black"> مشاهده بیشتر </span>
<Icon
name="bi:chevron-down"
name="ci:bi-chevron-down"
class="**:stroke-black"
/>
</button>
+6 -6
View File
@@ -196,7 +196,7 @@ watch(
:class="deleteCartItemIsPending ? 'pointer-events-none' : ''"
>
<Icon
name="bi:plus"
name="ci:bi-plus"
class="**:stroke-slate-800"
/>
</button>
@@ -225,12 +225,12 @@ watch(
>
<Icon
v-if="counter == 1"
:name="deleteCartItemIsPending ? 'svg-spinners:3-dots-bounce' : 'bi:trash'"
:name="deleteCartItemIsPending ? 'svg-spinners:3-dots-bounce' : 'ci:bi-trash'"
class="**:fill-red-700"
/>
<Icon
v-else
name="bi:dash"
name="ci:bi-dash"
class="**:stroke-slate-800"
/>
</button>
@@ -262,7 +262,7 @@ watch(
:class="deleteCartItemIsPending ? 'pointer-events-none' : ''"
>
<Icon
name="bi:plus"
name="ci:bi-plus"
class="**:stroke-slate-800"
/>
</button>
@@ -291,12 +291,12 @@ watch(
>
<Icon
v-if="counter == 1"
:name="deleteCartItemIsPending ? 'svg-spinners:3-dots-bounce' : 'bi:trash'"
:name="deleteCartItemIsPending ? 'svg-spinners:3-dots-bounce' : 'ci:bi-trash'"
class="**:fill-red-700"
/>
<Icon
v-else
name="bi:dash"
name="ci:bi-dash"
class="**:stroke-slate-800"
/>
</button>
@@ -48,14 +48,14 @@ const handleSubmit = () => {
<Modal
v-model="isShow"
title="حذف اقلام"
icon="bi:trash"
icon="ci:bi-trash"
contectClass="!w-[90vw] lg:!w-[35vw]"
@close="isShow = false"
>
<template #trigger>
<Button
class="rounded-full shrink-0 whitespace-pre"
end-icon="bi:trash"
end-icon="ci:bi-trash"
size="md"
>
حذف همه
+1 -1
View File
@@ -122,7 +122,7 @@ const removeAttachment = (id: number) => {
:name="
loading
? 'svg-spinners:ring-resize'
: 'bi:file-earmark-arrow-down'
: 'ci:bi-file-earmark-arrow-down'
"
size="32"
:class="loading ? '' : ''"
+1 -1
View File
@@ -60,7 +60,7 @@ const megaMenuCategories = computed(() => {
@click="isSideDrawerOpen = true"
>
<Icon
name="humbleicons:bars"
name="ci:humbleicons-bars"
size="28"
/>
</button>
+1 -1
View File
@@ -72,7 +72,7 @@ const isShow = computed({
aria-label="Close"
>
<Icon
name="bi:x-lg"
name="ci:bi-x-lg"
class="**:fill-black"
/>
</DialogClose>
+4 -4
View File
@@ -43,7 +43,7 @@ const { isMobile } = useRatio();
class="w-9 h-9 flex items-center justify-center bg-transparent cursor-pointer hover:bg-slate-100 transition disabled:opacity-50 disabled:cursor-not-allowed rounded-lg"
>
<Icon
name="bi:chevron-double-right"
name="ci:bi-chevron-double-right"
class="**:fill-back"
size="18px"
/>
@@ -53,7 +53,7 @@ const { isMobile } = useRatio();
class="w-9 h-9 flex items-center justify-center bg-transparent cursor-pointer hover:bg-slate-100 transition disabled:opacity-50 disabled:cursor-not-allowed rounded-lg"
>
<Icon
name="bi:chevron-right"
name="ci:bi-chevron-right"
class="**:fill-back"
size="18px"
/>
@@ -82,7 +82,7 @@ const { isMobile } = useRatio();
class="w-9 h-9 flex items-center justify-center cursor-pointer hover:bg-slate-100 transition disabled:opacity-50 disabled:cursor-not-allowed rounded-lg"
>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
class="**:fill-back"
size="18px"
/>
@@ -92,7 +92,7 @@ const { isMobile } = useRatio();
class="w-9 h-9 flex items-center justify-center bg-transparent cursor-pointer hover:bg-slate-100 transition disabled:opacity-50 disabled:cursor-not-allowed rounded-lg"
>
<Icon
name="bi:chevron-double-left"
name="ci:bi-chevron-double-left"
class="**:fill-back"
size="18px"
/>
+2 -2
View File
@@ -72,7 +72,7 @@ const classes = computed(() => {
class="font-iran-yekan-x text-xs lg:text-sm text-start placeholder-slate-400 placeholder:text-xs lg:placeholder:text-sm"
/>
<Icon
:name="loading ? 'svg-spinners:3-dots-fade' : 'bi:chevron-down'"
:name="loading ? 'svg-spinners:3-dots-fade' : 'ci:bi-chevron-down'"
size="16"
/>
</SelectTrigger>
@@ -100,7 +100,7 @@ const classes = computed(() => {
class="absolute left-0 w-[25px] inline-flex items-center justify-center"
>
<Icon
name="bi:check"
name="ci:bi-check"
size="20"
/>
</SelectItemIndicator>
+5 -5
View File
@@ -78,7 +78,7 @@ watch(
<span class="text-xs"> {{ account.first_name }} {{ account.last_name }} </span>
</div>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
size="12"
class="**:stroke-black/50 opacity-70"
/>
@@ -105,7 +105,7 @@ watch(
<span class="text-xs"> ورود به حساب </span>
</div>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
size="12"
class="**:stroke-black/50 opacity-70"
/>
@@ -127,7 +127,7 @@ watch(
<span class="text-xs"> جست و جو </span>
</div>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
size="12"
class="**:stroke-black/50 opacity-70"
/>
@@ -146,7 +146,7 @@ watch(
<span class="text-xs"> سبد خرید </span>
</div>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
size="12"
class="**:stroke-black/50 opacity-70"
/>
@@ -176,7 +176,7 @@ watch(
<span class="text-xs"> {{ link.title }}</span>
</div>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
size="12"
class="**:stroke-black/50 opacity-70"
/>
+2 -2
View File
@@ -24,7 +24,7 @@ const profileDropdownItems = ref<DropdownItem[]>([
},
{
title: "خروج از حساب",
icon: "bi:arrow-bar-left",
icon: "ci:bi-arrow-bar-left",
itemClass: "!text-red-500",
iconClass: "**:stroke-red-500 **:fill-transparent",
onClick: () => {
@@ -99,7 +99,7 @@ const { data: account } = useGetAccount();
class="aspect-square rounded-sm size-7 flex-center"
>
<Icon
name="bi:pencil"
name="ci:bi-pencil"
class="**:fill-black"
size="14"
/>
+1 -1
View File
@@ -243,7 +243,7 @@ onUnmounted(() => {
class="transition-all cursor-pointer flex-center bg-white z-10 size-full rounded-full"
>
<Icon
:name="isMuted ? 'bi:volume-mute-fill' : 'bi:volume-up-fill'"
:name="isMuted ? 'ci:bi-volume-mute-fill' : 'ci:bi-volume-up-fill'"
class="text-black size-4 md:size-[18px] lg:size-[24px]"
/>
</button>
@@ -116,7 +116,7 @@ const limitedComments = computed(() => {
variant="primary"
@click="showMoreComments = !showMoreComments"
class="rounded-full px-8"
end-icon="bi:plus"
end-icon="ci:bi-plus"
>
نمایش همه
</Button>
@@ -99,7 +99,7 @@ watch(
<Icon
v-else
:class="product?.added_to_favorites ? '**:fill-blue-400' : ''"
:name="product?.added_to_favorites ? 'bi-bookmark-fill' : 'bi:bookmark'"
:name="product?.added_to_favorites ? 'bi-bookmark-fill' : 'ci:bi-bookmark'"
/>
</button>
</div>
@@ -165,7 +165,7 @@ watch(
<Icon
v-else
:class="product?.added_to_favorites ? '**:fill-blue-400' : ''"
:name="product?.added_to_favorites ? 'bi-bookmark-fill' : 'bi:bookmark'"
:name="product?.added_to_favorites ? 'bi-bookmark-fill' : 'ci:bi-bookmark'"
/>
</button>
</div>
@@ -322,7 +322,7 @@ watch(
<Button
variant="secondary"
class="w-full rounded-full h-full max-sm:h-[48px]"
end-icon="bi:percent"
end-icon="ci:bi-percent"
>
{{ selectedVariant?.special_discount_amount }}
تخفیف بگیر
@@ -331,7 +331,7 @@ watch(
<!-- <Button
variant="secondary"
class="w-full rounded-full h-full max-sm:h-[48px]"
end-icon="bi:person-check"
end-icon="ci:bi-person-check"
>
پورسانت بگیر
</Button> -->
@@ -32,7 +32,7 @@ defineProps<Props>();
class="text-white mb-1 px-3 py-1 bg-blue-500 text-xs rounded-full w-fit flex items-center justify-center gap-1"
>
<Icon
name="bi:percent"
name="ci:bi-percent"
class="size-3.5"
/>
<span class="mt-px">
@@ -17,7 +17,7 @@ const isSideShow = useState("side-modal-product-filters");
const currentCategory = computed({
get: () => {
return Array.isArray(slug.value) ? slug.value[1] ?? undefined : undefined;
return Array.isArray(slug.value) ? (slug.value[1] ?? undefined) : undefined;
},
set: (newValue) => {
isSideShow.value = false;
@@ -79,7 +79,7 @@ watch(
(newValue) => {
price_gte.value = newValue[0];
price_lte.value = newValue[1];
}
},
);
</script>
@@ -219,7 +219,7 @@ watch(
v-else
class="flex-center gap-3 text-sm"
>
بازنشانی به پیش فرض
بازنشانی فیلتر ها
<Icon
name="ci:close"
size="20"
@@ -43,7 +43,7 @@ const handleSubmit = () => {
<Modal
v-model="isShow"
title="خروج از حساب"
icon="bi:arrow-bar-right"
icon="ci:bi-arrow-bar-right"
contectClass="!w-[90vw] lg:!w-[35vw]"
@close="isShow = false"
>
@@ -21,7 +21,7 @@ const toggleSidebar = inject("toggleSidebar");
>
<div class="flex items-center w-full gap-3 lg:w-1/2">
<button class="flex-center lg:hidden" @click="toggleSidebar">
<Icon name="bi:chevron-right" size="18" class="**:fill-black" />
<Icon name="ci:bi-chevron-right" size="18" class="**:fill-black" />
</button>
<p class="font-semibold text-sm lg:text-lg text-black">
{{ title }}
@@ -19,35 +19,35 @@ const route = useRoute();
const profileLinks = ref([
{
icon: "bi:person-vcard",
icon: "ci:bi-person-vcard",
title: "پروفایل",
path: { name: "profile" },
},
{
icon: "bi:map",
icon: "ci:bi-map",
title: "آدرس ها",
path: { name: "profile-addresses" },
},
{
icon: "bi:cart",
icon: "ci:bi-cart",
title: "خرید ها و سفارش ها",
path: { name: "profile-purchases-and-orders" },
matchPattern: /^profile-purchases-and-orders/,
},
{
icon: "bi:bookmark",
icon: "ci:bi-bookmark",
title: "علاقه‌مندی ها",
path: { name: "profile-saved-products" },
matchPattern: /^profile-saved-products/,
},
{
icon: "bi:ticket",
icon: "ci:bi-ticket",
title: "تیکت ها",
path: { name: "profile-tickets" },
matchPattern: /^profile-ticket/,
},
{
icon: "bi:bell",
icon: "ci:bi-bell",
title: "اعلانات",
path: { name: "profile-notifications" },
},
@@ -127,7 +127,7 @@ const toggleSidebar = inject("toggleSidebar");
</span>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
class="transition-all"
/>
</NuxtLink>
@@ -140,7 +140,7 @@ const toggleSidebar = inject("toggleSidebar");
<span class="flex-center gap-3">
<div class="size-5 flex-center">
<Icon
name="bi:arrow-bar-right"
name="ci:bi-arrow-bar-right"
class="**:fill-danger-500"
/>
</div>
@@ -148,7 +148,7 @@ const toggleSidebar = inject("toggleSidebar");
</span>
<Icon
name="bi:chevron-left"
name="ci:bi-chevron-left"
class="transition-all **:fill-danger-500"
/>
</button>
@@ -95,14 +95,14 @@ const resetAvatarFile = async () => {
<Modal
v-model="visible"
title="عکس پروفایل"
icon="bi:image"
icon="ci:bi-image"
iconSize="20"
contectClass="w-full max-lg:container lg:!w-[30vw]"
>
<template #trigger>
<button class="bg-black text-slate-100 rounded-full p-2 flex-center absolute -bottom-0 -right-0">
<Icon
name="bi:pencil"
name="ci:bi-pencil"
class="**:fill-slate-100"
size="12"
/>
@@ -158,7 +158,7 @@ const resetAvatarFile = async () => {
>
<Icon
v-if="updateAccountIsPending"
name="bi:trash"
name="ci:bi-trash"
/>
<span v-else>حذف عکس</span>
</Button>
@@ -23,7 +23,7 @@ const { formatToPersian } = usePersianDate();
<div class="flex flex-col gap-2">
<div class="flex items-center gap-3">
<Icon
:name="data.notif_type == 'NEWS' ? 'bi:info-circle' : 'bi:bell'"
:name="data.notif_type == 'NEWS' ? 'ci:bi-info-circle' : 'ci:bi-bell'"
class="lg:text-lg"
/>
<h3 class="max-lg:text-sm font-semibold">{{ data.title }}</h3>
@@ -19,7 +19,7 @@ defineProps<Props>();
class="w-full flex items-center cursor-pointer p-2 gap-2 rounded-100 bg-slate-100 border border-slate-300"
>
<div class="size-10 flex-center border border-slate-300 rounded-md">
<Icon name="bi:pin-angle" class="**:fill-black" size="20" />
<Icon name="ci:bi-pin-angle" class="**:fill-black" size="20" />
</div>
<div class="flex flex-col gap-1">
<span class="text-sm line-clamp-1">
@@ -17,7 +17,7 @@ const isSideShow = useState("side-modal-resellers-product-filters");
const currentCategory = computed({
get: () => {
return Array.isArray(slug.value) ? slug.value[1] ?? undefined : undefined;
return Array.isArray(slug.value) ? (slug.value[1] ?? undefined) : undefined;
},
set: (newValue) => {
isSideShow.value = false;
@@ -69,7 +69,7 @@ watch(
(newValue) => {
price_gte.value = newValue[0];
price_lte.value = newValue[1];
}
},
);
</script>
@@ -210,7 +210,7 @@ watch(
v-else
class="flex-center gap-3 text-sm"
>
بازنشانی به پیش فرض
بازنشانی فیلتر ها
<Icon
name="ci:close"
size="20"