fixed bugs

This commit is contained in:
Mr.Jebelli 2025-11-18 16:05:31 +03:30
parent 1871b8dd7e
commit 461eee1ed7
49 changed files with 701 additions and 393 deletions

View File

@ -0,0 +1,5 @@
<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="75" height="75" rx="37.5" fill="#E6F2F6"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M47.912 17.2123C45.786 16.3743 43.732 16.9423 42.278 18.2363C40.858 19.4963 40 21.4403 40 23.5003V31.5003C40 33.4343 41.568 35.0003 43.5 35.0003H51.5C53.56 35.0003 55.504 34.1403 56.766 32.7223C58.058 31.2683 58.626 29.2143 57.786 27.0883C56.9032 24.8543 55.5714 22.8252 53.873 21.1265C52.1746 19.4277 50.1458 18.0955 47.912 17.2123ZM43 31.5003V23.5003C43 22.2463 43.53 21.1363 44.272 20.4763C44.978 19.8483 45.854 19.6263 46.812 20.0043C48.6632 20.7365 50.3445 21.8405 51.7521 23.2481C53.1598 24.6558 54.2638 26.3371 54.996 28.1883C55.374 29.1463 55.152 30.0223 54.524 30.7283C53.864 31.4703 52.754 32.0003 51.5 32.0003H43.5C43.3674 32.0003 43.2402 31.9476 43.1464 31.8538C43.0527 31.76 43 31.6329 43 31.5003Z" fill="#007EA7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M35.4901 19.2401C34.2701 18.4481 33.0901 18.2201 31.7901 18.4481C30.6901 18.6401 29.5101 19.1681 28.2561 19.7301L28.1221 19.7901C25.0903 21.148 22.4339 23.2223 20.3816 25.8345C18.3293 28.4466 16.9425 31.5184 16.3407 34.7854C15.7389 38.0524 15.94 41.4167 16.9267 44.5887C17.9135 47.7608 19.6563 50.6455 22.0052 52.9946C24.3541 55.3436 27.2387 57.0867 30.4107 58.0737C33.5826 59.0607 36.9469 59.262 40.214 58.6604C43.481 58.0588 46.5529 56.6723 49.1652 54.6202C51.7775 52.5681 53.852 49.9118 55.2101 46.8801L55.2701 46.7441C55.8321 45.4901 56.3601 44.3101 56.5521 43.2081C56.7781 41.9121 56.5521 40.7301 55.7601 39.5081C54.9081 38.1941 53.7401 37.5501 52.3121 37.2581C51.0441 36.9981 49.4601 36.9981 47.6441 37.0001H44.5001C42.5721 37.0001 41.2761 36.9961 40.3101 36.8681C39.3881 36.7421 38.9921 36.5281 38.7321 36.2681C38.4721 36.0081 38.2581 35.6121 38.1321 34.6881C38.0041 33.7241 38.0001 32.4281 38.0001 30.5001V27.3561C38.0001 25.5401 38.0001 23.9561 37.7401 22.6881C37.4501 21.2601 36.8061 20.0921 35.4901 19.2401ZM29.3481 22.5281C30.7861 21.8841 31.6201 21.5221 32.3081 21.4021C32.8381 21.3101 33.2561 21.3661 33.8601 21.7581C34.3681 22.0881 34.6381 22.4801 34.8021 23.2881C34.9921 24.2221 35.0001 25.4961 35.0001 27.5001V30.6041C35.0001 32.4001 35.0001 33.9001 35.1601 35.0881C35.3281 36.3441 35.7001 37.4781 36.6121 38.3881C37.5221 39.3001 38.6561 39.6721 39.9121 39.8401C41.1001 40.0001 42.6001 40.0001 44.3961 40.0001H47.5001C49.5041 40.0001 50.7781 40.0081 51.7121 40.1981C52.5201 40.3621 52.9121 40.6321 53.2421 41.1401C53.6341 41.7441 53.6901 42.1621 53.5981 42.6941C53.4781 43.3801 53.1161 44.2141 52.4721 45.6541C50.643 49.732 47.3246 52.9566 43.1961 54.6681C38.9479 56.4265 34.1784 56.4425 29.9186 54.7125C25.6588 52.9826 22.2508 49.6457 20.4315 45.4233C18.6122 41.2008 18.5277 36.432 20.1962 32.1478C21.8647 27.8635 25.1523 24.408 29.3481 22.5281Z" fill="#007EA7"/>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,6 @@
<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="75" height="75" rx="37.5" fill="#E6F2F6"/>
<path d="M43.62 33.1604C44.7476 32.7851 45.9664 32.7851 47.094 33.1604C47.83 33.4064 48.438 33.8364 49.028 34.3524C49.592 34.8484 50.232 35.5104 50.998 36.3024C51.9126 37.2531 52.8286 38.2024 53.746 39.1504C54.642 40.0744 55.002 41.0504 54.998 42.3544C54.986 45.6724 54.916 47.9484 53.964 49.8144C53.0528 51.6014 51.5994 53.0541 49.812 53.9644C47.122 55.3364 43.682 55.0004 40.766 55.0004H34.234C32.05 55.0004 30.318 55.0004 28.924 54.8864C27.496 54.7704 26.29 54.5264 25.188 53.9664C23.4003 53.0556 21.9468 51.6021 21.036 49.8144C20.446 48.6564 20.216 47.3964 20.096 45.8624C19.92 43.5424 21.888 41.6644 23.402 40.1384C24.016 39.5184 24.664 38.9984 25.468 38.7024C26.6878 38.2563 28.0262 38.2563 29.246 38.7024C30.05 38.9984 30.698 39.5184 31.312 40.1384C31.908 40.7384 32.576 41.5384 33.384 42.5084C33.454 42.5944 33.564 42.6744 33.666 42.5684L39.716 36.3024C40.484 35.5104 41.122 34.8484 41.686 34.3524C42.276 33.8364 42.886 33.4064 43.62 33.1604ZM43.666 36.6064C43.206 37.0104 42.652 37.5824 41.832 38.4324L35.824 44.6524C35.5157 44.9718 35.1436 45.2227 34.7319 45.3887C34.3202 45.5548 33.8782 45.6322 33.4346 45.616C32.991 45.5997 32.5558 45.4902 32.1573 45.2946C31.7588 45.0989 31.4061 44.8215 31.122 44.4804C30.26 43.4484 29.674 42.7464 29.182 42.2524C28.702 41.7664 28.422 41.5964 28.216 41.5204C27.6613 41.3175 27.0527 41.3175 26.498 41.5204C26.292 41.5964 26.014 41.7664 25.532 42.2524C24.792 42.9964 24.138 43.8264 23.468 44.6324C23.146 45.0184 23.058 45.2224 23.094 45.7124C23.194 47.0244 23.388 47.8224 23.708 48.4524C24.3311 49.6751 25.3252 50.6693 26.548 51.2924C27.158 51.6024 27.928 51.7944 29.168 51.8964C30.428 51.9984 32.036 52.0004 34.3 52.0004H40.7C43.084 52.0004 46.23 52.4244 48.452 51.2924C49.6747 50.6693 50.6689 49.6751 51.292 48.4524C51.856 47.3424 51.984 45.8464 51.998 42.3444C52 41.7964 51.916 41.5724 51.522 41.1664L48.882 38.4324C48.062 37.5824 47.51 37.0124 47.048 36.6064C46.018 35.7024 44.74 35.6624 43.666 36.6064Z" fill="#007EA7"/>
<path d="M34.234 20H40.766C42.95 20 44.682 20 46.076 20.114C47.504 20.23 48.71 20.474 49.814 21.034C51.6013 21.9457 53.054 23.3998 53.964 25.188C54.526 26.288 54.77 27.496 54.886 28.924C55 30.318 55 32.05 55 34.234V40.766C55 42.95 55 44.682 54.886 46.076C54.77 47.504 54.526 48.71 53.966 49.814C53.0543 51.6013 51.6002 53.054 49.812 53.964C48.712 54.526 47.504 54.77 46.076 54.886C44.682 55 42.95 55 40.766 55H34.234C32.05 55 30.318 55 28.924 54.886C27.496 54.77 26.29 54.526 25.188 53.966C23.4003 53.0552 21.9468 51.6017 21.036 49.814C20.474 48.71 20.23 47.504 20.114 46.076C20 44.682 20 42.95 20 40.766V34.234C20 32.05 20 30.318 20.114 28.924C20.23 27.496 20.474 26.29 21.034 25.188C21.9453 23.4 23.3995 21.9465 25.188 21.036C26.288 20.474 27.496 20.23 28.924 20.114C30.318 20 32.05 20 34.234 20ZM29.168 23.104C27.928 23.204 27.158 23.398 26.548 23.708C25.3253 24.3311 24.3311 25.3253 23.708 26.548C23.398 27.158 23.206 27.928 23.104 29.168C23.002 30.428 23 32.036 23 34.3V40.7C23 42.966 23 44.574 23.104 45.832C23.204 47.072 23.398 47.842 23.708 48.452C24.3311 49.6747 25.3253 50.6689 26.548 51.292C27.158 51.602 27.928 51.794 29.168 51.896C30.428 51.998 32.036 52 34.3 52H40.7C42.966 52 44.574 52 45.832 51.896C47.072 51.796 47.842 51.602 48.452 51.292C49.6747 50.6689 50.6689 49.6747 51.292 48.452C51.602 47.842 51.794 47.072 51.896 45.832C51.998 44.572 52 42.964 52 40.7V34.3C52 32.036 52 30.426 51.896 29.168C51.796 27.928 51.602 27.158 51.292 26.548C50.6689 25.3253 49.6747 24.3311 48.452 23.708C47.842 23.398 47.072 23.206 45.832 23.104C44.572 23.002 42.964 23 40.7 23H34.3C32.036 23 30.426 23 29.168 23.104Z" fill="#007EA7"/>
<path d="M33.5 29C32.837 29 32.2011 29.2634 31.7322 29.7322C31.2634 30.2011 31 30.837 31 31.5C31 32.163 31.2634 32.7989 31.7322 33.2678C32.2011 33.7366 32.837 34 33.5 34C34.163 34 34.7989 33.7366 35.2678 33.2678C35.7366 32.7989 36 32.163 36 31.5C36 30.837 35.7366 30.2011 35.2678 29.7322C34.7989 29.2634 34.163 29 33.5 29ZM28 31.5C28 30.0413 28.5795 28.6424 29.6109 27.6109C30.6424 26.5795 32.0413 26 33.5 26C34.9587 26 36.3576 26.5795 37.3891 27.6109C38.4205 28.6424 39 30.0413 39 31.5C39 32.9587 38.4205 34.3576 37.3891 35.3891C36.3576 36.4205 34.9587 37 33.5 37C32.0413 37 30.6424 36.4205 29.6109 35.3891C28.5795 34.3576 28 32.9587 28 31.5Z" fill="#007EA7"/>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,3 @@
<svg width="32" height="21" viewBox="0 0 32 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 10.4689H6.00571C6.21648 10.4665 6.42282 10.408 6.60356 10.2996C6.78431 10.1912 6.93296 10.0366 7.03429 9.85176L11.1486 1.62319C11.25 1.41832 11.4116 1.24938 11.6118 1.13906C11.812 1.02874 12.0412 0.982327 12.2686 1.00605C12.495 1.02135 12.7112 1.10651 12.8872 1.24979C13.0632 1.39307 13.1905 1.58742 13.2514 1.80605L18.3486 18.766C18.4155 18.9961 18.553 19.1993 18.7416 19.347C18.9303 19.4946 19.1606 19.5793 19.4 19.5889C19.6243 19.5815 19.8415 19.5081 20.0244 19.3781C20.2073 19.248 20.3479 19.0669 20.4286 18.8575L23.56 11.2003C23.6462 10.9855 23.7944 10.8013 23.9858 10.671C24.1771 10.5408 24.4028 10.4704 24.6343 10.4689H30.7143" stroke="#007EA7" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 833 B

View File

@ -0,0 +1,6 @@
<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="75" height="75" rx="37.5" fill="#E6F2F6"/>
<path d="M20.8334 30C22.0834 31.6667 22.5 35 22.5 37.5C22.5 40 22.0834 43.3333 20.8334 45M24.9334 24.7617C24.5792 23.6583 25.3967 22.5 26.5559 22.5H48.4442C49.6034 22.5 50.4209 23.6583 50.0667 24.7617C49.0834 27.8333 47.5 33.4083 47.5 37.5C47.5 41.5917 49.0834 47.1667 50.0667 50.2383C50.4209 51.3417 49.6034 52.5 48.4442 52.5H26.5559C25.3967 52.5 24.5792 51.3417 24.9334 50.2383C25.9167 47.1667 27.5 41.5917 27.5 37.5C27.5 33.4083 25.9167 27.8333 24.9334 24.7617Z" stroke="#007EA7" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32.5 30.417H42.5M32.5 37.5003H42.5M32.5 44.167H35.8333" stroke="#007EA7" stroke-width="3" stroke-linecap="round"/>
<path d="M54.1667 30C52.9167 31.6667 52.5 35 52.5 37.5C52.5 40 52.9167 42.5 54.1667 45" stroke="#007EA7" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1004 B

View File

@ -0,0 +1,5 @@
<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="75" height="75" rx="37.5" fill="#E6F2F6"/>
<path d="M44.5 24.5C44.5 20.634 41.366 17.5 37.5 17.5C33.634 17.5 30.5 20.634 30.5 24.5V37.5C30.5 41.366 33.634 44.5 37.5 44.5C41.366 44.5 44.5 41.366 44.5 37.5V24.5Z" stroke="#007EA7" stroke-width="3.3" stroke-linejoin="round"/>
<path d="M22.5 36.5C22.5 44.784 29.216 51.5 37.5 51.5M37.5 51.5C45.784 51.5 52.5 44.784 52.5 36.5M37.5 51.5V57.5" stroke="#007EA7" stroke-width="3.3" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 588 B

View File

@ -0,0 +1,7 @@
<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="75" height="75" rx="37.5" fill="#E6F2F6"/>
<path d="M23.5 25.156H28.9M28.9 25.156H32.5M28.9 25.156V23.5M35.5 25.156H32.5M32.5 25.156C31.868 27.418 30.54 29.558 29.028 31.438L31.342 33.844M25.172 35.5C26.5554 34.2433 27.8443 32.8863 29.028 31.44C28.258 30.534 27.178 29.072 26.868 28.41M40.5 51.5L42.166 47.5M42.166 47.5L45.5 39.5L48.834 47.5M42.166 47.5H48.834M50.5 51.5L48.834 47.5" stroke="#007EA7" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M41.5 33.5V29.5C41.5 23.844 41.5 21.014 39.742 19.258C37.986 17.5 35.156 17.5 29.5 17.5C23.844 17.5 21.014 17.5 19.258 19.258C17.5 21.014 17.5 23.844 17.5 29.5C17.5 35.156 17.5 37.986 19.258 39.742C21.014 41.5 23.844 41.5 29.5 41.5H33.5" stroke="#007EA7" stroke-width="2.2" stroke-linecap="round"/>
<path d="M33.5 45.5C33.5 39.844 33.5 37.014 35.258 35.258C37.014 33.5 39.844 33.5 45.5 33.5C51.156 33.5 53.986 33.5 55.742 35.258C57.5 37.014 57.5 39.844 57.5 45.5C57.5 51.156 57.5 53.986 55.742 55.742C53.986 57.5 51.156 57.5 45.5 57.5C39.844 57.5 37.014 57.5 35.258 55.742C33.5 53.986 33.5 51.156 33.5 45.5Z" stroke="#007EA7" stroke-width="2.2"/>
<path d="M21.5 46.5C21.5 49.308 21.5 50.714 22.174 51.722C22.4659 52.1589 22.8411 52.5341 23.278 52.826C24.286 53.5 25.692 53.5 28.5 53.5M53.5 28.5C53.5 25.692 53.5 24.286 52.826 23.278C52.5341 22.8411 52.1589 22.4659 51.722 22.174C50.714 21.5 49.308 21.5 46.5 21.5" stroke="#007EA7" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,5 @@
<svg width="75" height="75" viewBox="0 0 75 75" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="75" height="75" rx="37.5" fill="#E6F2F6"/>
<path d="M19.8921 29.2459H55.1081M45.1141 29.2459V19.2539M29.8861 29.2459V19.2539M33.7801 37.3559V47.1999C33.7801 47.4019 33.8441 47.5999 33.9621 47.7719C34.0821 47.9419 34.2521 48.0799 34.4541 48.1699C34.6577 48.259 34.8804 48.2953 35.1017 48.2753C35.323 48.2554 35.5357 48.1799 35.7201 48.0559L43.3161 42.7559C43.4636 42.6534 43.5844 42.5169 43.6681 42.3579C43.7469 42.2044 43.7846 42.0331 43.7776 41.8606C43.7706 41.6882 43.7191 41.5205 43.6281 41.3739C43.5297 41.2226 43.3984 41.0955 43.2441 41.0019L35.6481 36.4579C35.4623 36.3499 35.253 36.2889 35.0383 36.2802C34.8236 36.2715 34.61 36.3153 34.4161 36.4079C34.2299 36.4977 34.0701 36.6341 33.9521 36.8039C33.8417 36.967 33.7818 37.159 33.7801 37.3559Z" stroke="#007EA7" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M44 19H31C24.3726 19 19 24.3726 19 31V44C19 50.6274 24.3726 56 31 56H44C50.6274 56 56 50.6274 56 44V31C56 24.3726 50.6274 19 44 19Z" stroke="#007EA7" stroke-width="2.8"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 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="M21.3334 11.333C23.1107 13.7037 23.1107 18.2957 21.3334 20.6664M25.3334 6.66636C30.6507 11.7437 30.6827 20.289 25.3334 25.333M2.66675 19.945V12.053C2.66675 11.2877 3.26408 10.6664 4.00008 10.6664H8.78141C8.95786 10.6657 9.13235 10.6294 9.29436 10.5595C9.45637 10.4896 9.60255 10.3876 9.72408 10.2597L13.7241 5.74236C14.5641 4.86769 16.0001 5.48769 16.0001 6.72369V25.2757C16.0001 26.521 14.5467 27.1357 13.7121 26.2437L9.72542 21.7517C9.60354 21.6201 9.45588 21.5151 9.29164 21.443C9.1274 21.371 8.95009 21.3336 8.77075 21.333H4.00008C3.26408 21.333 2.66675 20.7117 2.66675 19.945Z" stroke="#007EA7" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 778 B

View File

@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 12.9V17.1C16 20.6 14.6 22 11.1 22H6.9C3.4 22 2 20.6 2 17.1V12.9C2 9.4 3.4 8 6.9 8H11.1C14.6 8 16 9.4 16 12.9Z" stroke="#007EA7" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M22 6.9V11.1C22 14.6 20.6 16 17.1 16H16V12.9C16 9.4 14.6 8 11.1 8H8V6.9C8 3.4 9.4 2 12.9 2H17.1C20.6 2 22 3.4 22 6.9Z" stroke="#007EA7" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 525 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 15.575C11.8667 15.575 11.7417 15.5543 11.625 15.513C11.5083 15.4717 11.4 15.4007 11.3 15.3L7.7 11.7C7.5 11.5 7.404 11.2667 7.412 11C7.42 10.7333 7.516 10.5 7.7 10.3C7.9 10.1 8.13767 9.996 8.413 9.988C8.68833 9.98 8.92567 10.0757 9.125 10.275L11 12.15V5C11 4.71667 11.096 4.47934 11.288 4.288C11.48 4.09667 11.7173 4.00067 12 4C12.2827 3.99934 12.5203 4.09534 12.713 4.288C12.9057 4.48067 13.0013 4.718 13 5V12.15L14.875 10.275C15.075 10.075 15.3127 9.979 15.588 9.987C15.8633 9.995 16.1007 10.0993 16.3 10.3C16.4833 10.5 16.5793 10.7333 16.588 11C16.5967 11.2667 16.5007 11.5 16.3 11.7L12.7 15.3C12.6 15.4 12.4917 15.471 12.375 15.513C12.2583 15.555 12.1333 15.5757 12 15.575ZM6 20C5.45 20 4.97933 19.8043 4.588 19.413C4.19667 19.0217 4.00067 18.5507 4 18V16C4 15.7167 4.096 15.4793 4.288 15.288C4.48 15.0967 4.71733 15.0007 5 15C5.28267 14.9993 5.52033 15.0953 5.713 15.288C5.90567 15.4807 6.00133 15.718 6 16V18H18V16C18 15.7167 18.096 15.4793 18.288 15.288C18.48 15.0967 18.7173 15.0007 19 15C19.2827 14.9993 19.5203 15.0953 19.713 15.288C19.9057 15.4807 20.0013 15.718 20 16V18C20 18.55 19.8043 19.021 19.413 19.413C19.0217 19.805 18.5507 20.0007 18 20H6Z" fill="#007EA7"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22 12C22 17.52 17.52 22 12 22C6.48 22 3.11 16.44 3.11 16.44M3.11 16.44H7.63M3.11 16.44V21.44M2 12C2 6.48 6.44 2 12 2C18.67 2 22 7.56 22 7.56M22 7.56V2.56M22 7.56H17.56" stroke="#007EA7" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 367 B

View File

@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 8.5C2 5 4 3.5 7 3.5H17C20 3.5 22 5 22 8.5V15.5C22 19 20 20.5 17 20.5H7" stroke="#007EA7" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17 9L13.87 11.5C12.84 12.32 11.15 12.32 10.12 11.5L7 9" stroke="#007EA7" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2 16.5H8" stroke="#007EA7" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2 12.5H5" stroke="#007EA7" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 725 B

View File

@ -312,6 +312,96 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
} }
} }
String _getBotTitle() {
final name = _currentBot.name?.toLowerCase() ?? '';
if (name.contains('dall-e') ||
name.contains('dalle') ||
name.contains('image')) {
return 'ساخت عکس';
} else if (name.contains('veo') || name.contains('video')) {
return 'ساخت ویدیو';
} else if (name.contains('translate') ||
name.contains('translator') ||
name.contains('ترجمه')) {
return 'ترجمه';
} else if (name.contains('summarize') ||
name.contains('aisummery') ||
name.contains('خلاصه')) {
return 'خلاصه‌ساز';
} else if (name.contains('speech') ||
name.contains('text-to-speech') ||
name.contains('aiaudio') ||
name.contains('متن به صوت')) {
return 'تبدیل متن به صوت';
} else if (name.contains('chart') ||
name.contains('graph') ||
name.contains('نمودار') ||
name.contains('تحلیل')) {
return 'تحلیل و ترسیم نمودار';
}
return _currentBot.short ?? _currentBot.name ?? 'هوش مصنوعی';
}
String _getBotSubtitle() {
final name = _currentBot.name?.toLowerCase() ?? '';
if (name.contains('dall-e') ||
name.contains('dalle') ||
name.contains('image')) {
return 'با استفاده از این بات، می‌توانید تصاویر با کیفیت ایجاد کنید. پس از توصیف ایده‌ خود در قابل چند عبارت، بات، تصویری نزدیک به درخواست شما تولید می‌کند. در صورت نیاز، می‌توانید توضیح خود را اصلاح کرده و دوباره امتحان کنید تا به نتیجه دلخواه برسید.';
} else if (name.contains('veo') || name.contains('video')) {
return 'با استفاده از این بات، می‌توانید ویدیوهای کوتاه و ساده را از ایده‌ها، متن‌ها یا سناریوی موردنظر خود بسازید. کافی است توضیح دهید چه می‌خواهید، تا بات نسخه اولیه ویدیو را تولید کند. ';
} else if (name.contains('translate') ||
name.contains('translator') ||
name.contains('ترجمه')) {
return 'این بات به شما کمک می‌کند متن‌های خود را به‌صورت سریع و دقیق بین زبان‌های فارسی و انگلیسی ترجمه کنید. تنها کافی است جمله یا پاراگراف خود را وارد کنید تا ترجمه روان و قابل اتکا دریافت کنید. ';
} else if (name.contains('summarize') ||
name.contains('aisummery') ||
name.contains('خلاصه')) {
return 'با استفاده از این بات، می‌توانید هر متن طولانی را به نسخه‌ای کوتاه، روان و دقیق تبدیل کنید. کافی است متن خود را ارسال کنید تا بات، مهم‌ترین نکات آن را استخراج و در قالب خلاصه‌ای قابل‌فهم ارائه کند. ';
} else if (name.contains('speech') ||
name.contains('text-to-speech') ||
name.contains('aiaudio') ||
name.contains('متن به صوت')) {
return 'این بات متن شما را با صدایی طبیعی و واضح به فایل صوتی تبدیل می‌کند. فقط کافی است متن موردنظر را وارد کنید تا نسخه صوتی آن را دریافت کنید. ';
} else if (name.contains('chart') ||
name.contains('graph') ||
name.contains('نمودار') ||
name.contains('تحلیل')) {
return 'این بات امکان تولید انواع نمودارها و ترسیم‌های تحلیلی را برای شما فراهم می‌کند. تنها کافی است داده‌ها و نوع نمودار موردنظر را توضیح دهید تا خروجی تمیز و قابل استفاده دریافت کنید. اگر نتیجه مطابق نیازتان نبود، می‌توانید داده‌ها یا سبک نمودار را اصلاح و دوباره تولید کنید.';
}
return _currentBot.description ?? '';
}
String? _getBotIcon() {
final name = _currentBot.name?.toLowerCase() ?? '';
if (name.contains('dall-e') ||
name.contains('dalle') ||
name.contains('image')) {
return 'lib/assets/icons/CrateImage.svg';
} else if (name.contains('veo') || name.contains('video')) {
return 'lib/assets/icons/VideoBot.svg';
} else if (name.contains('translate') ||
name.contains('translator') ||
name.contains('ترجمه')) {
return 'lib/assets/icons/TranslateBot.svg';
} else if (name.contains('summarize') ||
name.contains('aisummery') ||
name.contains('خلاصه')) {
return 'lib/assets/icons/SummeryBot.svg';
} else if (name.contains('speech') ||
name.contains('text-to-speech') ||
name.contains('aiaudio') ||
name.contains('متن به صوت')) {
return 'lib/assets/icons/TTV_Bot.svg';
} else if (name.contains('chart') ||
name.contains('graph') ||
name.contains('نمودار') ||
name.contains('تحلیل')) {
return 'lib/assets/icons/ChartBot.svg';
}
return null;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return WillPopScope( return WillPopScope(
@ -412,30 +502,91 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
), ),
) )
: const SizedBox(height: 20), : const SizedBox(height: 20),
TweenAnimationBuilder<double>( if (widget.args.bot.id == 35)
duration: const Duration(milliseconds: 1000), TweenAnimationBuilder<double>(
tween: Tween(begin: 0.0, end: 1.0), duration: const Duration(milliseconds: 1000),
curve: Curves.easeOut, tween: Tween(begin: 0.0, end: 1.0),
builder: (context, value, child) { curve: Curves.easeOut,
return Opacity( builder: (context, value, child) {
opacity: value, return Center(
child: Transform.translate( child: Opacity(
offset: Offset(0, 20 * (1 - value)), opacity: value,
child: child, child: Transform.translate(
offset: Offset(0, 20 * (1 - value)),
child: child,
),
),
);
},
child: Center(
child: Text(
'چطور می‌تونم کمکت کنم؟',
style: TextStyle(
color: DesignConfig.isDark
? const Color.fromARGB(
255, 0, 90, 119)
: const Color.fromARGB(
255, 0, 53, 70),
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
),
),
if (widget.args.bot.id != 35)
TweenAnimationBuilder<double>(
duration: const Duration(milliseconds: 1000),
tween: Tween(begin: 0.0, end: 1.0),
curve: Curves.easeOut,
builder: (context, value, child) {
return Center(
child: Opacity(
opacity: value,
child: Transform.translate(
offset: Offset(0, 20 * (1 - value)),
child: child,
),
),
);
},
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 24.0),
child: Column(
children: [
if (_getBotIcon() != null)
const SizedBox(
height: 10,
),
Padding(
padding: const EdgeInsets.only(
bottom: 16.0),
child: SvgPicture.asset(
_getBotIcon()!,
height: 70,
),
),
DidvanText(
_getBotTitle(),
textAlign: TextAlign.center,
fontSize: 18,
fontWeight: FontWeight.bold,
color: const Color.fromARGB(
255, 27, 60, 89),
),
const SizedBox(height: 12),
DidvanText(
_getBotSubtitle(),
textAlign: TextAlign.start,
fontSize: 14,
color: Theme.of(context)
.colorScheme
.caption,
),
],
), ),
);
},
child: Text(
'چطور می‌تونم کمکت کنم؟',
style: TextStyle(
color: DesignConfig.isDark
? const Color.fromARGB(255, 0, 90, 119)
: const Color.fromARGB(255, 0, 53, 70),
fontSize: 16,
fontWeight: FontWeight.bold,
), ),
), ),
),
const SizedBox(height: 70), const SizedBox(height: 70),
if (widget.args.bot.id == 35) if (widget.args.bot.id == 35)
Column( Column(
@ -529,14 +680,18 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
.messages .messages
.last .last
.dateTime) .dateTime)
.toPersianDateStr() .toPersianDateStr(
monthString:
'')
.contains(DateTime.parse(DateTime .contains(DateTime.parse(DateTime
.now() .now()
.subtract(const Duration( .subtract(const Duration(
minutes: minutes:
210)) 210))
.toIso8601String()) .toIso8601String())
.toPersianDateStr())) { .toPersianDateStr(
monthString:
''))) {
state.messages.last state.messages.last
.prompts .prompts
.add(Prompts( .add(Prompts(
@ -739,7 +894,7 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
borderRadius: DesignConfig.lowBorderRadius, borderRadius: DesignConfig.lowBorderRadius,
), ),
child: DidvanText( child: DidvanText(
DateTime.parse(time).toPersianDateStr(), DateTime.parse(time).toPersianDateStr(monthString: ''),
style: Theme.of(context).textTheme.labelSmall, style: Theme.of(context).textTheme.labelSmall,
color: DesignConfig.isDark color: DesignConfig.isDark
? Theme.of(context).colorScheme.white ? Theme.of(context).colorScheme.white
@ -793,7 +948,7 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: MediaQuery.sizeOf(context).width / 1.3), maxWidth: MediaQuery.sizeOf(context).width / 1.3),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: DesignConfig.mediumBorderRadius.copyWith( borderRadius: DesignConfig.highBorderRadius.copyWith(
bottomLeft: !message.role.toString().contains('user') bottomLeft: !message.role.toString().contains('user')
? Radius.zero ? Radius.zero
: null, : null,
@ -804,11 +959,12 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
color: message.error != null && message.error! color: message.error != null && message.error!
? Theme.of(context).colorScheme.error.withOpacity(0.4) ? Theme.of(context).colorScheme.error.withOpacity(0.4)
: (message.role.toString().contains('user') : (message.role.toString().contains('user')
? Theme.of(context).colorScheme.surface ? Theme.of(context).colorScheme.focused
: Theme.of(context).colorScheme.focused) : Theme.of(context).colorScheme.surface)
.withOpacity(0.9), .withOpacity(0.9),
border: Border.all( border: Border.all(
color: Theme.of(context).colorScheme.border, color: message.role.toString().contains('user')
? const Color.fromARGB(0, 0, 0, 0) :Theme.of(context).colorScheme.border,
width: 0.5, width: 0.5,
), ),
), ),
@ -1000,20 +1156,16 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
state.isEdite = true; state.isEdite = true;
state.message.text = state.message.text =
message.text.toString(); message.text.toString();
state.update(); state.update();
}, },
child: Icon( child: SvgPicture.asset(
Icons.edit_outlined, 'lib/assets/icons/edit-2.svg',
size: 18, height: 20,
color: Theme.of(context) )),
.colorScheme
.focusedBorder,
),
),
), ),
if (message.file != null && kIsWeb) if (message.file != null && kIsWeb)
Padding( Padding(
@ -1038,62 +1190,57 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
debugPrint( debugPrint(
"Download button tapped on iOS"); "Download button tapped on iOS");
final url = final url =
'${RequestHelper.baseUrl + message.file.toString()}?accessToken=${RequestService.token}'; '${RequestHelper.baseUrl + message.file.toString()}?accessToken=${RequestService.token}';
await MediaService.downloadFile(url, await MediaService.downloadFile(
name: message.fileName); url,
}, name: message.fileName);
child: Icon( },
DidvanIcons.download_solid, child: SvgPicture.asset(
size: 18, 'lib/assets/icons/material-symbols_download-rounded.svg',
color: Theme.of(context) height: 20,
.colorScheme )),
.focusedBorder,
),
),
), ),
if (message.error != null && message.error!) if (message.error != null && message.error!)
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
state.messages.last.prompts state.messages.last.prompts
.remove(message); .remove(message);
state.messages.last.prompts.add( state.messages.last.prompts.add(
message.copyWith(error: false)); message.copyWith(
state.file = file; error: false));
state.update(); state.file = file;
final botToUse = _isSearchMode && state.update();
_searchBot != null final botToUse = _isSearchMode &&
? _searchBot! _searchBot != null
: _getSelectedBot(); ? _searchBot!
await state.postMessage( : _getSelectedBot();
botToUse, await state.postMessage(
widget.args.assistantsName != botToUse,
null); widget.args.assistantsName !=
Future.delayed( null);
const Duration( Future.delayed(
milliseconds: 100), () { const Duration(
state.scrollController.animateTo( milliseconds: 100), () {
state.scrollController.position state.scrollController
.maxScrollExtent, .animateTo(
duration: const Duration( state.scrollController
milliseconds: 300), .position.maxScrollExtent,
curve: Curves.easeOut, duration: const Duration(
); milliseconds: 300),
}); curve: Curves.easeOut,
}, );
child: Icon( });
DidvanIcons.refresh_solid, },
size: 18, child: SvgPicture.asset(
color: Theme.of(context) 'lib/assets/icons/refresh-2.svg',
.colorScheme height: 20,
.focusedBorder, )),
),
),
), ),
if (message.text != null && if (message.text != null &&
message.text!.isNotEmpty && message.text!.isNotEmpty &&
@ -1101,54 +1248,49 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
await Clipboard.setData( await Clipboard.setData(
ClipboardData( ClipboardData(
text: state.messages[mIndex] text: state
.prompts[index].text .messages[mIndex]
.toString())); .prompts[index]
Future.delayed( .text
Duration.zero, .toString()));
() => ActionSheetUtils(context) Future.delayed(
.showAlert( Duration.zero,
AlertData( () => ActionSheetUtils(context)
message: .showAlert(
"متن با موفقیت کپی شد", AlertData(
aLertType: ALertType.success, message:
"متن با موفقیت کپی شد",
aLertType:
ALertType.success,
),
), ),
), );
); },
}, child: SvgPicture.asset(
child: Icon( 'lib/assets/icons/copy.svg',
DidvanIcons.copy_regular, height: 20,
size: 18, )),
color: Theme.of(context)
.colorScheme
.focusedBorder,
),
),
), ),
Padding( Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
if (message.id != null) { if (message.id != null) {
state.deleteMessage( state.deleteMessage(
message.id!, mIndex, index); message.id!, mIndex, index);
} else { } else {
state.messages[mIndex].prompts state.messages[mIndex].prompts
.removeAt(index); .removeAt(index);
state.update(); state.update();
} }
}, },
child: Icon( child: SvgPicture.asset(
DidvanIcons.trash_solid, 'lib/assets/icons/trash.svg',
size: 18, height: 20,
color: Theme.of(context) )),
.colorScheme
.focusedBorder,
),
),
), ),
], ],
), ),
@ -1165,7 +1307,8 @@ class _AiChatPageState extends State<AiChatPage> with TickerProviderStateMixin {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
DidvanText( DidvanText(
DateTimeUtils.timeWithAmPm(message.createdAt.toString()), DateTimeUtils.timeWithAmPm(message.createdAt.toString())
.toPersianDigit(),
style: Theme.of(context).textTheme.labelSmall, style: Theme.of(context).textTheme.labelSmall,
color: Theme.of(context).colorScheme.caption, color: Theme.of(context).colorScheme.caption,
), ),

View File

@ -95,7 +95,7 @@ class _HistoryAiChatPageState extends State<HistoryAiChatPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Padding( Padding(
padding: EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text('فهرست آرشیوشده‌ها', child: Text('فهرست آرشیوشده‌ها',
style: TextStyle( style: TextStyle(
fontSize: 20, fontSize: 20,
@ -454,7 +454,7 @@ class _HistoryAiChatPageState extends State<HistoryAiChatPage> {
DateTime.parse(chat DateTime.parse(chat
.updatedAt .updatedAt
.toString()) .toString())
.toPersianDateStr(), .toPersianDateStr(monthString: ''),
style: style:
const TextStyle( const TextStyle(
fontSize: fontSize:

View File

@ -95,7 +95,7 @@ class _VerificationState extends State<Verification> {
crossAxisAlignment: CrossAxisAlignment.baseline, crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic, textBaseline: TextBaseline.alphabetic,
children: [ children: [
DidvanText('کد تایید پنج رقمی به شماره ', DidvanText('کد تایید شش رقمی به شماره ',
style: Theme.of(context).textTheme.titleSmall, style: Theme.of(context).textTheme.titleSmall,
fontWeight: FontWeight.normal, fontWeight: FontWeight.normal,
color: Theme.of(context).colorScheme.caption), color: Theme.of(context).colorScheme.caption),

View File

@ -75,7 +75,7 @@ class _CommentsState extends State<Comments> {
builder: (context, state, child) => SliverStateHandler<CommentsState>( builder: (context, state, child) => SliverStateHandler<CommentsState>(
onRetry: state.getComments, onRetry: state.getComments,
state: state, state: state,
itemPadding: const EdgeInsets.only(top: 0, bottom: 20), itemPadding: const EdgeInsets.only( bottom: 20),
childCount: state.comments.length, childCount: state.comments.length,
placeholder: const _CommentPlaceholder(), placeholder: const _CommentPlaceholder(),
centerEmptyState: false, centerEmptyState: false,
@ -109,7 +109,7 @@ class _CommentsState extends State<Comments> {
Positioned( Positioned(
left: 20, left: 20,
right: 20, right: 20,
top: 0, bottom: 20,
child: CommentMessageBox(focusNode: _focusNode), child: CommentMessageBox(focusNode: _focusNode),
), ),
], ],

View File

@ -139,7 +139,7 @@ class _MessageState extends State<Message> with SingleTickerProviderStateMixin {
if (widget.message.text != null) if (widget.message.text != null)
DidvanText( DidvanText(
widget.message.text!, widget.message.text!,
fontWeight: FontWeight.bold, fontWeight: FontWeight.normal,
), ),
if (widget.message.audio != null) if (widget.message.audio != null)
AudioWave( AudioWave(
@ -263,7 +263,7 @@ class _MessageState extends State<Message> with SingleTickerProviderStateMixin {
), ),
DidvanText( DidvanText(
DateTimeUtils.timeWithAmPm( DateTimeUtils.timeWithAmPm(
widget.message.createdAt), widget.message.createdAt).toPersianDigit(),
style: Theme.of(context).textTheme.labelSmall, style: Theme.of(context).textTheme.labelSmall,
color: Theme.of(context).colorScheme.caption, color: Theme.of(context).colorScheme.caption,
), ),

View File

@ -102,7 +102,7 @@ class _BookmarksState extends State<Bookmarks> {
iconWidget: 'lib/assets/icons/calendar.svg', iconWidget: 'lib/assets/icons/calendar.svg',
color: const Color.fromARGB(255, 27, 60, 89), color: const Color.fromARGB(255, 27, 60, 89),
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
StatefulBuilder( StatefulBuilder(
builder: (context, setState) => Row( builder: (context, setState) => Row(
children: [ children: [
@ -131,7 +131,7 @@ class _BookmarksState extends State<Bookmarks> {
], ],
), ),
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',
style: Theme.of(context) style: Theme.of(context)
@ -179,8 +179,10 @@ class _BookmarksState extends State<Bookmarks> {
hidePlayer: true, hidePlayer: true,
slivers: [ slivers: [
SliverAppBar( SliverAppBar(
pinned: true, pinned: false,
expandedHeight: 140, expandedHeight: 140,
scrolledUnderElevation: 0,
surfaceTintColor: Colors.transparent,
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
flexibleSpace: FlexibleSpaceBar( flexibleSpace: FlexibleSpaceBar(

View File

@ -161,6 +161,7 @@ class _FilteredBookmarksState extends State<FilteredBookmarks> {
onMarkChanged: (id, value) => onMarkChanged: (id, value) =>
_onBookmarkChanged(id, value, true, item.type), _onBookmarkChanged(id, value, true, item.type),
enableBookmark: true, enableBookmark: true,
useCardStyle: true, // **اعمال استایل کارت در لیست بوکمارک**
); );
}, },
childCount: state.bookmarks.length + childCount: state.bookmarks.length +
@ -173,4 +174,4 @@ class _FilteredBookmarksState extends State<FilteredBookmarks> {
), ),
); );
} }
} }

View File

@ -164,10 +164,9 @@ class _DidvanSignalsTitle extends StatelessWidget {
child: Row( child: Row(
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
'lib/assets/icons/voice-square.svg', 'lib/assets/icons/Signal.svg',
color: Theme.of(context).colorScheme.title, width: 25,
width: 30, height: 25,
height: 30,
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
DidvanText( DidvanText(
@ -192,10 +191,9 @@ class _DidvanVoiceTitle extends StatelessWidget {
child: Row( child: Row(
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
'lib/assets/icons/voice-square.svg', 'lib/assets/icons/akar-icons_sound-on.svg',
color: Theme.of(context).colorScheme.title, width: 25,
width: 30, height: 25,
height: 30,
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
DidvanText( DidvanText(
@ -236,9 +234,9 @@ class _ExploreLatestTitle extends StatelessWidget {
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
'lib/assets/icons/discover.svg', 'lib/assets/icons/discover.svg',
color: Theme.of(context).colorScheme.title, width: 25,
width: 30, height: 25,
height: 30, color: const Color.fromARGB(255, 0, 126, 167),
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
DidvanText( DidvanText(

View File

@ -109,10 +109,9 @@ class _DidvanPlusSectionState extends State<DidvanPlusSection> {
Row( Row(
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
'lib/assets/icons/voice-square.svg', 'lib/assets/icons/DidvanPlus.svg',
color: Theme.of(context).colorScheme.title, width: 25,
width: 30, height: 25,
height: 30,
), ),
const SizedBox(width: 5), const SizedBox(width: 5),
DidvanText( DidvanText(

View File

@ -9,6 +9,7 @@ import 'package:didvan/views/widgets/shimmer_placeholder.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:persian_number_utility/persian_number_utility.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
class SwotItemCard extends StatefulWidget { class SwotItemCard extends StatefulWidget {
@ -143,7 +144,7 @@ class _SwotItemCardState extends State<SwotItemCard> {
Text( Text(
"عدد ${widget.item.type == "THREAT" "عدد ${widget.item.type == "THREAT"
? "تهدید" ? "تهدید"
: "فرصت"} : ${(widget.item.x1 * widget.item.y1).toStringAsFixed(1)}", : "فرصت"} : ${(widget.item.x1 * widget.item.y1).toStringAsFixed(1).toPersianDigit()}",
style: theme.textTheme.bodySmall?.copyWith( style: theme.textTheme.bodySmall?.copyWith(
color: widget.item.type == "THREAT" color: widget.item.type == "THREAT"
? Colors.red ? Colors.red

View File

@ -292,10 +292,14 @@ class _PodcastTabPageState extends State<PodcastTabPage> {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final podcast = state.studios[index]; final podcast = state.studios[index];
// NEW: بررسی اینکه آیا این آیتم، آخرین آیتم در لیست است
final bool isLast = index == state.studios.length - 1;
return PodcastListCard( return PodcastListCard(
podcast: podcast, podcast: podcast,
onTap: () => _navigateToDetails(index), onTap: () => _navigateToDetails(index),
isLastItem: isLast, // NEW: ارسال پارامتر به ویجت کارت
); );
}, },
), ),
@ -306,4 +310,4 @@ class _PodcastTabPageState extends State<PodcastTabPage> {
onRetry: () => context.read<PodcastsState>().getStudios(page: 1), onRetry: () => context.read<PodcastsState>().getStudios(page: 1),
); );
} }
} }

View File

@ -171,6 +171,8 @@ class _VideoDetailsPageState extends State<VideoDetailsPage>
appBar: PreferredSize( appBar: PreferredSize(
preferredSize: const Size.fromHeight(90.0), preferredSize: const Size.fromHeight(90.0),
child: AppBar( child: AppBar(
scrolledUnderElevation: 0,
surfaceTintColor: Colors.transparent,
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
elevation: 0, elevation: 0,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
@ -232,18 +234,47 @@ class _VideoDetailsPageState extends State<VideoDetailsPage>
Positioned( Positioned(
top: 1, top: 1,
left: 1, left: 1,
child: BookmarkButton( child: Row(
value: state.studio.marked, children: [
onMarkChanged: (value) { Container(
if (widget.pageData['onMarkChanged'] != height: 36,
null) { decoration: BoxDecoration(
widget.pageData['onMarkChanged']( color:
state.studio.id, value); Colors.black.withOpacity(0.6),
} shape: BoxShape.circle,
}, ),
gestureSize: 35, child: IconButton(
type: 'video', icon: SvgPicture.asset(
itemId: state.studio.id, 'lib/assets/icons/fluent_mention-32-regular.svg',
width: 28,
height: 28,
),
onPressed: () =>
Navigator.of(context).pushNamed(
Routes.mentions,
arguments: {
'id': state.studio.id,
'type': 'studio',
'title': state.studio.title,
},
),
),
),
BookmarkButton(
value: state.studio.marked,
onMarkChanged: (value) {
if (widget.pageData[
'onMarkChanged'] !=
null) {
widget.pageData['onMarkChanged'](
state.studio.id, value);
}
},
gestureSize: 35,
type: 'video',
itemId: state.studio.id,
),
],
), ),
), ),
], ],
@ -489,24 +520,24 @@ class _VideoDetailsPageState extends State<VideoDetailsPage>
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
CircleAvatar( // CircleAvatar(
radius: 20, // radius: 20,
backgroundColor: DesignConfig.isDark // backgroundColor: DesignConfig.isDark
? Colors.transparent // ? Colors.transparent
: Colors.white, // : Colors.white,
backgroundImage: // backgroundImage:
hasProfileImage ? NetworkImage(user.photo!) : null, // hasProfileImage ? NetworkImage(user.photo!) : null,
child: !hasProfileImage // child: !hasProfileImage
? Icon( // ? Icon(
DidvanIcons.avatar_light, // DidvanIcons.avatar_light,
size: 50, // size: 50,
color: DesignConfig.isDark // color: DesignConfig.isDark
? Colors.white // ? Colors.white
: Colors.black, // : Colors.black,
) // )
: null, // : null,
), // ),
const SizedBox(width: 8), // const SizedBox(width: 8),
Expanded( Expanded(
child: CommentMessageBox(focusNode: _focusNode), child: CommentMessageBox(focusNode: _focusNode),
), ),
@ -514,28 +545,32 @@ class _VideoDetailsPageState extends State<VideoDetailsPage>
); );
}, },
), ),
const SizedBox(height: 16), SizedBox(height: state.studio.comments == 0 ? 0 : 16),
SizedBox( SizedBox(
width: double.infinity, width: double.infinity,
child: DidvanText( child: state.studio.comments == 0
'نظرات کاربران:', ? const SizedBox()
style: TextStyle( : DidvanText(
color: DesignConfig.isDark 'نظرات کاربران:',
? const Color.fromARGB(255, 0, 90, 119) style: TextStyle(
: const Color.fromARGB(255, 0, 53, 70), color: DesignConfig.isDark
fontSize: 18, ? const Color.fromARGB(255, 0, 90, 119)
fontWeight: FontWeight.bold, : const Color.fromARGB(255, 0, 53, 70),
), fontSize: 18,
), fontWeight: FontWeight.bold,
),
),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
SizedBox( state.studio.comments == 0
height: 400, ? const SizedBox()
child: Comments( : SizedBox(
key: _commentsKey, height: 400,
pageData: const {'isPage': false}, child: Comments(
), key: _commentsKey,
), pageData: const {'isPage': false},
),
),
], ],
), ),
), ),

View File

@ -12,11 +12,13 @@ import 'package:persian_number_utility/persian_number_utility.dart';
class PodcastListCard extends StatelessWidget { class PodcastListCard extends StatelessWidget {
final OverviewData podcast; final OverviewData podcast;
final VoidCallback onTap; final VoidCallback onTap;
final bool isLastItem; // NEW: پارامتر جدید برای تشخیص آیتم آخر
const PodcastListCard({ const PodcastListCard({
super.key, super.key,
required this.podcast, required this.podcast,
required this.onTap, required this.onTap,
this.isLastItem = false, // NEW: مقداردهی اولیه پارامتر
}); });
String _formatDuration(int? duration) { String _formatDuration(int? duration) {
@ -141,14 +143,16 @@ class PodcastListCard extends StatelessWidget {
), ),
), ),
), ),
Divider( // NEW: چک میکنیم که آیا آیتم آخر است یا نه
color: Colors.grey[300], if (!isLastItem)
thickness: 2, Divider(
indent: 16, color: Colors.grey[300],
endIndent: 16, thickness: 2,
), indent: 16,
endIndent: 16,
),
], ],
), ),
); );
} }
} }

View File

@ -16,6 +16,7 @@ import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/shimmer_placeholder.dart'; import 'package:didvan/views/widgets/shimmer_placeholder.dart';
import 'package:didvan/views/widgets/skeleton_image.dart'; import 'package:didvan/views/widgets/skeleton_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:persian_number_utility/persian_number_utility.dart'; import 'package:persian_number_utility/persian_number_utility.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
@ -54,26 +55,26 @@ class SearchResultItem extends StatelessWidget {
return null; return null;
} }
IconData get _icon { String get _icon {
if (item.type == 'radar') { if (item.type == 'radar') {
return DidvanIcons.scanning_light; return 'lib/assets/icons/Pouyesh_Ofogh_New.svg';
} }
if (item.type == 'news') { if (item.type == 'news') {
return DidvanIcons.foolad_light; return 'lib/assets/icons/Donye_Foolad.svg';
} }
if (item.type == 'video') { if (item.type == 'video') {
return DidvanIcons.video_light; return 'lib/assets/icons/video-play.svg';
} }
if (item.type == 'podcast') { if (item.type == 'podcast') {
return DidvanIcons.podcast_light; return 'lib/assets/icons/play-circle.svg';
} }
if (item.type == 'delphi') { if (item.type == 'delphi') {
return DidvanIcons.saha_light; return 'lib/assets/icons/Saha.svg';
} }
if (item.type == 'infography') { if (item.type == 'infography') {
return DidvanIcons.infography_regular; return 'lib/assets/icons/hugeicons_chart-02.svg';
} }
return DidvanIcons.radar_light; return 'DidvanIcons.radar_light';
} }
void _openInteractiveViewer(BuildContext context, String image) { void _openInteractiveViewer(BuildContext context, String image) {
@ -156,16 +157,16 @@ class SearchResultItem extends StatelessWidget {
Container( Container(
padding: padding:
const EdgeInsets.symmetric(vertical: 4, horizontal: 8), const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
decoration: BoxDecoration( decoration: const BoxDecoration(
color: Theme.of(context).colorScheme.secondary, color: Color.fromARGB(255, 0, 126, 167),
borderRadius: const BorderRadius.horizontal( borderRadius: BorderRadius.horizontal(
left: Radius.circular(10), left: Radius.circular(10),
), ),
), ),
child: Icon( child: SvgPicture.asset(
_icon, _icon,
color: Theme.of(context).colorScheme.white, color: Theme.of(context).colorScheme.white,
size: 18, height: 18,
), ),
), ),
], ],
@ -173,7 +174,7 @@ class SearchResultItem extends StatelessWidget {
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded( Expanded(
child: SizedBox( child: SizedBox(
height: 200, height: 80,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,

View File

@ -97,7 +97,7 @@ class _MentionsState extends State<Mentions> {
subtitle: widget.pageData['title'], subtitle: widget.pageData['title'],
) )
: null, : null,
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 92), padding: const EdgeInsets.only(bottom: 92),
showSliversFirst: false, showSliversFirst: false,
slivers: [ slivers: [
Consumer<MentionsState>( Consumer<MentionsState>(
@ -105,14 +105,18 @@ class _MentionsState extends State<Mentions> {
SliverStateHandler<MentionsState>( SliverStateHandler<MentionsState>(
onRetry: state.getComments, onRetry: state.getComments,
state: state, state: state,
itemPadding: const EdgeInsets.symmetric(vertical: 16), itemPadding: const EdgeInsets.symmetric(vertical: 0),
childCount: state.comments.length, childCount: state.comments.length,
placeholder: const _MentionPlaceholder(), placeholder: const _MentionPlaceholder(),
centerEmptyState: _isPage, centerEmptyState: _isPage,
enableEmptyState: state.comments.isEmpty, enableEmptyState: state.comments.isEmpty,
emptyState: EmptyState( paddingEmptyState: 0,
asset: Assets.emptyChat, emptyState: const EmptyState(
title: 'دوستان خود را فراخوانی کنید'), asset: 'lib/assets/images/empty_states/Empty_List.png',
title: 'دوستان خود را فراخوانی کنید',
titleColor: Color.fromARGB(255, 0, 126, 167),
height: 550,
),
builder: (context, state, index) => Mention( builder: (context, state, index) => Mention(
key: ValueKey( key: ValueKey(
state.comments[index].id.toString() + state.comments[index].id.toString() +

View File

@ -73,11 +73,11 @@ class _MonthlyListPageState extends State<MonthlyListPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ItemTitle( ItemTitle(
title: 'تاریخ ایجاد', title: 'تاریخ',
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular, icon: DidvanIcons.calendar_range_regular,
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
Row( Row(
children: [ children: [
DatePickerButton( DatePickerButton(
@ -95,7 +95,7 @@ class _MonthlyListPageState extends State<MonthlyListPage> {
), ),
], ],
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
if (state.categories.isNotEmpty) ...[ if (state.categories.isNotEmpty) ...[
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',

View File

@ -222,11 +222,11 @@ class _NewsState extends State<News> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ItemTitle( ItemTitle(
title: 'تاریخ خبر', title: 'تاریخ',
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular, icon: DidvanIcons.calendar_range_regular,
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
Row( Row(
children: [ children: [
DatePickerButton( DatePickerButton(
@ -246,7 +246,7 @@ class _NewsState extends State<News> {
), ),
], ],
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',
icon: DidvanIcons.category_regular, icon: DidvanIcons.category_regular,

View File

@ -286,32 +286,12 @@ class _NotificationSettingsState extends State<NotificationSettings>
), ),
TimeSliderPicker( TimeSliderPicker(
selectedTime: state.selectedTime, selectedTime: state.selectedTime,
isDisabled: state.isAnytime, isDisabled: false,
onTimeChanged: (newTime) { onTimeChanged: (newTime) {
state.selectedTime = newTime; state.selectedTime = newTime;
state.update(); state.update();
}, },
), ),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 16),
// child: Container(
// padding: const EdgeInsets.all(16),
// decoration: BoxDecoration(
// color: Theme.of(context).colorScheme.surface,
// border: Border.all(
// color: Theme.of(context).colorScheme.border,
// width: 1),
// borderRadius: BorderRadius.circular(18)),
// child: DidvanSwitch(
// value: state.isAnytime,
// title: "دریافت آنی اعلانات",
// onChanged: (val) {
// state.isAnytime = val;
// state.update();
// },
// ),
// ),
// ),
const SizedBox(height: 16), const SizedBox(height: 16),
Padding( Padding(
padding: const EdgeInsets.all(15.0), padding: const EdgeInsets.all(15.0),

View File

@ -13,7 +13,7 @@ class OnboardingIndicatorPainter extends CustomPainter {
required this.currentPage, required this.currentPage,
required this.activeColor, required this.activeColor,
required this.inactiveColor, required this.inactiveColor,
this.strokeWidth = 6.0, this.strokeWidth = 4.0,
}); });
@override @override

View File

@ -6,30 +6,28 @@ import 'package:didvan/views/onboarding/onboarding_indicator_painter.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
final List<OnboardingEntity> onboardingPages = [ final List<OnboardingEntity> onboardingPages = [
OnboardingEntity(
imagePath: 'lib/assets/images/onboarding/1.png',
title: 'چرا دیدوان؟',
description:
'جغرافیای زمانی هیچ‌گاه نمی‌ایستد و سفر به آینده یک سفر شگفت‌انگیز به جایی است که قسمت‌هایی از آن را قبلاً در گذشته دیده‌ایم، قسمت‌هایی از آن را طی مسیر به تدریج می‌بینیم و قسمت‌هایی از آن کاملاً بدیع هستند. برای سفر مطمئن در جغرافیای زمانی ما به سیستم‌های پیش‌نگر نیاز داریم و یکی از ارکان این سیستم‌ها، سامانه‌های رصد راهبردی هستند.',
),
OnboardingEntity( OnboardingEntity(
imagePath: 'lib/assets/images/onboarding/2.png', imagePath: 'lib/assets/images/onboarding/2.png',
title: 'رادارهای استراتژیک', title: 'رصدخانه استراتژیک',
description: description:
'رادارهای استراتژیک، قلب دیدوان هستند. رادارهایی که قرار است دید 360 درجه‌ای برای مدیران ایجاد کنند و به صورت مستمر گزارش‌هایی تحلیلی را از محیط‌های دور و نزدیک هر کسب و کار در اختیار مدیران قرار ‌دهند. رادارها به صورت موضوعی شامل رادار روند، رادار ریسک، رادار تکنولوژی، رادار استارت‌آپ و ماژول فرصت و تهدید دسته بندی شده‌اند و مدیران می‌توانند پیرامون این گزارشات به بحث و تبادل نظر بپردازند.', 'ارائه گزارش‌های تحلیلی از محیط‌های دور و نزدیک صنعت و آخرین اخبار مرتبط با محیط رقابتی، ایجاد دید ۳۶۰ درجه محیطی در قالب ماهنامه‌های تحلیلی، رادارهای روند، ریسک، استارت‌آپ، تکنولوژی، شناسایی فرصت‌ها و تهدیدها و سامانه هم اندیشی سها.',
),
OnboardingEntity(
imagePath: 'lib/assets/images/onboarding/3.png',
title: 'استودیو دیدوان',
description:
'''در استودیو آینده شما می‌توانید ویدیوهایی مستند از مسائلی مانند آموزش مفاهیم آینده‌گرا، تحلیل روندها، تحلیل صنعت و یا هر نوع اطلاعاتی که می‌تواند برای تصمیم‌گیری مدیران ارشد راهگشا باشد را ببینید.
همچنین در بخش دیگر این استودیو و در قالب پادکست، اطلاعاتی از جنس مسائل پیش گفته که ارزش تبدیل به فایل صوتی دارند را، میشنوید.
 ''',
), ),
OnboardingEntity( OnboardingEntity(
imagePath: 'lib/assets/images/onboarding/4.png', imagePath: 'lib/assets/images/onboarding/4.png',
title: 'نبض صنعت', title: 'نبض صنعت',
description: 'در دنیای امروز، تصمیم‌گیری‌های کلیدی در صنایع مختلف به شدت وابسته به داده‌های دقیق و به‌روز شده‌اند. این داده‌ها شامل اطلاعات اقتصادی، مالی، خرید و فروش، بازار سرمایه، ارزهای دیجیتال، شاخص‌های کلان اقتصادی و دیگر حوزه‌ها هستند. استفاده هوشمندانه از داده‌ها این امکان را به مدیران می‌دهد تا تصمیماتی آگاهانه بگیرند، ریسک‌ها را کاهش دهند و عملکرد کلی خود را به سطحی بالاتر ارتقاء دهند.', description:
'ارائه داده‌های دقیق و به‌روز از کل زنجیره صنعت فولاد از مواد اولیه تا محصولات نهایی، شاخص‌های کلان اقتصادی، بازار سرمایه و دیگر اطلاعات لازم به منظور تصمیم‌گیری آگاهانه، کاهش ریسک و ارتقای عملکرد مدیران.',
),
OnboardingEntity(
imagePath: 'lib/assets/images/onboarding/3.png',
title: 'استودیو آینده',
description:
'ارائه مفاهیم آینده‌گرا، تحلیل روندها، تحلیل صنعت و یا هر نوع اطلاعات مورد نیاز برای تصمیم‌گیری مدیران ارشد در قالب ویدیوکست، پادکست و اینفوگرافی.',
),
OnboardingEntity(
imagePath: 'lib/assets/images/onboarding/1.png',
title: 'هوشان',
description: 'ارائه ابزارهای هوش مصنوعی مورد نیاز مدیران اعم از خلاصه‌ساز، ساخت عکس، تحلیل و ترسیم نمودار، تبدیل متن به صوت، ساخت ویدیو و ترجمه، امکان پرسش و پاسخ از مدل‌های زبانی مختلف و یا جستجوی هوشمند در محتوای داخلی از طریق دستیار اختصاصی هوش مصنوعی دیدوان.',
), ),
]; ];
@ -130,13 +128,13 @@ class _OnboardingPageState extends State<OnboardingPage> {
}, },
), ),
SizedBox( SizedBox(
width: 60, width: 50,
height: 60, height: 50,
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
CustomPaint( CustomPaint(
size: const Size(60, 60), size: const Size(50, 50),
painter: OnboardingIndicatorPainter( painter: OnboardingIndicatorPainter(
pageCount: onboardingPages.length, pageCount: onboardingPages.length,
currentPage: _currentPage, currentPage: _currentPage,
@ -148,8 +146,8 @@ class _OnboardingPageState extends State<OnboardingPage> {
GestureDetector( GestureDetector(
onTap: _onNextTap, onTap: _onNextTap,
child: Container( child: Container(
width: 60, width: 50,
height: 45, height: 35,
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Color.fromARGB(255, 1, 35, 72), color: Color.fromARGB(255, 1, 35, 72),
shape: BoxShape.circle, shape: BoxShape.circle,
@ -170,6 +168,7 @@ class _OnboardingPageState extends State<OnboardingPage> {
], ],
), ),
), ),
const SizedBox(height: 10,),
Expanded( Expanded(
flex: 2, flex: 2,
child: Padding( child: Padding(
@ -196,7 +195,7 @@ class _OnboardingPageState extends State<OnboardingPage> {
style: theme.textTheme.bodyMedium?.copyWith( style: theme.textTheme.bodyMedium?.copyWith(
color: const Color.fromARGB(255, 41, 41, 41), color: const Color.fromARGB(255, 41, 41, 41),
height: 1.6, height: 1.6,
fontSize: 15 fontSize: 14
), ),
), ),
], ],
@ -237,7 +236,7 @@ class _OnboardingPageState extends State<OnboardingPage> {
), ),
Positioned( Positioned(
bottom: 40, bottom: 30,
left: 24, left: 24,
right: 24, right: 24,
child: Column( child: Column(

View File

@ -267,7 +267,7 @@ class _PodcastsState extends State<Podcasts> {
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular, icon: DidvanIcons.calendar_range_regular,
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
StatefulBuilder( StatefulBuilder(
builder: (context, setState) => Row( builder: (context, setState) => Row(
children: [ children: [

View File

@ -312,6 +312,8 @@ class _StudioDetailsState extends State<StudioDetails>
appBar: PreferredSize( appBar: PreferredSize(
preferredSize: const Size.fromHeight(90.0), preferredSize: const Size.fromHeight(90.0),
child: AppBar( child: AppBar(
scrolledUnderElevation: 0,
surfaceTintColor: Colors.transparent,
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
elevation: 0, elevation: 0,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
@ -389,24 +391,55 @@ class _StudioDetailsState extends State<StudioDetails>
scale: _bookmarkScaleAnimation, scale: _bookmarkScaleAnimation,
child: RotationTransition( child: RotationTransition(
turns: _bookmarkRotationAnimation, turns: _bookmarkRotationAnimation,
child: BookmarkButton( child: Row(
value: state.studio.marked, children: [
onMarkChanged: (value) { Container(
if (widget.pageData[ height: 36,
'onMarkChanged'] != decoration: BoxDecoration(
null) { color: Colors.black
widget.pageData[ .withOpacity(0.6),
'onMarkChanged']( shape: BoxShape.circle,
state.studio.id, ),
value, child: IconButton(
true); icon: SvgPicture.asset(
} 'lib/assets/icons/fluent_mention-32-regular.svg',
}, width: 28,
gestureSize: 35, height: 28,
type: state.studio.type == 'video' ),
? 'video' onPressed: () =>
: 'podcast', Navigator.of(context)
itemId: state.studio.id, .pushNamed(
Routes.mentions,
arguments: {
'id': state.studio.id,
'type': 'studio',
'title':
state.studio.title,
},
),
),
),
BookmarkButton(
value: state.studio.marked,
onMarkChanged: (value) {
if (widget.pageData[
'onMarkChanged'] !=
null) {
widget.pageData[
'onMarkChanged'](
state.studio.id,
value,
true);
}
},
gestureSize: 35,
type:
state.studio.type == 'video'
? 'video'
: 'podcast',
itemId: state.studio.id,
),
],
), ),
), ),
), ),
@ -710,28 +743,38 @@ class _StudioDetailsState extends State<StudioDetails>
); );
}, },
), ),
const SizedBox(height: 16), SizedBox(height: state.studio.comments == 0 ? 0 : 16),
SizedBox( SizedBox(
width: double.infinity, width: double.infinity,
child: DidvanText( child: state.studio.comments == 0
'نظرات کاربران:', ? const SizedBox(
style: TextStyle( height: 0,
color: DesignConfig.isDark )
? const Color.fromARGB(255, 0, 90, 119) : DidvanText(
: const Color.fromARGB(255, 0, 53, 70), 'نظرات کاربران:',
fontSize: 18, style: TextStyle(
fontWeight: FontWeight.bold, color: DesignConfig.isDark
), ? const Color.fromARGB(255, 0, 90, 119)
), : const Color.fromARGB(255, 0, 53, 70),
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
SizedBox( state.studio.comments == 0
height: 400, ? const Padding(
child: Comments( padding: EdgeInsets.all(32.0),
key: _commentsKey, child: SizedBox(
pageData: const {'isPage': false}, height: 5,
), ))
), : SizedBox(
height: 500,
child: Comments(
key: _commentsKey,
pageData: const {'isPage': false},
),
),
], ],
), ),
), ),

View File

@ -13,6 +13,7 @@ import 'package:didvan/views/widgets/didvan/scaffold.dart';
import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:persian_number_utility/persian_number_utility.dart';
import 'package:pin_code_fields/pin_code_fields.dart'; import 'package:pin_code_fields/pin_code_fields.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -272,7 +273,7 @@ class _VerifyOtpScreenState extends State<VerifyOtpScreen>
), ),
children: [ children: [
const TextSpan( const TextSpan(
text: 'ما یک کد تأیید 6 رقمی به شماره '), text: 'ما یک کد تأیید ۶ رقمی به شماره '),
TextSpan( TextSpan(
text: phoneNumber.convertToPersianDigits(), text: phoneNumber.convertToPersianDigits(),
style: TextStyle( style: TextStyle(
@ -404,7 +405,7 @@ class _VerifyOtpScreenState extends State<VerifyOtpScreen>
if (_remainingTime > 0) ...[ if (_remainingTime > 0) ...[
const SizedBox(width: 8), const SizedBox(width: 8),
DidvanText( DidvanText(
_formattedTime, _formattedTime.toPersianDigit(),
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
.bodyMedium .bodyMedium

View File

@ -44,9 +44,8 @@ class ChatRoomItem extends StatelessWidget {
Row( Row(
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
chatRoom.unread != 0 chatRoom.lastMessage.writedByAdmin? chatRoom.lastMessage.readed ?'lib/assets/icons/sms.svg' :'lib/assets/icons/sms-notification.svg'
? 'lib/assets/icons/sms-notification.svg' : 'lib/assets/icons/sms-tracking.svg',
: 'lib/assets/icons/sms.svg',
height: 24, height: 24,
width: 24, width: 24,
color: chatRoom.unread != 0 color: chatRoom.unread != 0
@ -88,12 +87,8 @@ class ChatRoomItem extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.fromLTRB(10, 8, 10, 8), padding: const EdgeInsets.fromLTRB(10, 8, 10, 8),
child: Text( child: Text(
chatRoom.lastMessage.readed chatRoom.lastMessage.writedByAdmin? chatRoom.lastMessage.readed
? chatRoom.lastMessage.writedByAdmin ? 'پاسخ داده شده' : 'خوانده نشده' : 'در انتظار پاسخ',),
? 'پاسخ داده شده'
: 'در انتظار پاسخ'
: 'خوانده نشده',
),
), ),
), ),
// Icon( // Icon(

View File

@ -6,6 +6,7 @@ import 'package:didvan/models/view/action_sheet_data.dart';
import 'package:didvan/providers/theme.dart'; import 'package:didvan/providers/theme.dart';
import 'package:didvan/providers/user.dart'; import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.dart'; import 'package:didvan/routes/routes.dart';
import 'package:didvan/services/network/request.dart';
import 'package:didvan/services/storage/storage.dart'; import 'package:didvan/services/storage/storage.dart';
import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/utils/action_sheet.dart';
import 'package:didvan/views/profile/general_settings/settings_state.dart'; import 'package:didvan/views/profile/general_settings/settings_state.dart';
@ -90,6 +91,7 @@ class _ProfilePageState extends State<ProfilePage>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final user = context.watch<UserProvider>().user; final user = context.watch<UserProvider>().user;
print('DEBUG - User Photo URL: ${user.photo}');
return Consumer<GeneralSettingsState>( return Consumer<GeneralSettingsState>(
builder: (context, state, child) => StateHandler<GeneralSettingsState>( builder: (context, state, child) => StateHandler<GeneralSettingsState>(
@ -105,6 +107,8 @@ class _ProfilePageState extends State<ProfilePage>
backgroundColor: Theme.of(context).colorScheme.surface, backgroundColor: Theme.of(context).colorScheme.surface,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
leadingWidth: 200, leadingWidth: 200,
scrolledUnderElevation: 0,
surfaceTintColor: Colors.transparent,
leading: Padding( leading: Padding(
padding: const EdgeInsetsDirectional.only(start: 0.0), padding: const EdgeInsetsDirectional.only(start: 0.0),
child: SvgPicture.asset( child: SvgPicture.asset(
@ -155,7 +159,11 @@ class _ProfilePageState extends State<ProfilePage>
image: image:
(user.photo != null && user.photo!.isNotEmpty) (user.photo != null && user.photo!.isNotEmpty)
? DecorationImage( ? DecorationImage(
image: NetworkImage(user.photo!), image: NetworkImage('https://api.didvan.app${user.photo!}',
headers: {
'Authorization':
'Bearer ${RequestService.token}',
}),
fit: BoxFit.cover, fit: BoxFit.cover,
) )
: null, : null,

View File

@ -388,7 +388,7 @@ class _RadarStateView extends State<Radar> {
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular, icon: DidvanIcons.calendar_range_regular,
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
StatefulBuilder( StatefulBuilder(
builder: (context, setState) => Row( builder: (context, setState) => Row(
children: [ children: [
@ -408,7 +408,7 @@ class _RadarStateView extends State<Radar> {
], ],
), ),
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',
icon: DidvanIcons.category_regular, icon: DidvanIcons.category_regular,

View File

@ -189,6 +189,7 @@ class HomeAppBar extends StatelessWidget {
confrimTitle: 'نمایش نتایج', confrimTitle: 'نمایش نتایج',
onDismissed: () => state.resetFilters(false), onDismissed: () => state.resetFilters(false),
onConfirmed: () => state.searchAll(page: 1), onConfirmed: () => state.searchAll(page: 1),
hasPadding: true,
content: Column( content: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -202,7 +203,7 @@ class HomeAppBar extends StatelessWidget {
iconWidget: 'lib/assets/icons/calendar.svg', iconWidget: 'lib/assets/icons/calendar.svg',
color: const Color.fromARGB(255, 27, 60, 89), color: const Color.fromARGB(255, 27, 60, 89),
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
StatefulBuilder( StatefulBuilder(
builder: (context, setState) => Row( builder: (context, setState) => Row(
children: [ children: [
@ -223,7 +224,7 @@ class HomeAppBar extends StatelessWidget {
], ],
), ),
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
], ],
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',

View File

@ -580,7 +580,7 @@ class _HistoryDrawerContentState extends State<HistoryDrawerContent> {
Widget _buildChatItem(dynamic chat, dynamic historyState) { Widget _buildChatItem(dynamic chat, dynamic historyState) {
final int index = historyState.chats.indexOf(chat); final int index = historyState.chats.indexOf(chat);
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
@ -596,7 +596,7 @@ class _HistoryDrawerContentState extends State<HistoryDrawerContent> {
}, },
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
child: Padding( child: Padding(
padding: const EdgeInsets.fromLTRB(8, 5, 10, 5), padding: const EdgeInsets.fromLTRB(8, 0, 10, 10),
child: SizedBox( child: SizedBox(
child: Row( child: Row(
children: [ children: [

View File

@ -155,7 +155,7 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular, icon: DidvanIcons.calendar_range_regular,
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
StatefulBuilder( StatefulBuilder(
builder: (context, setState) => Row( builder: (context, setState) => Row(
children: [ children: [
@ -176,7 +176,7 @@ class LogoAppBar extends StatelessWidget implements PreferredSizeWidget {
], ],
), ),
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
], ],
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',

View File

@ -5,6 +5,7 @@ import 'package:didvan/models/requests/radar.dart';
import 'package:didvan/models/requests/studio.dart'; import 'package:didvan/models/requests/studio.dart';
import 'package:didvan/providers/user.dart'; import 'package:didvan/providers/user.dart';
import 'package:didvan/routes/routes.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/card.dart';
import 'package:didvan/views/widgets/didvan/text.dart'; import 'package:didvan/views/widgets/didvan/text.dart';
import 'package:didvan/views/widgets/didvan/text_field.dart'; import 'package:didvan/views/widgets/didvan/text_field.dart';
@ -21,6 +22,7 @@ class MultitypeOverview extends StatelessWidget {
final bool enableCaption; final bool enableCaption;
final bool enableBookmark; final bool enableBookmark;
final bool showDivider; final bool showDivider;
final bool useCardStyle; // **جدید: برای کنترل استایل کارت**
const MultitypeOverview({ const MultitypeOverview({
Key? key, Key? key,
@ -30,9 +32,11 @@ class MultitypeOverview extends StatelessWidget {
this.enableCaption = false, this.enableCaption = false,
this.enableBookmark = false, this.enableBookmark = false,
this.showDivider = true, this.showDivider = true,
this.useCardStyle = false, // **مقدار پیشفرض false**
}) : super(key: key); }) : super(key: key);
get _targetPageArgs { get _targetPageArgs {
// ...
if (item.type == 'radar') { if (item.type == 'radar') {
return const RadarRequestArgs(page: 0); return const RadarRequestArgs(page: 0);
} }
@ -43,6 +47,7 @@ class MultitypeOverview extends StatelessWidget {
} }
String? get _targetPageRouteName { String? get _targetPageRouteName {
// ...
if (item.type == 'radar') { if (item.type == 'radar') {
return Routes.radarDetails; return Routes.radarDetails;
} }
@ -59,6 +64,7 @@ class MultitypeOverview extends StatelessWidget {
} }
String get _icon { String get _icon {
// ...
switch (item.type) { switch (item.type) {
case 'radar': case 'radar':
return 'lib/assets/icons/Pouyesh_Ofogh_New.svg'; return 'lib/assets/icons/Pouyesh_Ofogh_New.svg';
@ -82,7 +88,8 @@ class MultitypeOverview extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( // محتوای داخلی کارت
final innerContent = Column(
children: [ children: [
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -224,33 +231,57 @@ class MultitypeOverview extends StatelessWidget {
), ),
), ),
if (!enableCaption) const Spacer(), if (!enableCaption) const Spacer(),
// if (enableBookmark) ...[ if (enableBookmark) ...[
// const SizedBox( const SizedBox(
// width: 12, width: 12,
// ), ),
// BookmarkButton( BookmarkButton(
// value: item.marked, value: item.marked,
// onMarkChanged: (value) => onMarkChanged(item.id, value), onMarkChanged: (value) => onMarkChanged(item.id, value),
// gestureSize: 32, gestureSize: 20,
// type: item.type, type: item.type,
// itemId: item.id, itemId: item.id,
// askForConfirmation: true, askForConfirmation: true,
// svgIconOn: 'lib/assets/icons/bookmark_fill.svg', svgIconOn: 'lib/assets/icons/bookmark_fill.svg',
// svgIconOff: 'lib/assets/icons/archive-tick.svg', svgIconOff: 'lib/assets/icons/archive-tick.svg',
// color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
// ), ),
// ], ],
], ],
), ),
const SizedBox( // **اگر useCardStyle فعال نباشد، فاصله و خط جداکننده قبلی را اضافه میکنیم**
height: 10, if (!useCardStyle) ...[
), const SizedBox(
Visibility( height: 10,
visible: showDivider, ),
child: Divider(color: Theme.of(context).colorScheme.border), Visibility(
), visible: showDivider,
child: Divider(color: Theme.of(context).colorScheme.border),
),
],
], ],
); );
// **اعمال استایل کارت (Container با Border و Padding) به صورت شرطی**
if (useCardStyle) {
return Padding(
padding: const EdgeInsets.all(20.0),
child: Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: Theme.of(context).colorScheme.border,
width: 1,
),
),
child: innerContent,
),
);
}
return innerContent; // در غیر این صورت، فقط محتوای داخلی را برمیگرداند.
} }
static Widget get placeholder => const DidvanCard( static Widget get placeholder => const DidvanCard(
@ -275,4 +306,4 @@ class MultitypeOverview extends StatelessWidget {
], ],
), ),
); );
} }

View File

@ -140,7 +140,7 @@ class NewsOverview extends StatelessWidget {
askForConfirmation: hasUnmarkConfirmation, askForConfirmation: hasUnmarkConfirmation,
svgIconOn: 'lib/assets/icons/bookmark_fill.svg', svgIconOn: 'lib/assets/icons/bookmark_fill.svg',
svgIconOff: 'lib/assets/icons/archive-tick.svg', svgIconOff: 'lib/assets/icons/archive-tick.svg',
color: Theme.of(context).colorScheme.caption, color: const Color.fromARGB(255, 0, 126, 167),
unbookmarkedColor: Theme.of(context).colorScheme.caption, unbookmarkedColor: Theme.of(context).colorScheme.caption,
), ),
], ],

View File

@ -175,7 +175,7 @@ class RadarOverview extends StatelessWidget {
askForConfirmation: hasUnmarkConfirmation, askForConfirmation: hasUnmarkConfirmation,
svgIconOn: 'lib/assets/icons/bookmark_fill.svg', svgIconOn: 'lib/assets/icons/bookmark_fill.svg',
svgIconOff: 'lib/assets/icons/archive-tick.svg', svgIconOff: 'lib/assets/icons/archive-tick.svg',
color: Theme.of(context).colorScheme.caption, color: const Color.fromARGB(255, 0, 126, 167),
unbookmarkedColor: unbookmarkedColor:
Theme.of(context).colorScheme.caption, Theme.of(context).colorScheme.caption,
), ),

View File

@ -95,7 +95,7 @@ class SearchAppBar extends StatelessWidget implements PreferredSizeWidget {
style: Theme.of(context).textTheme.bodyMedium, style: Theme.of(context).textTheme.bodyMedium,
icon: DidvanIcons.calendar_range_regular, icon: DidvanIcons.calendar_range_regular,
), ),
const SizedBox(height: 8), // const SizedBox(height: 8),
StatefulBuilder( StatefulBuilder(
builder: (context, setState) => Row( builder: (context, setState) => Row(
children: [ children: [
@ -116,7 +116,7 @@ class SearchAppBar extends StatelessWidget implements PreferredSizeWidget {
], ],
), ),
), ),
const SizedBox(height: 28), // const SizedBox(height: 28),
], ],
ItemTitle( ItemTitle(
title: 'دسته بندی', title: 'دسته بندی',

View File

@ -13,7 +13,6 @@ class EmptyConnection extends StatelessWidget {
title: 'اتصال اینترنت برقرار نیست', title: 'اتصال اینترنت برقرار نیست',
titleColor: const Color.fromARGB(255, 0, 126, 167), titleColor: const Color.fromARGB(255, 0, 126, 167),
action: onRetry, action: onRetry,
subtitle: 'لطفاً اتصال وای‌فای یا داده تلفن همراه خود را بررسی کنید.',
buttonTitle: 'تلاش مجدد' , buttonTitle: 'تلاش مجدد' ,
); );
} }

View File

@ -8,7 +8,7 @@ class EmptyList extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const EmptyState( return const EmptyState(
asset: 'lib/assets/images/empty_states/Bookmark2.png', asset: 'lib/assets/images/empty_states/Bookmark2.png',
height: 600, height: 400,
title: 'رصدخانه شما هنوز خالی است', title: 'رصدخانه شما هنوز خالی است',
titleColor: Color.fromARGB(255, 0, 126, 167), titleColor: Color.fromARGB(255, 0, 126, 167),
subtitle: subtitle:

View File

@ -29,8 +29,8 @@ class EmptyState extends StatelessWidget {
final isSvg = asset.toLowerCase().endsWith('.svg'); final isSvg = asset.toLowerCase().endsWith('.svg');
return Column( return Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: subtitle != null ? MainAxisAlignment.start : MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: subtitle != null ? CrossAxisAlignment.start : CrossAxisAlignment.center,
children: [ children: [
SizedBox( SizedBox(
width: double.infinity, width: double.infinity,
@ -40,26 +40,26 @@ class EmptyState extends StatelessWidget {
: Image.asset(asset, : Image.asset(asset,
fit: BoxFit.fitWidth, height: height, width: double.infinity), fit: BoxFit.fitWidth, height: height, width: double.infinity),
), ),
const SizedBox(height: 10), const SizedBox(height: 20),
Padding( Padding(
padding: const EdgeInsets.only(right: 20, left: 20), padding: const EdgeInsets.only(right: 20, left: 20),
child: DidvanText( child: DidvanText(
title, title,
style: Theme.of(context).textTheme.displaySmall, style: Theme.of(context).textTheme.displaySmall,
color: titleColor ?? Theme.of(context).colorScheme.caption, color: titleColor ?? Theme.of(context).colorScheme.caption,
textAlign: TextAlign.center, textAlign: TextAlign.start,
), ),
), ),
// if (subtitle != null) const SizedBox(height: 8), if (subtitle != null) const SizedBox(height: 8),
// if (subtitle != null) if (subtitle != null)
// Padding( Padding(
// padding: const EdgeInsets.only(right: 20, left: 20), padding: const EdgeInsets.only(right: 20, left: 20),
// child: DidvanText( child: DidvanText(
// subtitle!, subtitle!,
// color: Theme.of(context).colorScheme.caption, color: Theme.of(context).colorScheme.caption,
// ), ),
// ), ),
// if (action != null) const SizedBox(height: 16), if (action != null) const SizedBox(height: 16),
if (action != null) if (action != null)
Center( Center(
child: Padding( child: Padding(