You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

785 regels
27 KiB

  1. <template>
  2. <Layout>
  3. <BRow>
  4. <BCol sm="12">
  5. <BCard no-body>
  6. <BCardHeader>
  7. <div class="d-flex justify-content-between align-items-center">
  8. <h5>ایجاد بنر</h5>
  9. <!-- Help and Modal buttons -->
  10. <div>
  11. <button
  12. v-if="pageType === 'main_page'"
  13. data-bs-toggle="modal"
  14. data-bs-target="#mainPageBanner"
  15. class="btn btn-info btn-sm mx-2"
  16. @click="showHelp"
  17. >
  18. <i class="fa fa-question-circle"></i> راهنمایی بنر صفحه اصلی
  19. </button>
  20. <button
  21. data-bs-toggle="modal"
  22. data-bs-target="#catBanner"
  23. class="btn btn-info btn-sm mx-2"
  24. @click="showModal"
  25. v-if="pageType === 'category'"
  26. >
  27. <i class="fa fa-info-circle"></i> راهنمایی بنر دسته ها
  28. </button>
  29. <button
  30. data-bs-toggle="modal"
  31. data-bs-target="#specialPageBanner"
  32. class="btn btn-info btn-sm mx-2"
  33. @click="showModal"
  34. v-if="pageType === 'special_page'"
  35. >
  36. <i class="fa fa-info-circle"></i> راهنمایی بنر فروش ویژه
  37. </button>
  38. <button
  39. v-if="pageType === 'brand'"
  40. data-bs-toggle="modal"
  41. data-bs-target="#brandBanner"
  42. class="btn btn-info btn-sm mx-2"
  43. @click="showModal"
  44. >
  45. <i class="fa fa-info-circle"></i> راهنمایی بنر برند
  46. </button>
  47. <button
  48. data-bs-toggle="modal"
  49. data-bs-target="#specialPageBanner"
  50. class="btn btn-info btn-sm mx-2"
  51. @click="showModal"
  52. v-if="pageType === 'blog_page'"
  53. >
  54. <i class="fa fa-info-circle"></i> راهنمایی بنر بلاگ
  55. </button>
  56. </div>
  57. </div>
  58. </BCardHeader>
  59. <BCardBody>
  60. <BRow class="g-3">
  61. <BCol md="6">
  62. <div class="form-group">
  63. <label class="form-label">عنوان</label>
  64. <input
  65. type="text"
  66. v-model="title"
  67. class="form-control"
  68. placeholder="عنوان بنر"
  69. :class="{ 'is-invalid': errors.title }"
  70. @input="clearError('title')"
  71. />
  72. </div>
  73. <small v-if="errors.title" class="text-danger">
  74. {{ errors.title }}
  75. </small>
  76. </BCol>
  77. <BCol md="6">
  78. <div class="form-group">
  79. <label class="form-label">پنل نمایش</label>
  80. <select
  81. class="form-select"
  82. aria-label="Default select example"
  83. v-model="pannel"
  84. @change="clearError('pannel')"
  85. :class="{ 'is-invalid': errors.pannel }"
  86. placeholder="انتخاب پنل"
  87. >
  88. <option value="wholesale">پنل عمده فروشی</option>
  89. <option value="web">وب سایت و اپلیکیشن</option>
  90. </select>
  91. </div>
  92. <small v-if="errors.pannel" class="text-danger">
  93. {{ errors.pannel }}
  94. </small>
  95. </BCol>
  96. <BCol v-if="pannel === 'web'" md="6">
  97. <div class="form-group">
  98. <label class="form-label">نمایش در</label>
  99. <select
  100. v-model="pageType"
  101. :class="{ 'is-invalid': errors.pageType }"
  102. class="form-select"
  103. aria-label="Default select example"
  104. placeholder="انتخاب صفحه"
  105. @change="clearError('pageType')"
  106. >
  107. <option value="main_page">صفحه اصلی</option>
  108. <option value="category">صفحه دسته</option>
  109. <option value="special_page">صفحه فروش ویژه</option>
  110. <option value="brand">صفحه برند</option>
  111. <option value="blog_page">صفحه بلاگ</option>
  112. </select>
  113. </div>
  114. <small v-if="errors.pageType" class="text-danger">
  115. {{ errors.pageType }}
  116. </small>
  117. </BCol>
  118. <BCol v-if="pageType === 'category' && pannel === 'web'" md="6">
  119. <div class="form-group">
  120. <label class="form-label">صفحه دسته</label>
  121. <VueSelect
  122. style="--vs-min-height: 48px; --vs-border-radius: 8px"
  123. v-model="selectedCatPage"
  124. :isLoading="categoryPageSelectorLoader"
  125. :options="formattedCategoriesPages"
  126. @change="clearError('selectedCatPage')"
  127. placeholder="دسته ای را انتخاب کنید"
  128. @search="handleCategoryPageSearch"
  129. />
  130. </div>
  131. <small v-if="errors.selectedCatPage" class="text-danger">
  132. {{ errors.selectedCatPage }}
  133. </small>
  134. </BCol>
  135. <BCol v-if="pageType === 'brand' && pannel === 'web'" md="6">
  136. <div class="form-group">
  137. <label class="form-label">صفحه برند</label>
  138. <VueSelect
  139. style="--vs-min-height: 48px; --vs-border-radius: 8px"
  140. v-model="selectedBrandPage"
  141. :isLoading="brandSelectorLoader"
  142. :options="formattedBrands"
  143. @change="clearError(`selectedBrandPage`)"
  144. placeholder="برندی را انتخاب کنید"
  145. @search="handleBrandSearch"
  146. />
  147. </div>
  148. <small v-if="errors.selectedBrandPage" class="text-danger">
  149. {{ errors.selectedBrandPage }}
  150. </small>
  151. </BCol>
  152. <BCol v-if="pannel != 'wholesale' && pannel" md="6">
  153. <div class="form-group">
  154. <label class="form-label">انتخاب صفحه فرود</label>
  155. <select
  156. class="form-select"
  157. aria-label="Default select example"
  158. v-model="landingType"
  159. @change="clearError('landingType')"
  160. :class="{ 'is-invalid': errors.landingType }"
  161. placeholder="انتخاب صفحه فرود"
  162. >
  163. <option value="product">صفحه محصولات</option>
  164. <option value="cat">صفحه دسته ها</option>
  165. </select>
  166. </div>
  167. <small v-if="errors.landingType" class="text-danger">
  168. {{ errors.landingType }}
  169. </small>
  170. </BCol>
  171. <BCol
  172. v-if="landingType === 'product'"
  173. sm="6"
  174. class="mt-3"
  175. style="margin-top: 30px"
  176. >
  177. <label for="token">صفحه کدام محصول</label>
  178. <VueSelect
  179. style="
  180. --vs-min-height: 48px;
  181. --vs-border-radius: 8px;
  182. margin-top: 7px;
  183. "
  184. v-model="selectedLandingProduct"
  185. :isLoading="productSelectorLoader"
  186. @change="clearError(`selectedLandingProduct`)"
  187. :options="formattedProducts"
  188. placeholder="محصولی را انتخاب کنید"
  189. @search="handleSearch"
  190. />
  191. <small v-if="errors.selectedLandingProduct" class="text-danger">
  192. {{ errors.selectedLandingProduct }}
  193. </small>
  194. </BCol>
  195. <BCol v-if="landingType === 'cat'" md="6">
  196. <div class="form-group">
  197. <label class="form-label">صفحه کدام دسته</label>
  198. <VueSelect
  199. style="--vs-min-height: 48px; --vs-border-radius: 8px"
  200. v-model="selectedLandingCat"
  201. @change="clearError('selectedLandingCat')"
  202. :isLoading="categorySelectorLoader"
  203. :options="formattedCategories"
  204. placeholder="دسته ای را انتخاب کنید"
  205. @search="handleCategorySearch"
  206. />
  207. </div>
  208. <small v-if="errors.selectedLandingCat" class="text-danger">
  209. {{ errors.selectedLandingCat }}
  210. </small>
  211. </BCol>
  212. <BCol v-if="pageType === 'main_page' && pannel === 'web'" md="6">
  213. <div class="form-group">
  214. <label class="form-label">موقعیت در صفحه اصلی</label>
  215. <select
  216. class="form-select"
  217. aria-label="Default select example"
  218. v-model="selectedLoc"
  219. @change="clearError('selectedLoc')"
  220. :class="{ 'is-invalid': errors.selectedLoc }"
  221. placeholder="موقعیت بنر"
  222. >
  223. <option value="A">َA-Slideshow</option>
  224. <option value="B">B-Banner</option>
  225. <option value="C">C-Banner</option>
  226. <option value="D">D-Banner</option>
  227. <option value="E">E-Banner</option>
  228. <option value="F">F-Banner</option>
  229. <option value="G">G-Banner</option>
  230. <option value="H">H-Banner</option>
  231. <option value="I">I-Banner</option>
  232. <option value="J">J-Banner</option>
  233. </select>
  234. </div>
  235. <small v-if="errors.selectedLoc" class="text-danger">
  236. {{ errors.selectedLoc }}
  237. </small>
  238. </BCol>
  239. <BCol v-if="pageType === 'category' && pannel === 'web'" md="6">
  240. <div class="form-group">
  241. <label class="form-label">موقعیت در صفحه دسته ها</label>
  242. <select
  243. class="form-select"
  244. aria-label="Default select example"
  245. v-model="selectedLoc"
  246. @change="clearError('selectedLoc')"
  247. :class="{ 'is-invalid': errors.selectedLoc }"
  248. placeholder="موقعیت بنر"
  249. >
  250. <option value="A">َA-Slideshow</option>
  251. <option value="B">B-Banner</option>
  252. <option value="C">C-Banner</option>
  253. <option value="D">D-Banner</option>
  254. <option value="E">E-Banner</option>
  255. <option value="F">F-Banner</option>
  256. <option value="G">G-Banner</option>
  257. <option value="H">H-Banner</option>
  258. <option value="I">I-Banner</option>
  259. </select>
  260. </div>
  261. <small v-if="errors.selectedLoc" class="text-danger">
  262. {{ errors.selectedLoc }}
  263. </small>
  264. </BCol>
  265. <BCol
  266. v-if="pageType === 'special_page' && pannel === 'web'"
  267. md="6"
  268. >
  269. <div class="form-group">
  270. <label class="form-label">موقعیت در صفحه فروش ویژه</label>
  271. <select
  272. class="form-select"
  273. aria-label="Default select example"
  274. v-model="selectedLoc"
  275. @change="clearError('selectedLoc')"
  276. :class="{ 'is-invalid': errors.selectedLoc }"
  277. placeholder="موقعیت بنر"
  278. :value="(selectedLoc = 'A')"
  279. >
  280. <option value="A">A-Slideshow</option>
  281. </select>
  282. </div>
  283. <small v-if="errors.selectedLoc" class="text-danger">
  284. {{ errors.selectedLoc }}
  285. </small>
  286. </BCol>
  287. <BCol
  288. v-if="pageType === 'blog_page' && pannel === 'web'"
  289. md="6"
  290. >
  291. <div class="form-group">
  292. <label class="form-label">موقعیت در صفحه بلاگ</label>
  293. <select
  294. class="form-select"
  295. aria-label="Default select example"
  296. v-model="selectedLoc"
  297. @change="clearError('selectedLoc')"
  298. :class="{ 'is-invalid': errors.selectedLoc }"
  299. placeholder="موقعیت بنر"
  300. :value="(selectedLoc = 'A')"
  301. >
  302. <option value="A">A-Banner</option>
  303. </select>
  304. </div>
  305. <small v-if="errors.selectedLoc" class="text-danger">
  306. {{ errors.selectedLoc }}
  307. </small>
  308. </BCol>
  309. <BCol v-if="pageType === 'brand' && pannel === 'web'" md="6">
  310. <div class="form-group">
  311. <label class="form-label">موقعیت در صفحه برند</label>
  312. <select
  313. class="form-select"
  314. aria-label="Default select example"
  315. v-model="selectedLoc"
  316. @change="clearError('selectedLoc')"
  317. :class="{ 'is-invalid': errors.selectedLoc }"
  318. placeholder="موقعیت بنر"
  319. >
  320. <option value="A">َA-Slideshow</option>
  321. <option value="B">B-Banner</option>
  322. <option value="C">C-Banner</option>
  323. <option value="D">D-Banner</option>
  324. <option value="E">E-Banner</option>
  325. <option value="F">F-Banner</option>
  326. </select>
  327. </div>
  328. <small v-if="errors.selectedLoc" class="text-danger">
  329. {{ errors.selectedLoc }}
  330. </small>
  331. </BCol>
  332. <BCol md="6" v-if="pannel">
  333. <div class="form-group">
  334. <label class="form-label">تصویر بنر</label>
  335. <input
  336. type="file"
  337. accept="image/*"
  338. @change="handleImageUpload"
  339. class="form-control"
  340. :class="{ 'is-invalid': errors.image }"
  341. />
  342. <div v-if="imagePreview" class="mt-2">
  343. <img
  344. :src="imagePreview"
  345. alt="Image Preview"
  346. class="img-fluid rounded shadow-sm Image-Preview"
  347. />
  348. </div>
  349. <small v-if="errors.image" class="text-danger">
  350. {{ errors.image }}
  351. </small>
  352. </div>
  353. </BCol>
  354. </BRow>
  355. </BCardBody>
  356. <BCardFooter>
  357. <div class="d-flex justify-content-center">
  358. <div class="text-center">
  359. <button
  360. type="submit"
  361. class="btn btn-primary"
  362. @click.prevent="submitForm"
  363. :disabled="loading"
  364. >
  365. <span v-if="loading">
  366. <i class="fa fa-spinner fa-spin"></i> بارگذاری...
  367. </span>
  368. <span v-else>ایجاد</span>
  369. </button>
  370. </div>
  371. </div>
  372. </BCardFooter>
  373. </BCard>
  374. </BCol>
  375. </BRow>
  376. <mainPageBanner />
  377. <catBanner />
  378. <specialBanner/>
  379. <brandBanner/>
  380. </Layout>
  381. </template>
  382. <script>
  383. import VueSelect from "vue3-select-component";
  384. import catBanner from "@/components/modals/helperModals/catBanner.vue";
  385. import mainPageBanner from "@/components/modals/helperModals/mainPageBanner.vue";
  386. import specialBanner from "@/components/modals/helperModals/specialBanner.vue";
  387. import brandBanner from "@/components/modals/helperModals/brandBanner.vue";
  388. import { toast } from "vue3-toastify";
  389. import "vue3-toastify/dist/index.css";
  390. import ApiServiece from "@/services/ApiService";
  391. import { ref, computed } from "vue";
  392. import Layout from "@/layout/custom.vue";
  393. export default {
  394. name: "SAMPLE-PAGE",
  395. components: {
  396. Layout,
  397. mainPageBanner,
  398. catBanner,
  399. VueSelect,
  400. specialBanner,
  401. brandBanner
  402. },
  403. setup() {
  404. const title = ref();
  405. const pageType = ref();
  406. const products = ref([]);
  407. const cats = ref([]);
  408. const categoryPages = ref([]);
  409. const brands = ref([]);
  410. const landingType = ref();
  411. const selectedCatPage = ref();
  412. const selectedBrandPage = ref();
  413. const selectedLandingCat = ref();
  414. const selectedLandingProduct = ref();
  415. const selectedLoc = ref();
  416. const pannel = ref();
  417. const image = ref();
  418. const imagePreview = ref();
  419. const productSelectorLoader = ref(false);
  420. const categorySelectorLoader = ref(false);
  421. const categoryPageSelectorLoader = ref(false);
  422. const brandSelectorLoader = ref(false);
  423. const loading = ref(false);
  424. const errors = ref({});
  425. const handleSearch = async (searchTerm) => {
  426. if (searchTerm.length < 3) return;
  427. productSelectorLoader.value = true;
  428. try {
  429. const response = await ApiServiece.get(
  430. `admin/products?title=${searchTerm}`
  431. );
  432. products.value = response.data.data;
  433. console.log(products.value, "products");
  434. productSelectorLoader.value = false;
  435. } catch (error) {
  436. products.value = [];
  437. productSelectorLoader.value = false;
  438. }
  439. };
  440. const formattedBrands = computed(() =>
  441. Array.isArray(brands.value) // ✅ Check if products.value is an array
  442. ? brands.value.map((brand) => ({
  443. value: brand.id,
  444. label: brand.title,
  445. }))
  446. : []
  447. );
  448. const handleBrandSearch = async (searchTerm) => {
  449. if (searchTerm.length < 3) return;
  450. brandSelectorLoader.value = true;
  451. try {
  452. const response = await ApiServiece.get(
  453. `admin/brands?title=${searchTerm}`
  454. );
  455. brands.value = response.data.data;
  456. brandSelectorLoader.value = false;
  457. } catch (error) {
  458. brands.value = [];
  459. brandSelectorLoader.value = false;
  460. }
  461. };
  462. const formattedProducts = computed(() =>
  463. Array.isArray(products.value) // ✅ Check if products.value is an array
  464. ? products.value.map((product) => ({
  465. value: product.id,
  466. label: product.title,
  467. }))
  468. : []
  469. );
  470. const handleCategorySearch = async (searchTerm) => {
  471. if (searchTerm.length < 3) return;
  472. categorySelectorLoader.value = true;
  473. try {
  474. const response = await ApiServiece.get(
  475. `admin/categories?title=${searchTerm}`
  476. );
  477. cats.value = response.data.data;
  478. categorySelectorLoader.value = false;
  479. } catch (error) {
  480. cats.value = [];
  481. categorySelectorLoader.value = false;
  482. }
  483. };
  484. const formattedCategories = computed(() =>
  485. Array.isArray(cats.value)
  486. ? cats.value.map((cat) => ({
  487. value: cat.id,
  488. label: cat.title,
  489. }))
  490. : []
  491. );
  492. const handleCategoryPageSearch = async (searchTerm) => {
  493. if (searchTerm.length < 3) return;
  494. categoryPageSelectorLoader.value = true;
  495. try {
  496. const response = await ApiServiece.get(
  497. `admin/categories/parents?title=${searchTerm}`
  498. );
  499. categoryPages.value = response.data.data;
  500. categoryPageSelectorLoader.value = false;
  501. } catch (error) {
  502. categoryPages.value = [];
  503. categoryPageSelectorLoader.value = false;
  504. }
  505. };
  506. const formattedCategoriesPages = computed(() =>
  507. Array.isArray(categoryPages.value)
  508. ? categoryPages.value.map((categoryPage) => ({
  509. value: categoryPage.id,
  510. label: categoryPage.title,
  511. }))
  512. : []
  513. );
  514. const handleImageUpload = (event) => {
  515. const file = event.target.files[0];
  516. if (file) {
  517. errors.value.image = null;
  518. image.value = file;
  519. const reader = new FileReader();
  520. reader.onload = () => {
  521. imagePreview.value = reader.result;
  522. };
  523. reader.readAsDataURL(file);
  524. }
  525. };
  526. const validateForm = () => {
  527. errors.value = {};
  528. if (!title.value) errors.value.title = "وارد کردن عنوان بنر الزامی است";
  529. if (!pageType.value && pannel.value != "wholesale")
  530. errors.value.pageType = "مشخص کنید بنر کجا نشان داده شود";
  531. if (pageType.value === "category" && !selectedCatPage.value)
  532. errors.value.selectedCatPage = "صفحه دسته را انتخاب کنید";
  533. if (pageType.value === "brand" && !selectedBrandPage.value)
  534. errors.value.selectedBrandPage = "صفحه برند را انتخاب کنید";
  535. if (!landingType.value && pannel.value != "wholesale")
  536. errors.value.landingType = "صفحه فرود را انتخاب نمایید";
  537. if (
  538. landingType.value === "cat" &&
  539. !selectedLandingCat.value &&
  540. pannel.value != "wholesale"
  541. )
  542. errors.value.selectedLandingCat = "صفحه فرود دسته را انتخاب کنید";
  543. if (
  544. landingType.value === "product" &&
  545. !selectedLandingProduct.value &&
  546. pannel.value != "wholesale"
  547. )
  548. errors.value.selectedLandingProduct = "صفحه فرود محصول را انتخاب کنید";
  549. if (!selectedLoc.value && pannel.value != "wholesale")
  550. errors.value.selectedLoc = "موقعیت بنر را انتخاب کنید";
  551. if (!pannel.value) errors.value.pannel = "پنل نمایش بنر را انتخاب کنید";
  552. if (!image.value) errors.value.image = "عکس بنر را وارد نمایید";
  553. return Object.keys(errors.value).length === 0;
  554. };
  555. const clearError = (field) => {
  556. errors.value[field] = "";
  557. };
  558. const submitForm = () => {
  559. if (!validateForm()) {
  560. toast.error("لطفا فیلد های لازم را وارد نمایید", {
  561. position: "top-right",
  562. autoClose: 1000,
  563. });
  564. return;
  565. }
  566. loading.value = true;
  567. const formData = new FormData();
  568. formData.append("title", title.value);
  569. if (pageType.value === "category") {
  570. formData.append("page_id", selectedCatPage.value);
  571. }
  572. if (pageType.value === "brand") {
  573. formData.append("page_id", selectedBrandPage.value);
  574. }
  575. if (landingType.value === "product" && pannel.value != "wholesale") {
  576. formData.append("product_id", selectedLandingProduct.value);
  577. }
  578. if (landingType.value === "cat" && pannel.value != "wholesale") {
  579. formData.append("category_id", selectedLandingCat.value);
  580. }
  581. if (selectedLoc.value === "A") {
  582. formData.append("type", pageType.value === 'blog_page' ? "banner" :"slider");
  583. }
  584. if (selectedLoc.value !== "A") {
  585. formData.append("type", "banner");
  586. }
  587. if (pannel.value === "wholesale") {
  588. formData.append("type", "slider");
  589. formData.append("location", "A");
  590. }
  591. if (selectedLoc.value) {
  592. formData.append("location", selectedLoc.value);
  593. }
  594. formData.append("panel", pannel.value);
  595. if (pannel.value == "wholesale") {
  596. formData.append("page_type", "main_page");
  597. }
  598. if (pannel.value !== "wholesale") {
  599. formData.append("page_type", pageType.value);
  600. }
  601. formData.append("image", image.value);
  602. formData.append("sort", 1);
  603. ApiServiece.post(`admin/banners`, formData, {
  604. headers: {
  605. "content-type": "multipart",
  606. Authorization: `Bearer ${localStorage.getItem("token")}`,
  607. },
  608. })
  609. .then((resp) => {
  610. toast.success("!بنر با موفقیت اضافه شد", {
  611. position: "top-right",
  612. autoClose: 1000,
  613. });
  614. console.log(resp);
  615. loading.value = false;
  616. resetForm();
  617. })
  618. .catch((error) => {
  619. loading.value = false;
  620. console.log(error.response.message);
  621. toast.error(`${error.response.data.message}`, {
  622. position: "top-right",
  623. autoClose: 1000,
  624. });
  625. });
  626. };
  627. const resetForm = () => {
  628. title.value = "";
  629. selectedCatPage.value = "";
  630. selectedBrandPage.value = "";
  631. selectedLandingProduct.value = "";
  632. selectedLandingCat.value = "";
  633. selectedLoc.value = "";
  634. pannel.value = "";
  635. pageType.value = "";
  636. landingType.value = "";
  637. image.value = null;
  638. imagePreview.value = null;
  639. loading.value = false;
  640. };
  641. return {
  642. cats,
  643. errors,
  644. title,
  645. products,
  646. selectedCatPage,
  647. selectedBrandPage,
  648. submitForm,
  649. clearError,
  650. pageType,
  651. formattedProducts,
  652. landingType,
  653. selectedLandingCat,
  654. selectedLandingProduct,
  655. selectedLoc,
  656. pannel,
  657. handleImageUpload,
  658. image,
  659. imagePreview,
  660. loading,
  661. brands,
  662. handleSearch,
  663. productSelectorLoader,
  664. handleCategorySearch,
  665. categorySelectorLoader,
  666. formattedCategories,
  667. handleCategoryPageSearch,
  668. formattedCategoriesPages,
  669. categoryPageSelectorLoader,
  670. brandSelectorLoader,
  671. formattedBrands,
  672. handleBrandSearch,
  673. };
  674. },
  675. };
  676. </script>
  677. <style scoped>
  678. .ql-editor {
  679. direction: rtl;
  680. text-align: right;
  681. }
  682. .ql-editor::before {
  683. content: attr(placeholder);
  684. direction: rtl !important;
  685. text-align: right;
  686. }
  687. .Image-Preview {
  688. min-width: 200px;
  689. max-height: 200px;
  690. min-height: 200px;
  691. max-width: 200px;
  692. object-fit: cover;
  693. border-radius: 8px;
  694. border: 1px solid #ddd;
  695. }
  696. .delete-btn {
  697. display: flex;
  698. align-items: center;
  699. padding: 3px;
  700. font-size: 10px;
  701. background-color: #e74c3c;
  702. color: white;
  703. border: none;
  704. border-radius: 5px;
  705. cursor: pointer;
  706. transition: background-color 0.3s ease, transform 0.2s ease;
  707. gap: 8px;
  708. margin-right: 200px;
  709. }
  710. .delete-btn:hover {
  711. background-color: #c0392b;
  712. transform: scale(1.05);
  713. }
  714. .delete-btn:active {
  715. background-color: #a93226;
  716. }
  717. .delete-btn:focus {
  718. outline: none;
  719. }
  720. </style>