navbar and setting bar is done
This commit is contained in:
3
assets/images/attendance.svg
Normal file
3
assets/images/attendance.svg
Normal 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="M2.66663 10.648C2.81329 7.70135 3.24929 5.86402 4.55729 4.55735C5.86529 3.25069 7.70129 2.81335 10.648 2.66669M29.3333 10.648C29.1866 7.70135 28.7506 5.86402 27.4426 4.55735C26.1346 3.25069 24.3 2.81335 21.352 2.66669M21.352 29.3334C24.2986 29.1867 26.136 28.7507 27.444 27.4427C28.752 26.1347 29.1866 24.3 29.3333 21.352M10.648 29.3334C7.70129 29.1867 5.86396 28.7507 4.55729 27.4427C3.25063 26.1347 2.81329 24.3 2.66663 21.352M22.02 11.9227C22.4426 12.6907 22.6666 13.536 22.6666 14.3987V18.2414C22.6666 19.7534 21.952 21.244 20.7146 22.3134C19.4746 23.3827 17.7506 24 16 24M9.33329 15.0374V18.2414C9.33329 19.9187 10.2053 21.5694 11.7346 22.6694M19.3333 8.77202C17.7634 8.00412 15.9769 7.8007 14.2746 8.19602C12.568 8.59202 11.1106 9.55602 10.2266 10.88M18.2213 15.304V14.1214C18.2346 13.2734 17.5106 12.508 16.528 12.308M13.7786 15.8094V17.8414C13.7706 18.2147 13.9026 18.5814 14.1546 18.892C14.9413 19.8627 16.7013 19.9734 17.6533 19.0974" stroke="#008864" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
5
assets/images/ball.svg
Normal file
5
assets/images/ball.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15 5C13.0109 5 11.1032 5.79018 9.6967 7.1967C8.29018 8.60322 7.5 10.5109 7.5 12.5V22.5H22.5V12.5C22.5 10.5109 21.7098 8.60322 20.3033 7.1967C18.8968 5.79018 16.9891 5 15 5Z" fill="black" fill-opacity="0.16"/>
|
||||
<path d="M15 5C13.0109 5 11.1032 5.79018 9.6967 7.1967C8.29018 8.60322 7.5 10.5109 7.5 12.5V22.5H22.5V12.5C22.5 10.5109 21.7098 8.60322 20.3033 7.1967C18.8968 5.79018 16.9891 5 15 5ZM15 5C15.3315 5 15.6495 4.8683 15.8839 4.63388C16.1183 4.39946 16.25 4.08152 16.25 3.75C16.25 3.41848 16.1183 3.10054 15.8839 2.86612C15.6495 2.6317 15.3315 2.5 15 2.5C14.6685 2.5 14.3505 2.6317 14.1161 2.86612C13.8817 3.10054 13.75 3.41848 13.75 3.75C13.75 4.08152 13.8817 4.39946 14.1161 4.63388C14.3505 4.8683 14.6685 5 15 5ZM25 22.5H5M17.5 25C17.5 25.663 17.2366 26.2989 16.7678 26.7678C16.2989 27.2366 15.663 27.5 15 27.5C14.337 27.5 13.7011 27.2366 13.2322 26.7678C12.7634 26.2989 12.5 25.663 12.5 25" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<circle cx="23" cy="21" r="6" fill="#B10A0A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
12
assets/images/finance.svg
Normal file
12
assets/images/finance.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1_62)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.364 11.012C27.6947 8.41601 30.172 3.47601 27.2827 3.09068C24.9782 2.74657 22.65 2.58606 20.32 2.61067C20.384 2.21423 20.4152 1.81512 20.4134 1.41334C20.3334 -0.317325 17.9907 0.0266748 17.3107 0.0266748C16.6428 -0.00408578 15.9741 0.0678632 15.328 0.240008C10.84 1.21334 11.1467 1.00001 9.69604 1.36001C8.5007 1.6469 7.34977 2.09453 6.27471 2.69067C6.03293 2.87211 5.84801 3.11884 5.74171 3.40182C5.63542 3.6848 5.61217 3.99226 5.67471 4.28801C5.67471 4.60801 6.66137 8.93468 6.86137 9.70668C7.20671 11.1173 7.35337 11.344 8.07204 14.26C8.16537 14.6467 8.17871 15.3253 8.75204 15.3787C8.80451 15.384 8.85752 15.3789 8.90802 15.3637C8.95851 15.3485 9.0055 15.3234 9.04627 15.2899C9.08704 15.2565 9.12079 15.2153 9.14558 15.1687C9.17037 15.1222 9.1857 15.0712 9.19071 15.0187C9.19071 14.5787 8.51071 12.9013 7.69871 7.44401C9.32404 7.83068 12.372 4.79468 11.9867 2.35867C15.98 1.59867 15.6734 1.22534 17.3107 1.17201C17.8307 1.17201 19.108 0.880008 19.428 1.30534C19.5614 1.47867 19.428 2.41201 19.4947 2.63867C18.8014 2.63867 15.1814 2.85067 14.7014 3.36934C14.2434 4.12707 14.0125 5.00029 14.036 5.88534C13.956 6.49868 13.184 13.1147 13.2907 13.7C13.2916 13.7623 13.306 13.8237 13.3331 13.8798C13.3603 13.936 13.3993 13.9855 13.4476 14.0249C13.4959 14.0643 13.5523 14.0926 13.6127 14.1079C13.6731 14.1232 13.7362 14.125 13.7974 14.1133C14.0107 14.1133 14.928 8.01601 14.9414 7.90934C15.4565 8.04932 15.9978 8.06302 16.5193 7.94929C17.0409 7.83555 17.5273 7.59774 17.9374 7.25601C18.4503 6.90093 18.8753 6.43331 19.1799 5.88887C19.4844 5.34443 19.6605 4.73758 19.6947 4.11468H22.996C22.8696 4.62871 22.8586 5.1644 22.964 5.68318C23.0693 6.20196 23.2884 6.69093 23.6054 7.1149C23.9224 7.53887 24.3294 7.8873 24.7972 8.1351C25.265 8.38291 25.7819 8.52392 26.3107 8.54801C26.044 9.21467 25.7507 9.88001 25.4454 10.5587L25.0454 11.664C24.872 12.1973 25.6987 12.636 25.9254 12.1173C25.992 11.9307 25.872 12.2387 26.364 11.012ZM7.56671 6.53867C7.43337 5.60534 7.18004 4.36801 7.18004 4.34134C7.06004 3.38268 7.38004 3.75467 8.27204 3.38267C9.12987 3.02716 10.0215 2.75957 10.9334 2.58401C10.7467 3.62401 8.60271 6.37867 7.56537 6.53867M17.1774 5.95201C15.5 7.28401 15.8454 6.88534 15.1 6.99201C15.2094 6.16534 15.3649 5.34845 15.5667 4.54134C15.6867 4.54134 16.8974 4.28801 18.748 4.16801C18.5347 4.91467 17.576 5.62001 17.1774 5.95201ZM25.044 6.44534C23.7134 5.11334 23.94 4.32801 23.9134 4.20801C24.992 4.20801 26.0694 4.35468 27.1214 4.46134C27.6814 4.46134 26.8947 6.97734 26.708 7.52401C26.0588 7.33718 25.48 6.96119 25.0454 6.44401" fill="black"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.012 19.732C29.6653 18.2267 28.7467 17.0693 27.2027 17.2413C27.016 16.9213 27.7627 14.0467 25.5253 13.048C25.2445 12.9098 24.9426 12.8197 24.632 12.7813C23.992 12.688 23.3387 12.8213 22.7827 13.1547C22.076 13.488 19.0947 14.38 19.0947 14.4067C18.4693 14.5667 12.4387 15.644 10.748 15.7373C8.804 15.804 5.58267 15.5373 6.83333 14.02C6.90361 13.9437 6.94262 13.8437 6.94262 13.74C6.94262 13.6363 6.90361 13.5363 6.83333 13.46C6.31467 13.0213 5.68933 14.18 5.72933 14.8733C5.82267 16.5893 9.07067 17.0827 10.788 17.1493C16.38 17.3493 23.2227 14.38 23.5413 13.74C25.5387 14.0733 25.9773 15.6307 26.2973 17.7347C25.5907 18.7333 24.78 18.228 22.556 18.7067C20.892 19.0667 19.8933 19.8773 19.9867 21.5813C20.0005 22.2004 20.1959 22.8017 20.5487 23.3107C20.9014 23.8196 21.3959 24.2137 21.9707 24.444C22.3627 24.5711 22.7622 24.6689 23.1693 24.7373C24.2815 24.9817 25.4357 24.9589 26.5373 24.6707C26.404 28.3707 25.9907 28.3587 23.8747 29.0773C20.4533 30.1947 9.54933 31.38 6.568 29.5307C4.73067 28.5173 4.43733 26.6533 3.99867 24.7507C3.39015 22.2649 3.05042 19.721 2.98533 17.1627C2.92 13.0747 3.19867 13.0347 5.64933 11.264C5.72882 11.1889 5.7785 11.0876 5.78922 10.9788C5.79993 10.87 5.77096 10.761 5.70764 10.6719C5.64432 10.5827 5.55092 10.5195 5.44464 10.4938C5.33837 10.4681 5.22639 10.4816 5.12933 10.532C2.46667 12.3827 1.988 12.676 1.908 17.188C1.87274 19.8262 2.1276 22.4602 2.668 25.0427C3.16 27.4267 3.492 29.476 5.64933 30.8213C9.896 33.484 24.9 31.1547 26.6707 28.5973C27.2706 27.2862 27.5051 25.8374 27.3493 24.404C28.2852 24.0816 29.0717 23.4294 29.5617 22.5693C30.0517 21.7092 30.2118 20.7015 30.012 19.732ZM23.4747 23.284C22.9528 23.236 22.4482 23.0725 21.9973 22.8053C21.2907 22.232 21.0253 20.7947 21.8107 20.2893C23.6747 19.104 26.0973 20.1027 27.136 18.132C27.256 18.132 28.68 17.7187 29.0133 19.9293C29.36 22.6587 26.084 23.8973 23.4747 23.284Z" fill="black"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.132 12.276C21.6096 12.0844 22.1217 11.9936 22.636 12.0093C22.756 12.6893 23.968 12.4227 23.8747 11.8893C23.7547 10.932 23.1814 10.6653 22.1974 10.5587C21.7096 10.5162 21.2192 10.6006 20.7737 10.8036C20.3282 11.0067 19.9427 11.3214 19.6547 11.7173C19.392 12.1733 19.268 12.696 19.2947 13.2213C19.1747 13.7413 20.3734 13.6213 20.3867 13.1413C20.64 12.5413 20.7734 12.4347 21.132 12.276Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1_62">
|
||||
<rect width="32" height="32" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.1 KiB |
11
assets/images/holiday.svg
Normal file
11
assets/images/holiday.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0.75 10.3276C0.926 6.7916 1.4492 4.5868 3.0188 3.0188C4.5884 1.4508 6.7916 0.926 10.3276 0.75M32.75 10.3276C32.574 6.7916 32.0508 4.5868 30.4812 3.0188C28.9116 1.4508 26.71 0.926 23.1724 0.75M23.1724 32.75C26.7084 32.574 28.9132 32.0508 30.4828 30.4812C32.0524 28.9116 32.574 26.71 32.75 23.1724M10.3276 32.75C6.7916 32.574 4.5868 32.0508 3.0188 30.4812C1.4508 28.9116 0.926 26.71 0.75 23.1724" stroke="black" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<g clip-path="url(#clip0_1_899)">
|
||||
<path d="M25 24.25C25.2031 24.25 25.3789 24.3242 25.5273 24.4727C25.6758 24.6211 25.75 24.7969 25.75 25C25.75 25.2031 25.6758 25.3789 25.5273 25.5273C25.3789 25.6758 25.2031 25.75 25 25.75H16C15.7969 25.75 15.6211 25.6758 15.4727 25.5273C15.3242 25.3789 15.25 25.2031 15.25 25C15.25 24.7969 15.3242 24.6211 15.4727 24.4727C15.6211 24.3242 15.7969 24.25 16 24.25H25ZM23.5 27.25C23.7031 27.25 23.8789 27.3242 24.0273 27.4727C24.1758 27.6211 24.25 27.7969 24.25 28C24.25 28.2031 24.1758 28.3789 24.0273 28.5273C23.8789 28.6758 23.7031 28.75 23.5 28.75H17.5C17.2969 28.75 17.1211 28.6758 16.9727 28.5273C16.8242 28.3789 16.75 28.2031 16.75 28C16.75 27.7969 16.8242 27.6211 16.9727 27.4727C17.1211 27.3242 17.2969 27.25 17.5 27.25H23.5ZM26.2891 21.25H28.75V22.75H11.043C10.9648 23.25 10.9102 23.75 10.8789 24.25C10.8477 24.75 10.8203 25.2461 10.7969 25.7383C10.7734 26.2305 10.7617 26.7305 10.7617 27.2383C10.7617 27.7461 10.7578 28.25 10.75 28.75H6.25V26.4883C6.25 25.8555 6.27344 25.2305 6.32031 24.6133C6.36719 23.9961 6.43359 23.375 6.51953 22.75H4.75V21.25H6.76562C7.15625 19.3359 7.74609 17.4961 8.53516 15.7305C9.32422 13.9648 10.3008 12.2969 11.4648 10.7266C10.3242 10.6875 9.27734 10.4492 8.32422 10.0117C7.37109 9.57422 6.5 8.94922 5.71094 8.13672L5.18359 7.59766L5.73438 7.08203C6.54688 6.32422 7.4375 5.75 8.40625 5.35938C9.375 4.96875 10.418 4.76953 11.5352 4.76172C12.7539 4.76172 13.8711 4.98828 14.8867 5.44141C15.9023 5.89453 16.8359 6.55078 17.6875 7.41016C18.2891 7.42578 18.8711 7.51953 19.4336 7.69141C19.9961 7.86328 20.5195 8.09766 21.0039 8.39453C21.4883 8.69141 21.9297 9.04297 22.3281 9.44922C22.7266 9.85547 23.0664 10.3047 23.3477 10.7969C23.6289 11.2891 23.8516 11.8164 24.0156 12.3789C24.1797 12.9414 24.2578 13.5273 24.25 14.1367V14.8867H23.5C22.4688 14.8867 21.5039 14.668 20.6055 14.2305C19.707 13.793 18.9297 13.1719 18.2734 12.3672C17.6797 13.4453 16.9336 14.332 16.0352 15.0273C15.1367 15.7227 14.0859 16.2109 12.8828 16.4922C12.5469 17.2656 12.25 18.0469 11.9922 18.8359C11.7344 19.625 11.5117 20.4297 11.3242 21.25H14.7109C14.8828 20.5938 15.1523 19.9922 15.5195 19.4453C15.8867 18.8984 16.3242 18.4219 16.832 18.0156C17.3398 17.6094 17.9102 17.3008 18.543 17.0898C19.1758 16.8789 19.8281 16.7656 20.5 16.75C21.1797 16.75 21.832 16.8594 22.457 17.0781C23.082 17.2969 23.6484 17.6094 24.1562 18.0156C24.6641 18.4219 25.1055 18.8945 25.4805 19.4336C25.8555 19.9727 26.125 20.5781 26.2891 21.25ZM19.2578 9.20312C19.2109 9.71094 19.1094 10.2266 18.9531 10.75C19.3516 11.4375 19.875 12.0078 20.5234 12.4609C21.1719 12.9141 21.8945 13.2031 22.6914 13.3281C22.6133 12.8516 22.4766 12.4023 22.2812 11.9805C22.0859 11.5586 21.8398 11.1641 21.543 10.7969C21.2461 10.4297 20.9023 10.1172 20.5117 9.85938C20.1211 9.60156 19.7031 9.38281 19.2578 9.20312ZM17.7812 9.28516C16.9844 9.34766 16.2344 9.54297 15.5312 9.87109C14.8281 10.1992 14.1992 10.6289 13.6445 11.1602C13.0898 11.6914 12.6328 12.3047 12.2734 13C11.9141 13.6953 11.6758 14.4336 11.5586 15.2148C12.2227 15.1602 12.8516 15.0195 13.4453 14.793C14.0391 14.5664 14.582 14.2617 15.0742 13.8789C15.5664 13.4961 16.0039 13.0586 16.3867 12.5664C16.7695 12.0742 17.0859 11.5117 17.3359 10.8789C17.4453 10.6211 17.5352 10.3594 17.6055 10.0938C17.6758 9.82813 17.7344 9.55859 17.7812 9.28516ZM7.375 7.64453C8 8.16016 8.69141 8.55469 9.44922 8.82812C10.207 9.10156 10.9922 9.23828 11.8047 9.23828C12.5625 9.23828 13.293 9.12109 13.9961 8.88672C14.6992 8.65234 15.3555 8.30859 15.9648 7.85547C15.3398 7.33984 14.6484 6.94531 13.8906 6.67188C13.1328 6.39844 12.3477 6.26172 11.5352 6.26172C10.7773 6.26172 10.0469 6.37891 9.34375 6.61328C8.64062 6.84766 7.98438 7.19141 7.375 7.64453ZM11.1016 16.7266C11.0391 16.7422 10.9766 16.75 10.9141 16.75C10.8516 16.75 10.7891 16.75 10.7266 16.75H10.3516C10.2266 16.75 10.1016 16.7422 9.97656 16.7266V16.1758C9.5625 17.0977 9.21484 18.0039 8.93359 18.8945C8.65234 19.7852 8.42187 20.6836 8.24219 21.5898C8.0625 22.4961 7.9375 23.4141 7.86719 24.3438C7.79688 25.2734 7.75781 26.2422 7.75 27.25H9.25C9.25 26.3047 9.28125 25.3906 9.34375 24.5078C9.40625 23.625 9.51172 22.7539 9.66016 21.8945C9.80859 21.0352 10 20.1797 10.2344 19.3281C10.4688 18.4766 10.7578 17.6094 11.1016 16.7266ZM16.2812 21.25H24.7188C24.5625 20.8047 24.3438 20.3984 24.0625 20.0312C23.7812 19.6641 23.457 19.3477 23.0898 19.082C22.7227 18.8164 22.3164 18.6133 21.8711 18.4727C21.4258 18.332 20.9688 18.2578 20.5 18.25C20.0234 18.25 19.5664 18.3203 19.1289 18.4609C18.6914 18.6016 18.2891 18.8047 17.9219 19.0703C17.5547 19.3359 17.2266 19.6523 16.9375 20.0195C16.6484 20.3867 16.4297 20.7969 16.2812 21.25Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1_899">
|
||||
<rect width="24" height="24" fill="white" transform="translate(4.75 4.75)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.2 KiB |
3
assets/images/user.svg
Normal file
3
assets/images/user.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.75 18.75H10C8.3424 18.75 6.75269 19.4085 5.58058 20.5806C4.40848 21.7527 3.75 23.3424 3.75 25V26.25H13.8125M23.125 18.75V17.1875M23.125 18.75C22.1304 18.75 21.1766 19.1451 20.4733 19.8483C19.7701 20.5516 19.375 21.5054 19.375 22.5C19.375 23.4946 19.7701 24.4484 20.4733 25.1517C21.1766 25.8549 22.1304 26.25 23.125 26.25M23.125 18.75C24.1196 18.75 25.0734 19.1451 25.7767 19.8483C26.4799 20.5516 26.875 21.5054 26.875 22.5C26.875 23.4946 26.4799 24.4484 25.7767 25.1517C25.0734 25.8549 24.1196 26.25 23.125 26.25M23.125 26.25V27.8125M19.8775 20.625L18.5238 19.8438M26.3725 24.375L27.7262 25.1562M26.3725 20.625L27.7262 19.8438M19.875 24.375L18.5225 25.1562M20 9.375C20 10.8668 19.4074 12.2976 18.3525 13.3525C17.2976 14.4074 15.8668 15 14.375 15C12.8832 15 11.4524 14.4074 10.3975 13.3525C9.34263 12.2976 8.75 10.8668 8.75 9.375C8.75 7.88316 9.34263 6.45242 10.3975 5.39752C11.4524 4.34263 12.8832 3.75 14.375 3.75C15.8668 3.75 17.2976 4.34263 18.3525 5.39752C19.4074 6.45242 20 7.88316 20 9.375Z" stroke="black" stroke-width="2" stroke-linecap="square"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
24
lib/screens/attendence_screen.dart
Normal file
24
lib/screens/attendence_screen.dart
Normal file
@@ -0,0 +1,24 @@
|
||||
// lib/screens/attendance_screen.dart
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AttendanceScreen extends StatelessWidget {
|
||||
const AttendanceScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
// This is where your attendance content will go
|
||||
// For now, it's just a placeholder
|
||||
child: const Center(
|
||||
child: Text(
|
||||
'Attendance Content',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -8,29 +8,21 @@ class AuthScreen extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: true,
|
||||
resizeToAvoidBottomInset: false,
|
||||
body: AppBackground(
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(height: 60),
|
||||
// Logo
|
||||
Center(
|
||||
child: Image.asset("assets/images/logo2.png", width: 200),
|
||||
),
|
||||
Center(child: Image.asset("assets/images/logo2.png", width: 200)),
|
||||
// const SizedBox(height: 15),
|
||||
// Form - taking remaining space and centered
|
||||
Expanded(
|
||||
child: Center(
|
||||
child: SingleChildScrollView(
|
||||
child: const AuthForm(),
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(child: Center(child: const AuthForm())),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
19
lib/screens/finance_screen.dart
Normal file
19
lib/screens/finance_screen.dart
Normal file
@@ -0,0 +1,19 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class FinanceScreen extends StatelessWidget {
|
||||
const FinanceScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Center(
|
||||
child: Text(
|
||||
'المالية',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
19
lib/screens/holiday_screen.dart
Normal file
19
lib/screens/holiday_screen.dart
Normal file
@@ -0,0 +1,19 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class HolidayScreen extends StatelessWidget {
|
||||
const HolidayScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Center(
|
||||
child: Text(
|
||||
'الإجازة',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
79
lib/screens/main_screen.dart
Normal file
79
lib/screens/main_screen.dart
Normal file
@@ -0,0 +1,79 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import '../widgets/app_background.dart';
|
||||
import '../widgets/floatingnavbar.dart';
|
||||
import '../widgets/settings_bar.dart';
|
||||
import '../screens/attendence_screen.dart';
|
||||
import '../screens/finance_screen.dart';
|
||||
import '../screens/holiday_screen.dart';
|
||||
|
||||
class MainPage extends StatefulWidget {
|
||||
const MainPage({super.key});
|
||||
|
||||
@override
|
||||
State<MainPage> createState() => _MainPageState();
|
||||
}
|
||||
|
||||
class _MainPageState extends State<MainPage> {
|
||||
int _currentIndex = 0;
|
||||
int _settingsIndex = 0;
|
||||
|
||||
final List<Widget> _screens = [
|
||||
const AttendanceScreen(),
|
||||
const FinanceScreen(),
|
||||
const HolidayScreen(),
|
||||
];
|
||||
|
||||
final List<NavBarItem> _navItems = [
|
||||
NavBarItem(iconPath: 'assets/images/attendance.svg', label: 'الحضور'),
|
||||
NavBarItem(iconPath: 'assets/images/finance.svg', label: 'المالية'),
|
||||
NavBarItem(iconPath: 'assets/images/holiday.svg', label: 'الإجازة'),
|
||||
];
|
||||
|
||||
final List<String> _settingsIconPaths = [
|
||||
'assets/images/user.svg',
|
||||
'assets/images/ball.svg',
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: AppBackground(
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
SettingsBar(
|
||||
selectedIndex: _settingsIndex,
|
||||
onTap: (index) {
|
||||
setState(() {
|
||||
_settingsIndex = index;
|
||||
});
|
||||
},
|
||||
showBackButton: false,
|
||||
iconPaths: _settingsIconPaths,
|
||||
),
|
||||
|
||||
// Main content area
|
||||
Expanded(
|
||||
child: IndexedStack(index: _currentIndex, children: _screens),
|
||||
),
|
||||
|
||||
const SizedBox(height: 20),
|
||||
|
||||
Floatingnavbar(
|
||||
items: _navItems,
|
||||
selectedIndex: _currentIndex,
|
||||
onTap: (index) {
|
||||
setState(() {
|
||||
_currentIndex = index;
|
||||
});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
106
lib/widgets/FloatingNavBar.dart
Normal file
106
lib/widgets/FloatingNavBar.dart
Normal file
@@ -0,0 +1,106 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
|
||||
class NavBarItem {
|
||||
final String iconPath;
|
||||
final String label;
|
||||
|
||||
NavBarItem({required this.iconPath, required this.label});
|
||||
}
|
||||
|
||||
class Floatingnavbar extends StatelessWidget {
|
||||
final List<NavBarItem> items;
|
||||
final int selectedIndex;
|
||||
final ValueChanged<int> onTap;
|
||||
|
||||
const Floatingnavbar({
|
||||
super.key,
|
||||
required this.items,
|
||||
required this.selectedIndex,
|
||||
required this.onTap,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// Get the bottom padding to account for system navigation bar
|
||||
final bottomPadding = MediaQuery.of(context).padding.bottom;
|
||||
|
||||
return Container(
|
||||
height: 85,
|
||||
margin: EdgeInsets.only(
|
||||
bottom: 10 + bottomPadding, // Add system padding to our margin
|
||||
left: 25,
|
||||
right: 25,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: (const Color(0xFFE9E9E9)),
|
||||
borderRadius: BorderRadius.circular(45),
|
||||
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: items.asMap().entries.map((entry) {
|
||||
final index = entry.key;
|
||||
final item = entry.value;
|
||||
final isSelected = selectedIndex == index;
|
||||
|
||||
return _NavBarItemTile(
|
||||
item: item,
|
||||
isSelected: isSelected,
|
||||
onTap: () => onTap(index),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _NavBarItemTile extends StatelessWidget {
|
||||
final NavBarItem item;
|
||||
final bool isSelected;
|
||||
final VoidCallback onTap;
|
||||
|
||||
const _NavBarItemTile({
|
||||
Key? key,
|
||||
required this.item,
|
||||
required this.isSelected,
|
||||
required this.onTap,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Expanded(
|
||||
child: InkWell(
|
||||
onTap: onTap,
|
||||
borderRadius: BorderRadius.circular(45),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
item.iconPath,
|
||||
width: 37,
|
||||
height: 37,
|
||||
colorFilter: ColorFilter.mode(
|
||||
isSelected ? const Color(0xFF177046) : Colors.black,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Text(
|
||||
item.label,
|
||||
style: TextStyle(
|
||||
color: isSelected ? const Color(0xFF177046) : Colors.black,
|
||||
fontSize: 15,
|
||||
fontFamily: 'AbdEriady', // Using the custom font family
|
||||
fontWeight: isSelected ? FontWeight.w700 : FontWeight.w400, // Using specific weights
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@ class AppBackground extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return Stack(
|
||||
children: [
|
||||
/// 1️⃣ BASE GRADIENT (Exact Figma: #434343 -> #00382A)
|
||||
Container(
|
||||
decoration: const BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
@@ -23,7 +22,6 @@ class AppBackground extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
Positioned(
|
||||
top: -250,
|
||||
left: 100,
|
||||
@@ -33,11 +31,11 @@ class AppBackground extends StatelessWidget {
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
// very soft inner fill
|
||||
color: Color.fromARGB(0, 62, 254, 203),
|
||||
color: Color.fromARGB(0, 62, 254, 203),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
// wide soft bloom
|
||||
color: Color.fromARGB(69, 62, 254, 190),
|
||||
color: Color.fromARGB(69, 62, 254, 190),
|
||||
blurRadius: 140,
|
||||
spreadRadius: 160,
|
||||
),
|
||||
@@ -54,10 +52,10 @@ class AppBackground extends StatelessWidget {
|
||||
height: 320,
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Color.fromARGB(0, 62, 254, 203),
|
||||
color: Color.fromARGB(0, 62, 254, 203),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Color.fromARGB(83, 62, 254, 190),
|
||||
color: Color.fromARGB(83, 62, 254, 190),
|
||||
blurRadius: 180,
|
||||
spreadRadius: 60,
|
||||
),
|
||||
@@ -65,8 +63,6 @@ class AppBackground extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
/// 4️⃣ CONTENT LAYER
|
||||
child,
|
||||
],
|
||||
);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../screens/main_screen.dart';
|
||||
import 'onboarding_button.dart';
|
||||
|
||||
class AuthForm extends StatefulWidget {
|
||||
@@ -13,120 +14,190 @@ class AuthForm extends StatefulWidget {
|
||||
class _AuthFormState extends State<AuthForm> {
|
||||
bool _obscure = true;
|
||||
|
||||
// Focus nodes for text fields
|
||||
late FocusNode _usernameFocusNode;
|
||||
late FocusNode _passwordFocusNode;
|
||||
|
||||
void _handleLogin() {
|
||||
// Unfocus any focused text field
|
||||
_usernameFocusNode.unfocus();
|
||||
_passwordFocusNode.unfocus();
|
||||
|
||||
// Call the onSubmit callback if provided (for any other logic you might have)
|
||||
if (widget.onSubmit != null) {
|
||||
widget.onSubmit!();
|
||||
}
|
||||
|
||||
// Navigate to the AttendancePage
|
||||
Navigator.pushReplacement(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => const MainPage()),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// Initialize focus nodes
|
||||
_usernameFocusNode = FocusNode();
|
||||
_passwordFocusNode = FocusNode();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
// Clean up focus nodes when widget is disposed
|
||||
_usernameFocusNode.dispose();
|
||||
_passwordFocusNode.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// Get screen dimensions
|
||||
final screenSize = MediaQuery.of(context).size;
|
||||
final screenWidth = screenSize.width;
|
||||
final screenHeight = screenSize.height;
|
||||
|
||||
// Calculate responsive dimensions
|
||||
final formWidth = screenWidth > 600 ? screenWidth * 0.5 : screenWidth * 0.9;
|
||||
final formHeight =
|
||||
screenHeight > 800 ? screenHeight * 0.6 : screenHeight * 0.8;
|
||||
final borderWidth = formWidth + 20;
|
||||
final titleFontSize = screenWidth > 600 ? 28.0 : 24.0;
|
||||
final labelFontSize = screenWidth > 600 ? 18.0 : 16.0;
|
||||
final fieldFontSize = screenWidth > 600 ? 18.0 : 16.0;
|
||||
final verticalSpacing = screenHeight > 800 ? 34.0 : 24.0;
|
||||
final fieldSpacing = screenHeight > 800 ? 30.0 : 20.0;
|
||||
final buttonSpacing = screenHeight > 800 ? 100.0 : 60.0;
|
||||
final bottomSpacing = screenHeight > 800 ? 40.0 : 20.0;
|
||||
final horizontalPadding = screenWidth > 600 ? 30.0 : 25.0;
|
||||
final verticalPadding = screenHeight > 800 ? 38.0 : 28.0;
|
||||
|
||||
return Directionality(
|
||||
textDirection: TextDirection.rtl,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
// Border container - decorative element behind the form
|
||||
Container(
|
||||
width: 360,
|
||||
constraints: const BoxConstraints(
|
||||
minHeight: 500,
|
||||
maxHeight: 580, // Allows shrinking when keyboard opens
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.transparent,
|
||||
borderRadius: BorderRadius.circular(32),
|
||||
border: Border.all(
|
||||
color: const Color(0xDD00C28E),
|
||||
width: 1,
|
||||
child: FocusScope(
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
// Border container - decorative element behind the form
|
||||
Container(
|
||||
width: borderWidth,
|
||||
constraints: BoxConstraints(
|
||||
minHeight: formHeight + 40,
|
||||
maxHeight:
|
||||
formHeight + 80, // Allows shrinking when keyboard opens
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.transparent,
|
||||
borderRadius: BorderRadius.circular(32),
|
||||
border: Border.all(color: const Color(0xDD00C28E), width: 1),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// Main form container
|
||||
Container(
|
||||
width: 340,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 38),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFEEFFFA),
|
||||
borderRadius: BorderRadius.circular(28),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Colors.black26,
|
||||
blurRadius: 10,
|
||||
offset: Offset(0, 5),
|
||||
),
|
||||
],
|
||||
|
||||
// Main form container
|
||||
Container(
|
||||
width: formWidth,
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: horizontalPadding,
|
||||
vertical: verticalPadding,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFEEFFFA),
|
||||
borderRadius: BorderRadius.circular(28),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Colors.black26,
|
||||
blurRadius: 10,
|
||||
offset: Offset(0, 5),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
/// Title
|
||||
Center(
|
||||
child: Text(
|
||||
"تسجيل دخول",
|
||||
style: TextStyle(
|
||||
fontSize: titleFontSize,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: verticalSpacing),
|
||||
|
||||
/// Username Label
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(
|
||||
"اسم المستخدم",
|
||||
style: TextStyle(
|
||||
fontSize: labelFontSize,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
||||
_buildField(
|
||||
hint: "اسم المستخدم",
|
||||
obscure: false,
|
||||
focusNode: _usernameFocusNode,
|
||||
textInputAction: TextInputAction.next,
|
||||
onSubmitted: (_) {
|
||||
// Move focus to password field when next is pressed
|
||||
FocusScope.of(context).requestFocus(_passwordFocusNode);
|
||||
},
|
||||
fontSize: fieldFontSize,
|
||||
),
|
||||
|
||||
SizedBox(height: fieldSpacing),
|
||||
|
||||
/// Password Label
|
||||
Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(
|
||||
"كلمة المرور",
|
||||
style: TextStyle(
|
||||
fontSize: labelFontSize,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
||||
_buildField(
|
||||
hint: "كلمة المرور",
|
||||
obscure: _obscure,
|
||||
hasEye: true,
|
||||
focusNode: _passwordFocusNode,
|
||||
textInputAction: TextInputAction.done,
|
||||
onSubmitted:
|
||||
(_) =>
|
||||
_handleLogin(), // Added parentheses to call the method
|
||||
fontSize: fieldFontSize,
|
||||
),
|
||||
|
||||
SizedBox(height: buttonSpacing), // Responsive spacing
|
||||
|
||||
Center(
|
||||
child: OnboardingButton(
|
||||
text: "تسجيل دخول",
|
||||
backgroundColor: const Color.fromARGB(239, 35, 87, 74),
|
||||
onPressed: _handleLogin,
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: bottomSpacing),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
/// Title
|
||||
const Center(
|
||||
child: Text(
|
||||
"تسجيل دخول",
|
||||
style: TextStyle(
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
const SizedBox(height: 34),
|
||||
|
||||
/// Username Label
|
||||
const Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(
|
||||
"اسم المستخدم",
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
||||
_buildField(
|
||||
hint: "اسم المستخدم",
|
||||
obscure: false,
|
||||
),
|
||||
|
||||
const SizedBox(height: 30),
|
||||
|
||||
/// Password Label
|
||||
const Align(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(
|
||||
"كلمة المرور",
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
||||
_buildField(
|
||||
hint: "كلمة المرور",
|
||||
obscure: _obscure,
|
||||
hasEye: true,
|
||||
),
|
||||
|
||||
const SizedBox(height: 100), // Restored original spacing
|
||||
|
||||
Center(
|
||||
child: OnboardingButton(
|
||||
text: "تسجيل دخول",
|
||||
backgroundColor: const Color.fromARGB(239, 35, 87, 74),
|
||||
onPressed: widget.onSubmit,
|
||||
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
const SizedBox(height: 40),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -135,42 +206,48 @@ class _AuthFormState extends State<AuthForm> {
|
||||
required String hint,
|
||||
required bool obscure,
|
||||
bool hasEye = false,
|
||||
FocusNode? focusNode,
|
||||
TextInputAction? textInputAction,
|
||||
Function(String)? onSubmitted,
|
||||
required double fontSize,
|
||||
}) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xDEDEDEDE),
|
||||
borderRadius: BorderRadius.circular(7),
|
||||
boxShadow: const [
|
||||
BoxShadow(
|
||||
color: Colors.black26,
|
||||
blurRadius: 6,
|
||||
offset: Offset(0, 2),
|
||||
),
|
||||
BoxShadow(color: Colors.black26, blurRadius: 6, offset: Offset(0, 2)),
|
||||
],
|
||||
),
|
||||
child: TextField(
|
||||
focusNode: focusNode,
|
||||
obscureText: obscure,
|
||||
textAlign: TextAlign.right,
|
||||
style: const TextStyle(fontSize: 16),
|
||||
textInputAction: textInputAction,
|
||||
onSubmitted: onSubmitted,
|
||||
style: TextStyle(fontSize: fontSize),
|
||||
decoration: InputDecoration(
|
||||
hintText: hint,
|
||||
hintStyle: const TextStyle(color: Colors.black54),
|
||||
border: InputBorder.none,
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 16, horizontal: 16),
|
||||
suffixIcon: hasEye
|
||||
? IconButton(
|
||||
icon: Icon(
|
||||
obscure ? Icons.visibility_off : Icons.visibility,
|
||||
color: Colors.black54,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() => _obscure = !obscure);
|
||||
},
|
||||
)
|
||||
: null,
|
||||
contentPadding: const EdgeInsets.symmetric(
|
||||
vertical: 16,
|
||||
horizontal: 16,
|
||||
),
|
||||
suffixIcon:
|
||||
hasEye
|
||||
? IconButton(
|
||||
icon: Icon(
|
||||
obscure ? Icons.visibility_off : Icons.visibility,
|
||||
color: Colors.black54,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() => _obscure = !obscure);
|
||||
},
|
||||
)
|
||||
: null,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
126
lib/widgets/settings_bar.dart
Normal file
126
lib/widgets/settings_bar.dart
Normal file
@@ -0,0 +1,126 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
|
||||
class SettingsBar extends StatelessWidget {
|
||||
final int selectedIndex;
|
||||
final ValueChanged<int> onTap;
|
||||
final bool showBackButton;
|
||||
final VoidCallback? onBackTap;
|
||||
final List<String> iconPaths;
|
||||
|
||||
const SettingsBar({
|
||||
super.key,
|
||||
required this.selectedIndex,
|
||||
required this.onTap,
|
||||
this.showBackButton = false,
|
||||
this.onBackTap,
|
||||
required this.iconPaths,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
color: Colors.transparent,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/images/logo2.png',
|
||||
width: 150,
|
||||
height: 40,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
// Navigation icons on the right
|
||||
Row(
|
||||
children: [
|
||||
// Back button (only shown when showBackButton is true)
|
||||
if (showBackButton)
|
||||
GestureDetector(
|
||||
onTap: onBackTap,
|
||||
child: Container(
|
||||
width: 50,
|
||||
height: 50,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: const Color(0x10000000),
|
||||
blurRadius: 5,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: const Center(
|
||||
child: Icon(
|
||||
Icons.arrow_back,
|
||||
color: Color(0xFF006838),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// Add spacing if back button is shown
|
||||
if (showBackButton) const SizedBox(width: 20),
|
||||
|
||||
// Settings and notification icons
|
||||
...iconPaths.asMap().entries.map((entry) {
|
||||
final index = entry.key;
|
||||
final iconPath = entry.value;
|
||||
final isSelected = selectedIndex == index;
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 10),
|
||||
child: GestureDetector(
|
||||
onTap: () => onTap(index),
|
||||
child: Container(
|
||||
width: 43,
|
||||
height: 43,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
shape: BoxShape.circle,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: const Color(0x10000000),
|
||||
blurRadius: 5,
|
||||
offset: const Offset(0, 2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Center(
|
||||
child: Stack(
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
iconPath,
|
||||
width: 30,
|
||||
height: 30,
|
||||
|
||||
),
|
||||
if (index == 1)
|
||||
Positioned(
|
||||
top: 0,
|
||||
right: 0,
|
||||
child: Container(
|
||||
width: 10,
|
||||
height: 10,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -21,11 +21,7 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
assets:
|
||||
- assets/images/splash.png
|
||||
- assets/images/logo.png
|
||||
- assets/images/logo2.png
|
||||
- assets/images/Onboarding1.svg
|
||||
- assets/images/Onboarding2.svg
|
||||
- assets/images/
|
||||
fonts:
|
||||
- family: AbdElRady
|
||||
fonts:
|
||||
|
||||
Reference in New Issue
Block a user