Compare commits

..

2 Commits

Author SHA1 Message Date
OkaykOrhmn 281ec9d275 clean code. 2025-03-03 14:35:06 +03:30
OkaykOrhmn 4d9f295bfe create setting page. 2025-03-03 14:34:41 +03:30
24 changed files with 867 additions and 82 deletions

View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.6825 15.5025C6.54 15.5025 6.3975 15.45 6.285 15.3375C6.0675 15.12 6.0675 14.76 6.285 14.5425L11.175 9.65251C11.535 9.29251 11.535 8.70751 11.175 8.34751L6.285 3.45751C6.0675 3.24001 6.0675 2.88001 6.285 2.66251C6.5025 2.44501 6.8625 2.44501 7.08 2.66251L11.97 7.55251C12.3525 7.93501 12.57 8.45252 12.57 9.00002C12.57 9.54751 12.36 10.065 11.97 10.4475L7.08 15.3375C6.9675 15.4425 6.825 15.5025 6.6825 15.5025Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 544 B

View File

@ -0,0 +1,6 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.305 17.0625H4.695C2.8275 17.0625 1.3125 15.5475 1.3125 13.68V8.63251C1.3125 6.76501 2.8275 5.25 4.695 5.25H13.305C15.1725 5.25 16.6875 6.76501 16.6875 8.63251V9.71251C16.6875 10.02 16.4325 10.275 16.125 10.275H14.61C14.3475 10.275 14.1075 10.3725 13.935 10.5525L13.9275 10.56C13.7175 10.7625 13.62 11.04 13.6425 11.325C13.6875 11.82 14.16 12.2175 14.7 12.2175H16.125C16.4325 12.2175 16.6875 12.4725 16.6875 12.78V13.6725C16.6875 15.5475 15.1725 17.0625 13.305 17.0625ZM4.695 6.375C3.45 6.375 2.4375 7.38751 2.4375 8.63251V13.68C2.4375 14.925 3.45 15.9375 4.695 15.9375H13.305C14.55 15.9375 15.5625 14.925 15.5625 13.68V13.35H14.7C13.5675 13.35 12.6075 12.51 12.5175 11.43C12.4575 10.815 12.6825 10.2075 13.1325 9.76501C13.5225 9.36751 14.0475 9.15001 14.61 9.15001H15.5625V8.63251C15.5625 7.38751 14.55 6.375 13.305 6.375H4.695Z" fill="#292D32"/>
<path d="M1.875 9.87001C1.5675 9.87001 1.3125 9.61501 1.3125 9.30751V5.88005C1.3125 4.76255 2.0175 3.75 3.06 3.3525L9.015 1.1025C9.63 0.870004 10.3125 0.952541 10.845 1.32754C11.385 1.70254 11.7 2.31004 11.7 2.96254V5.81253C11.7 6.12003 11.445 6.37503 11.1375 6.37503C10.83 6.37503 10.575 6.12003 10.575 5.81253V2.96254C10.575 2.67754 10.44 2.41503 10.2 2.25003C9.96 2.08503 9.675 2.04752 9.405 2.15252L3.45 4.40252C2.8425 4.63502 2.43 5.22755 2.43 5.88005V9.30751C2.4375 9.62251 2.1825 9.87001 1.875 9.87001Z" fill="#292D32"/>
<path d="M14.7 13.3499C13.5675 13.3499 12.6075 12.5099 12.5175 11.4299C12.4575 10.8074 12.6825 10.2 13.1325 9.75746C13.515 9.36746 14.04 9.14996 14.6025 9.14996H16.1625C16.905 9.17246 17.475 9.75743 17.475 10.4774V12.0225C17.475 12.7425 16.905 13.3274 16.185 13.3499H14.7ZM16.1475 10.275H14.61C14.3475 10.275 14.1075 10.3725 13.935 10.5525C13.7175 10.7625 13.6125 11.0474 13.6425 11.3324C13.6875 11.8274 14.16 12.2249 14.7 12.2249H16.17C16.2675 12.2249 16.3575 12.135 16.3575 12.0225V10.4774C16.3575 10.3649 16.2675 10.2825 16.1475 10.275Z" fill="#292D32"/>
<path d="M10.5 9.5625H5.25C4.9425 9.5625 4.6875 9.3075 4.6875 9C4.6875 8.6925 4.9425 8.4375 5.25 8.4375H10.5C10.8075 8.4375 11.0625 8.6925 11.0625 9C11.0625 9.3075 10.8075 9.5625 10.5 9.5625Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 17.07C8.1825 17.07 7.3725 16.83 6.735 16.3575L3.51 13.95C2.655 13.3125 1.9875 11.985 1.9875 10.92V5.33999C1.9875 4.18499 2.835 2.95499 3.9225 2.54999L7.665 1.14749C8.4075 0.869987 9.5775 0.869987 10.32 1.14749L14.07 2.54999C15.1575 2.95499 16.005 4.18499 16.005 5.33999V10.9125C16.005 11.9775 15.3375 13.305 14.4825 13.9425L11.2575 16.35C10.6275 16.83 9.8175 17.07 9 17.07ZM8.0625 2.20499L4.32 3.60749C3.675 3.84749 3.1125 4.65749 3.1125 5.34749V10.92C3.1125 11.6325 3.615 12.63 4.1775 13.05L7.4025 15.4575C8.265 16.1025 9.7275 16.1025 10.59 15.4575L13.815 13.05C14.385 12.6225 14.88 11.625 14.88 10.92V5.33999C14.88 4.65749 14.3175 3.84749 13.6725 3.59999L9.93 2.19749C9.435 2.01749 8.565 2.01749 8.0625 2.20499Z" fill="#292D32"/>
<path d="M9 9.9375C7.86 9.9375 6.9375 9.015 6.9375 7.875C6.9375 6.735 7.86 5.8125 9 5.8125C10.14 5.8125 11.0625 6.735 11.0625 7.875C11.0625 9.015 10.14 9.9375 9 9.9375ZM9 6.9375C8.4825 6.9375 8.0625 7.3575 8.0625 7.875C8.0625 8.3925 8.4825 8.8125 9 8.8125C9.5175 8.8125 9.9375 8.3925 9.9375 7.875C9.9375 7.3575 9.5175 6.9375 9 6.9375Z" fill="#292D32"/>
<path d="M9 12.1875C8.6925 12.1875 8.4375 11.9325 8.4375 11.625V9.375C8.4375 9.0675 8.6925 8.8125 9 8.8125C9.3075 8.8125 9.5625 9.0675 9.5625 9.375V11.625C9.5625 11.9325 9.3075 12.1875 9 12.1875Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.43 16.7025H11.3325C8.0025 16.7025 6.3975 15.39 6.12 12.45C6.09 12.1425 6.315 11.865 6.63 11.835C6.93 11.805 7.215 12.0375 7.245 12.345C7.4625 14.7 8.5725 15.5775 11.34 15.5775H11.4375C14.49 15.5775 15.57 14.4975 15.57 11.445V6.555C15.57 3.5025 14.49 2.4225 11.4375 2.4225H11.34C8.5575 2.4225 7.4475 3.315 7.245 5.715C7.2075 6.0225 6.945 6.255 6.63 6.225C6.315 6.2025 6.09 5.925 6.1125 5.6175C6.3675 2.6325 7.98 1.2975 11.3325 1.2975H11.43C15.1125 1.2975 16.6875 2.8725 16.6875 6.555V11.445C16.6875 15.1275 15.1125 16.7025 11.43 16.7025Z" fill="#292D32"/>
<path d="M11.25 9.5625H2.715C2.4075 9.5625 2.1525 9.3075 2.1525 9C2.1525 8.6925 2.4075 8.4375 2.715 8.4375H11.25C11.5575 8.4375 11.8125 8.6925 11.8125 9C11.8125 9.3075 11.5575 9.5625 11.25 9.5625Z" fill="#292D32"/>
<path d="M4.3875 12.075C4.245 12.075 4.1025 12.0225 3.99 11.91L1.4775 9.3975C1.26 9.18 1.26 8.82001 1.4775 8.60251L3.99 6.09C4.2075 5.8725 4.5675 5.8725 4.785 6.09C5.0025 6.3075 5.0025 6.66751 4.785 6.88501L2.67 9.00001L4.785 11.115C5.0025 11.3325 5.0025 11.6925 4.785 11.91C4.68 12.0225 4.53 12.075 4.3875 12.075Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 16.7399C5.79 16.7399 5.57249 16.6874 5.37749 16.5824C4.94999 16.3574 4.6875 15.9074 4.6875 15.4274V14.3625C2.4225 14.13 0.9375 12.4649 0.9375 10.0799V5.57996C0.9375 2.99996 2.67 1.26746 5.25 1.26746H12.75C15.33 1.26746 17.0625 2.99996 17.0625 5.57996V10.0799C17.0625 12.6599 15.33 14.3924 12.75 14.3924H9.92249L6.72748 16.5225C6.50998 16.665 6.255 16.7399 6 16.7399ZM5.25 2.38495C3.315 2.38495 2.0625 3.63745 2.0625 5.57245V10.0725C2.0625 12.0075 3.315 13.26 5.25 13.26C5.5575 13.26 5.8125 13.515 5.8125 13.8225V15.42C5.8125 15.5175 5.8725 15.5625 5.91 15.585C5.9475 15.6075 6.02251 15.63 6.10501 15.5775L9.44252 13.3575C9.53252 13.2975 9.64501 13.26 9.75751 13.26H12.7575C14.6925 13.26 15.945 12.0075 15.945 10.0725V5.57245C15.945 3.63745 14.6925 2.38495 12.7575 2.38495H5.25Z" fill="#292D32"/>
<path d="M8.99986 9.08249C8.69236 9.08249 8.43736 8.82749 8.43736 8.51999V8.36252C8.43736 7.49252 9.07485 7.06501 9.31485 6.90001C9.59235 6.71251 9.68234 6.58501 9.68234 6.39001C9.68234 6.01501 9.37486 5.70749 8.99986 5.70749C8.62486 5.70749 8.31738 6.01501 8.31738 6.39001C8.31738 6.69751 8.06238 6.95251 7.75488 6.95251C7.44738 6.95251 7.19238 6.69751 7.19238 6.39001C7.19238 5.39251 8.00236 4.58249 8.99986 4.58249C9.99736 4.58249 10.8073 5.39251 10.8073 6.39001C10.8073 7.24501 10.1774 7.6725 9.94487 7.83C9.65237 8.025 9.56236 8.15252 9.56236 8.36252V8.51999C9.56236 8.83499 9.30736 9.08249 8.99986 9.08249Z" fill="#292D32"/>
<path d="M9 10.95C8.685 10.95 8.4375 10.695 8.4375 10.3875C8.4375 10.08 8.6925 9.82498 9 9.82498C9.3075 9.82498 9.5625 10.08 9.5625 10.3875C9.5625 10.695 9.315 10.95 9 10.95Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,5 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.01499 15.3975C7.26749 15.3975 5.51999 15.12 3.86249 14.565C3.23249 14.3475 2.75249 13.905 2.54249 13.3275C2.32499 12.75 2.39999 12.1125 2.74499 11.5425L3.60749 10.11C3.78749 9.81 3.95249 9.21 3.95249 8.8575V6.69C3.95249 3.9 6.22499 1.6275 9.01499 1.6275C11.805 1.6275 14.0775 3.9 14.0775 6.69V8.8575C14.0775 9.2025 14.2425 9.81 14.4225 10.1175L15.2775 11.5425C15.6 12.0825 15.66 12.735 15.4425 13.3275C15.225 13.92 14.7525 14.37 14.16 14.565C12.51 15.12 10.7625 15.3975 9.01499 15.3975ZM9.01499 2.7525C6.84749 2.7525 5.07749 4.515 5.07749 6.69V8.8575C5.07749 9.405 4.85249 10.215 4.57499 10.6875L3.71249 12.12C3.54749 12.3975 3.50249 12.69 3.59999 12.9375C3.68999 13.1925 3.91499 13.3875 4.22249 13.4925C7.35749 14.5425 10.68 14.5425 13.815 13.4925C14.085 13.4025 14.295 13.2 14.3925 12.93C14.49 12.66 14.4675 12.3675 14.3175 12.12L13.455 10.6875C13.17 10.2 12.9525 9.3975 12.9525 8.85V6.69C12.9525 4.515 11.19 2.7525 9.01499 2.7525Z" fill="#292D32"/>
<path d="M10.4097 2.95501C10.3572 2.95501 10.3047 2.94751 10.2522 2.93251C10.0347 2.87251 9.82472 2.82751 9.62222 2.79751C8.98472 2.71501 8.36972 2.76001 7.79222 2.93251C7.58222 3.00001 7.35722 2.93251 7.21472 2.77501C7.07222 2.61751 7.02722 2.39251 7.10972 2.19001C7.41722 1.40251 8.16722 0.88501 9.02222 0.88501C9.87722 0.88501 10.6272 1.39501 10.9347 2.19001C11.0097 2.39251 10.9722 2.61751 10.8297 2.77501C10.7172 2.89501 10.5597 2.95501 10.4097 2.95501Z" fill="#292D32"/>
<path d="M9.01465 17.1075C8.27215 17.1075 7.55215 16.8075 7.02715 16.2825C6.50215 15.7575 6.20215 15.0375 6.20215 14.295H7.32715C7.32715 14.7375 7.50715 15.1725 7.82215 15.4875C8.13715 15.8025 8.57215 15.9825 9.01465 15.9825C9.94465 15.9825 10.7021 15.225 10.7021 14.295H11.8271C11.8271 15.8475 10.5671 17.1075 9.01465 17.1075Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,4 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.11971 8.715C9.09721 8.715 9.08221 8.715 9.05971 8.715C9.02221 8.7075 8.96971 8.7075 8.92471 8.715C6.74971 8.6475 5.10721 6.9375 5.10721 4.83C5.10721 2.685 6.85471 0.9375 8.99971 0.9375C11.1447 0.9375 12.8922 2.685 12.8922 4.83C12.8847 6.9375 11.2347 8.6475 9.14221 8.715C9.13471 8.715 9.12721 8.715 9.11971 8.715ZM8.99971 2.0625C7.47721 2.0625 6.23221 3.3075 6.23221 4.83C6.23221 6.33 7.40221 7.5375 8.89471 7.59C8.93221 7.5825 9.03721 7.5825 9.13471 7.59C10.6047 7.5225 11.7597 6.315 11.7672 4.83C11.7672 3.3075 10.5222 2.0625 8.99971 2.0625Z" fill="#292D32"/>
<path d="M9.12721 16.9125C7.65721 16.9125 6.17971 16.5375 5.06221 15.7875C4.01971 15.0975 3.44971 14.1525 3.44971 13.125C3.44971 12.0975 4.01971 11.145 5.06221 10.4475C7.31221 8.955 10.9572 8.955 13.1922 10.4475C14.2272 11.1375 14.8047 12.0825 14.8047 13.11C14.8047 14.1375 14.2347 15.09 13.1922 15.7875C12.0672 16.5375 10.5972 16.9125 9.12721 16.9125ZM5.68471 11.3925C4.96471 11.8725 4.57471 12.4875 4.57471 13.1325C4.57471 13.77 4.97221 14.385 5.68471 14.8575C7.55221 16.11 10.7022 16.11 12.5697 14.8575C13.2897 14.3775 13.6797 13.7625 13.6797 13.1175C13.6797 12.48 13.2822 11.865 12.5697 11.3925C10.7022 10.1475 7.55221 10.1475 5.68471 11.3925Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 17.07C8.1825 17.07 7.3725 16.83 6.735 16.3575L3.51 13.95C2.655 13.3125 1.9875 11.9775 1.9875 10.92V5.34C1.9875 4.185 2.835 2.955 3.9225 2.55L7.665 1.1475C8.4075 0.870002 9.5775 0.870002 10.32 1.1475L14.0625 2.55C15.15 2.955 15.9975 4.185 15.9975 5.34V10.9125C15.9975 11.9775 15.33 13.305 14.475 13.9425L11.25 16.35C10.6275 16.83 9.8175 17.07 9 17.07ZM8.0625 2.205L4.32 3.6075C3.6825 3.8475 3.12 4.6575 3.12 5.3475V10.92C3.12 11.6325 3.6225 12.63 4.185 13.05L7.41 15.4575C8.2725 16.1025 9.7275 16.1025 10.5975 15.4575L13.8225 13.05C14.3925 12.6225 14.8875 11.6325 14.8875 10.92V5.34C14.8875 4.6575 14.325 3.8475 13.6875 3.6L9.945 2.1975C9.435 2.0175 8.565 2.0175 8.0625 2.205Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 809 B

View File

@ -0,0 +1,10 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.04 17.0625H6.99755C6.51755 17.0625 6.09754 17.0325 5.71504 16.98C5.40754 16.935 5.19002 16.65 5.23502 16.3425C5.28002 16.035 5.55755 15.81 5.87255 15.8625C6.20255 15.9075 6.57004 15.93 6.99004 15.93H11.0326C14.1001 15.93 15.1875 14.8425 15.1875 11.775V8.40747C15.1875 8.09997 15.4425 7.84497 15.75 7.84497C16.0575 7.84497 16.3125 8.09997 16.3125 8.40747V11.775C16.32 15.48 14.7375 17.0625 11.04 17.0625Z" fill="#292D32"/>
<path d="M2.28003 12.2025C1.97253 12.2025 1.71753 11.9475 1.71753 11.64V8.41498C1.71753 8.10748 1.97253 7.85248 2.28003 7.85248C2.58753 7.85248 2.84253 8.10748 2.84253 8.41498V11.64C2.84253 11.9475 2.58753 12.2025 2.28003 12.2025Z" fill="#292D32"/>
<path d="M9.02238 9.5625C8.19738 9.5625 7.44733 9.24002 6.91483 8.64752C6.38233 8.05502 6.13484 7.28249 6.21734 6.45749L6.71987 1.44754C6.74987 1.16254 6.98987 0.9375 7.28237 0.9375H10.7849C11.0774 0.9375 11.3174 1.15504 11.3474 1.44754L11.8498 6.45749C11.9323 7.28249 11.6849 8.05502 11.1524 8.64752C10.5974 9.24002 9.84738 9.5625 9.02238 9.5625ZM7.77735 2.0625L7.32737 6.57001C7.27487 7.07251 7.42486 7.54501 7.73986 7.89001C8.37736 8.59501 9.65233 8.59501 10.2898 7.89001C10.6048 7.53751 10.7549 7.06501 10.7024 6.57001L10.2523 2.0625H7.77735Z" fill="#292D32"/>
<path d="M13.7475 9.5625C12.225 9.5625 10.8675 8.33247 10.71 6.81747L10.185 1.55997C10.17 1.40247 10.2225 1.245 10.3275 1.125C10.4325 1.005 10.5825 0.9375 10.7475 0.9375H13.035C15.24 0.9375 16.2675 1.86 16.575 4.125L16.785 6.21002C16.875 7.09502 16.605 7.93504 16.0275 8.57254C15.45 9.21004 14.64 9.5625 13.7475 9.5625ZM11.37 2.0625L11.835 6.70496C11.9325 7.64246 12.81 8.4375 13.7475 8.4375C14.3175 8.4375 14.8275 8.22004 15.195 7.82254C15.555 7.42504 15.72 6.89254 15.6675 6.32254L15.4575 4.26004C15.225 2.56504 14.6775 2.0625 13.035 2.0625H11.37Z" fill="#292D32"/>
<path d="M4.25235 9.5625C3.35985 9.5625 2.54986 9.21004 1.97236 8.57254C1.39486 7.93504 1.12485 7.09502 1.21485 6.21002L1.42488 4.14752C1.73988 1.86002 2.76736 0.9375 4.97236 0.9375H7.25985C7.41735 0.9375 7.56735 1.005 7.67985 1.125C7.78485 1.245 7.83735 1.40247 7.82235 1.55997L7.29734 6.81747C7.13234 8.33247 5.76735 9.5625 4.25235 9.5625ZM4.96485 2.0625C3.32235 2.0625 2.77486 2.55746 2.53486 4.27496L2.33235 6.31503C2.27235 6.88503 2.44485 7.41753 2.80485 7.81503C3.16485 8.21253 3.68235 8.42999 4.25235 8.42999C5.19735 8.42999 6.07484 7.63504 6.16484 6.69754L6.62988 2.05499H4.96485V2.0625Z" fill="#292D32"/>
<path d="M3.75 17.8125C2.7 17.8125 1.71751 17.355 1.04251 16.5525C1.03501 16.545 1.005 16.515 0.982498 16.4775C0.869998 16.3425 0.772494 16.2075 0.697495 16.065C0.367495 15.5325 0.1875 14.9025 0.1875 14.2425C0.1875 13.1475 0.675022 12.135 1.52252 11.46C1.67252 11.34 1.8375 11.2275 2.0175 11.13C2.535 10.8375 3.1425 10.6725 3.75 10.6725C4.62 10.6725 5.42252 10.9725 6.06752 11.535C6.15002 11.595 6.26249 11.7075 6.35999 11.8125C6.96749 12.48 7.30499 13.335 7.30499 14.2275C7.30499 14.88 7.12499 15.5175 6.78749 16.065C6.62249 16.35 6.42001 16.5975 6.19501 16.7925C6.15001 16.8375 6.10501 16.8825 6.05251 16.92C5.46001 17.4975 4.6275 17.8125 3.75 17.8125ZM1.85999 15.78C1.88249 15.8025 1.91998 15.84 1.94998 15.8925C2.36248 16.38 3.0375 16.695 3.75 16.695C4.3425 16.695 4.9125 16.4775 5.3475 16.0875C5.37 16.0575 5.4 16.0275 5.4375 16.005C5.5875 15.8775 5.71502 15.7125 5.83502 15.5175C6.06752 15.135 6.19501 14.7075 6.19501 14.2575C6.19501 13.65 5.96251 13.0575 5.54251 12.6C5.49001 12.54 5.43748 12.48 5.36998 12.435C4.55998 11.7375 3.44999 11.6325 2.56499 12.135C2.44499 12.2025 2.33999 12.27 2.24249 12.3525C1.65749 12.8175 1.32001 13.5075 1.32001 14.2575C1.32001 14.7 1.43999 15.135 1.67249 15.51C1.73249 15.615 1.79249 15.6975 1.85999 15.7725C1.85249 15.7725 1.85999 15.7725 1.85999 15.78Z" fill="#292D32"/>
<path d="M4.87482 14.7975H2.63232C2.32482 14.7975 2.06982 14.5425 2.06982 14.235C2.06982 13.9275 2.32482 13.6725 2.63232 13.6725H4.87482C5.18232 13.6725 5.43732 13.9275 5.43732 14.235C5.43732 14.5425 5.18232 14.7975 4.87482 14.7975Z" fill="#292D32"/>
<path d="M3.75 15.945C3.4425 15.945 3.1875 15.69 3.1875 15.3825V13.14C3.1875 12.8325 3.4425 12.5775 3.75 12.5775C4.0575 12.5775 4.3125 12.8325 4.3125 13.14V15.3825C4.3125 15.6975 4.0575 15.945 3.75 15.945Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.245 17.0025C12.8475 17.0025 12.3375 16.875 11.7 16.5L9.4575 15.1725C9.225 15.0375 8.775 15.0375 8.55 15.1725L6.3 16.5C4.9725 17.2875 4.1925 16.9725 3.84 16.7175C3.495 16.4625 2.955 15.81 3.3075 14.31L3.84 12.0075C3.9 11.7675 3.78 11.355 3.6 11.175L1.74 9.31501C0.809997 8.38501 0.884997 7.59001 1.0125 7.20001C1.14 6.81001 1.545 6.12001 2.835 5.90251L5.2275 5.50501C5.4525 5.46751 5.775 5.22751 5.8725 5.02501L7.2 2.37751C7.8 1.17001 8.5875 0.990005 9 0.990005C9.4125 0.990005 10.2 1.17001 10.8 2.37751L12.12 5.01751C12.225 5.22001 12.5475 5.46001 12.7725 5.49751L15.165 5.89501C16.4625 6.11251 16.8675 6.80251 16.9875 7.19251C17.1075 7.58251 17.1825 8.37751 16.26 9.30751L14.4 11.175C14.22 11.355 14.1075 11.76 14.16 12.0075L14.6925 14.31C15.0375 15.81 14.505 16.4625 14.16 16.7175C13.9725 16.8525 13.6725 17.0025 13.245 17.0025ZM9 13.9425C9.3675 13.9425 9.735 14.0325 10.0275 14.205L12.27 15.5325C12.9225 15.9225 13.335 15.9225 13.4925 15.81C13.65 15.6975 13.7625 15.3 13.5975 14.565L13.065 12.2625C12.9225 11.64 13.155 10.8375 13.605 10.38L15.465 8.52001C15.8325 8.15251 15.9975 7.79251 15.9225 7.54501C15.84 7.29751 15.495 7.09501 14.985 7.01251L12.5925 6.61501C12.015 6.51751 11.385 6.05251 11.1225 5.52751L9.8025 2.88751C9.5625 2.40751 9.2625 2.12251 9 2.12251C8.7375 2.12251 8.4375 2.40751 8.205 2.88751L6.8775 5.52751C6.615 6.05251 5.985 6.51751 5.4075 6.61501L3.0225 7.01251C2.5125 7.09501 2.1675 7.29751 2.085 7.54501C2.0025 7.79251 2.175 8.16001 2.5425 8.52001L4.4025 10.38C4.8525 10.83 5.085 11.64 4.9425 12.2625L4.41 14.565C4.2375 15.3075 4.3575 15.6975 4.515 15.81C4.6725 15.9225 5.0775 15.915 5.7375 15.5325L7.98 14.205C8.265 14.0325 8.6325 13.9425 9 13.9425Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,6 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.75 15.5625H5.25C1.9425 15.5625 0.9375 14.5575 0.9375 11.25V10.875C0.9375 10.5675 1.1925 10.3125 1.5 10.3125C2.22 10.3125 2.8125 9.72 2.8125 9C2.8125 8.28 2.22 7.6875 1.5 7.6875C1.1925 7.6875 0.9375 7.4325 0.9375 7.125V6.75C0.9375 3.4425 1.9425 2.4375 5.25 2.4375H12.75C16.0575 2.4375 17.0625 3.4425 17.0625 6.75V7.5C17.0625 7.8075 16.8075 8.0625 16.5 8.0625C15.78 8.0625 15.1875 8.655 15.1875 9.375C15.1875 10.095 15.78 10.6875 16.5 10.6875C16.8075 10.6875 17.0625 10.9425 17.0625 11.25C17.0625 14.5575 16.0575 15.5625 12.75 15.5625ZM2.0625 11.37C2.0775 13.95 2.61 14.4375 5.25 14.4375H12.75C15.255 14.4375 15.8625 13.995 15.93 11.745C14.8575 11.49 14.0625 10.5225 14.0625 9.375C14.0625 8.2275 14.865 7.26 15.9375 7.005V6.75C15.9375 4.0725 15.4275 3.5625 12.75 3.5625H5.25C2.61 3.5625 2.0775 4.05 2.0625 6.63C3.135 6.885 3.9375 7.8525 3.9375 9C3.9375 10.1475 3.135 11.115 2.0625 11.37Z" fill="#292D32"/>
<path d="M11.25 11.91C10.83 11.91 10.4925 11.5725 10.4925 11.16C10.4925 10.7475 10.83 10.41 11.2425 10.41C11.655 10.41 11.9925 10.7475 11.9925 11.16C11.9925 11.5725 11.67 11.91 11.25 11.91Z" fill="#292D32"/>
<path d="M6.74999 8.16C6.32999 8.16 5.99249 7.8225 5.99249 7.41C5.99249 6.9975 6.32999 6.66 6.74249 6.66C7.15499 6.66 7.49249 6.9975 7.49249 7.41C7.49249 7.8225 7.16999 8.16 6.74999 8.16Z" fill="#292D32"/>
<path d="M6.47251 12.3225C6.33001 12.3225 6.18751 12.27 6.07501 12.1575C5.85751 11.94 5.85751 11.58 6.07501 11.3625L11.1225 6.315C11.34 6.0975 11.7 6.0975 11.9175 6.315C12.135 6.5325 12.135 6.8925 11.9175 7.11L6.87001 12.1575C6.76501 12.27 6.61501 12.3225 6.47251 12.3225Z" fill="#292D32"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -40,20 +40,62 @@ class $AssetsLogoGen {
class $AssetsIconOutlineGen {
const $AssetsIconOutlineGen();
/// File path: assets/icon/outline/arrow-right.svg
SvgGenImage get arrowRight => const SvgGenImage(
'assets/icon/outline/arrow-right.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/empty-wallet.svg
SvgGenImage get emptyWallet => const SvgGenImage(
'assets/icon/outline/empty-wallet.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/frame.svg
SvgGenImage get frame => const SvgGenImage(
'assets/icon/outline/frame.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/home.svg
SvgGenImage get home =>
const SvgGenImage('assets/icon/outline/home.svg', size: Size(24.0, 24.0));
/// File path: assets/icon/outline/logout.svg
SvgGenImage get logout => const SvgGenImage(
'assets/icon/outline/logout.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/map.svg
SvgGenImage get map =>
const SvgGenImage('assets/icon/outline/map.svg', size: Size(24.0, 24.0));
/// File path: assets/icon/outline/message-question.svg
SvgGenImage get messageQuestion => const SvgGenImage(
'assets/icon/outline/message-question.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/notification-bing.svg
SvgGenImage get notificationBing => const SvgGenImage(
'assets/icon/outline/notification-bing.svg',
size: Size(24.0, 24.0),
);
/// File path: assets/icon/outline/notification.svg
SvgGenImage get notification => const SvgGenImage(
'assets/icon/outline/notification.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/profile.svg
SvgGenImage get profile => const SvgGenImage(
'assets/icon/outline/profile.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/search.svg
SvgGenImage get search => const SvgGenImage(
'assets/icon/outline/search.svg',
@ -66,17 +108,50 @@ class $AssetsIconOutlineGen {
size: Size(24.0, 24.0),
);
/// File path: assets/icon/outline/shield.svg
SvgGenImage get shield => const SvgGenImage(
'assets/icon/outline/shield.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/shop-add.svg
SvgGenImage get shopAdd => const SvgGenImage(
'assets/icon/outline/shop-add.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/star.svg
SvgGenImage get star =>
const SvgGenImage('assets/icon/outline/star.svg', size: Size(18.0, 18.0));
/// File path: assets/icon/outline/ticket-discount.svg
SvgGenImage get ticketDiscount => const SvgGenImage(
'assets/icon/outline/ticket-discount.svg',
size: Size(18.0, 18.0),
);
/// File path: assets/icon/outline/user.svg
SvgGenImage get user =>
const SvgGenImage('assets/icon/outline/user.svg', size: Size(24.0, 24.0));
/// List of all assets
List<SvgGenImage> get values => [
arrowRight,
emptyWallet,
frame,
home,
logout,
map,
messageQuestion,
notificationBing,
notification,
profile,
search,
setting,
shield,
shopAdd,
star,
ticketDiscount,
user,
];
}

View File

@ -5,20 +5,24 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:proxibuy/presentation/providers/category/cubit/categories_children_cubit.dart';
import 'package:proxibuy/presentation/providers/category/cubit/categories_cubit.dart';
import 'package:proxibuy/presentation/providers/user_info_cubit.dart';
import 'package:proxibuy/presentation/ui/screens/auth/auth_page.dart';
import 'package:proxibuy/presentation/ui/screens/setting/edit_profile_page.dart';
import 'package:proxibuy/presentation/ui/screens/home/screens/categories_screen.dart';
import 'package:proxibuy/presentation/ui/screens/home/screens/explore_screen.dart';
import 'package:proxibuy/presentation/ui/screens/home/home_page.dart';
import 'package:proxibuy/presentation/ui/screens/home/screens/home_screen.dart';
import 'package:proxibuy/presentation/ui/screens/home/screens/setting_screen.dart';
import 'package:proxibuy/presentation/ui/screens/product/product_page.dart';
import 'package:proxibuy/presentation/ui/screens/setting/notifications_etting_page.dart';
import 'package:proxibuy/presentation/ui/theme/responsive.dart';
class AppRouter {
static final initial = '/';
static final auth = '/auth';
static final explore = '/explore';
static final setting = '/settings';
static final editProfile = 'edit-profile';
static final notificationsSetting = 'notification';
static final product = '/product';
static final categories = '/categories';
@ -30,51 +34,21 @@ class AppRouter {
static GoRouter createRouter = GoRouter(
navigatorKey: navigatorKey,
initialLocation: initial,
redirect: (context, state) {
return null;
},
routes: [
// GoRoute(
// path: initial,
// builder: (BuildContext context, GoRouterState state) {
// return BlocConsumer<UserInfoCubit, UserInfoState>(
// listener: (context, state) {
// if (state is UserInfoSuccess || state is UserInfoFail) {
// FlutterNativeSplash.remove();
// }
// },
// builder: (context, state) {
// if (state is UserInfoSuccess) {
// return const HomePage();
// } else {
// return const AuthPage();
// }
// },
// );
// },
// routes: <RouteBase>[
// GoRoute(
// path: product,
// builder: (BuildContext context, GoRouterState state) {
// return ProductPage();
// },
// routes: <RouteBase>[],
// ),
// ],
// ),
GoRoute(
path: auth,
builder: (context, state) {
return AuthPage();
},
),
StatefulShellRoute.indexedStack(
builder: (context, state, navigationShell) =>
BlocBuilder<UserInfoCubit, UserInfoState>(
builder: (context, userState) {
if (userState is UserInfoSuccess) {
if (home.contains(state.fullPath)) {
return HomePage(child: navigationShell);
} else {
return navigationShell;
}
} else {
return AuthPage();
}
},
),
home.contains(state.fullPath)
? HomePage(child: navigationShell)
: navigationShell,
branches: [
StatefulShellBranch(routes: [
GoRoute(
@ -140,9 +114,24 @@ class AppRouter {
]),
StatefulShellBranch(routes: [
GoRoute(
path: setting,
builder: (context, state) => SettingScreen(),
),
path: setting,
builder: (context, state) => SettingScreen(),
routes: [
GoRoute(
path: editProfile,
name: editProfile,
builder: (context, state) {
return EditProfilePage();
},
),
GoRoute(
path: notificationsSetting,
name: notificationsSetting,
builder: (context, state) {
return NotificationsEttingPage();
},
),
]),
]),
],
),

View File

@ -0,0 +1,10 @@
import 'package:flutter/cupertino.dart';
import 'package:proxibuy/core/gen/assets.gen.dart';
class SettingBtnsModel {
final String title;
final SvgGenImage icon;
final Function(BuildContext context)? onPressed;
SettingBtnsModel({required this.title, required this.icon, this.onPressed});
}

View File

@ -22,10 +22,8 @@ void main() async {
BlocProvider<ThemModeCubit>(create: (context) => ThemModeCubit()),
BlocProvider<CategoriesChildrenCubit>(
create: (context) => CategoriesChildrenCubit()),
BlocProvider<CategoriesCubit>(
create: (context) => CategoriesCubit()..getAllCategories()),
BlocProvider<UserInfoCubit>(
create: (context) => UserInfoCubit()..getUserInfo()),
BlocProvider<CategoriesCubit>(create: (context) => CategoriesCubit()),
BlocProvider<UserInfoCubit>(create: (context) => UserInfoCubit()),
],
child: const MyApp(),
));

View File

@ -26,7 +26,10 @@ class _AuthPageState extends State<AuthPage> {
appBar: AppBar(
title: Text(
'Auth',
style: Theme.of(context).textTheme.titleLarge,
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(color: Theme.of(context).colorScheme.onSurface),
),
backgroundColor: Colors.transparent,
surfaceTintColor: Colors.transparent,

View File

@ -18,7 +18,6 @@ class HomeDeskPage extends StatefulWidget {
}
class _HomeDeskPageState extends State<HomeDeskPage> {
int selectedIndex = 0;
List<ScreenModel> deskScreens = [
ScreenModel(
title: 'Home',
@ -34,10 +33,14 @@ class _HomeDeskPageState extends State<HomeDeskPage> {
route: AppRouter.setting),
];
int _getSelectedIndex(BuildContext context) {
final g = GoRouterState.of(context);
final String location = g.fullPath.toString();
return deskScreens
.indexWhere((element) => element.route.startsWith(location));
}
void _onItemTapped(BuildContext context, int index) {
setState(() {
selectedIndex = index;
});
switch (index) {
case 0:
context.go(AppRouter.initial);
@ -64,10 +67,6 @@ class _HomeDeskPageState extends State<HomeDeskPage> {
}
Padding navBar(BuildContext context) {
final defaultBorder = OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide:
BorderSide(color: Theme.of(context).colorScheme.surface, width: 2));
return Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
@ -89,7 +88,7 @@ class _HomeDeskPageState extends State<HomeDeskPage> {
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: selectedIndex == index
color: _getSelectedIndex(context) == index
? themeColor(context)
?.primaryLightSurface
.withAlpha(90)
@ -103,7 +102,7 @@ class _HomeDeskPageState extends State<HomeDeskPage> {
crossAxisAlignment: CrossAxisAlignment.end,
children: [
deskScreens[index].icon.svg(
color: selectedIndex == index
color: _getSelectedIndex(context) == index
? Theme.of(context).primaryColor
: Theme.of(context)
.colorScheme
@ -115,7 +114,8 @@ class _HomeDeskPageState extends State<HomeDeskPage> {
.textTheme
.labelLarge
?.copyWith(
color: selectedIndex == index
color: _getSelectedIndex(context) ==
index
? Theme.of(context).primaryColor
: Theme.of(context)
.colorScheme
@ -142,18 +142,16 @@ class _HomeDeskPageState extends State<HomeDeskPage> {
child: Container(
constraints: BoxConstraints(maxWidth: 800),
child: TextField(
decoration: InputDecoration(
hintText: 'what are you looking for?',
suffixIcon: Padding(
padding: const EdgeInsets.all(8.0),
child: Assets.icon.outline.search.svg(
color: Theme.of(context).colorScheme.onSurface,
width: 16,
height: 16),
),
enabledBorder: defaultBorder,
border: defaultBorder),
),
decoration: defaultInputDecoration(context).copyWith(
hintText: 'what are you looking for?',
suffixIcon: Padding(
padding: const EdgeInsets.all(8.0),
child: Assets.icon.outline.search.svg(
color: Theme.of(context).colorScheme.onSurface,
width: 16,
height: 16),
),
)),
)),
32.w,
IconButton(

View File

@ -44,7 +44,7 @@ class _HomePageState extends State<HomePage> {
int _getSelectedIndex(BuildContext context) {
final g = GoRouterState.of(context);
final String location = g.fullPath.toString();
return screens.indexWhere((element) => element.route == location);
return screens.indexWhere((element) => element.route.startsWith(location));
}
@override

View File

@ -163,7 +163,10 @@ class _HomeScreenState extends State<HomeScreen> {
padding: const EdgeInsets.only(left: 2.0),
child: SelectableText(
"Proxibuy",
style: Theme.of(context).textTheme.headlineSmall,
style: Theme.of(context)
.textTheme
.headlineSmall
?.copyWith(color: Theme.of(context).colorScheme.onSurface),
),
),
actions: [

View File

@ -1,13 +1,178 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:proxibuy/core/gen/assets.gen.dart';
import 'package:proxibuy/core/routes/app_router.dart';
import 'package:proxibuy/data/models/setting_btns_model.dart';
import 'package:proxibuy/presentation/ui/theme/responsive.dart';
class SettingScreen extends StatelessWidget {
class SettingScreen extends StatefulWidget {
const SettingScreen({super.key});
@override
State<SettingScreen> createState() => _SettingScreenState();
}
class _SettingScreenState extends State<SettingScreen> {
final List<SettingBtnsModel> _generalBtns = [
SettingBtnsModel(
title: 'Edit Profile',
icon: Assets.icon.outline.profile,
onPressed: (context) {
context.goNamed(AppRouter.editProfile);
},
),
SettingBtnsModel(
title: 'Notifications',
icon: Assets.icon.outline.notification,
onPressed: (context) {
context.goNamed(AppRouter.notificationsSetting);
},
),
SettingBtnsModel(title: 'Security', icon: Assets.icon.outline.frame),
SettingBtnsModel(
title: 'Transactions & Wallets', icon: Assets.icon.outline.emptyWallet),
SettingBtnsModel(
title: 'Discounts & Prizes', icon: Assets.icon.outline.ticketDiscount),
SettingBtnsModel(title: 'Favorite Stores', icon: Assets.icon.outline.star),
SettingBtnsModel(
title: 'Store Introduction', icon: Assets.icon.outline.shopAdd),
];
final List<SettingBtnsModel> _preferencesBtns = [
SettingBtnsModel(
title: 'Legal & Policies', icon: Assets.icon.outline.shield),
SettingBtnsModel(
title: 'Help & Support', icon: Assets.icon.outline.messageQuestion),
SettingBtnsModel(title: 'Logout', icon: Assets.icon.outline.logout),
];
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('Setting'),
return Responsive(context).builder(
mobile: Scaffold(
appBar: AppBar(
title: Text(
'Setting',
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(color: Theme.of(context).colorScheme.onSurface),
),
),
body: SingleChildScrollView(
child: Column(
children: [
ListTile(
title: SelectableText(
'General',
style: Theme.of(context).textTheme.titleMedium,
),
),
ListView.builder(
itemCount: _generalBtns.length,
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return settingItem(context, item: _generalBtns[index]);
},
),
ListTile(
title: SelectableText(
'Preferences',
style: Theme.of(context).textTheme.titleMedium,
),
),
ListView.builder(
itemCount: _preferencesBtns.length,
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return settingItem(context, item: _preferencesBtns[index]);
},
)
],
),
),
),
desktop: Responsive(context).maxWidthInDesktop(
maxWidth: 1200,
child: (contxet, mw) => Scaffold(
body: SingleChildScrollView(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
children: [
ListTile(
title: SelectableText(
'General',
style: Theme.of(context).textTheme.titleMedium,
),
),
ListView.builder(
itemCount: _generalBtns.length,
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return settingItem(context,
item: _generalBtns[index]);
},
),
],
),
),
Expanded(
child: Column(
children: [
ListTile(
title: SelectableText(
'Preferences',
style: Theme.of(context).textTheme.titleMedium,
),
),
ListView.builder(
itemCount: _preferencesBtns.length,
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return settingItem(context,
item: _preferencesBtns[index]);
},
)
],
),
),
],
),
),
),
),
);
}
Container settingItem(BuildContext context,
{required final SettingBtnsModel item}) {
return Container(
margin: EdgeInsets.symmetric(vertical: 8, horizontal: 16),
padding: EdgeInsets.symmetric(vertical: 8),
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.15),
spreadRadius: 2,
blurRadius: 12,
offset: Offset(0, 4),
),
],
borderRadius: BorderRadius.circular(8),
color: Theme.of(context).colorScheme.surface,
),
child: ListTile(
onTap: () => item.onPressed?.call(context),
leading: item.icon.svg(color: Theme.of(context).colorScheme.onSurface),
trailing: Assets.icon.outline.arrowRight
.svg(color: Theme.of(context).colorScheme.onSurface),
title: Text(item.title),
),
);
}

View File

@ -0,0 +1,187 @@
import 'package:flutter/material.dart';
import 'package:proxibuy/core/utils/empty_space.dart';
import 'package:proxibuy/presentation/ui/theme/responsive.dart';
import 'package:proxibuy/presentation/ui/theme/theme.dart';
import 'package:proxibuy/presentation/ui/widgets/dialog/dialog_manager.dart';
class EditProfilePage extends StatelessWidget {
const EditProfilePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Edit Profile',
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(color: Theme.of(context).colorScheme.onSurface),
),
),
body: Responsive(context).builder(
mobile: Form(
child: Padding(
padding: const EdgeInsets.all(16.0).copyWith(bottom: 32),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Center(
child: SizedBox(
width: 64, height: 64, child: CircleAvatar())),
16.h,
Text(
'Username',
style: Theme.of(context).textTheme.titleMedium,
),
32.h,
TextFormField(
decoration: defaultInputDecoration(context).copyWith(
labelText: 'First Name',
)),
16.h,
TextFormField(
decoration: defaultInputDecoration(context).copyWith(
labelText: 'Last Name',
)),
16.h,
TextFormField(
decoration: defaultInputDecoration(context).copyWith(
labelText: 'Phone',
)),
16.h,
TextFormField(
decoration: defaultInputDecoration(context).copyWith(
labelText: 'Email',
)),
16.h,
SwitchListTile.adaptive(
title: Text(
'Login with Password',
style: Theme.of(context).textTheme.titleLarge,
),
subtitle: Text('Change Password'),
value: false,
onChanged: (value) {
DialogManager(context).changePasswordBS();
},
),
],
),
SizedBox(
width: double.infinity,
height: 46,
child: ElevatedButton(
onPressed: () {},
child: Text(
'Confirm Changes',
style: Theme.of(context)
.textTheme
.labelLarge
?.copyWith(color: Colors.white),
)),
)
],
),
),
),
desktop: Responsive(context).maxWidthInDesktop(
maxWidth: 800,
child: (context, mw) {
return Form(
child: Padding(
padding: const EdgeInsets.all(16.0).copyWith(bottom: 32),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Center(
child: SizedBox(
width: 128,
height: 128,
child: CircleAvatar())),
16.h,
Text(
'Username',
style: Theme.of(context).textTheme.titleLarge,
),
32.h,
Row(
children: [
Expanded(
child: TextFormField(
decoration:
defaultInputDecoration(context)
.copyWith(
labelText: 'First Name',
)),
),
16.w,
Expanded(
child: TextFormField(
decoration:
defaultInputDecoration(context)
.copyWith(
labelText: 'Last Name',
)),
),
],
),
16.h,
Row(
children: [
Expanded(
child: TextFormField(
decoration:
defaultInputDecoration(context)
.copyWith(
labelText: 'Phone',
)),
),
16.w,
Expanded(
child: TextFormField(
decoration:
defaultInputDecoration(context)
.copyWith(
labelText: 'Email',
)),
),
],
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Login with Password Only',
style: Theme.of(context).textTheme.titleLarge,
),
subtitle: Text('Change Password'),
value: false,
onChanged: (value) {},
),
],
),
SizedBox(
width: double.infinity,
height: 46,
child: ElevatedButton(
onPressed: () {},
child: Text(
'Confirm Changes',
style: Theme.of(context)
.textTheme
.labelLarge
?.copyWith(color: Colors.white),
)),
)
],
),
),
);
})),
);
}
}

View File

@ -0,0 +1,193 @@
import 'package:flutter/material.dart';
import 'package:proxibuy/core/utils/empty_space.dart';
import 'package:proxibuy/presentation/ui/theme/responsive.dart';
class NotificationsEttingPage extends StatefulWidget {
const NotificationsEttingPage({super.key});
@override
State<NotificationsEttingPage> createState() =>
_NotificationsEttingPageState();
}
class _NotificationsEttingPageState extends State<NotificationsEttingPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Notifications',
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(color: Theme.of(context).colorScheme.onSurface),
),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Responsive(context).builder(
desktop: Responsive(context).maxWidthInDesktop(
maxWidth: 1000,
child: (context, mw) {
return Row(
children: [
Expanded(
child: Column(
children: [
ListTile(
title: Text(
'Notification Categories',
style: Theme.of(context).textTheme.titleLarge,
),
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Special Offers',
),
value: true,
onChanged: (value) {},
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Order Status',
),
value: false,
onChanged: (value) {},
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Account Notifications',
),
value: false,
onChanged: (value) {},
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Product Updates',
),
value: false,
onChanged: (value) {},
),
],
)),
16.w,
Expanded(
child: Column(
children: [
ListTile(
title: Text(
'Notification Frequency Control',
style: Theme.of(context).textTheme.titleLarge,
),
),
16.h,
CheckboxListTile.adaptive(
title: Text(
'Daily',
),
value: false,
onChanged: (value) {},
),
16.h,
CheckboxListTile.adaptive(
title: Text(
'Weekly',
),
value: false,
onChanged: (value) {},
),
16.h,
CheckboxListTile.adaptive(
title: Text(
'monthly',
),
value: true,
onChanged: (value) {},
),
],
))
],
);
}),
mobile: Column(
children: [
ListTile(
title: Text(
'Notification Categories',
style: Theme.of(context).textTheme.titleLarge,
),
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Special Offers',
),
value: false,
onChanged: (value) {},
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Order Status',
),
value: true,
onChanged: (value) {},
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Account Notifications',
),
value: false,
onChanged: (value) {},
),
16.h,
SwitchListTile.adaptive(
title: Text(
'Product Updates',
),
value: false,
onChanged: (value) {},
),
16.h,
ListTile(
title: Text(
'Notification Frequency Control',
style: Theme.of(context).textTheme.titleLarge,
),
),
16.h,
CheckboxListTile.adaptive(
title: Text(
'Daily',
),
value: false,
onChanged: (value) {},
),
16.h,
CheckboxListTile.adaptive(
title: Text(
'Weekly',
),
value: false,
onChanged: (value) {},
),
16.h,
CheckboxListTile.adaptive(
title: Text(
'monthly',
),
value: true,
onChanged: (value) {},
),
],
),
),
),
);
}
}

View File

@ -21,11 +21,29 @@ final ThemeData appTheme = ThemeData(
appBarTheme: const AppBarTheme(
surfaceTintColor: lightBackground,
backgroundColor: lightBackground,
toolbarTextStyle: TextStyle(color: fontDark),
centerTitle: true,
elevation: 2,
titleTextStyle: TextStyle(
color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold),
),
switchTheme: SwitchThemeData(
thumbColor: MaterialStateProperty.resolveWith<Color?>(
(Set<MaterialState> states) {
return Colors.white; // Thumb color when switch is off
},
),
trackColor: MaterialStateProperty.resolveWith<Color?>(
(Set<MaterialState> states) {
if (states.contains(MaterialState.selected)) {
return primarySwatch; // Thumb color when switch is on
}
return Colors.grey[300]!; // Thumb color when switch is off
},
),
),
// Text Theme
textTheme: const TextTheme(
displayLarge:
@ -102,6 +120,8 @@ final ThemeData darkTheme = ThemeData(
appBarTheme: const AppBarTheme(
backgroundColor: darkBackground,
surfaceTintColor: darkBackground,
centerTitle: true,
toolbarTextStyle: TextStyle(color: fontLight),
elevation: 2,
titleTextStyle: TextStyle(
color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold),
@ -168,3 +188,21 @@ final ThemeData darkTheme = ThemeData(
CustomColors? themeColor(BuildContext context) {
return Theme.of(context).extension<CustomColors>();
}
OutlineInputBorder defaultBorder(BuildContext context) => OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide:
BorderSide(color: Theme.of(context).colorScheme.onSurface, width: 2));
OutlineInputBorder defaultFocusedBorder(
BuildContext context) =>
OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: themeColor(context)!.primarySwatch.shade400, width: 2));
InputDecoration defaultInputDecoration(BuildContext context) => InputDecoration(
floatingLabelStyle:
TextStyle(color: themeColor(context)!.primarySwatch.shade400),
enabledBorder: defaultBorder(context),
border: defaultBorder(context),
focusedBorder: defaultFocusedBorder(context));

View File

@ -1,10 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:proxibuy/core/utils/empty_space.dart';
import 'package:proxibuy/presentation/ui/theme/theme.dart';
class DialogManager {
final BuildContext context;
DialogManager({required this.context});
DialogManager(this.context);
// Future _showDialog(Widget widget) async {
// await showDialog(
@ -16,4 +17,74 @@ class DialogManager {
// },
// );
// }
Future _showBottomSheet(Widget widget) async {
await showModalBottomSheet(
context: context,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
builder: (context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: widget,
);
},
);
}
void changePasswordBS() async {
await _showBottomSheet(Form(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
ListTile(
title: Text(
'Login with Password',
style: Theme.of(context).textTheme.titleLarge,
),
subtitle: Text('"To confirm, please enter a password."'),
),
32.h,
TextFormField(
decoration: defaultInputDecoration(context).copyWith(
labelText: 'Password',
)),
16.h,
TextFormField(
decoration: defaultInputDecoration(context).copyWith(
labelText: 're-Password',
)),
32.h,
TextButton(onPressed: () {}, child: Text('Forgot Your Password?'))
],
),
Row(
children: [
Expanded(
child: SizedBox(
height: 46,
child: ElevatedButton(onPressed: () {}, child: Text('Confirm')),
)),
12.w,
Expanded(
child: SizedBox(
height: 46,
child: OutlinedButton(
style: OutlinedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
side: BorderSide(
color: Theme.of(context).primaryColor,
),
),
onPressed: () {},
child: Text('Cancel')),
))
],
)
],
),
));
}
}