redesign news and radar

This commit is contained in:
Mohamad Mahdi Jebeli 2025-11-09 07:48:31 +03:30
parent 241a3d8f78
commit 1cabd1196a
47 changed files with 2213 additions and 775 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -0,0 +1,5 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<path d="M49.5 45.5C53.9183 45.5 57.5 41.9183 57.5 37.5C57.5 33.0817 53.9183 29.5 49.5 29.5C45.0817 29.5 41.5 33.0817 41.5 37.5C41.5 41.9183 45.0817 45.5 49.5 45.5Z" stroke="#007EA7" stroke-width="3"/>
<path d="M61.5 43.5C64.814 43.5 67.5 41.26 67.5 38.5C67.5 35.74 64.814 33.5 61.5 33.5M37.5 43.5C34.186 43.5 31.5 41.26 31.5 38.5C31.5 35.74 34.186 33.5 37.5 33.5M59.894 55.5C60.914 56.676 61.5 58.042 61.5 59.5C61.5 63.92 56.128 67.5 49.5 67.5C42.872 67.5 37.5 63.92 37.5 59.5C37.5 55.08 42.872 51.5 49.5 51.5C50.1813 51.5 50.848 51.5367 51.5 51.61M65.5 63.5C69.008 62.73 71.5 60.782 71.5 58.5C71.5 56.218 69.008 54.27 65.5 53.5M33.5 63.5C29.992 62.73 27.5 60.782 27.5 58.5C27.5 56.218 29.992 54.27 33.5 53.5" stroke="#007EA7" stroke-width="3" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,4 @@
<svg width="58" height="58" viewBox="0 0 58 58" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 14.2428C0.226563 13.1856 0.377604 12.0981 0.679688 11.0559C2.74896 4.04753 9.71198 -0.574345 16.9771 0.195968C23.7438 0.920968 29.0755 5.70899 30.5557 12.4001C30.5859 12.5663 30.6313 12.7324 30.6766 12.9288C33.7578 12.9288 36.8391 12.9288 39.9656 12.9288C40.0109 12.7928 40.0714 12.6418 40.1167 12.4757C40.9474 9.21316 43.8927 7.15899 47.3365 7.44597C50.3573 7.70274 53.0156 10.4215 53.2422 13.5027C53.4839 16.8106 51.3844 19.771 48.1974 20.5413C47.7896 20.647 47.7141 20.8132 47.7141 21.1908C47.7292 23.2751 47.7443 25.3746 47.7141 27.459C47.7141 27.897 47.85 28.0783 48.2427 28.2293C52.1094 29.8152 54.9036 32.5491 56.6104 36.3553C56.7313 36.6272 56.8521 36.9293 56.837 37.2163C56.8219 37.7298 56.5198 38.0923 56.0062 38.2434C55.5078 38.3793 55.1151 38.2132 54.813 37.8204C54.6922 37.6543 54.6167 37.4579 54.526 37.2767C52.2 31.9902 46.7323 28.7882 41.1286 29.4225C35.1927 30.1022 30.5406 34.3465 29.4833 40.1616C28.7281 44.3606 29.7854 48.1064 32.5948 51.3387C32.6401 51.3991 32.7005 51.4444 32.7458 51.5048C32.776 51.535 32.8063 51.5501 32.8969 51.6106C33.7276 49.5413 35.1776 48.1215 37.3375 47.4569C33.7427 43.4845 35.374 38.8022 37.851 36.7783C40.6302 34.4975 44.6781 34.6184 47.3516 37.1106C49.8135 39.4064 50.7651 43.8772 47.5026 47.4418C49.6474 48.1215 51.1276 49.5111 51.9583 51.6559C52.9854 50.6288 53.7406 49.4658 54.3448 48.2121C54.4958 47.91 54.6167 47.5928 54.7375 47.2757C55.0849 46.4147 55.6438 46.0824 56.3234 46.3543C56.988 46.6262 57.1844 47.2454 56.837 48.1215C55.6891 51.0668 53.8161 53.4382 51.2182 55.2507C49.0734 56.746 46.7021 57.6371 44.1042 57.909C43.9833 57.9241 43.8474 57.9694 43.7266 57.9996C42.8656 57.9996 41.9896 57.9996 41.1286 57.9996C41.0078 57.9694 40.8719 57.9241 40.751 57.909C34.8604 57.1236 30.6766 54.0121 28.2146 48.6048C27.7161 47.5173 27.4594 46.3392 27.0667 45.1762C24.0307 45.1762 20.9495 45.1762 17.8682 45.1762C17.8229 45.3574 17.7625 45.5236 17.7323 45.6897C16.9016 48.9069 13.926 50.946 10.5276 50.659C7.52187 50.4022 4.90885 47.7439 4.63698 44.6626C4.35 41.385 6.46458 38.3642 9.63646 37.5788C10.1047 37.4731 10.1802 37.2767 10.1802 36.8689C10.1651 34.8298 10.15 32.8059 10.1802 30.7668C10.1953 30.2835 10.0443 30.0569 9.59115 29.8606C5.22604 28.0027 2.23542 24.8309 0.755208 20.3147C0.392708 19.1819 0.241667 18.0038 0 16.8408C0 15.9798 0 15.1189 0 14.2428ZM12.4458 37.4277C15.3911 38.1225 17.1885 39.935 17.8833 42.8501C20.9193 42.8501 23.925 42.8501 26.9609 42.8501C26.9911 37.9564 28.7885 33.8632 32.5193 30.7215C36.25 27.5798 40.6151 26.5829 45.4333 27.3684C45.4333 25.1934 45.4484 23.0788 45.4182 20.9642C45.4182 20.8283 45.1766 20.6168 45.0104 20.5715C42.8958 19.9975 41.3703 18.7288 40.4641 16.7501C40.2526 16.2819 40.1167 15.7684 39.9505 15.2548C36.9448 15.2548 33.9391 15.2548 30.888 15.2548C30.8427 20.1486 29.0755 24.2418 25.3297 27.3835C21.5839 30.5251 17.2339 31.522 12.4307 30.7366C12.4458 32.9871 12.4458 35.1772 12.4458 37.4277ZM24.9974 24.5741C29.3021 20.4053 30.3443 12.1283 25.0125 6.50951C19.7109 0.890759 10.7844 1.01159 5.63385 6.76628C0.438021 12.5965 1.8125 20.6923 5.93594 24.6043C6.75156 22.5048 8.23177 21.1303 10.3766 20.4356C7.15937 16.9465 7.9599 12.4303 10.588 10.0288C13.3068 7.53659 17.4604 7.50638 20.2094 9.95326C22.913 12.3548 23.7286 16.9767 20.5266 20.4053C23.2604 21.7194 23.2604 21.7194 24.9974 24.5741ZM20.3604 15.3454C20.3755 12.6418 18.2005 10.4366 15.512 10.4064C12.7932 10.3762 10.5578 12.5663 10.5427 15.285C10.5276 17.9736 12.7479 20.2241 15.4516 20.2392C18.125 20.2241 20.3453 18.0189 20.3604 15.3454ZM42.4578 37.3975C39.7542 37.3975 37.549 39.5574 37.5339 42.2611C37.5188 44.9798 39.7089 47.2001 42.4276 47.2152C45.1313 47.2303 47.3667 44.9949 47.3516 42.2913C47.3516 39.5876 45.1464 37.3975 42.4578 37.3975ZM15.4516 22.4897C14.3036 22.4897 13.1557 22.4595 12.0078 22.4897C10.0594 22.535 8.39792 23.9095 7.94479 25.8126C7.85417 26.1902 7.92969 26.4319 8.29219 26.6434C13.0651 29.4829 17.8229 29.4829 22.5958 26.6434C22.9885 26.4168 23.0188 26.1449 22.9281 25.7673C22.5052 23.9397 20.8286 22.535 18.9406 22.4897C17.7927 22.4746 16.6146 22.4897 15.4516 22.4897ZM42.488 49.496C41.2042 49.5111 39.9203 49.4507 38.6516 49.5262C36.8693 49.6319 35.2682 51.1272 34.9208 52.8793C34.8604 53.2267 34.9359 53.4231 35.238 53.6194C39.437 56.4439 45.4031 56.4439 49.6323 53.6194C49.9344 53.4231 50.0099 53.2116 49.9344 52.8793C49.5568 51.0668 47.9406 49.6168 46.0828 49.5262C44.9047 49.4507 43.6964 49.496 42.488 49.496ZM46.5813 9.69649C44.1344 9.69649 42.1708 11.6751 42.1708 14.122C42.1859 16.5236 44.1495 18.5022 46.5661 18.5173C48.9828 18.5324 50.9917 16.5387 50.9917 14.1069C50.9917 11.66 49.0281 9.69649 46.5813 9.69649ZM11.2979 48.4236C13.7448 48.4236 15.7234 46.4449 15.7083 44.0132C15.7083 41.6116 13.7297 39.6329 11.3281 39.6027C8.91146 39.5725 6.9026 41.5663 6.8875 43.9981C6.8875 46.4449 8.85104 48.4085 11.2979 48.4236Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M57.8792 42.306C57.8641 42.895 57.3506 43.4086 56.7464 43.4086C56.1271 43.4086 55.5985 42.8648 55.6287 42.2456C55.6438 41.6263 56.1875 41.1127 56.8068 41.1581C57.411 41.1883 57.8943 41.7169 57.8792 42.306Z" fill="#007EA7"/>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,15 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<path d="M65.5 44.7C65.5 36.7 62.3 33.5 54.3 33.5H44.7C36.7 33.5 33.5 36.7 33.5 44.7V54.3C33.5 62.3 36.7 65.5 44.7 65.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M58.2 41.5C57.1 40.1 55.26 39.5 52.5 39.5H46.5C41.5 39.5 39.5 41.5 39.5 46.5V52.5C39.5 55.26 40.1 57.1 41.48 58.2" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M41.52 33.5V29.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M49.5 33.5V29.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M57.5 33.5V29.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M65.5 41.5H69.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M41.52 65.5V69.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M29.5 41.5H33.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M29.5 49.5H33.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M29.5 57.5H33.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M58.92 62.6803C60.6763 62.6803 62.1 61.2566 62.1 59.5003C62.1 57.744 60.6763 56.3203 58.92 56.3203C57.1637 56.3203 55.74 57.744 55.74 59.5003C55.74 61.2566 57.1637 62.6803 58.92 62.6803Z" stroke="#007EA7" stroke-width="2.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M48.3199 60.4201V58.5601C48.3199 57.4601 49.2199 56.5601 50.3199 56.5601C52.2399 56.5601 53.0199 55.2001 52.0599 53.5401C51.4999 52.5801 51.8399 51.3401 52.7999 50.8001L54.6199 49.7401C55.4599 49.2401 56.5399 49.5401 57.0399 50.3801L57.1599 50.5801C58.1199 52.2401 59.6799 52.2401 60.6399 50.5801L60.7599 50.3801C61.2599 49.5401 62.3399 49.2601 63.1799 49.7401L64.9999 50.8001C65.9599 51.3601 66.2999 52.5801 65.7399 53.5401C64.7799 55.2001 65.5599 56.5601 67.4799 56.5601C68.5799 56.5601 69.4799 57.4601 69.4799 58.5601V60.4201C69.4799 61.5201 68.5799 62.4201 67.4799 62.4201C65.5599 62.4201 64.7799 63.7801 65.7399 65.4401C66.2999 66.4001 65.9599 67.6401 64.9999 68.1801L63.1799 69.2401C62.3399 69.7401 61.2599 69.4401 60.7599 68.6001L60.6399 68.4001C59.6799 66.7401 58.1199 66.7401 57.1599 68.4001L57.0399 68.6001C56.5399 69.4401 55.4599 69.7201 54.6199 69.2401L52.7999 68.1801C51.8399 67.6201 51.4999 66.4001 52.0599 65.4401C53.0199 63.7801 52.2399 62.4201 50.3199 62.4201C49.2199 62.4401 48.3199 61.5401 48.3199 60.4201Z" stroke="#007EA7" stroke-width="2.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,5 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<path d="M62.5 58.4999H52.5M62.5 63.4999H52.5M65 39.4999H54M48.5 29.4999C45.739 28.2469 42.346 28.0889 38.5 29.4999C34.654 30.9109 31.261 30.7529 28.5 29.4999M48.5 35.4999C45.739 34.2469 42.346 34.0889 38.5 35.4999C34.654 36.9109 31.261 36.7529 28.5 35.4999M28.5 53.4119C28.5 51.4269 29.237 49.5079 30.783 48.2639C33.013 46.4689 36.89 43.8279 42.481 41.6869C44.285 40.9949 46.169 42.3079 46.251 44.2379C46.331 46.1519 46.419 48.6629 46.465 51.4579H67.502C68.2973 51.4584 69.0599 51.7747 69.622 52.3373C70.1842 52.8998 70.5 53.6626 70.5 54.4579V60.9579C70.5 63.4839 70.341 65.4329 70.15 66.8649C69.89 68.8049 68.25 70.0929 66.294 70.1739C63.185 70.3029 57.722 70.4589 49.5 70.4589C41.278 70.4589 35.815 70.3029 32.706 70.1739C30.75 70.0929 29.109 68.8059 28.85 66.8649C28.66 65.4329 28.5 63.4839 28.5 60.9599V53.4119Z" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M44.462 70.48C44.484 69.468 44.5 68.165 44.5 66.5C44.5 64.1 44.467 62.45 44.429 61.343C44.383 60.016 43.709 58.833 42.396 58.63C41.7683 58.5386 41.1344 58.4952 40.5 58.5C39.732 58.5 39.108 58.552 38.604 58.63C37.291 58.833 36.617 60.016 36.571 61.343C36.5182 63.0615 36.4945 64.7807 36.5 66.5C36.5 68.092 36.514 69.353 36.535 70.345M52.5 51.5C53.0352 45.6822 53.6496 39.872 54.343 34.071C54.494 32.813 55.428 31.797 56.688 31.658C57.6218 31.5546 58.5605 31.5018 59.5 31.5C60.55 31.5 61.518 31.571 62.312 31.658C63.572 31.798 64.506 32.813 64.657 34.071C65.3505 39.872 65.9649 45.6822 66.5 51.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -0,0 +1,12 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<g clip-path="url(#clip0_11520_41128)">
<path d="M20.5 34.7428C20.7266 33.6856 20.8776 32.5981 21.1797 31.5559C23.249 24.5475 30.212 19.9257 37.4771 20.696C44.2438 21.421 49.5755 26.209 51.0557 32.9001C51.0859 33.0663 51.1313 33.2324 51.1766 33.4288C54.2578 33.4288 57.3391 33.4288 60.4656 33.4288C60.5109 33.2928 60.5714 33.1418 60.6167 32.9757C61.4474 29.7132 64.3927 27.659 67.8365 27.946C70.8573 28.2027 73.5156 30.9215 73.7422 34.0027C73.9839 37.3106 71.8844 40.271 68.6974 41.0413C68.2896 41.147 68.2141 41.3132 68.2141 41.6908C68.2292 43.7751 68.2443 45.8746 68.2141 47.959C68.2141 48.397 68.35 48.5783 68.7427 48.7293C72.6094 50.3152 75.4036 53.0491 77.1104 56.8553C77.2313 57.1272 77.3521 57.4293 77.337 57.7163C77.3219 58.2298 77.0198 58.5923 76.5062 58.7434C76.0078 58.8793 75.6151 58.7132 75.313 58.3204C75.1922 58.1543 75.1167 57.9579 75.026 57.7767C72.7 52.4902 67.2323 49.2882 61.6286 49.9225C55.6927 50.6022 51.0406 54.8465 49.9833 60.6616C49.2281 64.8606 50.2854 68.6064 53.0948 71.8387C53.1401 71.8991 53.2005 71.9444 53.2458 72.0048C53.276 72.035 53.3063 72.0501 53.3969 72.1106C54.2276 70.0413 55.6776 68.6215 57.8375 67.9569C54.2427 63.9845 55.874 59.3022 58.351 57.2783C61.1302 54.9975 65.1781 55.1184 67.8516 57.6106C70.3135 59.9064 71.2651 64.3772 68.0026 67.9418C70.1474 68.6215 71.6276 70.0111 72.4583 72.1559C73.4854 71.1288 74.2406 69.9658 74.8448 68.7121C74.9958 68.41 75.1167 68.0928 75.2375 67.7757C75.5849 66.9147 76.1438 66.5824 76.8234 66.8543C77.488 67.1262 77.6844 67.7454 77.337 68.6215C76.1891 71.5668 74.3161 73.9382 71.7182 75.7507C69.5734 77.246 67.2021 78.1371 64.6042 78.409C64.4833 78.4241 64.3474 78.4694 64.2266 78.4996C63.3656 78.4996 62.4896 78.4996 61.6286 78.4996C61.5078 78.4694 61.3719 78.4241 61.251 78.409C55.3604 77.6236 51.1766 74.5121 48.7146 69.1048C48.2161 68.0173 47.9594 66.8392 47.5667 65.6762C44.5307 65.6762 41.4495 65.6762 38.3682 65.6762C38.3229 65.8574 38.2625 66.0236 38.2323 66.1897C37.4016 69.4069 34.426 71.446 31.0276 71.159C28.0219 70.9022 25.4089 68.2439 25.137 65.1626C24.85 61.885 26.9646 58.8642 30.1365 58.0788C30.6047 57.9731 30.6802 57.7767 30.6802 57.3689C30.6651 55.3298 30.65 53.3059 30.6802 51.2668C30.6953 50.7835 30.5443 50.5569 30.0911 50.3606C25.726 48.5027 22.7354 45.3309 21.2552 40.8147C20.8927 39.6819 20.7417 38.5038 20.5 37.3408C20.5 36.4798 20.5 35.6189 20.5 34.7428ZM32.9458 57.9277C35.8911 58.6225 37.6885 60.435 38.3833 63.3501C41.4193 63.3501 44.425 63.3501 47.4609 63.3501C47.4911 58.4564 49.2885 54.3632 53.0193 51.2215C56.75 48.0798 61.1151 47.0829 65.9333 47.8684C65.9333 45.6934 65.9484 43.5788 65.9182 41.4642C65.9182 41.3283 65.6766 41.1168 65.5104 41.0715C63.3958 40.4975 61.8703 39.2288 60.9641 37.2501C60.7526 36.7819 60.6167 36.2684 60.4505 35.7548C57.4448 35.7548 54.4391 35.7548 51.388 35.7548C51.3427 40.6486 49.5755 44.7418 45.8297 47.8835C42.0839 51.0251 37.7339 52.022 32.9307 51.2366C32.9458 53.4871 32.9458 55.6772 32.9458 57.9277ZM45.4974 45.0741C49.8021 40.9053 50.8443 32.6283 45.5125 27.0095C40.2109 21.3908 31.2844 21.5116 26.1339 27.2663C20.938 33.0965 22.3125 41.1923 26.4359 45.1043C27.2516 43.0048 28.7318 41.6303 30.8766 40.9356C27.6594 37.4465 28.4599 32.9303 31.088 30.5288C33.8068 28.0366 37.9604 28.0064 40.7094 30.4533C43.413 32.8548 44.2286 37.4767 41.0266 40.9053C43.7604 42.2194 43.7604 42.2194 45.4974 45.0741ZM40.8604 35.8454C40.8755 33.1418 38.7005 30.9366 36.012 30.9064C33.2932 30.8762 31.0578 33.0663 31.0427 35.785C31.0276 38.4736 33.2479 40.7241 35.9516 40.7392C38.625 40.7241 40.8453 38.5189 40.8604 35.8454ZM62.9578 57.8975C60.2542 57.8975 58.049 60.0574 58.0339 62.7611C58.0188 65.4798 60.2089 67.7001 62.9276 67.7152C65.6313 67.7303 67.8667 65.4949 67.8516 62.7913C67.8516 60.0876 65.6464 57.8975 62.9578 57.8975ZM35.9516 42.9897C34.8036 42.9897 33.6557 42.9595 32.5078 42.9897C30.5594 43.035 28.8979 44.4095 28.4448 46.3126C28.3542 46.6902 28.4297 46.9319 28.7922 47.1434C33.5651 49.9829 38.3229 49.9829 43.0958 47.1434C43.4885 46.9168 43.5188 46.6449 43.4281 46.2673C43.0052 44.4397 41.3286 43.035 39.4406 42.9897C38.2927 42.9746 37.1146 42.9897 35.9516 42.9897ZM62.988 69.996C61.7042 70.0111 60.4203 69.9507 59.1516 70.0262C57.3693 70.1319 55.7682 71.6272 55.4208 73.3793C55.3604 73.7267 55.4359 73.9231 55.738 74.1194C59.937 76.9439 65.9031 76.9439 70.1323 74.1194C70.4344 73.9231 70.5099 73.7116 70.4344 73.3793C70.0568 71.5668 68.4406 70.1168 66.5828 70.0262C65.4047 69.9507 64.1964 69.996 62.988 69.996ZM67.0813 30.1965C64.6344 30.1965 62.6708 32.1751 62.6708 34.622C62.6859 37.0236 64.6495 39.0022 67.0661 39.0173C69.4828 39.0324 71.4917 37.0387 71.4917 34.6069C71.4917 32.16 69.5281 30.1965 67.0813 30.1965ZM31.7979 68.9236C34.2448 68.9236 36.2234 66.9449 36.2083 64.5132C36.2083 62.1116 34.2297 60.1329 31.8281 60.1027C29.4115 60.0725 27.4026 62.0663 27.3875 64.4981C27.3875 66.9449 29.351 68.9085 31.7979 68.9236Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M78.3792 62.806C78.3641 63.395 77.8506 63.9086 77.2464 63.9086C76.6271 63.9086 76.0985 63.3648 76.1287 62.7456C76.1438 62.1263 76.6875 61.6127 77.3068 61.6581C77.911 61.6883 78.3943 62.2169 78.3792 62.806Z" fill="#007EA7"/>
</g>
<defs>
<clipPath id="clip0_11520_41128">
<rect width="58" height="58" fill="white" transform="translate(20.5 20.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.0 KiB

View File

@ -0,0 +1,15 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<g clip-path="url(#clip0_11520_41098)">
<path d="M23.6167 48.583C28.2834 48.583 32.8834 48.583 37.5334 48.583C37.5834 49.5496 37.6334 50.5163 37.6834 51.483C37.7167 52.1496 38.1 52.5496 38.6667 52.5496C39.2834 52.5663 39.7 52.0663 39.6834 51.3163C39.65 49.7496 39.5667 48.1996 39.5834 46.633C39.6167 42.3996 40.05 38.2163 41.0334 34.083C41.1167 33.733 41.2167 33.5663 41.6334 33.5663C46.9834 33.583 52.3334 33.583 57.6667 33.583C57.7334 33.583 57.7834 33.5996 57.9667 33.6163C58.2334 34.9996 58.55 36.4163 58.7834 37.833C59.45 42.0496 59.6834 46.2996 59.4334 50.583C59.4167 50.8996 59.4 51.1996 59.4167 51.5163C59.4334 52.1163 59.8334 52.5163 60.3667 52.533C60.9334 52.5496 61.3834 52.133 61.4 51.5163C61.4334 50.5663 61.4 49.5996 61.4 48.5996C66.1334 48.5996 70.7334 48.5996 75.5 48.5996C75.3167 49.9663 75.2 51.3163 74.9334 52.6496C74.3167 55.9163 73.05 58.9163 71.25 61.7163C71.0834 61.983 70.8667 62.383 70.95 62.6163C71.0667 62.9496 71.3834 63.333 71.7167 63.4663C72.15 63.6663 72.55 63.3663 72.8167 62.9663C74.1 61.033 75.1334 58.983 75.8834 56.783C81.05 41.8996 73.0834 25.883 58.1167 20.983C42.1834 15.7663 25.0834 25.933 22.0834 42.433C20.7667 49.7163 22.1334 56.4663 26.0667 62.733C26.1334 62.833 26.2 62.9496 26.2667 63.0496C26.65 63.5663 27.2 63.6996 27.6834 63.3663C28.15 63.0496 28.2334 62.483 27.9334 61.933C27.2667 60.733 26.5334 59.5663 25.95 58.333C24.5334 55.3663 23.8334 52.2163 23.6167 48.9496C23.6167 48.8496 23.6167 48.733 23.6167 48.583ZM23.6167 46.5163C23.6167 46.3663 23.6167 46.233 23.6167 46.1163C23.9 41.783 25.1334 37.7663 27.3667 34.0496C27.5667 33.7163 27.7834 33.5663 28.2 33.5663C31.6334 33.583 35.0667 33.583 38.5 33.583C38.6834 33.583 38.8667 33.5996 39.1 33.6163C38.0834 37.8996 37.65 42.1996 37.55 46.533C32.8667 46.5163 28.2667 46.5163 23.6167 46.5163ZM59.9834 33.633C60.1334 33.5996 60.2 33.583 60.2667 33.583C63.8334 33.583 67.4167 33.5663 70.9834 33.5996C71.2 33.5996 71.5 33.8163 71.6334 34.0163C73 36.1996 74 38.533 74.6334 41.033C75.1 42.8163 75.4 44.633 75.4167 46.533C70.7667 46.533 66.1667 46.533 61.5167 46.533C61.4167 42.1663 61 37.883 59.9834 33.633ZM57.3334 31.5496C52.1 31.5496 46.95 31.5496 41.7334 31.5496C42.4667 29.1663 43.3667 26.9163 44.8 24.933C45.35 24.1663 45.9834 23.433 46.7 22.7996C48.45 21.2496 50.4167 21.233 52.2334 22.683C52.8334 23.1663 53.3667 23.733 53.8334 24.333C55.5167 26.4663 56.5167 28.9496 57.3334 31.5496ZM44.3667 22.233C41.9834 24.983 40.6834 28.2163 39.65 31.533C36.1334 31.533 32.6834 31.533 29.2 31.533C31.9167 27.3663 40.0334 22.383 44.3667 22.233ZM69.95 31.5496C69.75 31.5663 69.6667 31.583 69.6 31.583C66.35 31.583 63.1167 31.5663 59.8667 31.5996C59.4334 31.5996 59.3667 31.3663 59.2834 31.0663C58.2834 27.933 57.0334 24.9496 54.8834 22.4163C54.85 22.383 54.85 22.3163 54.8334 22.1663C60.95 23.533 65.9334 26.6163 69.95 31.5496Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M31.5834 66.5499C43.5667 66.5499 55.5 66.5499 67.5334 66.5499C67.5334 67.2832 67.55 68.0332 67.5167 68.7665C67.5167 68.9165 67.3 69.0832 67.1334 69.1832C65.85 69.9665 64.5834 70.7499 63.2834 71.4999C62.75 71.7999 62.5334 72.1999 62.5334 72.8165C62.55 74.6332 62.5334 76.4332 62.55 78.2499C62.55 79.0332 62.9167 79.4999 63.5334 79.4999C64.15 79.4999 64.5334 79.0499 64.5334 78.2665C64.5334 76.6832 64.5167 75.0999 64.55 73.5332C64.55 73.2999 64.7334 72.9832 64.9334 72.8665C66.2 72.0665 67.4834 71.2999 68.7834 70.5499C69.3167 70.2499 69.55 69.8499 69.55 69.2332C69.5167 68.0665 69.55 66.8999 69.5334 65.7332C69.5334 64.8832 69.1667 64.5332 68.3167 64.5332C55.8167 64.5332 43.3167 64.5332 30.8167 64.5332C29.9667 64.5332 29.6167 64.8999 29.6167 65.7499C29.6167 66.9165 29.6334 68.0832 29.6 69.2499C29.5834 69.8332 29.8167 70.2332 30.3167 70.5165C31.5834 71.2665 32.85 72.0499 34.1167 72.7832C34.5 72.9999 34.6167 73.2499 34.6 73.6665C34.5667 75.1832 34.5834 76.6999 34.5834 78.2165C34.5834 79.0332 34.9667 79.5165 35.6167 79.4999C36.2334 79.4832 36.5834 79.0332 36.5834 78.2332C36.5834 76.4499 36.5667 74.6499 36.6 72.8665C36.6167 72.2332 36.3834 71.8165 35.8334 71.4999C34.55 70.7665 33.3 69.9832 32.0334 69.2332C31.7 69.0499 31.5667 68.8165 31.6 68.4499C31.6 67.8332 31.5834 67.1999 31.5834 66.5499Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M49.5333 52.5497C53.9333 52.5497 57.5333 48.983 57.5333 44.5997C57.5333 40.1663 53.9667 36.5997 49.5333 36.583C45.1333 36.583 41.55 40.183 41.5667 44.633C41.5833 48.9663 45.2 52.5497 49.5333 52.5497ZM49.55 50.5497C46.2833 50.5497 43.5667 47.883 43.5667 44.633C43.55 41.2997 46.2333 38.583 49.55 38.583C52.8333 38.5663 55.5333 41.2663 55.5333 44.5663C55.55 47.8663 52.8667 50.5497 49.55 50.5497Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M50.65 53.5166C46.4167 53.5833 43.3 53.8333 40.35 54.9499C39.45 55.2833 38.5833 55.7833 37.7833 56.3333C36.9333 56.9166 36.5333 57.7833 36.5667 58.8666C36.6 60.0166 36.5667 61.1499 36.5833 62.2999C36.5833 63.0833 36.9667 63.5333 37.6 63.5333C38.2167 63.5166 38.5833 63.0666 38.5833 62.2833C38.5833 61.2166 38.6333 60.1666 38.5667 59.0999C38.5167 58.3666 38.85 57.9166 39.4167 57.5833C40.6833 56.8166 42.0667 56.3999 43.5 56.1333C48.1333 55.2666 52.7667 55.2833 57.3333 56.5833C58.2333 56.8333 59.0833 57.3333 59.9333 57.7666C60.3833 57.9999 60.5667 58.4166 60.55 58.9666C60.5167 60.0833 60.5333 61.2166 60.5333 62.3333C60.5333 63.0999 60.9333 63.5666 61.55 63.5499C62.15 63.5333 62.5167 63.0833 62.5167 62.3499C62.5167 61.2333 62.4833 60.0999 62.5333 58.9833C62.5833 57.7833 62.0833 56.8999 61.15 56.2166C59.6667 55.1166 57.9333 54.5499 56.15 54.2499C53.9833 53.8499 51.7667 53.6499 50.65 53.5166Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M39.9669 72.7666C39.7673 72.7666 39.65 72.7515 39.5157 72.7783L39.5128 72.7793C39.2822 72.8225 39.1195 72.9077 39.0157 73.0186C38.9153 73.126 38.8498 73.2787 38.8497 73.5C38.8497 73.7246 38.9132 73.8841 39.0128 73.998C39.1138 74.1135 39.2719 74.2035 39.4982 74.2539C39.6506 74.2811 39.7883 74.2666 40.0167 74.2666H59.0167C59.2314 74.2666 59.3907 74.283 59.5607 74.2676C59.989 74.2286 60.2696 73.9291 60.2833 73.5283C60.2809 73.1463 60.0155 72.8343 59.59 72.7812L59.589 72.7822C59.4549 72.7673 59.335 72.7666 59.1837 72.7666H39.9669Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
</g>
<defs>
<clipPath id="clip0_11520_41098">
<rect width="64" height="64" fill="white" transform="matrix(-1 0 0 1 81.5 17.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1,7 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<path d="M49.5 69.5C60.546 69.5 69.5 60.546 69.5 49.5C69.5 38.454 60.546 29.5 49.5 29.5C38.454 29.5 29.5 38.454 29.5 49.5C29.5 60.546 38.454 69.5 49.5 69.5Z" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M29.5 49.5H69.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M49.5 69.5C53.918 69.5 57.5 60.546 57.5 49.5C57.5 38.454 53.918 29.5 49.5 29.5C45.082 29.5 41.5 38.454 41.5 49.5C41.5 60.546 45.082 69.5 49.5 69.5Z" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M35.358 35.6416C37.2132 37.5014 39.4176 38.9764 41.8445 39.9817C44.2715 40.987 46.8731 41.5028 49.5 41.4996C52.1269 41.5028 54.7286 40.987 57.1555 39.9817C59.5825 38.9764 61.7869 37.5014 63.642 35.6416M63.642 63.3576C61.7869 61.4978 59.5825 60.0228 57.1555 59.0175C54.7286 58.0122 52.1269 57.4964 49.5 57.4996C46.8731 57.4964 44.2715 58.0122 41.8445 59.0175C39.4176 60.0228 37.2132 61.4978 35.358 63.3576" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,7 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.11669 31.083C10.7834 31.083 15.3834 31.083 20.0334 31.083C20.0834 32.0496 20.1334 33.0163 20.1834 33.983C20.2167 34.6496 20.6 35.0496 21.1667 35.0496C21.7834 35.0663 22.2 34.5663 22.1834 33.8163C22.15 32.2496 22.0667 30.6996 22.0834 29.133C22.1167 24.8996 22.55 20.7163 23.5334 16.583C23.6167 16.233 23.7167 16.0663 24.1334 16.0663C29.4834 16.083 34.8334 16.083 40.1667 16.083C40.2334 16.083 40.2834 16.0996 40.4667 16.1163C40.7334 17.4996 41.05 18.9163 41.2834 20.333C41.95 24.5496 42.1834 28.7996 41.9334 33.083C41.9167 33.3996 41.9 33.6996 41.9167 34.0163C41.9334 34.6163 42.3334 35.0163 42.8667 35.033C43.4334 35.0496 43.8834 34.633 43.9 34.0163C43.9334 33.0663 43.9 32.0996 43.9 31.0996C48.6334 31.0996 53.2334 31.0996 58 31.0996C57.8167 32.4663 57.7 33.8163 57.4334 35.1496C56.8167 38.4163 55.55 41.4163 53.75 44.2163C53.5834 44.483 53.3667 44.883 53.45 45.1163C53.5667 45.4496 53.8834 45.833 54.2167 45.9663C54.65 46.1663 55.05 45.8663 55.3167 45.4663C56.6 43.533 57.6334 41.483 58.3834 39.283C63.55 24.3996 55.5834 8.38296 40.6167 3.48296C24.6834 -1.73371 7.58336 8.43296 4.58336 24.933C3.26669 32.2163 4.63336 38.9663 8.56669 45.233C8.63336 45.333 8.70002 45.4496 8.76669 45.5496C9.15002 46.0663 9.70002 46.1996 10.1834 45.8663C10.65 45.5496 10.7334 44.983 10.4334 44.433C9.76669 43.233 9.03336 42.0663 8.45003 40.833C7.03336 37.8663 6.33336 34.7163 6.11669 31.4496C6.11669 31.3496 6.11669 31.233 6.11669 31.083ZM6.11669 29.0163C6.11669 28.8663 6.11669 28.733 6.11669 28.6163C6.40003 24.283 7.63336 20.2663 9.86669 16.5496C10.0667 16.2163 10.2834 16.0663 10.7 16.0663C14.1334 16.083 17.5667 16.083 21 16.083C21.1834 16.083 21.3667 16.0996 21.6 16.1163C20.5834 20.3996 20.15 24.6996 20.05 29.033C15.3667 29.0163 10.7667 29.0163 6.11669 29.0163ZM42.4834 16.133C42.6334 16.0996 42.7 16.083 42.7667 16.083C46.3334 16.083 49.9167 16.0663 53.4834 16.0996C53.7 16.0996 54 16.3163 54.1334 16.5163C55.5 18.6996 56.5 21.033 57.1334 23.533C57.6 25.3163 57.9 27.133 57.9167 29.033C53.2667 29.033 48.6667 29.033 44.0167 29.033C43.9167 24.6663 43.5 20.383 42.4834 16.133ZM39.8334 14.0496C34.6 14.0496 29.45 14.0496 24.2334 14.0496C24.9667 11.6663 25.8667 9.41629 27.3 7.43296C27.85 6.66629 28.4834 5.93296 29.2 5.29963C30.95 3.74963 32.9167 3.73296 34.7334 5.18296C35.3334 5.66629 35.8667 6.23296 36.3334 6.83296C38.0167 8.96629 39.0167 11.4496 39.8334 14.0496ZM26.8667 4.73296C24.4834 7.48296 23.1834 10.7163 22.15 14.033C18.6334 14.033 15.1834 14.033 11.7 14.033C14.4167 9.86629 22.5334 4.88296 26.8667 4.73296ZM52.45 14.0496C52.25 14.0663 52.1667 14.083 52.1 14.083C48.85 14.083 45.6167 14.0663 42.3667 14.0996C41.9334 14.0996 41.8667 13.8663 41.7834 13.5663C40.7834 10.433 39.5334 7.44963 37.3834 4.91629C37.35 4.88296 37.35 4.81629 37.3334 4.66629C43.45 6.03296 48.4334 9.11629 52.45 14.0496Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M14.0834 49.0499C26.0667 49.0499 38 49.0499 50.0334 49.0499C50.0334 49.7832 50.05 50.5332 50.0167 51.2665C50.0167 51.4165 49.8 51.5832 49.6334 51.6832C48.35 52.4665 47.0834 53.2499 45.7834 53.9999C45.25 54.2999 45.0334 54.6999 45.0334 55.3165C45.05 57.1332 45.0334 58.9332 45.05 60.7499C45.05 61.5332 45.4167 61.9999 46.0334 61.9999C46.65 61.9999 47.0334 61.5499 47.0334 60.7665C47.0334 59.1832 47.0167 57.5999 47.05 56.0332C47.05 55.7999 47.2334 55.4832 47.4334 55.3665C48.7 54.5665 49.9834 53.7999 51.2834 53.0499C51.8167 52.7499 52.05 52.3499 52.05 51.7332C52.0167 50.5665 52.05 49.3999 52.0334 48.2332C52.0334 47.3832 51.6667 47.0332 50.8167 47.0332C38.3167 47.0332 25.8167 47.0332 13.3167 47.0332C12.4667 47.0332 12.1167 47.3999 12.1167 48.2499C12.1167 49.4165 12.1334 50.5832 12.1 51.7499C12.0834 52.3332 12.3167 52.7332 12.8167 53.0165C14.0834 53.7665 15.35 54.5499 16.6167 55.2832C17 55.4999 17.1167 55.7499 17.1 56.1665C17.0667 57.6832 17.0834 59.1999 17.0834 60.7165C17.0834 61.5332 17.4667 62.0165 18.1167 61.9999C18.7334 61.9832 19.0834 61.5332 19.0834 60.7332C19.0834 58.9499 19.0667 57.1499 19.1 55.3665C19.1167 54.7332 18.8834 54.3165 18.3334 53.9999C17.05 53.2665 15.8 52.4832 14.5334 51.7332C14.2 51.5499 14.0667 51.3165 14.1 50.9499C14.1 50.3332 14.0834 49.6999 14.0834 49.0499Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M32.0333 35.0497C36.4333 35.0497 40.0333 31.483 40.0333 27.0997C40.0333 22.6663 36.4667 19.0997 32.0333 19.083C27.6333 19.083 24.05 22.683 24.0667 27.133C24.0833 31.4663 27.7 35.0497 32.0333 35.0497ZM32.05 33.0497C28.7833 33.0497 26.0667 30.383 26.0667 27.133C26.05 23.7997 28.7333 21.083 32.05 21.083C35.3333 21.0663 38.0333 23.7663 38.0333 27.0663C38.05 30.3663 35.3667 33.0497 32.05 33.0497Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M33.15 36.0166C28.9167 36.0833 25.8 36.3333 22.85 37.4499C21.95 37.7833 21.0833 38.2833 20.2833 38.8333C19.4333 39.4166 19.0333 40.2833 19.0667 41.3666C19.1 42.5166 19.0667 43.6499 19.0833 44.7999C19.0833 45.5833 19.4667 46.0333 20.1 46.0333C20.7167 46.0166 21.0833 45.5666 21.0833 44.7833C21.0833 43.7166 21.1333 42.6666 21.0667 41.5999C21.0167 40.8666 21.35 40.4166 21.9167 40.0833C23.1833 39.3166 24.5667 38.8999 26 38.6333C30.6333 37.7666 35.2667 37.7833 39.8333 39.0833C40.7333 39.3333 41.5833 39.8333 42.4333 40.2666C42.8833 40.4999 43.0667 40.9166 43.05 41.4666C43.0167 42.5833 43.0333 43.7166 43.0333 44.8333C43.0333 45.5999 43.4333 46.0666 44.05 46.0499C44.65 46.0333 45.0167 45.5833 45.0167 44.8499C45.0167 43.7333 44.9833 42.5999 45.0333 41.4833C45.0833 40.2833 44.5833 39.3999 43.65 38.7166C42.1667 37.6166 40.4333 37.0499 38.65 36.7499C36.4833 36.3499 34.2667 36.1499 33.15 36.0166Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
<path d="M22.4669 55.2666C22.2673 55.2666 22.15 55.2515 22.0157 55.2783L22.0128 55.2793C21.7822 55.3225 21.6195 55.4077 21.5157 55.5186C21.4153 55.626 21.3498 55.7787 21.3497 56C21.3497 56.2246 21.4132 56.3841 21.5128 56.498C21.6138 56.6135 21.7719 56.7035 21.9982 56.7539C22.1506 56.7811 22.2883 56.7666 22.5167 56.7666H41.5167C41.7314 56.7666 41.8907 56.783 42.0607 56.7676C42.489 56.7286 42.7696 56.4291 42.7833 56.0283C42.7809 55.6463 42.5155 55.3343 42.09 55.2812L42.089 55.2822C41.9549 55.2673 41.835 55.2666 41.6837 55.2666H22.4669Z" fill="#007EA7" stroke="#007EA7" stroke-width="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,12 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<g clip-path="url(#clip0_11520_41121)">
<path d="M40.5 70.5H58.5M46.12 70.5C46.12 70.5 46.849 67.227 46.98 59.687C45.9326 58.6794 44.8955 57.661 43.869 56.632C42.8047 55.5708 41.7519 54.4981 40.711 53.414C39.988 52.658 39.791 51.57 40.506 50.807C40.6243 50.6811 40.7467 50.559 40.873 50.441C41.635 49.725 42.723 49.923 43.479 50.646C44.6739 51.7925 45.855 52.9532 47.022 54.128C47.092 49.069 47.314 46.088 47.429 44.844C47.471 44.388 47.623 43.929 48.043 43.746C48.347 43.613 48.809 43.5 49.5 43.5C50.191 43.5 50.654 43.613 50.957 43.746C51.377 43.929 51.529 44.388 51.571 44.844C51.632 45.499 51.723 46.636 51.805 48.304L52.303 47.804C53.3642 46.7397 54.437 45.687 55.521 44.646C56.277 43.923 57.365 43.725 58.128 44.441C58.2539 44.559 58.376 44.6811 58.494 44.807C59.21 45.57 59.012 46.658 58.289 47.414C57.593 48.141 56.559 49.204 55.132 50.632C54.0899 51.6764 53.0369 52.7098 51.973 53.732C51.9903 54.828 51.9993 56.027 52 57.329C52 66.549 52.881 70.5 52.881 70.5" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M46.853 63.461C44.2364 63.3832 41.6237 63.2038 39.021 62.923C34.551 62.443 31.207 58.676 31.718 54.209C33.301 40.374 41.043 27.5 49.5 27.5C57.957 27.5 65.699 40.374 67.282 54.21C67.792 58.676 64.449 62.442 59.979 62.923C57.3763 63.2038 54.7637 63.3832 52.147 63.461" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_11520_41121">
<rect width="48" height="48" fill="white" transform="translate(25.5 25.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -0,0 +1,4 @@
<svg width="39" height="46" viewBox="0 0 39 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.0842 44.25H28.0842M15.7042 44.25C15.7042 44.25 16.4332 40.977 16.5642 33.437C15.5168 32.4294 14.4797 31.411 13.4532 30.382C12.3889 29.3208 11.3362 28.2481 10.2952 27.164C9.57222 26.408 9.37522 25.32 10.0902 24.557C10.2086 24.4311 10.331 24.309 10.4572 24.191C11.2192 23.475 12.3072 23.673 13.0632 24.396C14.2581 25.5425 15.4392 26.7032 16.6062 27.878C16.6762 22.819 16.8982 19.838 17.0132 18.594C17.0552 18.138 17.2072 17.679 17.6272 17.496C17.9312 17.363 18.3932 17.25 19.0842 17.25C19.7752 17.25 20.2382 17.363 20.5412 17.496C20.9612 17.679 21.1132 18.138 21.1552 18.594C21.2162 19.249 21.3072 20.386 21.3892 22.054L21.8872 21.554C22.9484 20.4897 24.0212 19.437 25.1052 18.396C25.8612 17.673 26.9492 17.475 27.7122 18.191C27.8381 18.309 27.9602 18.4311 28.0782 18.557C28.7942 19.32 28.5962 20.408 27.8732 21.164C27.1772 21.891 26.1432 22.954 24.7162 24.382C23.6741 25.4264 22.6211 26.4598 21.5572 27.482C21.5746 28.578 21.5836 29.777 21.5842 31.079C21.5842 40.299 22.4652 44.25 22.4652 44.25" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.4372 37.211C13.8206 37.1332 11.2079 36.9538 8.60524 36.673C4.13524 36.193 0.791236 32.426 1.30224 27.959C2.88524 14.124 10.6272 1.25 19.0842 1.25C27.5412 1.25 35.2832 14.124 36.8662 27.96C37.3762 32.426 34.0332 36.192 29.5632 36.673C26.9605 36.9538 24.3479 37.1332 21.7312 37.211" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,14 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M40 19.2C40 11.2 36.8 8 28.8 8H19.2C11.2 8 8 11.2 8 19.2V28.8C8 36.8 11.2 40 19.2 40" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32.7 16C31.6 14.6 29.76 14 27 14H21C16 14 14 16 14 21V27C14 29.76 14.6 31.6 15.98 32.7" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.02 8V4" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M24 8V4" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32 8V4" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M40 16H44" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.02 40V44" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 16H8" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 24H8" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 32H8" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M33.42 37.1803C35.1763 37.1803 36.6 35.7566 36.6 34.0003C36.6 32.244 35.1763 30.8203 33.42 30.8203C31.6637 30.8203 30.24 32.244 30.24 34.0003C30.24 35.7566 31.6637 37.1803 33.42 37.1803Z" stroke="#007EA7" stroke-width="2.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M22.8199 34.9201V33.0601C22.8199 31.9601 23.7199 31.0601 24.8199 31.0601C26.7399 31.0601 27.5199 29.7001 26.5599 28.0401C25.9999 27.0801 26.3399 25.8401 27.2999 25.3001L29.1199 24.2401C29.9599 23.7401 31.0399 24.0401 31.5399 24.8801L31.6599 25.0801C32.6199 26.7401 34.1799 26.7401 35.1399 25.0801L35.2599 24.8801C35.7599 24.0401 36.8399 23.7601 37.6799 24.2401L39.4999 25.3001C40.4599 25.8601 40.7999 27.0801 40.2399 28.0401C39.2799 29.7001 40.0599 31.0601 41.9799 31.0601C43.0799 31.0601 43.9799 31.9601 43.9799 33.0601V34.9201C43.9799 36.0201 43.0799 36.9201 41.9799 36.9201C40.0599 36.9201 39.2799 38.2801 40.2399 39.9401C40.7999 40.9001 40.4599 42.1401 39.4999 42.6801L37.6799 43.7401C36.8399 44.2401 35.7599 43.9401 35.2599 43.1001L35.1399 42.9001C34.1799 41.2401 32.6199 41.2401 31.6599 42.9001L31.5399 43.1001C31.0399 43.9401 29.9599 44.2201 29.1199 43.7401L27.2999 42.6801C26.3399 42.1201 25.9999 40.9001 26.5599 39.9401C27.5199 38.2801 26.7399 36.9201 24.8199 36.9201C23.7199 36.9401 22.8199 36.0401 22.8199 34.9201Z" stroke="#007EA7" stroke-width="2.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,4 @@
<svg width="37" height="39" viewBox="0 0 37 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.2309 20.2226C22.9322 19.3775 22.3788 18.6459 21.647 18.1284C20.9151 17.611 20.0408 17.3332 19.1445 17.3333V16.25H16.9779V17.3333C15.8286 17.3333 14.7264 17.7899 13.9137 18.6025C13.1011 19.4152 12.6445 20.5174 12.6445 21.6667C12.6445 22.8159 13.1011 23.9181 13.9137 24.7308C14.7264 25.5435 15.8286 26 16.9779 26V30.3333C16.0354 30.3333 15.2326 29.7321 14.9336 28.8892C14.8893 28.7514 14.8177 28.6238 14.7232 28.514C14.6286 28.4043 14.513 28.3146 14.3832 28.2503C14.2534 28.186 14.1121 28.1484 13.9675 28.1397C13.8229 28.1309 13.678 28.1513 13.5414 28.1996C13.4049 28.2478 13.2793 28.323 13.1723 28.4206C13.0653 28.5182 12.9789 28.6363 12.9183 28.7679C12.8577 28.8994 12.8242 29.0418 12.8195 29.1866C12.8149 29.3314 12.8394 29.4756 12.8915 29.6108C13.1902 30.4558 13.7436 31.1875 14.4754 31.7049C15.2073 32.2224 16.0816 32.5001 16.9779 32.5V33.5833H19.1445V32.5C20.2938 32.5 21.396 32.0435 22.2087 31.2308C23.0213 30.4181 23.4779 29.3159 23.4779 28.1667C23.4779 27.0174 23.0213 25.9152 22.2087 25.1025C21.396 24.2899 20.2938 23.8333 19.1445 23.8333V19.5C19.5926 19.4999 20.0297 19.6387 20.3956 19.8973C20.7615 20.1559 21.0383 20.5217 21.1877 20.9441C21.2834 21.215 21.4828 21.4369 21.742 21.5608C21.8704 21.6222 22.0096 21.6576 22.1516 21.6652C22.2937 21.6728 22.4359 21.6523 22.57 21.6049C22.7042 21.5575 22.8277 21.4842 22.9335 21.3891C23.0393 21.294 23.1254 21.179 23.1867 21.0506C23.2481 20.9223 23.2836 20.7831 23.2912 20.641C23.2987 20.4989 23.2782 20.3567 23.2309 20.2226ZM16.9779 19.5C16.4032 19.5 15.8521 19.7283 15.4458 20.1346C15.0395 20.5409 14.8112 21.092 14.8112 21.6667C14.8112 22.2413 15.0395 22.7924 15.4458 23.1987C15.8521 23.6051 16.4032 23.8333 16.9779 23.8333V19.5ZM19.1445 30.3333C19.7192 30.3333 20.2703 30.1051 20.6766 29.6987C21.0829 29.2924 21.3112 28.7413 21.3112 28.1667C21.3112 27.592 21.0829 27.0409 20.6766 26.6346C20.2703 26.2283 19.7192 26 19.1445 26V30.3333Z" fill="#007EA7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.31026 2.83942C8.96876 1.53833 13.3303 0 18.1034 0C22.7769 0 27.0236 1.47442 29.668 2.75817L29.8175 2.83075C30.6148 3.22508 31.2583 3.59775 31.7112 3.9L27.7093 9.75C36.935 19.1815 44.0612 38.9967 18.1034 38.9967C-7.85432 38.9967 -0.919907 19.5412 8.38593 9.75L4.41009 3.9C4.71668 3.69958 5.10559 3.46667 5.56926 3.21967C5.79893 3.09617 6.04593 2.96869 6.31026 2.83942ZM25.1375 9.67308L28.3409 4.98983C25.3618 5.20433 21.8171 5.90417 18.4046 6.89217C15.9671 7.59633 13.2588 7.48908 10.7508 7.0265C10.1188 6.90948 9.49118 6.77001 8.86909 6.60833L10.9491 9.67092C15.407 11.258 20.6785 11.258 25.1375 9.67308ZM9.69784 11.5158C14.9141 13.5308 21.1833 13.5308 26.3996 11.5137C28.5764 13.8094 30.3977 16.4176 31.8033 19.2519C33.2679 22.2397 34.0653 25.2265 33.9353 27.8005C33.8096 30.2846 32.8324 32.4068 30.6008 33.9842C28.2748 35.6276 24.3629 36.8301 18.1023 36.8301C11.8353 36.8301 7.90493 35.6482 5.55734 34.0232C3.30943 32.4664 2.32251 30.3723 2.18276 27.9218C2.03651 25.376 2.81651 22.4044 4.27576 19.396C5.66784 16.5273 7.61026 13.7659 9.69784 11.5158ZM8.45201 4.24233C9.31868 4.50017 10.2243 4.72442 11.143 4.8945C13.4722 5.3235 15.8078 5.38633 17.8012 4.80892C20.124 4.13194 22.4866 3.59973 24.8753 3.21533C22.882 2.61517 20.5507 2.16667 18.1023 2.16667C14.3703 2.16667 10.8895 3.20775 8.45201 4.24233Z" fill="#007EA7"/>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,5 @@
<svg width="99" height="99" viewBox="0 0 99 99" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 49.5C0 31.9952 0 23.2429 3.45932 16.5803C6.37752 10.9599 10.9599 6.37752 16.5803 3.45932C23.2429 0 31.9952 0 49.5 0C67.0048 0 75.7571 0 82.4197 3.45932C88.0401 6.37752 92.6225 10.9599 95.5407 16.5803C99 23.2429 99 31.9952 99 49.5C99 67.0048 99 75.7571 95.5407 82.4197C92.6225 88.0401 88.0401 92.6225 82.4197 95.5407C75.7571 99 67.0048 99 49.5 99C31.9952 99 23.2429 99 16.5803 95.5407C10.9599 92.6225 6.37752 88.0401 3.45932 82.4197C0 75.7571 0 67.0048 0 49.5Z" fill="#E6F2F6"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M54.6697 50.2226C54.371 49.3775 53.8176 48.6459 53.0858 48.1284C52.354 47.611 51.4797 47.3332 50.5834 47.3333V46.25H48.4167V47.3333C47.2674 47.3333 46.1652 47.7899 45.3526 48.6025C44.5399 49.4152 44.0834 50.5174 44.0834 51.6667C44.0834 52.8159 44.5399 53.9181 45.3526 54.7308C46.1652 55.5435 47.2674 56 48.4167 56V60.3333C47.4742 60.3333 46.6715 59.7321 46.3725 58.8892C46.3281 58.7514 46.2565 58.6238 46.162 58.514C46.0675 58.4043 45.9519 58.3146 45.8221 58.2503C45.6923 58.186 45.5509 58.1484 45.4063 58.1397C45.2617 58.1309 45.1169 58.1513 44.9803 58.1996C44.8437 58.2478 44.7182 58.323 44.6112 58.4206C44.5041 58.5182 44.4178 58.6363 44.3572 58.7679C44.2966 58.8994 44.263 59.0418 44.2584 59.1866C44.2538 59.3314 44.2783 59.4756 44.3304 59.6108C44.6291 60.4558 45.1824 61.1875 45.9143 61.7049C46.6461 62.2224 47.5204 62.5001 48.4167 62.5V63.5833H50.5834V62.5C51.7326 62.5 52.8348 62.0435 53.6475 61.2308C54.4602 60.4181 54.9167 59.3159 54.9167 58.1667C54.9167 57.0174 54.4602 55.9152 53.6475 55.1025C52.8348 54.2899 51.7326 53.8333 50.5834 53.8333V49.5C51.0315 49.4999 51.4686 49.6387 51.8345 49.8973C52.2004 50.1559 52.4771 50.5217 52.6265 50.9441C52.7222 51.215 52.9216 51.4369 53.1808 51.5608C53.3092 51.6222 53.4484 51.6576 53.5905 51.6652C53.7325 51.6728 53.8747 51.6523 54.0089 51.6049C54.143 51.5575 54.2665 51.4842 54.3724 51.3891C54.4782 51.294 54.5642 51.179 54.6256 51.0506C54.6869 50.9223 54.7224 50.7831 54.73 50.641C54.7376 50.4989 54.7171 50.3567 54.6697 50.2226ZM48.4167 49.5C47.8421 49.5 47.291 49.7283 46.8846 50.1346C46.4783 50.5409 46.25 51.092 46.25 51.6667C46.25 52.2413 46.4783 52.7924 46.8846 53.1987C47.291 53.6051 47.8421 53.8333 48.4167 53.8333V49.5ZM50.5834 60.3333C51.158 60.3333 51.7091 60.1051 52.1154 59.6987C52.5218 59.2924 52.75 58.7413 52.75 58.1667C52.75 57.592 52.5218 57.0409 52.1154 56.6346C51.7091 56.2283 51.158 56 50.5834 56V60.3333Z" fill="#007EA7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M37.7491 32.8394C40.4076 31.5383 44.7691 30 49.5423 30C54.2158 30 58.4624 31.4744 61.1069 32.7582L61.2564 32.8307C62.0537 33.2251 62.6972 33.5978 63.15 33.9L59.1482 39.75C68.3739 49.1815 75.5 68.9967 49.5423 68.9967C23.5845 68.9967 30.5189 49.5412 39.8248 39.75L35.8489 33.9C36.1555 33.6996 36.5444 33.4667 37.0081 33.2197C37.2378 33.0962 37.4848 32.9687 37.7491 32.8394ZM56.5764 39.6731L59.7798 34.9898C56.8006 35.2043 53.2559 35.9042 49.8434 36.8922C47.4059 37.5963 44.6976 37.4891 42.1897 37.0265C41.5577 36.9095 40.93 36.77 40.3079 36.6083L42.3879 39.6709C46.8459 41.258 52.1174 41.258 56.5764 39.6731ZM41.1367 41.5158C46.3529 43.5308 52.6222 43.5308 57.8384 41.5137C60.0152 43.8094 61.8366 46.4176 63.2421 49.2519C64.7068 52.2397 65.5041 55.2265 65.3741 57.8005C65.2484 60.2846 64.2713 62.4068 62.0396 63.9842C59.7137 65.6276 55.8018 66.8301 49.5412 66.8301C43.2741 66.8301 39.3438 65.6482 36.9962 64.0232C34.7483 62.4664 33.7614 60.3723 33.6216 57.9218C33.4754 55.376 34.2554 52.4044 35.7146 49.396C37.1067 46.5273 39.0491 43.7659 41.1367 41.5158ZM39.8909 34.2423C40.7575 34.5002 41.6632 34.7244 42.5819 34.8945C44.911 35.3235 47.2467 35.3863 49.24 34.8089C51.5629 34.1319 53.9254 33.5997 56.3142 33.2153C54.3209 32.6152 51.9895 32.1667 49.5412 32.1667C45.8091 32.1667 42.3284 33.2078 39.8909 34.2423Z" fill="#007EA7"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.56 26.411C18.4138 26.802 17.211 27.001 16 27C9.925 27 5 22.075 5 16C5 9.925 9.925 5 16 5C22.075 5 27 9.925 27 16C27 16.573 26.955 17.151 26.867 17.717C26.557 19.027 25.41 20 24 20C23.2044 20 22.4413 19.6839 21.8787 19.1213C21.3161 18.5587 21 17.7956 21 17V11C21 10.7348 20.8946 10.4804 20.7071 10.2929C20.5196 10.1054 20.2652 10 20 10C19.7348 10 19.4804 10.1054 19.2929 10.2929C19.1054 10.4804 19 10.7348 19 11V11.371C18.05 10.515 16.83 10 15.5 10C12.462 10 10 12.686 10 16C10 19.314 12.462 22 15.5 22C17.246 22 18.802 21.113 19.81 19.729C20.3981 20.6322 21.2624 21.3212 22.2739 21.6933C23.2854 22.0653 24.3901 22.1006 25.4233 21.7938C26.4565 21.487 27.363 20.8545 28.0075 19.9907C28.652 19.1268 29.0001 18.0778 29 17C29.025 16.67 29 16.337 29 16C29 8.82 23.18 3 16 3C8.82 3 3 8.82 3 16C3 23.18 8.82 29 16 29C17.546 29 19.03 28.73 20.405 28.235C20.5818 28.169 20.7338 28.05 20.8404 27.8943C20.9469 27.7385 21.0026 27.5537 21 27.365C21 26.65 20.238 26.18 19.56 26.411ZM15.5 20C13.727 20 12 18.377 12 16C12 13.623 13.727 12 15.5 12C17.273 12 19 13.624 19 16C19 18.376 17.273 20 15.5 20Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,6 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 44C35.046 44 44 35.046 44 24C44 12.954 35.046 4 24 4C12.954 4 4 12.954 4 24C4 35.046 12.954 44 24 44Z" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4 24H44" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M24 44C28.418 44 32 35.046 32 24C32 12.954 28.418 4 24 4C19.582 4 16 12.954 16 24C16 35.046 19.582 44 24 44Z" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.85803 10.1416C11.7132 12.0014 13.9176 13.4764 16.3445 14.4817C18.7715 15.487 21.3731 16.0028 24 15.9996C26.6269 16.0028 29.2286 15.487 31.6555 14.4817C34.0825 13.4764 36.2869 12.0014 38.142 10.1416M38.142 37.8576C36.2869 35.9978 34.0825 34.5228 31.6555 33.5175C29.2286 32.5122 26.6269 31.9964 24 31.9996C21.3731 31.9964 18.7715 32.5122 16.3445 33.5175C13.9176 34.5228 11.7132 35.9978 9.85803 37.8576" stroke="#007EA7" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.3333 25.3337H10.6666C5.33329 25.3337 2.66663 24.0003 2.66663 17.3337V10.667C2.66663 5.33366 5.33329 2.66699 10.6666 2.66699H21.3333C26.6666 2.66699 29.3333 5.33366 29.3333 10.667V17.3337C29.3333 22.667 26.6666 25.3337 21.3333 25.3337H20.6666C20.2533 25.3337 19.8533 25.5337 19.6 25.867L17.6 28.5337C16.72 29.707 15.28 29.707 14.4 28.5337L12.4 25.867C12.1866 25.5737 11.6933 25.3337 11.3333 25.3337Z" stroke="white" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.33337 10.667H22.6667" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.33337 17.333H17.3334" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 850 B

View File

@ -0,0 +1,4 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 20C28.4183 20 32 16.4183 32 12C32 7.58172 28.4183 4 24 4C19.5817 4 16 7.58172 16 12C16 16.4183 19.5817 20 24 20Z" stroke="#007EA7" stroke-width="3"/>
<path d="M36 18C39.314 18 42 15.76 42 13C42 10.24 39.314 8 36 8M12 18C8.686 18 6 15.76 6 13C6 10.24 8.686 8 12 8M34.394 30C35.414 31.176 36 32.542 36 34C36 38.42 30.628 42 24 42C17.372 42 12 38.42 12 34C12 29.58 17.372 26 24 26C24.6813 26 25.348 26.0367 26 26.11M40 38C43.508 37.23 46 35.282 46 33C46 30.718 43.508 28.77 40 28M8 38C4.492 37.23 2 35.282 2 33C2 30.718 4.492 28.77 8 28" stroke="#007EA7" stroke-width="3" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 710 B

View File

@ -1,13 +1,13 @@
class MainPageContentType {
final int id;
final String title;
final String image;
final String link;
bool marked;
bool isViewed;
bool isViewed;
final List<String> subtitles;
final int? duration;
final String? description;
MainPageContentType({
required this.id,
@ -15,9 +15,10 @@ class MainPageContentType {
required this.image,
required this.link,
required this.marked,
required this.isViewed,
required this.isViewed,
required this.subtitles,
this.duration,
this.description,
});
factory MainPageContentType.fromJson(Map<String, dynamic> json) =>
@ -30,5 +31,6 @@ class MainPageContentType {
isViewed: json['isViewed'] ?? false,
subtitles: List<String>.from(json['subtitles']),
duration: json['duration'],
description: json['description'],
);
}
}

View File

@ -17,6 +17,7 @@ class NewsDetailsData {
final List<Content> contents;
final List<OverviewData> relatedContents = [];
bool relatedContentsIsEmpty;
String? description;
NewsDetailsData({
required this.id,
@ -32,6 +33,7 @@ class NewsDetailsData {
required this.contents,
required this.order,
this.relatedContentsIsEmpty = false,
this.description,
});
factory NewsDetailsData.fromJson(Map<String, dynamic> json) {
@ -46,6 +48,7 @@ class NewsDetailsData {
likes: json['likes'],
comments: json['comments'],
order: json['order'],
description: json['description'],
tags: List<Tag>.from(json['tags'].map((tag) => Tag.fromJson(tag))),
contents: List<Content>.from(json['contents'].map(
(content) => Content.fromJson(content),
@ -64,6 +67,7 @@ class NewsDetailsData {
'liked': liked,
'likes': likes,
'comments': comments,
'description': description,
'tags': tags.map((e) => e.toJson()).toList(),
'contents': contents.map((e) => e.toJson()).toList(),
};

View File

@ -21,6 +21,7 @@ class RadarDetailsData {
final int order;
final List<OverviewData> relatedContents = [];
bool relatedContentsIsEmpty;
String? description;
RadarDetailsData({
required this.id,
@ -38,6 +39,7 @@ class RadarDetailsData {
required this.order,
required this.duration,
this.relatedContentsIsEmpty = false,
this.description,
});
factory RadarDetailsData.fromJson(Map<String, dynamic> json) {
@ -64,6 +66,7 @@ class RadarDetailsData {
),
),
duration: json['duration'],
description: json['description'],
);
}
@ -81,5 +84,6 @@ class RadarDetailsData {
'tags': tags.map((e) => e.toJson()).toList(),
'contents': contents.map((e) => e.toJson()).toList(),
'categories': categories.map((e) => e.toJson()).toList(),
'description': description,
};
}

View File

@ -6,6 +6,21 @@ class AiRagService {
'https://n8n-didvan.liara.run/webhook/didvan-rag';
static const String _authHeader =
'Basic dXNlcjpkYXNqZHBuM3BjdTQzcDM0aWpyaA==';
static const String _didvanBaseUrl = 'https://api.didvan.app';
static String _getFullAudioUrl(String? url) {
if (url == null || url.isEmpty) return '';
if (url.startsWith('http://') || url.startsWith('https://')) {
return url;
}
if (url.startsWith('/')) {
return '$_didvanBaseUrl$url';
}
return '$_didvanBaseUrl/$url';
}
static Future<AiRagResponse> sendMessage(String message) async {
try {
@ -23,9 +38,11 @@ class AiRagService {
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
final rawAudioUrl = data['url'] as String?;
return AiRagResponse(
output: data['output'] ?? '',
sources: List<int>.from(data['sources'] ?? []),
audioUrl: _getFullAudioUrl(rawAudioUrl),
isSuccess: true,
);
} else {
@ -48,11 +65,13 @@ class AiRagService {
class AiRagResponse {
final String output;
final List<int> sources;
final String? audioUrl;
final bool isSuccess;
AiRagResponse({
required this.output,
required this.sources,
this.audioUrl,
required this.isSuccess,
});
}

View File

@ -55,46 +55,65 @@ class _CommentsState extends State<Comments> {
}
}
_bottomPadding = bottomViewInset;
return Material(
child: DidvanScaffold(
hidePlayer: true,
physics: const BouncingScrollPhysics(),
backgroundColor: Theme.of(context).colorScheme.surface,
appBarData: _isPage
? AppBarData(
hasBack: true,
title: 'نظرات',
subtitle: widget.pageData['title'],
)
: null,
padding: _isPage ? const EdgeInsets.only(bottom: 92) : EdgeInsets.zero,
slivers: [
Consumer<CommentsState>(
builder: (context, state, child) =>
SliverStateHandler<CommentsState>(
onRetry: state.getComments,
state: state,
itemPadding: const EdgeInsets.only(top: 16, bottom: 16),
childCount: state.comments.length,
placeholder: const _CommentPlaceholder(),
centerEmptyState: _isPage,
enableEmptyState: state.comments.isEmpty,
emptyState: EmptyState(
asset: Assets.emptyChat,
title: 'اولین نظر را بنویسید...',
),
builder: (context, state, index) => Comment(
key: ValueKey(
state.comments[index].id.toString() +
state.comments[index].text,
),
focusNode: _focusNode,
comment: state.comments[index],
final scaffold = DidvanScaffold(
hidePlayer: true,
physics: const BouncingScrollPhysics(),
backgroundColor: Theme.of(context).colorScheme.surface,
appBarData: _isPage
? AppBarData(
hasBack: true,
title: 'نظرات',
subtitle: widget.pageData['title'],
)
: null,
padding: _isPage ? const EdgeInsets.only(bottom: 92) : EdgeInsets.zero,
slivers: [
Consumer<CommentsState>(
builder: (context, state, child) => SliverStateHandler<CommentsState>(
onRetry: state.getComments,
state: state,
itemPadding: const EdgeInsets.only(top: 16, bottom: 16),
childCount: state.comments.length,
placeholder: const _CommentPlaceholder(),
centerEmptyState: _isPage,
enableEmptyState: state.comments.isEmpty,
emptyState: EmptyState(
asset: Assets.emptyChat,
title: 'اولین نظر را بنویسید...',
),
builder: (context, state, index) => Comment(
key: ValueKey(
state.comments[index].id.toString() +
state.comments[index].text,
),
focusNode: _focusNode,
comment: state.comments[index],
),
),
],
),
),
],
);
if (_isPage) {
return Scaffold(
resizeToAvoidBottomInset: true,
body: Stack(
children: [
Positioned.fill(child: scaffold),
Positioned(
left: 20,
right: 20,
bottom: 20,
child: CommentMessageBox(focusNode: _focusNode),
),
],
),
);
}
return Material(
child: scaffold,
);
}
}

View File

@ -5,7 +5,7 @@ import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/models/studio_details_data.dart';
import 'package:didvan/services/media/media.dart';
import 'package:didvan/views/widgets/audio/audio_slider.dart';
import 'package:didvan/views/home/media/widgets/audio_waveform_progress.dart';
import 'package:didvan/views/podcasts/studio_details/studio_details_state.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:flutter/material.dart';
@ -27,41 +27,103 @@ class AudioWidget extends StatelessWidget {
this.duration,
}) : super(key: key);
String _formatDuration(Duration duration) {
String twoDigits(int n) => n.toString().padLeft(2, "0");
String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
return "$twoDigitMinutes:$twoDigitSeconds";
}
@override
Widget build(BuildContext context) {
return StreamBuilder<bool>(
stream: MediaService.audioPlayer.playingStream,
final tag =
audioMetaData != null ? '${audioMetaData!.type}-$id' : 'message-$id';
return StreamBuilder<PlayerState>(
stream: MediaService.audioPlayer.playerStateStream,
builder: (context, snapshot) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 12),
child: Row(
children: [
Expanded(
child: AudioSlider(
tag: audioMetaData != null
? '${audioMetaData!.type}-$id'
: 'message-$id',
duration:
audioMetaData?.duration ?? duration?.inSeconds,
showTimer: true,
),
),
],
final isCurrentlyPlaying = MediaService.audioPlayerTag == tag;
return StreamBuilder<Duration>(
stream: MediaService.audioPlayer.positionStream,
builder: (context, posSnapshot) {
var totalDuration = audioMetaData?.duration != null
? Duration(seconds: audioMetaData!.duration!)
: (duration ?? Duration.zero);
if (isCurrentlyPlaying &&
MediaService.audioPlayer.duration != null &&
MediaService.audioPlayer.duration! > Duration.zero) {
totalDuration = MediaService.audioPlayer.duration!;
}
final currentPosition = isCurrentlyPlaying
? (posSnapshot.data ?? Duration.zero)
: Duration.zero;
final progress = (totalDuration.inMilliseconds > 0)
? currentPosition.inMilliseconds / totalDuration.inMilliseconds
: 0.0;
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
_AudioControllerButton(
audioFile: audioFile,
audioUrl: audioUrl,
id: id,
audioMetaData: audioMetaData,
),
),
),
const SizedBox(width: 12),
_AudioControllerButton(
audioFile: audioFile,
audioUrl: audioUrl,
id: id,
audioMetaData: audioMetaData,
),
],
const SizedBox(width: 12),
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 4),
child: Row(
children: [
SizedBox(
width: 45,
child: Text(
_formatDuration(totalDuration),
style: const TextStyle(
fontSize: 12,
color: Color.fromARGB(255, 102, 102, 102)),
textAlign: TextAlign.center,
),
),
const SizedBox(width: 8),
Expanded(
child: AudioWaveformProgress(
progress: progress.clamp(0.0, 1.0),
isActive: isCurrentlyPlaying,
onChanged: isCurrentlyPlaying
? (value) {
final seekMillis =
(value * totalDuration.inMilliseconds)
.toInt();
MediaService.audioPlayer.seek(
Duration(milliseconds: seekMillis));
}
: null,
),
),
const SizedBox(width: 8),
SizedBox(
width: 45,
child: Text(
_formatDuration(currentPosition),
style: const TextStyle(
fontSize: 12,
color: Color.fromARGB(255, 102, 102, 102)),
textAlign: TextAlign.center,
),
),
],
),
),
),
],
);
},
);
},
);

View File

@ -178,7 +178,7 @@ class StaggeredEntry extends StatefulWidget {
super.key,
required this.child,
required this.index,
this.duration = const Duration(milliseconds: 500),
this.duration = const Duration(milliseconds: 250),
this.verticalOffset = 50.0,
});
@ -268,7 +268,7 @@ class SwotSection extends StatelessWidget {
),
const SizedBox(width: 5),
DidvanText(
"باید ها و نباید ها",
"بایدها و نبایدها",
style: Theme.of(context).textTheme.titleSmall,
color: const Color.fromARGB(255, 0, 89, 119),
),
@ -529,6 +529,7 @@ class MainPageSection extends StatelessWidget {
list.type,
item.id,
item.link,
description: item.description,
),
child: Padding(
padding: const EdgeInsets.all(8.0),
@ -605,6 +606,7 @@ class MainPageSection extends StatelessWidget {
list.type,
item.id,
item.link,
description: item.description,
),
child: Padding(
padding: const EdgeInsets.all(8.0),

View File

@ -24,27 +24,22 @@ class MainPageState extends CoreProvier {
List<SwotItem> swotItems = [];
Future<void> _getMainPageContent() async {
print("DEBUG: _getMainPageContent started");
final service = RequestService(RequestHelper.mainPageContent);
await service.httpGet();
if (service.isSuccess) {
print("DEBUG: _getMainPageContent success");
content = MainPageContent.fromJson(service.result);
print("DEBUG: _getMainPageContent service.result: ${service.result}");
unread = service.result['unread'];
print("DEBUG: __getMainPageContent unread: $unread, content: $content");
notifyListeners();
} else {
print("DEBUG: _getMainPageContent failed state");
notifyListeners();
throw Exception('Failed to load main page content');
}
}
int getStoryStartIndex(List<MainPageContentType> stories) {
final firstUnreadIndex = stories.indexWhere((story) => !story.isViewed);
return firstUnreadIndex != -1 ? firstUnreadIndex : 0;
}
final firstUnreadIndex = stories.indexWhere((story) => !story.isViewed);
return firstUnreadIndex != -1 ? firstUnreadIndex : 0;
}
Future<void> _getSwotItems() async {
try {
@ -94,8 +89,9 @@ class MainPageState extends CoreProvier {
void navigationHandler(
String type,
int id,
String? link,
) {
String? link, {
String? description,
}) {
link = link ?? '';
dynamic args;
switch (type) {
@ -118,6 +114,7 @@ class MainPageState extends CoreProvier {
'id': id,
'args': const NewsRequestArgs(page: 0),
'hasUnmarkConfirmation': false,
'description': description,
};
break;
}
@ -129,6 +126,7 @@ class MainPageState extends CoreProvier {
'id': id,
'args': const RadarRequestArgs(page: 0),
'hasUnmarkConfirmation': false,
'description': description,
};
break;
}
@ -155,4 +153,4 @@ class MainPageState extends CoreProvier {
}
Navigator.of(navigatorKey.currentContext!).pushNamed(link, arguments: args);
}
}
}

View File

@ -28,6 +28,7 @@ class _NewsDetailsState extends State<NewsDetails> {
}
});
state.args = widget.pageData['args'] ?? const NewsRequestArgs(page: 0);
state.initialDescription = widget.pageData['description'];
Future.delayed(Duration.zero, () {
state.getNewsDetails(widget.pageData['id']);
});
@ -42,8 +43,7 @@ class _NewsDetailsState extends State<NewsDetails> {
return Scaffold(
body: Consumer<NewsDetailsState>(
builder: (context, state, child) => StateHandler<NewsDetailsState>(
onRetry: () =>
state.getNewsDetails(widget.pageData['id']),
onRetry: () => state.getNewsDetails(widget.pageData['id']),
state: state,
builder: (context, state) => Stack(
children: [

View File

@ -13,6 +13,7 @@ class NewsDetailsState extends CoreProvier {
final List<NewsDetailsData?> news = [];
late final int initialIndex;
late final NewsRequestArgs args;
String? initialDescription;
late Timer _trackingTimer;
int _trackingTimerCounter = 0;
bool isFetchingNewItem = false;
@ -26,13 +27,11 @@ class NewsDetailsState extends CoreProvier {
NewsDetailsData get currentNews => news[_currentIndex]!;
Future<void> getNewsDetails(int id, {bool? isForward}) async {
// Prevent duplicate requests
if (_isRequestInProgress) {
return;
}
_isRequestInProgress = true;
// Set loading state
if (isForward == null) {
appState = AppState.busy;
} else {
@ -41,7 +40,6 @@ class NewsDetailsState extends CoreProvier {
}
try {
// Wait for token to be ready
if (RequestService.token == null || RequestService.token!.isEmpty) {
await Future.delayed(const Duration(milliseconds: 500));
if (RequestService.token == null || RequestService.token!.isEmpty) {
@ -56,6 +54,15 @@ class NewsDetailsState extends CoreProvier {
if (service.isSuccess) {
final result = service.result;
final newsItem = NewsDetailsData.fromJson(result['news']);
if (isForward == null && initialDescription != null) {
newsItem.description = initialDescription;
}
if (isForward == null && newsItem.description == null) {
await _fetchDescriptionFromList(newsItem.id, newsItem);
}
if (args.page == 0) {
news.add(newsItem);
initialIndex = 0;
@ -73,7 +80,8 @@ class NewsDetailsState extends CoreProvier {
nextNews = NewsDetailsData.fromJson(result['nextNews']);
}
if (isForward == null) {
news.addAll(List.generate(max(newsItem.order - 2, 0), (index) => null));
news.addAll(
List.generate(max(newsItem.order - 2, 0), (index) => null));
if (prevNews != null) {
news.add(prevNews);
}
@ -107,6 +115,7 @@ class NewsDetailsState extends CoreProvier {
}
}
} catch (e) {
// ignore: avoid_print
print('Error fetching news details: $e');
isFetchingNewItem = false;
if (isForward == null) {
@ -145,6 +154,35 @@ class NewsDetailsState extends CoreProvier {
_trackingTimer.cancel();
}
Future<void> _fetchDescriptionFromList(
int newsId, NewsDetailsData newsItem) async {
try {
final service = RequestService(
RequestHelper.newsOverviews(
args: const NewsRequestArgs(page: 1),
),
);
await service.httpGet();
if (service.isSuccess) {
final newsList = service.result['news'] as List?;
if (newsList != null) {
for (var item in newsList) {
if (item['id'] == newsId) {
final newsData = OverviewData.fromJson(item);
if (newsData.description.isNotEmpty) {
newsItem.description = newsData.description;
}
break;
}
}
}
}
} catch (e) {
print('Error fetching description from list: $e');
}
}
Future<void> getRelatedContents() async {
if (currentNews.relatedContents.isNotEmpty &&
currentNews.relatedContentsIsEmpty) {
@ -187,4 +225,4 @@ class NewsDetailsState extends CoreProvier {
_trackingTimer.cancel();
super.dispose();
}
}
}

View File

@ -3,7 +3,6 @@ import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/constants/assets.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/providers/theme.dart';
import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart';
@ -54,164 +53,276 @@ class _ProfilePageState extends State<ProfilePage> {
@override
Widget build(BuildContext context) {
final user = context.watch<UserProvider>().user;
return Consumer<GeneralSettingsState>(
builder: (context, state, child) => StateHandler<GeneralSettingsState>(
onRetry: context.read<GeneralSettingsState>().init,
state: context.read<GeneralSettingsState>(),
builder: (context, state) => DidvanScaffold(
padding: const EdgeInsets.all(16),
appBarData: AppBarData(title: 'تنظیمات', hasBack: true),
padding: const EdgeInsets.fromLTRB(8, 20, 0, 20),
appBarData: null,
showSliversFirst: true,
slivers: [
SliverAppBar(
pinned: true,
backgroundColor: Theme.of(context).colorScheme.surface,
automaticallyImplyLeading: false,
leadingWidth: 200,
leading: Padding(
padding: const EdgeInsetsDirectional.only(start: 0.0),
child: SvgPicture.asset(
Assets.horizontalLogoWithText,
fit: BoxFit.contain,
height: 80,
),
),
actions: [
IconButton(
onPressed: () {
Navigator.of(context).pushNamed(Routes.bookmarks);
},
icon: SvgPicture.asset(
'lib/assets/icons/hugeicons_telescope-01.svg')),
IconButton(
onPressed: () => Navigator.of(context).pop(),
icon: SvgPicture.asset(
'lib/assets/icons/arrow-left.svg',
color: const Color.fromARGB(255, 102, 102, 102),
)),
const SizedBox(width: 8),
],
),
],
children: [
DidvanCard(
const SizedBox(height: 24),
Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
MenuOption(
title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular,
suffix: context.watch<UserProvider>().user.fullName,
onTap: () => Navigator.of(context)
.pushNamed(Routes.editProfile),
Container(
width: 100,
height: 100,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context)
.colorScheme
.surfaceContainerHighest,
border: Border.all(
color: const Color.fromARGB(255, 184, 184, 184),
width: 1.0,
),
image:
(user.photo != null && user.photo!.isNotEmpty)
? DecorationImage(
image: NetworkImage(user.photo!),
fit: BoxFit.cover,
)
: null,
),
alignment: Alignment.center,
child: (user.photo == null || user.photo!.isEmpty)
? Icon(
Icons.person_rounded,
size: 60,
color: Theme.of(context)
.colorScheme
.onSurfaceVariant
.withOpacity(0.5),
)
: null,
),
const DidvanDivider(),
MenuOption(
title: 'تنظیمات',
icon: DidvanIcons.setting_regular,
onTap: () {
state.showSettings = !state.showSettings;
state.update();
},
trailing: Icon(
state.showSettings
? DidvanIcons.angle_up_regular
: DidvanIcons.angle_down_regular,
size: 18,
color: Theme.of(context).colorScheme.title,
)),
AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration,
isVisible: state.showSettings,
child: Padding(
padding: const EdgeInsets.only(right: 8.0, top: 8),
child: Column(
children: [
// Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 12.0),
// child: MenuOption(
// title: 'زمان دریافت اعلان',
// onTap: () =>
// Navigator.of(context).pushNamed(
// Routes.notificationTime,
// arguments: {
// "fromFav": false,
// 'onTimeChanged': () => Future.delayed(
// Duration.zero,
// () => state.getTime(),
// )
// },
// ),
// icon: DidvanIcons.notification_regular,
// suffix: state.time,
// // suffix: 'از${DateTimeUtils.normalizeTimeDuration(
// // Duration(minutes: state.notificationTimeRange[0]),
// // )} تا ${DateTimeUtils.normalizeTimeDuration(
// // Duration(minutes: state.notificationTimeRange[1]),
// // )}',
// ),
// ),
// Padding(
// padding: const EdgeInsets.symmetric(
// vertical: 12.0),
// child: MenuOption(
// title: 'شخصی سازی محتوا',
// onTap: () => Navigator.of(context)
// .pushNamed(Routes.favouritesStep,
// arguments: {"toTimer": false}),
// icon: DidvanIcons.note_regular,
// // suffix: 'از${DateTimeUtils.normalizeTimeDuration(
// // Duration(minutes: state.notificationTimeRange[0]),
// // )} تا ${DateTimeUtils.normalizeTimeDuration(
// // Duration(minutes: state.notificationTimeRange[1]),
// // )}',
// ),
// ),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
suffix: state.fontFamily == 'Dana-FA'
? 'دانا'
: state.fontFamily == 'Iransans-FA'
? 'ایران سنس'
: 'ایران یکان',
title: 'فونت برنامه',
onTap: _showFontFamilyBottomSheet,
icon: DidvanIcons.font_regular,
),
),
Padding(
const SizedBox(height: 4),
const SizedBox(height: 12),
// ویجت نمایش نام کاربر
DidvanText(
user.fullName,
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(
fontWeight: FontWeight.bold,
color:
const Color.fromARGB(255, 0, 126, 167)),
),
// نمایش شماره تلفن (اختیاری)
// const SizedBox(height: 4),
// Directionality(
// textDirection: TextDirection.ltr,
// child: DidvanText(
// user.phoneNumber,
// style: Theme.of(context)
// .textTheme
// .bodyMedium
// ?.copyWith(
// color: Theme.of(context)
// .colorScheme
// .onSurface
// .withOpacity(0.6),
// ),
// ),
// ),
],
),
),
const SizedBox(height: 32),
Padding(
padding: const EdgeInsets.all(8.0),
child: DidvanCard(
child: Column(
children: [
MenuOption(
title: 'ویرایش پروفایل',
icon: DidvanIcons.user_edit_regular,
// suffix: context.watch<UserProvider>().user.fullName,
onTap: () => Navigator.of(context)
.pushNamed(Routes.editProfile),
),
const DidvanDivider(),
// ... بقیه کدها بدون تغییر
MenuOption(
title: 'تنظیمات',
icon: DidvanIcons.setting_regular,
onTap: () {
state.showSettings = !state.showSettings;
state.update();
},
trailing: Icon(
state.showSettings
? DidvanIcons.angle_up_regular
: DidvanIcons.angle_down_regular,
size: 18,
color: Theme.of(context).colorScheme.title,
)),
AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration,
isVisible: state.showSettings,
child: Padding(
padding:
const EdgeInsets.only(right: 8.0, top: 8),
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
suffix:
fontScaleSuffix(state.fontSizeScale),
title: 'اندازه متن',
onTap: _showFontScaleBottomSheet,
icon: DidvanIcons.font_size_solid,
)),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
title: 'ظاهر برنامه',
onTap: () {
state.showThemes = !state.showThemes;
state.update();
title: 'زمان دریافت اعلان',
onTap: () =>
Navigator.of(context).pushNamed(
Routes.notificationTime,
arguments: {
"fromFav": false,
'onTimeChanged': () => Future.delayed(
Duration.zero,
() => state.getTime(),
)
},
icon: DidvanIcons.theme_regular,
trailing: Icon(
state.showThemes
? DidvanIcons.angle_up_regular
: DidvanIcons.angle_down_regular,
size: 18,
color: Theme.of(context)
.colorScheme
.title,
))),
AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration,
isVisible: state.showThemes,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
_themeItem(context, state, 'light'),
_themeItem(context, state, 'dark'),
],
),
icon: DidvanIcons.notification_regular,
suffix: state.time,
// suffix:
// 'از${DateTimeUtils.normalizeTimeDuration(
// Duration(
// minutes:
// state.notificationTimeRange[0]),
// )} تا ${DateTimeUtils.normalizeTimeDuration(
// Duration(
// minutes:
// state.notificationTimeRange[1]),
// )}',
),
),
),
],
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
title: 'شخصی سازی محتوا',
onTap: () => Navigator.of(context)
.pushNamed(Routes.favouritesStep,
arguments: {"toTimer": false}),
icon: DidvanIcons.note_regular,
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
suffix: state.fontFamily == 'Dana-FA'
? 'دانا'
: state.fontFamily == 'Iransans-FA'
? 'ایران سنس'
: 'ایران یکان',
title: 'فونت برنامه',
onTap: _showFontFamilyBottomSheet,
icon: DidvanIcons.font_regular,
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
suffix: fontScaleSuffix(
state.fontSizeScale),
title: 'اندازه متن',
onTap: _showFontScaleBottomSheet,
icon: DidvanIcons.font_size_solid,
)),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: MenuOption(
title: 'ظاهر برنامه',
onTap: () {
state.showThemes =
!state.showThemes;
state.update();
},
icon: DidvanIcons.theme_regular,
trailing: Icon(
state.showThemes
? DidvanIcons.angle_up_regular
: DidvanIcons
.angle_down_regular,
size: 18,
color: Theme.of(context)
.colorScheme
.title,
))),
AnimatedVisibility(
duration: DesignConfig.lowAnimationDuration,
isVisible: state.showThemes,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
_themeItem(context, state, 'light'),
_themeItem(context, state, 'dark'),
],
),
),
),
],
),
),
),
),
const DidvanDivider(),
MenuOption(
title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary,
onTap: () async {
StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.splash,
(_) => false,
);
},
),
],
const DidvanDivider(),
MenuOption(
title: 'خروج از حساب کاربری',
icon: DidvanIcons.sign_out_regular,
color: Theme.of(context).colorScheme.secondary,
onTap: () async {
StorageService.delete(key: 'token');
Navigator.of(context).pushNamedAndRemoveUntil(
Routes.splash,
(_) => false,
);
},
),
],
),
),
),
const ItemTitle(

View File

@ -1,231 +1,341 @@
import 'dart:async';
import 'dart:math';
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/category.dart';
import 'package:didvan/models/enums.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/models/view/app_bar_data.dart';
import 'package:didvan/views/radar/radar_state.dart';
import 'package:didvan/views/widgets/categories_gird.dart';
import 'package:didvan/views/widgets/categories_list.dart';
import 'package:didvan/views/widgets/date_picker_button.dart';
import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/widgets/overview/radar.dart';
import 'package:didvan/views/widgets/search_field.dart';
import 'package:didvan/views/widgets/animated_visibility.dart';
import 'package:didvan/views/widgets/didvan/checkbox.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/item_title.dart';
import 'package:didvan/views/widgets/state_handlers/empty_result.dart';
import 'package:didvan/views/widgets/state_handlers/sliver_state_handler.dart';
import 'package:didvan/views/widgets/home_app_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
class Radar extends StatefulWidget {
const Radar({Key? key}) : super(key: key);
@override
State<Radar> createState() => _RadarState();
State<Radar> createState() => _RadarStateView();
}
class _RadarState extends State<Radar> {
final ScrollController _scrollController = ScrollController();
final _focusNode = FocusNode();
bool _isAnimating = false;
class _RadarStateView extends State<Radar> {
Timer? _timer;
final _focusNode = FocusNode();
@override
void initState() {
_scrollController.addListener(() {
_handleAnimations();
});
final state = context.read<RadarState>();
state.addListener(() {
if (state.shouldColapse && mounted) {
_handleAnimations(true);
state.shouldColapse = false;
}
});
state.init();
context.read<RadarState>().init();
super.initState();
}
String _getCategoryIcon(int categoryId, bool isDark) {
switch (categoryId) {
case 1:
return 'lib/assets/icons/New_Economic.svg';
case 2:
return 'lib/assets/icons/New_Siasi.svg';
case 3:
return 'lib/assets/icons/New_Fanavari.svg';
case 4:
return 'lib/assets/icons/New_Kasbokar.svg';
case 5:
return 'lib/assets/icons/New_ZistMohit.svg';
case 6:
return 'lib/assets/icons/New_Ejtemaei.svg';
default:
return 'lib/assets/icons/Kasb o Kar.svg';
}
}
@override
Widget build(BuildContext context) {
return Consumer<RadarState>(
builder: (context, state, child) => DidvanScaffold(
padding: EdgeInsets.zero,
appBarData: AppBarData(
hasBack: true,
hasElevation: false,
title: 'پویش‌های افق',
final state = context.watch<RadarState>();
final theme = Theme.of(context);
final colorScheme = theme.colorScheme;
final isDark = theme.brightness == Brightness.dark;
final showCategories = !state.filtering && !state.searching;
return DidvanScaffold(
padding: EdgeInsets.zero,
appBarData: null,
slivers: [
SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.only(top: 12.0),
child: HomeAppBar(
showBackButton: false,
showSearchField: state.appState != AppState.failed,
onSearchChanged: _onChanged,
onFilterPressed: _showFilterBottomSheet,
searchFocusNode: _focusNode,
isFiltered: state.filtering,
searchValue: state.search,
),
),
),
children: [
SizedBox(
height: MediaQuery.of(context).size.height,
child: Stack(
children: [
CustomScrollView(
physics: _isAnimating
? const NeverScrollableScrollPhysics()
: const ClampingScrollPhysics(),
controller: _scrollController,
slivers: [
if (!state.filtering &&
!state.searching &&
state.appState != AppState.failed)
const SliverToBoxAdapter(
child: SizedBox(height: 320),
),
if (state.appState != AppState.failed)
SliverPadding(
padding: const EdgeInsets.only(
right: 16, bottom: 20, top: 20),
sliver: SliverToBoxAdapter(
child: Align(
alignment: Alignment.centerRight,
child: AnimatedVisibility(
isVisible: !state.isColapsed &&
!state.searching &&
!state.filtering,
duration: DesignConfig.lowAnimationDuration,
child: DidvanText(
'آخرین رصد',
style: Theme.of(context).textTheme.titleMedium,
color: Theme.of(context).colorScheme.title,
),
),
),
),
),
if (state.isColapsed || state.searching || state.filtering)
const SliverToBoxAdapter(
child: SizedBox(
height: 160,
),
),
SliverStateHandler<RadarState>(
onRetry: () => state.getRadars(page: state.page),
state: state,
itemPadding: const EdgeInsets.only(
bottom: 20,
left: 16,
right: 16,
),
enableEmptyState: state.radars.isEmpty,
emptyState: Padding(
padding: const EdgeInsets.only(bottom: 120),
child: EmptyResult(
onNewSearch: () => _focusNode.requestFocus()),
),
placeholder: RadarOverview.placeholder,
builder: (context, state, index) {
index += 2;
if (index % 15 == 0 && state.lastPage != state.page) {
state.getRadars(page: state.page + 1);
}
index -= 2;
if (index >= state.radars.length) {
return RadarOverview.placeholder;
}
final radar = state.radars[index];
return RadarOverview(
radar: radar,
onMarkChanged: state.changeMark,
onLikedChanged: state.changeLike,
onCommentsChanged: (id, count) =>
state.onCommentsChanged(id, count),
radarRequestArgs: RadarRequestArgs(
page: state.page,
categories: List.from(
state.selectedCats.map((cat) => cat.id)),
endDate: state.endDate,
isSingleItem: false,
search: state.search,
startDate: state.startDate,
),
);
},
childCount: state.radars.length +
(state.lastPage == state.page ? 0 : 3),
),
if (state.radars.length == 1)
const SliverToBoxAdapter(
child: SizedBox(height: 320),
),
const SliverToBoxAdapter(
child: SizedBox(
height: 100,
),
),
],
SliverAppBar(
pinned: true,
automaticallyImplyLeading: false,
backgroundColor: colorScheme.surface,
elevation: 0,
centerTitle: false,
titleSpacing: 16,
title: Text(
'پویش‌ افق',
style: theme.textTheme.headlineSmall?.copyWith(
color: isDark
? Colors.white
: const Color.fromARGB(255, 0, 53, 70),
fontWeight: FontWeight.bold,
fontSize: 19),
),
actions: [
IconButton(
onPressed: () => Navigator.of(context).pop(),
icon: SvgPicture.asset(
'lib/assets/icons/arrow-left.svg',
width: 30,
height: 30,
colorFilter: ColorFilter.mode(
isDark
? Colors.white70
: const Color.fromARGB(255, 102, 102, 102),
BlendMode.srcIn),
),
),
const SizedBox(width: 8),
],
),
const SliverToBoxAdapter(
child: SizedBox(
height: 16,
),
),
SliverToBoxAdapter(
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 500),
switchInCurve: Curves.easeOutCubic,
switchOutCurve: Curves.easeInCubic,
transitionBuilder: (Widget child, Animation<double> animation) {
return SizeTransition(
sizeFactor: animation,
axisAlignment: -1.0,
child: FadeTransition(
opacity: animation,
child: child,
),
if (state.appState != AppState.failed)
CategoriesRow1(
topPadding: 212,
rightPadding: 124,
onSelected: _onCategorySelected,
categories: state.categories,
isColapsed:
state.isColapsed || state.searching || state.filtering,
),
if (state.appState != AppState.failed)
CategoriesRow2(
categories: state.categories,
isColapsed:
state.isColapsed || state.searching || state.filtering,
onSelected: _onCategorySelected,
),
if (state.appState != AppState.failed &&
!state.searching &&
!state.filtering)
CategoriesList(
top: 60,
categories: state.categories,
isColapsed:
state.isColapsed || state.searching || state.filtering,
onSelected: (_) => state.getRadars(page: 1),
selectedCats: state.selectedCats,
),
if (state.appState != AppState.failed)
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: const BorderRadius.vertical(
bottom: Radius.circular(12),
),
),
child: SearchField(
focusNode: _focusNode,
isFiltered: state.filtering,
title: 'پویش‌های افق',
onChanged: _onChanged,
onFilterButtonPressed: _showFilterBottomSheet,
),
);
},
child: showCategories
? Column(
key: const ValueKey('categories_column'),
children: [
if (state.categories.length >= 3)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: state.categories
.sublist(0, 3)
.map((category) => _buildCoolCategoryItem(
category, isDark, state, theme))
.toList(),
),
),
if (state.categories.length >= 6)
Padding(
padding: const EdgeInsets.only(
top: 12, left: 20, right: 20),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: state.categories
.sublist(3, 6)
.map((category) => _buildCoolCategoryItem(
category, isDark, state, theme))
.toList(),
),
),
const SizedBox(height: 20),
],
)
: const SizedBox.shrink(key: ValueKey('empty_categories')),
),
),
SliverStateHandler<RadarState>(
centerEmptyState: false,
onRetry: () => state.getRadars(page: state.page),
state: state,
childCount: min(state.visibleCount, state.radars.length) +
(_hasMoreItems(state) ? 1 : 0),
builder: (context, state, index) {
final currentDisplayCount =
min(state.visibleCount, state.radars.length);
if (index == currentDisplayCount && _hasMoreItems(state)) {
return _buildLoadMoreButton(context, state);
}
if (index >= state.radars.length) {
return _SlideFadeTransition(
index: index, child: RadarOverview.placeholder);
}
final radar = state.radars[index];
return _SlideFadeTransition(
index: index,
child: RadarOverview(
radar: radar,
onMarkChanged: state.changeMark,
onLikedChanged: state.changeLike,
onCommentsChanged: (id, count) =>
state.onCommentsChanged(id, count),
radarRequestArgs: RadarRequestArgs(
page: state.page,
categories:
List.from(state.selectedCats.map((cat) => cat.id)),
endDate: state.endDate,
isSingleItem: false,
search: state.search,
startDate: state.startDate,
),
),
);
},
enableEmptyState:
state.radars.isEmpty && state.appState != AppState.busy,
emptyState: EmptyResult(
onNewSearch: () => _focusNode.requestFocus(),
),
itemPadding: const EdgeInsets.only(
bottom: 20,
left: 16,
right: 16,
),
placeholder:
_SlideFadeTransition(index: 0, child: RadarOverview.placeholder),
),
],
);
}
bool _hasMoreItems(RadarState state) {
return state.radars.length > state.visibleCount ||
state.page < state.lastPage;
}
Widget _buildLoadMoreButton(BuildContext context, RadarState state) {
if (state.appState == AppState.busy &&
state.radars.length <= state.visibleCount) {
return const Padding(
padding: EdgeInsets.all(16.0),
child: Center(child: CircularProgressIndicator()),
);
}
return Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0),
child: Center(
child: GestureDetector(
onTap: () {
state.loadMore();
},
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 50.0,
vertical: 12.0,
),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 0, 126, 167),
borderRadius: BorderRadius.circular(15),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
SvgPicture.asset(
'lib/assets/icons/element-plus.svg',
colorFilter:
const ColorFilter.mode(Colors.white, BlendMode.srcIn),
width: 20,
),
const SizedBox(width: 8),
const Text(
'بارگذاری بیشتر',
style: TextStyle(
color: Colors.white,
fontSize: 14,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
),
),
);
}
void _onCategorySelected(CategoryData category) {
final state = context.read<RadarState>();
state.selectedCats.clear();
if (category.id != 0) {
state.selectedCats.add(category);
}
state.getRadars(page: 1);
Widget _buildCoolCategoryItem(
CategoryData category, bool isDark, RadarState state, ThemeData theme) {
final isSelected =
state.selectedCats.any((element) => element.id == category.id);
category.asset = _getCategoryIcon(category.id, isDark);
return Expanded(
child: GestureDetector(
onTap: () => _onCategorySelected(category),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.fastOutSlowIn,
padding: EdgeInsets.zero,
decoration: BoxDecoration(
color: isSelected
? theme.colorScheme.primary.withOpacity(0.1)
: Colors.transparent,
borderRadius: BorderRadius.circular(30),
border: Border.all(
color: isSelected
? theme.colorScheme.primary
: Colors.transparent,
width: 2,
),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(30),
child: SvgPicture.asset(
category.asset!,
width: 100,
height: 100,
),
),
),
const SizedBox(height: 8),
Text(
category.label,
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.primary,
fontWeight: isSelected ? FontWeight.bold : FontWeight.bold,
fontSize: 15,
),
),
],
),
),
);
}
void _onChanged(String value) {
@ -240,35 +350,19 @@ class _RadarState extends State<Radar> {
});
}
void _handleAnimations([bool forceAnimate = false]) async {
void _onCategorySelected(CategoryData category) {
final state = context.read<RadarState>();
if (_isAnimating || state.filtering || state.searching) return;
final double position = _scrollController.offset;
if (position > 5 && !state.isColapsed || forceAnimate) {
state.isScrolled = true;
_isAnimating = true;
setState(() {});
await _scrollController.animateTo(
380,
duration: DesignConfig.mediumAnimationDuration,
curve: Curves.easeIn,
);
_isAnimating = false;
setState(() {});
} else if (position <
min(_scrollController.position.maxScrollExtent, 380) &&
state.isColapsed) {
state.isScrolled = false;
_isAnimating = true;
setState(() {});
await _scrollController.animateTo(
0,
duration: DesignConfig.mediumAnimationDuration,
curve: Curves.easeIn,
);
_isAnimating = false;
setState(() {});
final isAlreadySelected =
state.selectedCats.any((cat) => cat.id == category.id);
state.selectedCats.clear();
if (!isAlreadySelected && category.id != 0) {
state.selectedCats.add(category);
}
state.getRadars(page: 1);
}
Future<void> _showFilterBottomSheet() async {
@ -324,13 +418,15 @@ class _RadarState extends State<Radar> {
width: (MediaQuery.of(context).size.width - 40) / 2,
child: DidvanCheckbox(
title: state.categories[i].label,
value: state.selectedCats.contains(state.categories[i]),
value: state.selectedCats
.any((cat) => cat.id == state.categories[i].id),
onChanged: (value) {
if (value) {
state.selectedCats.add(state.categories[i]);
return;
} else {
state.selectedCats.removeWhere(
(cat) => cat.id == state.categories[i].id);
}
state.selectedCats.remove(state.categories[i]);
},
),
),
@ -345,7 +441,64 @@ class _RadarState extends State<Radar> {
@override
void dispose() {
_focusNode.dispose();
_scrollController.dispose();
super.dispose();
}
}
class _SlideFadeTransition extends StatefulWidget {
final Widget child;
final int index;
const _SlideFadeTransition({
Key? key,
required this.child,
required this.index,
}) : super(key: key);
@override
State<_SlideFadeTransition> createState() => _SlideFadeTransitionState();
}
class _SlideFadeTransitionState extends State<_SlideFadeTransition>
with SingleTickerProviderStateMixin {
late final AnimationController _controller;
late final Animation<double> _opacity;
late final Animation<Offset> _offset;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 600),
);
_opacity = CurvedAnimation(parent: _controller, curve: Curves.easeOut);
_offset = Tween<Offset>(begin: const Offset(0, 0.1), end: Offset.zero)
.animate(
CurvedAnimation(parent: _controller, curve: Curves.easeOutCubic));
Future.delayed(Duration(milliseconds: 50 * (widget.index % 5)), () {
if (mounted) {
_controller.forward();
}
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return FadeTransition(
opacity: _opacity,
child: SlideTransition(
position: _offset,
child: widget.child,
),
);
}
}

View File

@ -29,6 +29,7 @@ class _RadarDetailsState extends State<RadarDetails> {
}
});
state.args = widget.pageData['args'] ?? const RadarRequestArgs(page: 0);
state.initialDescription = widget.pageData['description'];
Future.delayed(Duration.zero, () {
state.getRadarDetails(widget.pageData['id']);
});

View File

@ -15,6 +15,7 @@ class RadarDetailsState extends CoreProvier {
int _trackingTimerCounter = 0;
late final int initialIndex;
late final RadarRequestArgs args;
String? initialDescription;
bool isFetchingNewItem = false;
final List<int> relatedQueue = [];
bool openComments = false;
@ -32,13 +33,11 @@ class RadarDetailsState extends CoreProvier {
}
Future<void> getRadarDetails(int id, {bool? isForward}) async {
// Prevent duplicate requests
if (_isRequestInProgress) {
return;
}
_isRequestInProgress = true;
// Set loading state
if (isForward == null) {
appState = AppState.busy;
} else {
@ -47,7 +46,6 @@ class RadarDetailsState extends CoreProvier {
}
try {
// Wait for token to be ready
if (RequestService.token == null || RequestService.token!.isEmpty) {
await Future.delayed(const Duration(milliseconds: 500));
if (RequestService.token == null || RequestService.token!.isEmpty) {
@ -62,6 +60,15 @@ class RadarDetailsState extends CoreProvier {
if (service.isSuccess) {
final result = service.result;
final radar = RadarDetailsData.fromJson(result['radar']);
if (isForward == null && initialDescription != null) {
radar.description = initialDescription;
}
if (isForward == null && radar.description == null) {
await _fetchDescriptionFromList(radar.id, radar);
}
if (args.page == 0) {
radars.add(radar);
initialIndex = 0;
@ -82,7 +89,8 @@ class RadarDetailsState extends CoreProvier {
}
if (isForward == null) {
radars.addAll(List.generate(max(radar.order - 2, 0), (index) => null));
radars
.addAll(List.generate(max(radar.order - 2, 0), (index) => null));
if (prevRadar != null) {
radars.add(prevRadar);
}
@ -127,6 +135,36 @@ class RadarDetailsState extends CoreProvier {
}
}
Future<void> _fetchDescriptionFromList(
int radarId, RadarDetailsData radarItem) async {
try {
final service = RequestService(
RequestHelper.radarOverviews(
args: const RadarRequestArgs(page: 1),
),
);
await service.httpGet();
if (service.isSuccess) {
final radarList = service.result['radars'] as List?;
if (radarList != null) {
for (var item in radarList) {
if (item['id'] == radarId) {
final radarData = OverviewData.fromJson(item);
if (radarData.description.isNotEmpty) {
radarItem.description = radarData.description;
}
break;
}
}
}
}
} catch (e) {
// ignore: avoid_print
print('Error fetching description from list: $e');
}
}
Future<void> getRelatedContents() async {
if (currentRadar.relatedContents.isNotEmpty &&
currentRadar.relatedContentsIsEmpty) {
@ -197,4 +235,4 @@ class RadarDetailsState extends CoreProvier {
_trackingTimer.cancel();
super.dispose();
}
}
}

View File

@ -14,6 +14,8 @@ class RadarState extends CoreProvier {
String? endDate;
int page = 1;
int lastPage = 1;
int visibleCount = 4;
bool isScrolled = false;
bool shouldColapse = false;
final List<CategoryData> selectedCats = [];
@ -37,11 +39,20 @@ class RadarState extends CoreProvier {
search = '';
lastSearch = '';
isScrolled = false;
visibleCount = 4;
if (!isInit) {
getRadars(page: 1);
}
}
void loadMore() {
visibleCount += 4;
if (visibleCount >= radars.length && page < lastPage) {
getRadars(page: page + 1);
}
notifyListeners();
}
Future<void> getRadars({
required int page,
}) async {

View File

@ -1,5 +1,8 @@
// ignore_for_file: deprecated_member_use
import 'package:didvan/services/ai_rag_service.dart';
import 'package:didvan/services/ai_voice_service.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/providers/user.dart';
import 'package:flutter/material.dart';
@ -8,6 +11,7 @@ import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:provider/provider.dart';
import 'package:record/record.dart';
import 'package:path_provider/path_provider.dart';
import 'package:just_audio/just_audio.dart';
import 'dart:ui';
import 'dart:io';
@ -28,7 +32,10 @@ class _AiChatDialogState extends State<AiChatDialog>
late AnimationController _animationController;
late AnimationController _pulseController;
final AudioRecorder _audioRecorder = AudioRecorder();
final AudioPlayer _audioPlayer = AudioPlayer();
String? _recordingPath;
String? _currentPlayingUrl;
bool _isPlaying = false;
@override
void initState() {
@ -37,6 +44,18 @@ class _AiChatDialogState extends State<AiChatDialog>
vsync: this,
duration: const Duration(milliseconds: 400),
);
_audioPlayer.playerStateStream.listen((state) {
if (mounted) {
setState(() {
_isPlaying = state.playing;
if (state.processingState == ProcessingState.completed) {
_isPlaying = false;
_currentPlayingUrl = null;
}
});
}
});
_pulseController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
@ -66,6 +85,7 @@ class _AiChatDialogState extends State<AiChatDialog>
_animationController.dispose();
_pulseController.dispose();
_audioRecorder.dispose();
_audioPlayer.dispose();
super.dispose();
}
@ -81,6 +101,68 @@ class _AiChatDialogState extends State<AiChatDialog>
});
}
Future<void> _toggleAudioPlayback(String audioUrl) async {
try {
if (_isPlaying && _currentPlayingUrl == audioUrl) {
await _audioPlayer.pause();
setState(() {
_isPlaying = false;
});
} else {
if (_currentPlayingUrl != audioUrl) {
final token = RequestService.token;
debugPrint('🎵 Audio URL: $audioUrl');
debugPrint('🔑 Token exists: ${token != null && token.isNotEmpty}');
AudioSource? audioSource;
try {
if (token != null && token.isNotEmpty) {
audioSource = AudioSource.uri(
Uri.parse(audioUrl),
headers: {
'Authorization': 'Bearer $token',
},
);
debugPrint('✅ Trying with token (no Bearer prefix)');
} else {
audioSource = AudioSource.uri(
Uri.parse(audioUrl),
headers: {
'Authorization': 'Bearer $token',
},
);
debugPrint('✅ Trying without Authorization header');
}
await _audioPlayer.setAudioSource(audioSource);
setState(() {
_currentPlayingUrl = audioUrl;
});
} catch (headerError) {
debugPrint(
'⚠️ Error with headers, trying simple URL: $headerError');
await _audioPlayer.setUrl(audioUrl);
setState(() {
_currentPlayingUrl = audioUrl;
});
}
}
await _audioPlayer.play();
setState(() {
_isPlaying = true;
});
}
} catch (e) {
debugPrint('❌ Error playing audio: $e');
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('خطا در پخش صوت')),
);
}
}
}
Future<void> _sendMessage() async {
final message = _messageController.text.trim();
if (message.isEmpty) return;
@ -105,6 +187,7 @@ class _AiChatDialogState extends State<AiChatDialog>
isUser: false,
timestamp: DateTime.now(),
sources: response.sources,
audioUrl: response.audioUrl,
));
_isLoading = false;
});
@ -171,6 +254,7 @@ class _AiChatDialogState extends State<AiChatDialog>
isUser: false,
timestamp: DateTime.now(),
sources: ragResponse.sources,
audioUrl: ragResponse.audioUrl,
));
_isLoading = false;
});
@ -310,7 +394,6 @@ class _AiChatDialogState extends State<AiChatDialog>
);
},
),
// Avatar
Container(
width: 44,
height: 44,
@ -334,7 +417,6 @@ class _AiChatDialogState extends State<AiChatDialog>
),
),
),
// Online indicator
Positioned(
bottom: 1,
left: 1,
@ -550,6 +632,67 @@ class _AiChatDialogState extends State<AiChatDialog>
),
),
],
if (!message.isUser &&
message.audioUrl != null &&
message.audioUrl!.isNotEmpty) ...[
const SizedBox(height: 8),
InkWell(
onTap: () => _toggleAudioPlayback(message.audioUrl!),
borderRadius: BorderRadius.circular(20),
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 8),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
const Color(0xFF0066AA).withOpacity(0.1),
const Color(0xFF0088DD).withOpacity(0.08),
],
),
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: const Color(0xFF0066AA).withOpacity(0.3),
width: 1,
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: const EdgeInsets.all(4),
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0xFF0066AA),
Color(0xFF0088DD),
],
),
shape: BoxShape.circle,
),
child: Icon(
(_isPlaying &&
_currentPlayingUrl == message.audioUrl)
? Icons.pause_rounded
: Icons.play_arrow_rounded,
size: 16,
color: Colors.white,
),
),
const SizedBox(width: 8),
DidvanText(
(_isPlaying &&
_currentPlayingUrl == message.audioUrl)
? 'در حال پخش...'
: 'پخش صوتی پاسخ',
fontSize: 12,
color: const Color(0xFF0066AA),
fontWeight: FontWeight.w600,
),
],
),
),
),
],
],
),
),
@ -686,7 +829,7 @@ class _AiChatDialogState extends State<AiChatDialog>
mainAxisSize: MainAxisSize.min,
children: [
Text(
'در حال تایپ...',
'در حال فکر کردن...',
style: TextStyle(
color: Colors.grey.shade600,
fontSize: 12,
@ -917,11 +1060,13 @@ class ChatMessage {
final bool isUser;
final DateTime timestamp;
final List<int> sources;
final String? audioUrl;
ChatMessage({
required this.text,
required this.isUser,
required this.timestamp,
this.sources = const [],
this.audioUrl,
});
}

View File

@ -1,5 +1,4 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/models/category.dart';
import 'package:didvan/views/widgets/animated_visibility.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
@ -26,7 +25,7 @@ class CategoryItem extends StatelessWidget {
return ds.height / 16 * 9 / 3;
}
}
return ds.width / 3;
return ds.width / 2;
}
bool _useWebMobileLayout(context) {
@ -44,14 +43,14 @@ class CategoryItem extends StatelessWidget {
child: AnimatedContainer(
duration: DesignConfig.mediumAnimationDuration,
padding: isColapsed ? const EdgeInsets.all(4) : EdgeInsets.zero,
width: isColapsed ? 100 : _width(context),
width: isColapsed ? 200 : _width(context),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: DesignConfig.lowBorderRadius,
border: isColapsed
? Border.all(color: Theme.of(context).colorScheme.focusedBorder)
: null,
),
// decoration: BoxDecoration(
// borderRadius: DesignConfig.lowBorderRadius,
// border: isColapsed
// ? Border.all(color: Theme.of(context).colorScheme.focusedBorder)
// : null,
// ),
child: Column(
children: [
AnimatedVisibility(
@ -64,13 +63,16 @@ class CategoryItem extends StatelessWidget {
height: !_useWebMobileLayout(context)
? _width(context) / 2
: ds.width / 7,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
boxShadow: DesignConfig.defaultShadow,
borderRadius: DesignConfig.mediumBorderRadius,
),
// decoration: BoxDecoration(
// color: Theme.of(context).colorScheme.surface,
// boxShadow: DesignConfig.defaultShadow,
// borderRadius: DesignConfig.mediumBorderRadius,
// ),
padding: const EdgeInsets.all(8),
child: SvgPicture.asset(category.asset!),
child: SvgPicture.asset(
category.asset!,
height: 50,
),
),
),
const SizedBox(
@ -78,7 +80,7 @@ class CategoryItem extends StatelessWidget {
),
DidvanText(
category.label,
color: Theme.of(context).colorScheme.title,
color: const Color.fromARGB(255, 25, 93, 128),
style: Theme.of(context).textTheme.titleSmall,
),
],

View File

@ -1,13 +1,16 @@
import 'package:didvan/views/widgets/ink_wrapper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class DidvanIconButton extends StatelessWidget {
final IconData icon;
final dynamic icon;
final Color? color;
final Color? backgroundColor;
final double? size;
final double? gestureSize;
final VoidCallback onPressed;
final bool isSvg;
const DidvanIconButton({
Key? key,
required this.icon,
@ -16,6 +19,7 @@ class DidvanIconButton extends StatelessWidget {
this.size,
this.gestureSize,
this.backgroundColor,
this.isSvg = false,
}) : super(key: key);
@override
@ -30,12 +34,22 @@ class DidvanIconButton extends StatelessWidget {
),
height: gestureSize ?? 48,
width: gestureSize ?? 48,
child: Icon(
icon,
size: size,
color: color,
child: Center(
child: isSvg
? SvgPicture.asset(
icon as String,
width: size,
height: size,
colorFilter: color != null
? ColorFilter.mode(color!, BlendMode.srcIn)
: null,
)
: Icon(
icon as IconData,
size: size,
color: color,
),
),
),
);
}

File diff suppressed because it is too large Load Diff

View File

@ -101,10 +101,7 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
height: 48,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.navigation,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(24),
bottomRight: Radius.circular(24),
),
borderRadius: BorderRadius.circular(24),
border: DesignConfig.isDark
? Border.all(
color: Theme.of(context).colorScheme.cardBorder,
@ -138,28 +135,28 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
),
),
const Spacer(),
DidvanIconButton(
gestureSize: 32,
onPressed: () => Navigator.of(context).pushNamed(
Routes.mentions,
arguments: {
'id': widget.item.id,
'type': widget.isRadar ? 'radar' : 'news',
'title': widget.item.title,
},
SizedBox(
width: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
DidvanIconButton(
gestureSize: 32,
onPressed: () => Navigator.of(context).pushNamed(
Routes.mentions,
arguments: {
'id': widget.item.id,
'type': widget.isRadar ? 'radar' : 'news',
'title': widget.item.title,
},
),
icon: 'lib/assets/icons/fluent_mention-32-regular.svg',
isSvg: true,
size: 25,
),
],
),
icon: DidvanIcons.mention_icon,
),
const Spacer(),
DidvanIconButton(
gestureSize: 32,
onPressed: () => Navigator.of(context).pushNamedAndRemoveUntil(
Routes.home,
(route) => false,
),
icon: DidvanIcons.house_regular,
),
const Spacer(),
BookmarkButton(
itemId: widget.item.id,
type: widget.isRadar ? 'radar' : 'news',
@ -174,9 +171,10 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
Navigator.of(context).pop();
}
},
gestureSize: 32,
gestureSize: 22,
svgIconOn: 'lib/assets/icons/bookmark_fill.svg',
svgIconOff: 'lib/assets/icons/archive-tick.svg',
),
const Spacer(),
SizedBox(
width: 60,
child: Row(
@ -198,12 +196,13 @@ class _FloatingNavigationBarState extends State<FloatingNavigationBar> {
'onCommentsChanged': widget.onCommentsChanged,
},
),
icon: DidvanIcons.chats_regular,
icon: 'lib/assets/icons/message-text.svg',
isSvg: true,
size: 25,
),
],
),
),
const Spacer(),
DidvanIconButton(
gestureSize: 32,
onPressed:

View File

@ -38,6 +38,7 @@ class NewsOverview extends StatelessWidget {
'id': news.id,
'args': newsRequestArgs,
'hasUnmarkConfirmation': hasUnmarkConfirmation,
'description': news.description,
},
),
child: Column(
@ -79,28 +80,38 @@ class NewsOverview extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
SvgPicture.asset('lib/assets/icons/calendar.svg'),
const SizedBox(
width: 5,
),
DidvanText(
DateTime.parse(news.createdAt).toPersianDateStr(),
style: Theme.of(context).textTheme.bodySmall,
),
const SizedBox(
width: 20,
),
SvgPicture.asset('lib/assets/icons/global.svg'),
const SizedBox(
width: 5,
),
DidvanText(
news.reference!,
style: Theme.of(context).textTheme.bodySmall,
),
],
Expanded(
child: Row(
children: [
SvgPicture.asset('lib/assets/icons/calendar.svg'),
const SizedBox(
width: 5,
),
Flexible(
child: DidvanText(
DateTime.parse(news.createdAt).toPersianDateStr(),
style: Theme.of(context).textTheme.bodySmall,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(
width: 20,
),
SvgPicture.asset('lib/assets/icons/global.svg'),
const SizedBox(
width: 5,
),
Flexible(
child: DidvanText(
news.reference!,
style: Theme.of(context).textTheme.bodySmall,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
),
Row(
children: [
@ -185,4 +196,4 @@ class NewsOverview extends StatelessWidget {
],
),
);
}
}

View File

@ -1,17 +1,16 @@
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/models/overview_data.dart';
import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/views/widgets/bookmark_button.dart';
import 'package:didvan/views/widgets/didvan/card.dart';
import 'package:didvan/views/widgets/didvan/divider.dart';
import 'package:didvan/views/widgets/didvan/icon_button.dart';
import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/liked_button.dart';
import 'package:didvan/views/widgets/shimmer_placeholder.dart';
import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:persian_number_utility/persian_number_utility.dart';
class RadarOverview extends StatelessWidget {
@ -34,6 +33,8 @@ class RadarOverview extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DidvanCard(
padding: const EdgeInsets.all(0),
enableBorder: true,
onTap: () => Navigator.of(context).pushNamed(
Routes.radarDetails,
arguments: {
@ -42,22 +43,33 @@ class RadarOverview extends StatelessWidget {
'id': radar.id,
'args': radarRequestArgs,
'hasUnmarkConfirmation': hasUnmarkConfirmation,
'description': radar.description,
},
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
DidvanText(
radar.title,
fontWeight: FontWeight.w600,
SkeletonImage(
imageUrl: radar.image,
aspectRatio: 16 / 8,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
bottomLeft: Radius.circular(0),
bottomRight: Radius.circular(0),
)),
const SizedBox(
height: 10,
),
Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0),
child: DidvanText(
radar.title,
fontWeight: FontWeight.w600,
),
),
const SizedBox(height: 8),
Stack(
children: [
SkeletonImage(
imageUrl: radar.image,
aspectRatio: 16 / 9,
),
if (radar.forManagers)
Positioned(
top: 0,
@ -80,73 +92,95 @@ class RadarOverview extends StatelessWidget {
),
],
),
const SizedBox(height: 8),
Row(
children: [
DidvanText(
radar.categories!.first.label,
style: Theme.of(context).textTheme.labelSmall,
color: Theme.of(context).colorScheme.caption,
),
const Spacer(),
DidvanText(
'${DateTime.parse(radar.createdAt).toPersianDateStr()} | خواندن در ${radar.timeToRead} دقیقه',
style: Theme.of(context).textTheme.labelSmall,
color: Theme.of(context).colorScheme.caption,
),
],
const SizedBox(height: 5),
Padding(
padding: const EdgeInsets.all(8.0),
child: DidvanText(
radar.description,
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(height: 8),
DidvanText(
radar.description,
maxLines: 3,
overflow: TextOverflow.ellipsis,
const Padding(
padding: EdgeInsets.only(left: 8, right: 8),
child: DidvanDivider(),
),
const DidvanDivider(),
Row(
children: [
if (radar.comments != 0) DidvanText(radar.comments.toString()),
const SizedBox(width: 4),
DidvanIconButton(
icon: DidvanIcons.chats_regular,
gestureSize: 24,
onPressed: () => Navigator.of(context).pushNamed(
Routes.comments,
arguments: {
'type': 'radar',
'title': radar.title,
'id': radar.id,
'onCommentsChanged': (count) =>
onCommentsChanged(radar.id, count)
},
Padding(
padding: const EdgeInsets.fromLTRB(8, 8, 8, 20),
child: Row(
children: [
SvgPicture.asset('lib/assets/icons/calendar.svg'),
const SizedBox(
width: 5,
),
DidvanText(
DateTime.parse(radar.createdAt).toPersianDateStr(),
style: Theme.of(context)
.textTheme
.labelSmall
?.copyWith(fontWeight: FontWeight.bold),
color: Theme.of(context).colorScheme.caption,
),
const SizedBox(
width: 15,
),
SvgPicture.asset(
'lib/assets/icons/ion_extension-puzzle-outline.svg',
height: 17,
),
const SizedBox(
width: 5,
),
DidvanText(
radar.categories!.first.label,
style: Theme.of(context)
.textTheme
.labelSmall
?.copyWith(fontWeight: FontWeight.bold),
color: Theme.of(context).colorScheme.caption,
),
],
),
),
const Spacer(),
Row(
children: [
LikedButton(
itemId: radar.id,
type: 'radar',
gestureSize: 32,
value: radar.liked,
onMarkChanged: (value) =>
onLikedChanged(radar.id, value, false),
askForConfirmation: hasUnmarkConfirmation,
likes: radar.likes,
),
const SizedBox(
width: 4.0,
),
BookmarkButton(
itemId: radar.id,
type: 'radar',
gestureSize: 32,
value: radar.marked,
onMarkChanged: (value) =>
onMarkChanged(radar.id, value, false),
askForConfirmation: hasUnmarkConfirmation,
),
],
Padding(
padding: const EdgeInsets.fromLTRB(8, 0, 8, 5),
child: Row(
children: [
LikedButton(
itemId: radar.id,
type: 'radar',
gestureSize: 32,
value: radar.liked,
onMarkChanged: (value) =>
onLikedChanged(radar.id, value, false),
askForConfirmation: hasUnmarkConfirmation,
likes: radar.likes,
unlikedColor: const Color.fromARGB(255, 102, 102, 102),
),
const SizedBox(
width: 4.0,
),
BookmarkButton(
itemId: radar.id,
type: 'radar',
gestureSize: 22,
value: radar.marked,
onMarkChanged: (value) =>
onMarkChanged(radar.id, value, false),
askForConfirmation: hasUnmarkConfirmation,
svgIconOn: 'lib/assets/icons/bookmark_fill.svg',
svgIconOff: 'lib/assets/icons/archive-tick.svg',
color: const Color.fromARGB(255, 102, 102, 102),
unbookmarkedColor:
const Color.fromARGB(255, 102, 102, 102),
),
],
),
),
],
),