Cw 1247 improve tabs navigation (#2634)
* add dashboard page indicator * refactor dashboard page indicator and UI * refactor fade animation * smoother UI transitions * Improve accessibility for page indicator * localize action names * Update page indicator colors and blur effect * fix page indicator layout * Update Spanish translations for 'apps', 'history', and 'home' * update dashboard labels * changed settings page label * Modify page_indicator.dart * refactor page indicator animation * review fixes --------- Co-authored-by: Jaim3 <github@jaim3.com> Co-authored-by: tuxsudo <tuxsudo@tux.pizza>
Serhii committed
Nov 14, 2025 at 16:34 UTC
cbf8e7d05dfb54cd085987458da3f6a4ebf03b38
44 files changed
+621
-85
assets/images/main_actions/apps.svg
new
+21
@@ -0,0 +1,21 @@
1
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M10.5479 15.0262C11.1418 15.0263 11.7109 15.2625 12.1309 15.6825C12.5508 16.1024 12.787 16.6716 12.7871 17.2655V21.7459C12.787 22.3398 12.5508 22.909 12.1309 23.3289C11.7109 23.7489 11.1417 23.9851 10.5479 23.9852H6.06836C5.47433 23.9852 4.90442 23.749 4.48438 23.3289C4.06446 22.909 3.82825 22.3398 3.82812 21.7459V17.2655C3.82823 16.6716 4.06447 16.1024 4.48438 15.6825C4.90442 15.2624 5.47433 15.0262 6.06836 15.0262H10.5479ZM21.749 15.0262C22.3431 15.0262 22.913 15.2624 23.333 15.6825C23.7529 16.1024 23.9892 16.6716 23.9893 17.2655V21.7459C23.9891 22.3398 23.7529 22.909 23.333 23.3289C22.913 23.749 22.3431 23.9852 21.749 23.9852H17.2695C16.6756 23.9851 16.1055 23.7489 15.6855 23.3289C15.2658 22.909 15.0304 22.3396 15.0303 21.7459V17.2655C15.0304 16.6718 15.2658 16.1024 15.6855 15.6825C16.1055 15.2625 16.6756 15.0263 17.2695 15.0262H21.749ZM10.5479 3.827C11.1417 3.82709 11.7109 4.06334 12.1309 4.48325C12.5509 4.90329 12.7871 5.4732 12.7871 6.06723V10.5467C12.787 11.1406 12.5508 11.7098 12.1309 12.1297C11.7109 12.5497 11.1418 12.7859 10.5479 12.786H6.06836C5.47433 12.786 4.90442 12.5498 4.48438 12.1297C4.06447 11.7098 3.82821 11.1406 3.82812 10.5467V6.06723C3.82813 5.4732 4.06433 4.90329 4.48438 4.48325C4.90442 4.06321 5.47433 3.827 6.06836 3.827H10.5479ZM19.5088 3.827C19.7828 3.82715 20.0471 3.92812 20.252 4.1102C20.4569 4.29247 20.588 4.54384 20.6201 4.81625L20.6279 4.94711V7.18637H22.8682C23.1535 7.18672 23.4282 7.29616 23.6357 7.49203C23.8433 7.68798 23.9676 7.95612 23.9844 8.24106C24.0011 8.52595 23.9087 8.80637 23.7256 9.02524C23.5424 9.24413 23.2825 9.38508 22.999 9.41879L22.8682 9.42661H20.6279V11.6668C20.6275 11.9521 20.5181 12.227 20.3223 12.4344C20.1264 12.6416 19.8589 12.7663 19.5742 12.7831C19.2893 12.7998 19.008 12.7075 18.7891 12.5243C18.5703 12.3411 18.4303 12.081 18.3965 11.7977L18.3887 11.6668V9.42661H16.1484C15.8631 9.42624 15.5884 9.31685 15.3809 9.12094C15.1734 8.92501 15.049 8.6568 15.0322 8.37192C15.0156 8.0871 15.1079 7.80653 15.291 7.58774C15.4742 7.36889 15.7342 7.22789 16.0176 7.19418L16.1484 7.18637H18.3887V4.94711C18.3887 4.6501 18.5068 4.36514 18.7168 4.15512C18.9268 3.9452 19.2119 3.827 19.5088 3.827Z" fill="#8C9FBB"/>
3
+<path d="M10.5479 15.0262C11.1418 15.0263 11.7109 15.2625 12.1309 15.6825C12.5508 16.1024 12.787 16.6716 12.7871 17.2655V21.7459C12.787 22.3398 12.5508 22.909 12.1309 23.3289C11.7109 23.7489 11.1417 23.9851 10.5479 23.9852H6.06836C5.47433 23.9852 4.90442 23.749 4.48438 23.3289C4.06446 22.909 3.82825 22.3398 3.82812 21.7459V17.2655C3.82823 16.6716 4.06447 16.1024 4.48438 15.6825C4.90442 15.2624 5.47433 15.0262 6.06836 15.0262H10.5479ZM21.749 15.0262C22.3431 15.0262 22.913 15.2624 23.333 15.6825C23.7529 16.1024 23.9892 16.6716 23.9893 17.2655V21.7459C23.9891 22.3398 23.7529 22.909 23.333 23.3289C22.913 23.749 22.3431 23.9852 21.749 23.9852H17.2695C16.6756 23.9851 16.1055 23.7489 15.6855 23.3289C15.2658 22.909 15.0304 22.3396 15.0303 21.7459V17.2655C15.0304 16.6718 15.2658 16.1024 15.6855 15.6825C16.1055 15.2625 16.6756 15.0263 17.2695 15.0262H21.749ZM10.5479 3.827C11.1417 3.82709 11.7109 4.06334 12.1309 4.48325C12.5509 4.90329 12.7871 5.4732 12.7871 6.06723V10.5467C12.787 11.1406 12.5508 11.7098 12.1309 12.1297C11.7109 12.5497 11.1418 12.7859 10.5479 12.786H6.06836C5.47433 12.786 4.90442 12.5498 4.48438 12.1297C4.06447 11.7098 3.82821 11.1406 3.82812 10.5467V6.06723C3.82813 5.4732 4.06433 4.90329 4.48438 4.48325C4.90442 4.06321 5.47433 3.827 6.06836 3.827H10.5479ZM19.5088 3.827C19.7828 3.82715 20.0471 3.92812 20.252 4.1102C20.4569 4.29247 20.588 4.54384 20.6201 4.81625L20.6279 4.94711V7.18637H22.8682C23.1535 7.18672 23.4282 7.29616 23.6357 7.49203C23.8433 7.68798 23.9676 7.95612 23.9844 8.24106C24.0011 8.52595 23.9087 8.80637 23.7256 9.02524C23.5424 9.24413 23.2825 9.38508 22.999 9.41879L22.8682 9.42661H20.6279V11.6668C20.6275 11.9521 20.5181 12.227 20.3223 12.4344C20.1264 12.6416 19.8589 12.7663 19.5742 12.7831C19.2893 12.7998 19.008 12.7075 18.7891 12.5243C18.5703 12.3411 18.4303 12.081 18.3965 11.7977L18.3887 11.6668V9.42661H16.1484C15.8631 9.42624 15.5884 9.31685 15.3809 9.12094C15.1734 8.92501 15.049 8.6568 15.0322 8.37192C15.0156 8.0871 15.1079 7.80653 15.291 7.58774C15.4742 7.36889 15.7342 7.22789 16.0176 7.19418L16.1484 7.18637H18.3887V4.94711C18.3887 4.6501 18.5068 4.36514 18.7168 4.15512C18.9268 3.9452 19.2119 3.827 19.5088 3.827Z" fill="url(#paint0_linear_10793_51293)"/>
4
+<path d="M10.5479 15.0262C11.1418 15.0263 11.7109 15.2625 12.1309 15.6825C12.5508 16.1024 12.787 16.6716 12.7871 17.2655V21.7459C12.787 22.3398 12.5508 22.909 12.1309 23.3289C11.7109 23.7489 11.1417 23.9851 10.5479 23.9852H6.06836C5.47433 23.9852 4.90442 23.749 4.48438 23.3289C4.06446 22.909 3.82825 22.3398 3.82812 21.7459V17.2655C3.82823 16.6716 4.06447 16.1024 4.48438 15.6825C4.90442 15.2624 5.47433 15.0262 6.06836 15.0262H10.5479ZM21.749 15.0262C22.3431 15.0262 22.913 15.2624 23.333 15.6825C23.7529 16.1024 23.9892 16.6716 23.9893 17.2655V21.7459C23.9891 22.3398 23.7529 22.909 23.333 23.3289C22.913 23.749 22.3431 23.9852 21.749 23.9852H17.2695C16.6756 23.9851 16.1055 23.7489 15.6855 23.3289C15.2658 22.909 15.0304 22.3396 15.0303 21.7459V17.2655C15.0304 16.6718 15.2658 16.1024 15.6855 15.6825C16.1055 15.2625 16.6756 15.0263 17.2695 15.0262H21.749ZM10.5479 3.827C11.1417 3.82709 11.7109 4.06334 12.1309 4.48325C12.5509 4.90329 12.7871 5.4732 12.7871 6.06723V10.5467C12.787 11.1406 12.5508 11.7098 12.1309 12.1297C11.7109 12.5497 11.1418 12.7859 10.5479 12.786H6.06836C5.47433 12.786 4.90442 12.5498 4.48438 12.1297C4.06447 11.7098 3.82821 11.1406 3.82812 10.5467V6.06723C3.82813 5.4732 4.06433 4.90329 4.48438 4.48325C4.90442 4.06321 5.47433 3.827 6.06836 3.827H10.5479ZM19.5088 3.827C19.7828 3.82715 20.0471 3.92812 20.252 4.1102C20.4569 4.29247 20.588 4.54384 20.6201 4.81625L20.6279 4.94711V7.18637H22.8682C23.1535 7.18672 23.4282 7.29616 23.6357 7.49203C23.8433 7.68798 23.9676 7.95612 23.9844 8.24106C24.0011 8.52595 23.9087 8.80637 23.7256 9.02524C23.5424 9.24413 23.2825 9.38508 22.999 9.41879L22.8682 9.42661H20.6279V11.6668C20.6275 11.9521 20.5181 12.227 20.3223 12.4344C20.1264 12.6416 19.8589 12.7663 19.5742 12.7831C19.2893 12.7998 19.008 12.7075 18.7891 12.5243C18.5703 12.3411 18.4303 12.081 18.3965 11.7977L18.3887 11.6668V9.42661H16.1484C15.8631 9.42624 15.5884 9.31685 15.3809 9.12094C15.1734 8.92501 15.049 8.6568 15.0322 8.37192C15.0156 8.0871 15.1079 7.80653 15.291 7.58774C15.4742 7.36889 15.7342 7.22789 16.0176 7.19418L16.1484 7.18637H18.3887V4.94711C18.3887 4.6501 18.5068 4.36514 18.7168 4.15512C18.9268 3.9452 19.2119 3.827 19.5088 3.827Z" fill="url(#paint1_linear_10793_51293)"/>
5
+<path d="M10.5479 15.0262C11.1418 15.0263 11.7109 15.2625 12.1309 15.6825C12.5508 16.1024 12.787 16.6716 12.7871 17.2655V21.7459C12.787 22.3398 12.5508 22.909 12.1309 23.3289C11.7109 23.7489 11.1417 23.9851 10.5479 23.9852H6.06836C5.47433 23.9852 4.90442 23.749 4.48438 23.3289C4.06446 22.909 3.82825 22.3398 3.82812 21.7459V17.2655C3.82823 16.6716 4.06447 16.1024 4.48438 15.6825C4.90442 15.2624 5.47433 15.0262 6.06836 15.0262H10.5479ZM21.749 15.0262C22.3431 15.0262 22.913 15.2624 23.333 15.6825C23.7529 16.1024 23.9892 16.6716 23.9893 17.2655V21.7459C23.9891 22.3398 23.7529 22.909 23.333 23.3289C22.913 23.749 22.3431 23.9852 21.749 23.9852H17.2695C16.6756 23.9851 16.1055 23.7489 15.6855 23.3289C15.2658 22.909 15.0304 22.3396 15.0303 21.7459V17.2655C15.0304 16.6718 15.2658 16.1024 15.6855 15.6825C16.1055 15.2625 16.6756 15.0263 17.2695 15.0262H21.749ZM10.5479 3.827C11.1417 3.82709 11.7109 4.06334 12.1309 4.48325C12.5509 4.90329 12.7871 5.4732 12.7871 6.06723V10.5467C12.787 11.1406 12.5508 11.7098 12.1309 12.1297C11.7109 12.5497 11.1418 12.7859 10.5479 12.786H6.06836C5.47433 12.786 4.90442 12.5498 4.48438 12.1297C4.06447 11.7098 3.82821 11.1406 3.82812 10.5467V6.06723C3.82813 5.4732 4.06433 4.90329 4.48438 4.48325C4.90442 4.06321 5.47433 3.827 6.06836 3.827H10.5479ZM19.5088 3.827C19.7828 3.82715 20.0471 3.92812 20.252 4.1102C20.4569 4.29247 20.588 4.54384 20.6201 4.81625L20.6279 4.94711V7.18637H22.8682C23.1535 7.18672 23.4282 7.29616 23.6357 7.49203C23.8433 7.68798 23.9676 7.95612 23.9844 8.24106C24.0011 8.52595 23.9087 8.80637 23.7256 9.02524C23.5424 9.24413 23.2825 9.38508 22.999 9.41879L22.8682 9.42661H20.6279V11.6668C20.6275 11.9521 20.5181 12.227 20.3223 12.4344C20.1264 12.6416 19.8589 12.7663 19.5742 12.7831C19.2893 12.7998 19.008 12.7075 18.7891 12.5243C18.5703 12.3411 18.4303 12.081 18.3965 11.7977L18.3887 11.6668V9.42661H16.1484C15.8631 9.42624 15.5884 9.31685 15.3809 9.12094C15.1734 8.92501 15.049 8.6568 15.0322 8.37192C15.0156 8.0871 15.1079 7.80653 15.291 7.58774C15.4742 7.36889 15.7342 7.22789 16.0176 7.19418L16.1484 7.18637H18.3887V4.94711C18.3887 4.6501 18.5068 4.36514 18.7168 4.15512C18.9268 3.9452 19.2119 3.827 19.5088 3.827Z" fill="url(#paint2_linear_10793_51293)"/>
6
+<path d="M10.5479 15.0262C11.1418 15.0263 11.7109 15.2625 12.1309 15.6825C12.5508 16.1024 12.787 16.6716 12.7871 17.2655V21.7459C12.787 22.3398 12.5508 22.909 12.1309 23.3289C11.7109 23.7489 11.1417 23.9851 10.5479 23.9852H6.06836C5.47433 23.9852 4.90442 23.749 4.48438 23.3289C4.06446 22.909 3.82825 22.3398 3.82812 21.7459V17.2655C3.82823 16.6716 4.06447 16.1024 4.48438 15.6825C4.90442 15.2624 5.47433 15.0262 6.06836 15.0262H10.5479ZM21.749 15.0262C22.3431 15.0262 22.913 15.2624 23.333 15.6825C23.7529 16.1024 23.9892 16.6716 23.9893 17.2655V21.7459C23.9891 22.3398 23.7529 22.909 23.333 23.3289C22.913 23.749 22.3431 23.9852 21.749 23.9852H17.2695C16.6756 23.9851 16.1055 23.7489 15.6855 23.3289C15.2658 22.909 15.0304 22.3396 15.0303 21.7459V17.2655C15.0304 16.6718 15.2658 16.1024 15.6855 15.6825C16.1055 15.2625 16.6756 15.0263 17.2695 15.0262H21.749ZM10.5479 3.827C11.1417 3.82709 11.7109 4.06334 12.1309 4.48325C12.5509 4.90329 12.7871 5.4732 12.7871 6.06723V10.5467C12.787 11.1406 12.5508 11.7098 12.1309 12.1297C11.7109 12.5497 11.1418 12.7859 10.5479 12.786H6.06836C5.47433 12.786 4.90442 12.5498 4.48438 12.1297C4.06447 11.7098 3.82821 11.1406 3.82812 10.5467V6.06723C3.82813 5.4732 4.06433 4.90329 4.48438 4.48325C4.90442 4.06321 5.47433 3.827 6.06836 3.827H10.5479ZM19.5088 3.827C19.7828 3.82715 20.0471 3.92812 20.252 4.1102C20.4569 4.29247 20.588 4.54384 20.6201 4.81625L20.6279 4.94711V7.18637H22.8682C23.1535 7.18672 23.4282 7.29616 23.6357 7.49203C23.8433 7.68798 23.9676 7.95612 23.9844 8.24106C24.0011 8.52595 23.9087 8.80637 23.7256 9.02524C23.5424 9.24413 23.2825 9.38508 22.999 9.41879L22.8682 9.42661H20.6279V11.6668C20.6275 11.9521 20.5181 12.227 20.3223 12.4344C20.1264 12.6416 19.8589 12.7663 19.5742 12.7831C19.2893 12.7998 19.008 12.7075 18.7891 12.5243C18.5703 12.3411 18.4303 12.081 18.3965 11.7977L18.3887 11.6668V9.42661H16.1484C15.8631 9.42624 15.5884 9.31685 15.3809 9.12094C15.1734 8.92501 15.049 8.6568 15.0322 8.37192C15.0156 8.0871 15.1079 7.80653 15.291 7.58774C15.4742 7.36889 15.7342 7.22789 16.0176 7.19418L16.1484 7.18637H18.3887V4.94711C18.3887 4.6501 18.5068 4.36514 18.7168 4.15512C18.9268 3.9452 19.2119 3.827 19.5088 3.827Z" fill="#91B0FF"/>
7
+<defs>
8
+<linearGradient id="paint0_linear_10793_51293" x1="13.9087" y1="3.827" x2="13.9087" y2="23.9852" gradientUnits="userSpaceOnUse">
9
+<stop stop-color="#D7E2F7"/>
10
+<stop offset="1" stop-color="#8C9FBB"/>
11
+</linearGradient>
12
+<linearGradient id="paint1_linear_10793_51293" x1="13.9087" y1="3.827" x2="13.9087" y2="23.9852" gradientUnits="userSpaceOnUse">
13
+<stop stop-color="#D7E2F7"/>
14
+<stop offset="1" stop-color="#8C9FBB"/>
15
+</linearGradient>
16
+<linearGradient id="paint2_linear_10793_51293" x1="13.9087" y1="3.827" x2="13.9087" y2="23.9852" gradientUnits="userSpaceOnUse">
17
+<stop stop-color="#D7E2F7"/>
18
+<stop offset="1" stop-color="#8C9FBB"/>
19
+</linearGradient>
20
+</defs>
21
+</svg>
assets/images/main_actions/charts.svg
new
+10
@@ -0,0 +1,10 @@
1
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M4.00312 2.70719C3.6544 2.71264 3.32209 2.85623 3.07912 3.10643C2.83616 3.35664 2.70238 3.69303 2.70715 4.04176V22.4738C2.70715 23.9129 3.90117 25.1069 5.34023 25.1069H23.7717C23.9462 25.1094 24.1194 25.0771 24.2813 25.0121C24.4432 24.947 24.5905 24.8504 24.7148 24.7279C24.839 24.6054 24.9377 24.4595 25.005 24.2985C25.0724 24.1375 25.107 23.9648 25.107 23.7903C25.107 23.6159 25.0724 23.4431 25.005 23.2822C24.9377 23.1212 24.839 22.9752 24.7148 22.8527C24.5905 22.7302 24.4432 22.6336 24.2813 22.5686C24.1194 22.5035 23.9462 22.4713 23.7717 22.4738H5.34023V4.04176C5.34264 3.86562 5.30968 3.69078 5.24331 3.52761C5.17693 3.36443 5.07849 3.21623 4.95381 3.09179C4.82913 2.96735 4.68075 2.86919 4.51745 2.80312C4.35415 2.73706 4.17925 2.70444 4.00312 2.70719ZM23.746 6.66205C23.404 6.67224 23.0794 6.81519 22.8409 7.06062L18.5056 11.396L15.4868 8.37719C15.2399 8.13038 14.9051 7.99173 14.556 7.99173C14.2069 7.99173 13.8721 8.13038 13.6252 8.37719L7.04247 14.96C6.91612 15.0814 6.81524 15.2267 6.74575 15.3875C6.67625 15.5483 6.63954 15.7213 6.63776 15.8965C6.63598 16.0716 6.66916 16.2454 6.73537 16.4075C6.80158 16.5697 6.89948 16.717 7.02333 16.8409C7.14719 16.9648 7.29452 17.0627 7.45669 17.1289C7.61885 17.1951 7.7926 17.2283 7.96775 17.2265C8.14291 17.2247 8.31595 17.188 8.47673 17.1185C8.63752 17.049 8.78282 16.9481 8.90414 16.8218L14.556 11.1698L17.5748 14.1886C17.8217 14.4354 18.1565 14.5741 18.5056 14.5741C18.8547 14.5741 19.1895 14.4354 19.4364 14.1886L24.7026 8.92233C24.8928 8.7374 25.0228 8.49931 25.0754 8.23927C25.128 7.97922 25.1008 7.70934 24.9974 7.465C24.894 7.22067 24.7192 7.01327 24.4959 6.86999C24.2726 6.72671 24.0112 6.65423 23.746 6.66205Z" fill="url(#paint0_linear_10793_51300)"/>
3
+<path d="M4.00312 2.70719C3.6544 2.71264 3.32209 2.85623 3.07912 3.10643C2.83616 3.35664 2.70238 3.69303 2.70715 4.04176V22.4738C2.70715 23.9129 3.90117 25.1069 5.34023 25.1069H23.7717C23.9462 25.1094 24.1194 25.0771 24.2813 25.0121C24.4432 24.947 24.5905 24.8504 24.7148 24.7279C24.839 24.6054 24.9377 24.4595 25.005 24.2985C25.0724 24.1375 25.107 23.9648 25.107 23.7903C25.107 23.6159 25.0724 23.4431 25.005 23.2822C24.9377 23.1212 24.839 22.9752 24.7148 22.8527C24.5905 22.7302 24.4432 22.6336 24.2813 22.5686C24.1194 22.5035 23.9462 22.4713 23.7717 22.4738H5.34023V4.04176C5.34264 3.86562 5.30968 3.69078 5.24331 3.52761C5.17693 3.36443 5.07849 3.21623 4.95381 3.09179C4.82913 2.96735 4.68075 2.86919 4.51745 2.80312C4.35415 2.73706 4.17925 2.70444 4.00312 2.70719ZM23.746 6.66205C23.404 6.67224 23.0794 6.81519 22.8409 7.06062L18.5056 11.396L15.4868 8.37719C15.2399 8.13038 14.9051 7.99173 14.556 7.99173C14.2069 7.99173 13.8721 8.13038 13.6252 8.37719L7.04247 14.96C6.91612 15.0814 6.81524 15.2267 6.74575 15.3875C6.67625 15.5483 6.63954 15.7213 6.63776 15.8965C6.63598 16.0716 6.66916 16.2454 6.73537 16.4075C6.80158 16.5697 6.89948 16.717 7.02333 16.8409C7.14719 16.9648 7.29452 17.0627 7.45669 17.1289C7.61885 17.1951 7.7926 17.2283 7.96775 17.2265C8.14291 17.2247 8.31595 17.188 8.47673 17.1185C8.63752 17.049 8.78282 16.9481 8.90414 16.8218L14.556 11.1698L17.5748 14.1886C17.8217 14.4354 18.1565 14.5741 18.5056 14.5741C18.8547 14.5741 19.1895 14.4354 19.4364 14.1886L24.7026 8.92233C24.8928 8.7374 25.0228 8.49931 25.0754 8.23927C25.128 7.97922 25.1008 7.70934 24.9974 7.465C24.894 7.22067 24.7192 7.01327 24.4959 6.86999C24.2726 6.72671 24.0112 6.65423 23.746 6.66205Z" fill="#91B0FF"/>
4
+<defs>
5
+<linearGradient id="paint0_linear_10793_51300" x1="13.907" y1="2.70703" x2="13.907" y2="25.107" gradientUnits="userSpaceOnUse">
6
+<stop stop-color="#D7E2F7"/>
7
+<stop offset="1" stop-color="#8C9FBB"/>
8
+</linearGradient>
9
+</defs>
10
+</svg>
assets/images/main_actions/contacts.svg
new
+10
@@ -0,0 +1,10 @@
1
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M4.32649 18.1659C5.37035 17.3914 6.50754 16.7797 7.73807 16.3309C8.96839 15.8822 10.2779 15.6579 11.6667 15.6579C13.0554 15.6579 14.3649 15.8822 15.5953 16.3309C16.8258 16.7797 17.963 17.3914 19.0068 18.1659C19.7703 17.3267 20.3752 16.3553 20.8216 15.2517C21.268 14.1481 21.4912 12.9531 21.4912 11.6667C21.4912 8.94444 20.5344 6.62646 18.6206 4.71272C16.7069 2.79898 14.3889 1.84211 11.6667 1.84211C8.94444 1.84211 6.62646 2.79898 4.71272 4.71272C2.79898 6.62646 1.84211 8.94444 1.84211 11.6667C1.84211 12.9531 2.06531 14.1481 2.51171 15.2517C2.95811 16.3553 3.56304 17.3267 4.32649 18.1659ZM11.6667 12.5877C10.5456 12.5877 9.60023 12.2027 8.83044 11.4327C8.06044 10.6629 7.67544 9.71751 7.67544 8.59649C7.67544 7.47547 8.06044 6.53006 8.83044 5.76026C9.60023 4.99026 10.5456 4.60526 11.6667 4.60526C12.7877 4.60526 13.7331 4.99026 14.5029 5.76026C15.2729 6.53006 15.6579 7.47547 15.6579 8.59649C15.6579 9.71751 15.2729 10.6629 14.5029 11.4327C13.7331 12.2027 12.7877 12.5877 11.6667 12.5877ZM11.6667 23.3333C10.0466 23.3333 8.5269 23.0287 7.10746 22.4193C5.68801 21.81 4.45329 20.9802 3.40329 19.93C2.35309 18.88 1.52332 17.6453 0.913991 16.2259C0.304664 14.8064 0 13.2867 0 11.6667C0 10.0466 0.304664 8.5269 0.913991 7.10746C1.52332 5.68801 2.35309 4.45329 3.40329 3.40329C4.45329 2.35308 5.68801 1.52332 7.10746 0.913992C8.5269 0.304664 10.0466 0 11.6667 0C13.2867 0 14.8064 0.304664 16.2259 0.913992C17.6453 1.52332 18.88 2.35308 19.93 3.40329C20.9802 4.45329 21.81 5.68801 22.4193 7.10746C23.0287 8.5269 23.3333 10.0466 23.3333 11.6667C23.3333 13.2867 23.0287 14.8064 22.4193 16.2259C21.81 17.6453 20.9802 18.88 19.93 19.93C18.88 20.9802 17.6453 21.81 16.2259 22.4193C14.8064 23.0287 13.2867 23.3333 11.6667 23.3333Z" fill="url(#paint0_linear_10793_51291)" fill-opacity="0.75"/>
3
+<path d="M4.32649 18.1659C5.37035 17.3914 6.50754 16.7797 7.73807 16.3309C8.96839 15.8822 10.2779 15.6579 11.6667 15.6579C13.0554 15.6579 14.3649 15.8822 15.5953 16.3309C16.8258 16.7797 17.963 17.3914 19.0068 18.1659C19.7703 17.3267 20.3752 16.3553 20.8216 15.2517C21.268 14.1481 21.4912 12.9531 21.4912 11.6667C21.4912 8.94444 20.5344 6.62646 18.6206 4.71272C16.7069 2.79898 14.3889 1.84211 11.6667 1.84211C8.94444 1.84211 6.62646 2.79898 4.71272 4.71272C2.79898 6.62646 1.84211 8.94444 1.84211 11.6667C1.84211 12.9531 2.06531 14.1481 2.51171 15.2517C2.95811 16.3553 3.56304 17.3267 4.32649 18.1659ZM11.6667 12.5877C10.5456 12.5877 9.60023 12.2027 8.83044 11.4327C8.06044 10.6629 7.67544 9.71751 7.67544 8.59649C7.67544 7.47547 8.06044 6.53006 8.83044 5.76026C9.60023 4.99026 10.5456 4.60526 11.6667 4.60526C12.7877 4.60526 13.7331 4.99026 14.5029 5.76026C15.2729 6.53006 15.6579 7.47547 15.6579 8.59649C15.6579 9.71751 15.2729 10.6629 14.5029 11.4327C13.7331 12.2027 12.7877 12.5877 11.6667 12.5877ZM11.6667 23.3333C10.0466 23.3333 8.5269 23.0287 7.10746 22.4193C5.68801 21.81 4.45329 20.9802 3.40329 19.93C2.35309 18.88 1.52332 17.6453 0.913991 16.2259C0.304664 14.8064 0 13.2867 0 11.6667C0 10.0466 0.304664 8.5269 0.913991 7.10746C1.52332 5.68801 2.35309 4.45329 3.40329 3.40329C4.45329 2.35308 5.68801 1.52332 7.10746 0.913992C8.5269 0.304664 10.0466 0 11.6667 0C13.2867 0 14.8064 0.304664 16.2259 0.913992C17.6453 1.52332 18.88 2.35308 19.93 3.40329C20.9802 4.45329 21.81 5.68801 22.4193 7.10746C23.0287 8.5269 23.3333 10.0466 23.3333 11.6667C23.3333 13.2867 23.0287 14.8064 22.4193 16.2259C21.81 17.6453 20.9802 18.88 19.93 19.93C18.88 20.9802 17.6453 21.81 16.2259 22.4193C14.8064 23.0287 13.2867 23.3333 11.6667 23.3333Z" fill="#91B0FF"/>
4
+<defs>
5
+<linearGradient id="paint0_linear_10793_51291" x1="11.6667" y1="0" x2="11.6667" y2="23.3333" gradientUnits="userSpaceOnUse">
6
+<stop stop-color="#D7E2F7"/>
7
+<stop offset="1" stop-color="#8C9FBB"/>
8
+</linearGradient>
9
+</defs>
10
+</svg>
assets/images/main_actions/history.svg
new
+3
@@ -0,0 +1,3 @@
1
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M7.91076 14.96C6.12754 14.96 4.5734 14.373 3.24834 13.1989C1.92328 12.0248 1.16049 10.553 0.959961 8.78354H2.22058C2.42852 10.2058 3.06861 11.3849 4.14084 12.3208C5.21294 13.2567 6.46958 13.7247 7.91076 13.7247C9.51664 13.7247 10.8789 13.1654 11.9975 12.0468C13.1161 10.9281 13.6755 9.56589 13.6755 7.96001C13.6755 6.35412 13.1161 4.99187 11.9975 3.87324C10.8789 2.75461 9.51664 2.1953 7.91076 2.1953C7.01119 2.1953 6.16817 2.39514 5.3817 2.79483C4.59509 3.19438 3.91774 3.74415 3.34964 4.44415H5.50358V5.67945H1.32252V1.49839H2.55781V3.44954C3.22611 2.66087 4.02644 2.04878 4.95881 1.61327C5.89105 1.17776 6.87503 0.960007 7.91076 0.960007C8.88211 0.960007 9.79224 1.14372 10.6412 1.51115C11.49 1.87859 12.23 2.37799 12.8614 3.00936C13.4928 3.64073 13.9922 4.38088 14.3596 5.2298C14.727 6.07859 14.9108 6.98865 14.9108 7.96001C14.9108 8.93136 14.727 9.84143 14.3596 10.6902C13.9922 11.5391 13.4928 12.2793 12.8614 12.9107C12.23 13.542 11.49 14.0414 10.6412 14.4089C9.79224 14.7763 8.88211 14.96 7.91076 14.96ZM10.383 11.2764L7.31699 8.21015V3.84236H8.55208V7.70986L11.2508 10.4084L10.383 11.2764Z" fill="#91B0FF"/>
3
+</svg>
assets/images/main_actions/home.svg
new
+16
@@ -0,0 +1,16 @@
1
+<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M12.9909 0.355182L23.9088 11.2732C24.6731 12.0374 24.1321 13.3439 23.0512 13.3439H21.8381V20.6226C21.8381 21.5878 21.4546 22.5135 20.7721 23.196C20.0896 23.8785 19.164 24.2619 18.1987 24.2619H16.9856V15.7701C16.9857 14.8419 16.631 13.9486 15.9942 13.2733C15.3574 12.5979 14.4865 12.1913 13.5598 12.1369L13.3463 12.1308H10.9201C9.95489 12.1308 9.02921 12.5143 8.34671 13.1968C7.6642 13.8793 7.28077 14.8049 7.28077 15.7701V24.2619H6.06766C5.10245 24.2619 4.17678 23.8785 3.49427 23.196C2.81177 22.5135 2.42834 21.5878 2.42834 20.6226V13.3439H1.21523C0.135562 13.3439 -0.406697 12.0374 0.357561 11.2732L11.2755 0.355182C11.503 0.127759 11.8115 0 12.1332 0C12.4549 0 12.7634 0.127759 12.9909 0.355182ZM13.3463 14.557C13.6681 14.557 13.9766 14.6848 14.2041 14.9124C14.4316 15.1399 14.5594 15.4484 14.5594 15.7701V24.2619H9.70699V15.7701C9.70703 15.473 9.81612 15.1862 10.0136 14.9642C10.211 14.7422 10.4831 14.6003 10.7782 14.5655L10.9201 14.557H13.3463Z" fill="#D7E2F7"/>
3
+<path d="M12.9909 0.355182L23.9088 11.2732C24.6731 12.0374 24.1321 13.3439 23.0512 13.3439H21.8381V20.6226C21.8381 21.5878 21.4546 22.5135 20.7721 23.196C20.0896 23.8785 19.164 24.2619 18.1987 24.2619H16.9856V15.7701C16.9857 14.8419 16.631 13.9486 15.9942 13.2733C15.3574 12.5979 14.4865 12.1913 13.5598 12.1369L13.3463 12.1308H10.9201C9.95489 12.1308 9.02921 12.5143 8.34671 13.1968C7.6642 13.8793 7.28077 14.8049 7.28077 15.7701V24.2619H6.06766C5.10245 24.2619 4.17678 23.8785 3.49427 23.196C2.81177 22.5135 2.42834 21.5878 2.42834 20.6226V13.3439H1.21523C0.135562 13.3439 -0.406697 12.0374 0.357561 11.2732L11.2755 0.355182C11.503 0.127759 11.8115 0 12.1332 0C12.4549 0 12.7634 0.127759 12.9909 0.355182ZM13.3463 14.557C13.6681 14.557 13.9766 14.6848 14.2041 14.9124C14.4316 15.1399 14.5594 15.4484 14.5594 15.7701V24.2619H9.70699V15.7701C9.70703 15.473 9.81612 15.1862 10.0136 14.9642C10.211 14.7422 10.4831 14.6003 10.7782 14.5655L10.9201 14.557H13.3463Z" fill="url(#paint0_linear_10793_51310)" fill-opacity="0.75"/>
4
+<path d="M12.9909 0.355182L23.9088 11.2732C24.6731 12.0374 24.1321 13.3439 23.0512 13.3439H21.8381V20.6226C21.8381 21.5878 21.4546 22.5135 20.7721 23.196C20.0896 23.8785 19.164 24.2619 18.1987 24.2619H16.9856V15.7701C16.9857 14.8419 16.631 13.9486 15.9942 13.2733C15.3574 12.5979 14.4865 12.1913 13.5598 12.1369L13.3463 12.1308H10.9201C9.95489 12.1308 9.02921 12.5143 8.34671 13.1968C7.6642 13.8793 7.28077 14.8049 7.28077 15.7701V24.2619H6.06766C5.10245 24.2619 4.17678 23.8785 3.49427 23.196C2.81177 22.5135 2.42834 21.5878 2.42834 20.6226V13.3439H1.21523C0.135562 13.3439 -0.406697 12.0374 0.357561 11.2732L11.2755 0.355182C11.503 0.127759 11.8115 0 12.1332 0C12.4549 0 12.7634 0.127759 12.9909 0.355182ZM13.3463 14.557C13.6681 14.557 13.9766 14.6848 14.2041 14.9124C14.4316 15.1399 14.5594 15.4484 14.5594 15.7701V24.2619H9.70699V15.7701C9.70703 15.473 9.81612 15.1862 10.0136 14.9642C10.211 14.7422 10.4831 14.6003 10.7782 14.5655L10.9201 14.557H13.3463Z" fill="url(#paint1_linear_10793_51310)"/>
5
+<path d="M12.9909 0.355182L23.9088 11.2732C24.6731 12.0374 24.1321 13.3439 23.0512 13.3439H21.8381V20.6226C21.8381 21.5878 21.4546 22.5135 20.7721 23.196C20.0896 23.8785 19.164 24.2619 18.1987 24.2619H16.9856V15.7701C16.9857 14.8419 16.631 13.9486 15.9942 13.2733C15.3574 12.5979 14.4865 12.1913 13.5598 12.1369L13.3463 12.1308H10.9201C9.95489 12.1308 9.02921 12.5143 8.34671 13.1968C7.6642 13.8793 7.28077 14.8049 7.28077 15.7701V24.2619H6.06766C5.10245 24.2619 4.17678 23.8785 3.49427 23.196C2.81177 22.5135 2.42834 21.5878 2.42834 20.6226V13.3439H1.21523C0.135562 13.3439 -0.406697 12.0374 0.357561 11.2732L11.2755 0.355182C11.503 0.127759 11.8115 0 12.1332 0C12.4549 0 12.7634 0.127759 12.9909 0.355182ZM13.3463 14.557C13.6681 14.557 13.9766 14.6848 14.2041 14.9124C14.4316 15.1399 14.5594 15.4484 14.5594 15.7701V24.2619H9.70699V15.7701C9.70703 15.473 9.81612 15.1862 10.0136 14.9642C10.211 14.7422 10.4831 14.6003 10.7782 14.5655L10.9201 14.557H13.3463Z" fill="#91B0FF"/>
6
+<defs>
7
+<linearGradient id="paint0_linear_10793_51310" x1="12.1333" y1="0" x2="12.1333" y2="24.2619" gradientUnits="userSpaceOnUse">
8
+<stop stop-color="#D7E2F7"/>
9
+<stop offset="1" stop-color="#8C9FBB"/>
10
+</linearGradient>
11
+<linearGradient id="paint1_linear_10793_51310" x1="12.1333" y1="0" x2="12.1333" y2="24.2619" gradientUnits="userSpaceOnUse">
12
+<stop stop-color="#D7E2F7"/>
13
+<stop offset="1" stop-color="#8C9FBB"/>
14
+</linearGradient>
15
+</defs>
16
+</svg>
assets/images/main_actions/wallets.svg
new
+11
@@ -0,0 +1,11 @@
1
+<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+<path d="M23.3842 4.095C25.0941 4.095 26.5345 5.53541 26.5345 7.24539V9.31473H26.5355V19.0345H26.5345V21.1048L26.5306 21.2649C26.4443 22.9038 25.0406 24.2552 23.3842 24.2552H4.48474L4.32458 24.2513C2.68574 24.1649 1.33435 22.7611 1.33435 21.1048V7.24539C1.33437 5.58904 2.68575 4.18529 4.32458 4.09891L4.48474 4.095H23.3842ZM4.48474 6.11063C3.88829 6.11082 3.35 6.64892 3.34998 7.24539V21.1048C3.34998 21.7013 3.88828 22.2384 4.48474 22.2386H23.3842C23.9807 22.2386 24.5179 21.7014 24.5179 21.1048V19.0345H18.7963L18.5443 19.0286C16.0462 18.9035 14.0668 16.9242 13.9418 14.4261L13.9359 14.1751C13.9359 11.5595 15.963 9.44988 18.5443 9.32059L18.7963 9.31473H24.5179V7.24539C24.5179 6.64881 23.9807 6.11063 23.3842 6.11063H4.48474ZM18.7963 11.3304C17.2097 11.3304 15.9515 12.5885 15.9515 14.1751C15.9518 15.7614 17.2098 17.0188 18.7963 17.0188H24.5179V11.3304H18.7963ZM18.7963 12.553C19.6907 12.5532 20.4153 13.2787 20.4154 14.1731C20.4154 15.0677 19.6908 15.793 18.7963 15.7932C17.9016 15.7932 17.1761 15.0678 17.1761 14.1731C17.1763 13.2785 17.9016 12.553 18.7963 12.553Z" fill="#91B0FF"/>
3
+<path d="M23.3842 4.095C25.0941 4.095 26.5345 5.53541 26.5345 7.24539V9.31473H26.5355V19.0345H26.5345V21.1048L26.5306 21.2649C26.4443 22.9038 25.0406 24.2552 23.3842 24.2552H4.48474L4.32458 24.2513C2.68574 24.1649 1.33435 22.7611 1.33435 21.1048V7.24539C1.33437 5.58904 2.68575 4.18529 4.32458 4.09891L4.48474 4.095H23.3842ZM4.48474 6.11063C3.88829 6.11082 3.35 6.64892 3.34998 7.24539V21.1048C3.34998 21.7013 3.88828 22.2384 4.48474 22.2386H23.3842C23.9807 22.2386 24.5179 21.7014 24.5179 21.1048V19.0345H18.7963L18.5443 19.0286C16.0462 18.9035 14.0668 16.9242 13.9418 14.4261L13.9359 14.1751C13.9359 11.5595 15.963 9.44988 18.5443 9.32059L18.7963 9.31473H24.5179V7.24539C24.5179 6.64881 23.9807 6.11063 23.3842 6.11063H4.48474ZM18.7963 11.3304C17.2097 11.3304 15.9515 12.5885 15.9515 14.1751C15.9518 15.7614 17.2098 17.0188 18.7963 17.0188H24.5179V11.3304H18.7963ZM18.7963 12.553C19.6907 12.5532 20.4153 13.2787 20.4154 14.1731C20.4154 15.0677 19.6908 15.793 18.7963 15.7932C17.9016 15.7932 17.1761 15.0678 17.1761 14.1731C17.1763 13.2785 17.9016 12.553 18.7963 12.553Z" fill="url(#paint0_linear_10793_51278)"/>
4
+<path d="M23.3842 4.095C25.0941 4.095 26.5345 5.53541 26.5345 7.24539V9.31473H26.5355V19.0345H26.5345V21.1048L26.5306 21.2649C26.4443 22.9038 25.0406 24.2552 23.3842 24.2552H4.48474L4.32458 24.2513C2.68574 24.1649 1.33435 22.7611 1.33435 21.1048V7.24539C1.33437 5.58904 2.68575 4.18529 4.32458 4.09891L4.48474 4.095H23.3842ZM4.48474 6.11063C3.88829 6.11082 3.35 6.64892 3.34998 7.24539V21.1048C3.34998 21.7013 3.88828 22.2384 4.48474 22.2386H23.3842C23.9807 22.2386 24.5179 21.7014 24.5179 21.1048V19.0345H18.7963L18.5443 19.0286C16.0462 18.9035 14.0668 16.9242 13.9418 14.4261L13.9359 14.1751C13.9359 11.5595 15.963 9.44988 18.5443 9.32059L18.7963 9.31473H24.5179V7.24539C24.5179 6.64881 23.9807 6.11063 23.3842 6.11063H4.48474ZM18.7963 11.3304C17.2097 11.3304 15.9515 12.5885 15.9515 14.1751C15.9518 15.7614 17.2098 17.0188 18.7963 17.0188H24.5179V11.3304H18.7963ZM18.7963 12.553C19.6907 12.5532 20.4153 13.2787 20.4154 14.1731C20.4154 15.0677 19.6908 15.793 18.7963 15.7932C17.9016 15.7932 17.1761 15.0678 17.1761 14.1731C17.1763 13.2785 17.9016 12.553 18.7963 12.553Z" fill="#91B0FF"/>
5
+<defs>
6
+<linearGradient id="paint0_linear_10793_51278" x1="13.9349" y1="4.095" x2="13.9349" y2="24.2552" gradientUnits="userSpaceOnUse">
7
+<stop stop-color="#D7E2F7"/>
8
+<stop offset="1" stop-color="#8C9FBB"/>
9
+</linearGradient>
10
+</defs>
11
+</svg>
lib/entities/page_indicator_actions.dart
new
+43
@@ -0,0 +1,43 @@
1
+import 'package:cake_wallet/generated/i18n.dart';
2
+import 'package:cake_wallet/routes.dart';
3
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
4
+import 'package:flutter/material.dart';
5
+
6
+class PageIndicatorActions {
7
+ final String Function(BuildContext context) name;
8
+ final String image;
9
+ final Key key;
10
+ final bool Function(DashboardViewModel viewModel)? isEnabled;
11
+
12
+ PageIndicatorActions._({
13
+ required this.name,
14
+ required this.image,
15
+ required this.key,
16
+ this.isEnabled,
17
+ });
18
+
19
+ static List<PageIndicatorActions> all = [
20
+ appsAction,
21
+ homeAction,
22
+ historyAction,
23
+ ];
24
+
25
+ static PageIndicatorActions appsAction = PageIndicatorActions._(
26
+ name: (context) => S.of(context).apps,
27
+ image: 'assets/images/main_actions/apps.svg',
28
+ key: ValueKey('dashboard_page_indicator_apps_action_button_key'),
29
+ isEnabled: (viewModel) => viewModel.shouldShowMarketPlaceInDashboard,
30
+ );
31
+
32
+ static PageIndicatorActions homeAction = PageIndicatorActions._(
33
+ name: (context) => S.of(context).home,
34
+ image: 'assets/images/main_actions/home.svg',
35
+ key: ValueKey('dashboard_page_indicator_home_action_button_key'),
36
+ );
37
+
38
+ static PageIndicatorActions historyAction = PageIndicatorActions._(
39
+ name: (context) => S.of(context).history,
40
+ image: 'assets/images/main_actions/history.svg',
41
+ key: ValueKey('dashboard_page_indicator_history_action_button_key'),
42
+ );
43
+}
lib/src/screens/dashboard/dashboard_page.dart
+16
-26
@@ -3,6 +3,7 @@ import 'package:cake_wallet/entities/preferences_key.dart';
3
import 'package:cake_wallet/di.dart';
4
import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
5
import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart';
6
+import 'package:cake_wallet/src/screens/dashboard/widgets/page_indicator.dart';
7
import 'package:cake_wallet/src/screens/wallet_connect/widgets/bottom_sheet/bottom_sheet_listener_widget.dart';
8
import 'package:cake_wallet/src/screens/wallet_connect/services/bottom_sheet_service.dart';
9
import 'package:cake_wallet/src/widgets/gradient_background.dart';
@@ -220,45 +221,34 @@ class _DashboardPageView extends BasePage {
221
child: Stack(
222
alignment: Alignment.bottomCenter,
223
children: <Widget>[
223
- //new Expanded(
224
Observer(
225
builder: (context) {
226
return PageView.builder(
227
- key: ValueKey('dashboard_page_view_key'),
227
+ key: const ValueKey('dashboard_page_view_key'),
228
controller: controller,
229
+ physics: const BouncingScrollPhysics(),
230
itemCount: pages.length,
231
itemBuilder: (context, index) => pages[index],
232
);
233
},
234
),
234
- //),
235
Positioned(
236
child: Container(
237
alignment: Alignment.bottomCenter,
238
margin: EdgeInsets.only(bottom: 110),
239
- child: Observer(
240
- builder: (context) {
241
- return Semantics(
242
- button: false,
243
- label: 'Page Indicator',
244
- hint: 'Swipe to change page',
245
- excludeSemantics: true,
246
- child: SmoothPageIndicator(
247
- controller: controller,
248
- count: pages.length,
249
- effect: ColorTransitionEffect(
250
- spacing: 6.0,
251
- radius: 6.0,
252
- dotWidth: 6.0,
253
- dotHeight: 6.0,
254
- dotColor: Theme.of(context).colorScheme.primary.withOpacity(0.4),
255
- activeDotColor: Theme.of(context).colorScheme.primary,
256
- ),
257
- ),
258
- );
259
- },
239
+ child: Semantics(
240
+ container: true,
241
+ label: 'Page indicator',
242
+ hint: 'Swipe left or right to change page, or double tap buttons below to navigate directly.',
243
+ child: ExcludeSemantics(
244
+ excluding: false,
245
+ child: PageIndicator(
246
+ controller: controller,
247
+ dashboardViewModel: dashboardViewModel,
248
+ ),
249
),
250
),
251
+ ),
252
),
253
NavigationDock(
254
dashboardViewModel: dashboardViewModel,
@@ -277,7 +267,7 @@ class _DashboardPageView extends BasePage {
267
if (dashboardViewModel.shouldShowMarketPlaceInDashboard) {
268
pages.add(
269
Semantics(
280
- label: 'Cake ${S.of(context).features}',
270
+ label: S.of(context).apps,
271
child: CakeFeaturesPage(
272
dashboardViewModel: dashboardViewModel,
273
cakeFeaturesViewModel: getIt.get<CakeFeaturesViewModel>(),
@@ -288,7 +278,7 @@ class _DashboardPageView extends BasePage {
278
pages.add(Semantics(label: S.of(context).balance_page, child: balancePage));
279
pages.add(
280
Semantics(
291
- label: S.of(context).settings_transactions,
281
+ label: S.of(context).history,
282
child: TransactionsPage(dashboardViewModel: dashboardViewModel),
283
),
284
);
lib/src/screens/dashboard/pages/cake_features_page.dart
+1
-1
@@ -28,7 +28,7 @@ class CakeFeaturesPage extends StatelessWidget {
28
Padding(
29
padding: EdgeInsets.only(left: 24, top: 16),
30
child: Text(
31
- 'Cake ${S.of(context).features}',
31
+ S.of(context).apps,
32
style: Theme.of(context).textTheme.headlineSmall?.copyWith(
33
fontWeight: FontWeight.w500,
34
color: Theme.of(context).colorScheme.onSurface,
lib/src/screens/dashboard/pages/navigation_dock.dart
+43
-31
@@ -19,7 +19,7 @@ class NavigationDock extends StatelessWidget {
19
child: Observer(
20
builder: (_) {
21
return Container(
22
- height: 150,
22
+ height: 84,
23
alignment: Alignment.bottomCenter,
24
decoration: dashboardViewModel.settingsStore.backgroundImage.isEmpty
25
? BoxDecoration(
@@ -30,7 +30,6 @@ class NavigationDock extends StatelessWidget {
30
),
31
)
32
: null,
33
- //color: Colors.transparent,
33
child: Container(
34
decoration: BoxDecoration(
35
borderRadius: BorderRadius.circular(50),
@@ -50,38 +49,51 @@ class NavigationDock extends StatelessWidget {
49
borderRadius: BorderRadius.circular(50.0),
50
color: Theme.of(context).colorScheme.surfaceContainer,
51
),
53
- child: Container(
54
- padding: EdgeInsets.symmetric(horizontal: 8),
55
- child: IntrinsicHeight(
56
- child: Row(
57
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
58
- children: MainActions.all
59
- .where((element) => element.canShow?.call(dashboardViewModel) ?? true)
60
- .map(
61
- (action) => Expanded(
62
- child: Semantics(
63
- button: true,
64
- enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
65
- child: ActionButton(
66
- key: action.key,
67
- image: Image.asset(action.image,
68
- height: 24,
69
- width: 24,
70
- color: Theme.of(context).colorScheme.primary),
71
- title: action.name(context),
72
- onClick: (action.isEnabled?.call(dashboardViewModel) ?? true)
73
- ? () async =>
74
- await action.onTap(context, dashboardViewModel)
75
- : null,
76
- textColor: action.isEnabled?.call(dashboardViewModel) ?? true
77
- ? null
78
- : Theme.of(context).colorScheme.onSurface,
52
+ padding: const EdgeInsets.symmetric(horizontal: 8),
53
+ child: ClipRect(
54
+ child: Row(
55
+ mainAxisSize: MainAxisSize.min,
56
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
57
+ crossAxisAlignment: CrossAxisAlignment.center,
58
+ children: MainActions.all
59
+ .where((element) =>
60
+ element.canShow?.call(dashboardViewModel) ??
61
+ true)
62
+ .map(
63
+ (action) => Expanded(
64
+ child: Semantics(
65
+ button: true,
66
+ enabled: (action.isEnabled
67
+ ?.call(dashboardViewModel) ??
68
+ true),
69
+ child: ActionButton(
70
+ key: action.key,
71
+ image: Image.asset(
72
+ action.image,
73
+ height: 24,
74
+ width: 24,
75
+ color:
76
+ Theme.of(context).colorScheme.primary,
77
),
78
+ title: action.name(context),
79
+ onClick: (action.isEnabled
80
+ ?.call(dashboardViewModel) ??
81
+ true)
82
+ ? () async => await action.onTap(
83
+ context, dashboardViewModel)
84
+ : null,
85
+ textColor: action.isEnabled
86
+ ?.call(dashboardViewModel) ??
87
+ true
88
+ ? null
89
+ : Theme.of(context)
90
+ .colorScheme
91
+ .onSurface,
92
),
93
),
82
- )
83
- .toList(),
84
- ),
94
+ ),
95
+ )
96
+ .toList(),
97
),
98
),
99
),
lib/src/screens/dashboard/widgets/action_button.dart
+31
-25
@@ -21,6 +21,11 @@ class ActionButton extends StatelessWidget {
21
@override
22
Widget build(BuildContext context) {
23
return TextButton(
24
+ style: TextButton.styleFrom(
25
+ padding: EdgeInsets.zero,
26
+ minimumSize: Size.zero,
27
+ tapTargetSize: MaterialTapTargetSize.shrinkWrap,
28
+ ),
29
onPressed: () {
30
if (route?.isNotEmpty ?? false) {
31
Navigator.of(context, rootNavigator: true).pushNamed(route!);
@@ -28,31 +33,32 @@ class ActionButton extends StatelessWidget {
33
onClick?.call();
34
}
35
},
31
- child: Container(
32
- color: Colors.transparent,
33
- padding: EdgeInsets.only(top: 5, bottom: 4, left: 0, right: 0),
34
- alignment: alignment,
35
- child: Column(
36
- mainAxisSize: MainAxisSize.max,
37
- crossAxisAlignment: CrossAxisAlignment.center,
38
- //mainAxisAlignment: MainAxisAlignment.center,
39
- children: <Widget>[
40
- Container(
41
- alignment: Alignment.center,
42
- decoration: BoxDecoration(
43
- shape: BoxShape.circle),
44
- child: image,
45
- ),
46
- SizedBox(height: 4),
47
- Text(
48
- title,
49
- maxLines: 1,
50
- overflow: TextOverflow.visible,
51
- style: Theme.of(context).textTheme.labelSmall?.copyWith(
52
- color: textColor ?? Theme.of(context).colorScheme.onSurface),
53
- textAlign: TextAlign.center,
54
- )
55
- ],
36
+ child: SizedBox.expand(
37
+ child: Container(
38
+ color: Colors.transparent,
39
+ alignment: alignment,
40
+ child: Column(
41
+ mainAxisAlignment: MainAxisAlignment.center,
42
+ mainAxisSize: MainAxisSize.min,
43
+ crossAxisAlignment: CrossAxisAlignment.center,
44
+ children: <Widget>[
45
+ image,
46
+ const SizedBox(height: 4),
47
+ Flexible(
48
+ child: Text(
49
+ title,
50
+ maxLines: 1,
51
+ overflow: TextOverflow.fade,
52
+ softWrap: false,
53
+ textAlign: TextAlign.center,
54
+ style: Theme.of(context).textTheme.labelSmall?.copyWith(
55
+ color: textColor ??
56
+ Theme.of(context).colorScheme.onSurface,
57
+ ),
58
+ ),
59
+ ),
60
+ ],
61
+ ),
62
),
63
),
64
);
lib/src/screens/dashboard/widgets/header_row.dart
+1
-1
@@ -23,7 +23,7 @@ class HeaderRow extends StatelessWidget {
23
crossAxisAlignment: CrossAxisAlignment.center,
24
children: <Widget>[
25
Text(
26
- S.of(context).transactions,
26
+ S.of(context).history,
27
style: Theme.of(context).textTheme.titleLarge?.copyWith(
28
fontWeight: FontWeight.w500,
29
color: Theme.of(context).colorScheme.onSurface),
lib/src/screens/dashboard/widgets/page_indicator.dart
new
+326
@@ -0,0 +1,326 @@
1
+import 'dart:math' as math;
2
+import 'dart:ui';
3
+import 'package:cake_wallet/entities/page_indicator_actions.dart';
4
+import 'package:flutter/material.dart';
5
+import 'package:flutter_svg/flutter_svg.dart';
6
+import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
7
+
8
+class PageIndicator extends StatefulWidget {
9
+ const PageIndicator({
10
+ super.key,
11
+ required this.controller,
12
+ required this.dashboardViewModel,
13
+ });
14
+
15
+ final PageController controller;
16
+ final DashboardViewModel dashboardViewModel;
17
+
18
+ @override
19
+ State<PageIndicator> createState() => _PageIndicatorState();
20
+}
21
+
22
+class _PageIndicatorState extends State<PageIndicator> {
23
+ static const barHeight = 37.0;
24
+ static const iconWidth = 16.0;
25
+ static const iconHeight = 16.0;
26
+ static const iconSpacing = 5.0;
27
+ static const barHorizontalPadding = 4.0;
28
+ static const pillHorizontalPadding = 8.0;
29
+ static const edgePadding = 5.0;
30
+ static const barBorderRadius = 50.0;
31
+ static const pillBorderRadius = 50.0;
32
+ static const pageSwitchDuration = Duration(milliseconds: 300);
33
+ static const pillMoveDuration = Duration(milliseconds: 300);
34
+ static const pillResizeDuration = Duration(milliseconds: 200);
35
+ static const textStyle = TextStyle(
36
+ fontSize: 12,
37
+ fontWeight: FontWeight.w400,
38
+ );
39
+
40
+ late int selectedIndex;
41
+ late final VoidCallback _pageListener;
42
+
43
+ @override
44
+ void initState() {
45
+ super.initState();
46
+
47
+ selectedIndex = widget.controller.initialPage;
48
+
49
+ _pageListener = () {
50
+ final page = widget.controller.page;
51
+ if (page == null) return;
52
+
53
+ final rounded = page.round();
54
+ if (rounded != selectedIndex && mounted) {
55
+ setState(() {
56
+ selectedIndex = rounded;
57
+ });
58
+ }
59
+ };
60
+
61
+ widget.controller.addListener(_pageListener);
62
+ }
63
+
64
+ @override
65
+ void dispose() {
66
+ widget.controller.removeListener(_pageListener);
67
+ super.dispose();
68
+ }
69
+
70
+ void _onItemTap(int index) {
71
+ if (index == selectedIndex) return;
72
+ widget.controller.animateToPage(
73
+ index,
74
+ duration: pageSwitchDuration,
75
+ curve: Curves.easeOutCubic,
76
+ );
77
+ }
78
+
79
+ double _estimateItemWidthForAction(
80
+ BuildContext context, PageIndicatorActions action,
81
+ {Color? color}) {
82
+ final text = action.name(context);
83
+ final textPainter = TextPainter(
84
+ text: TextSpan(text: text, style: textStyle.copyWith(color: color)),
85
+ maxLines: 1,
86
+ textDirection: Directionality.of(context),
87
+ textScaler: MediaQuery.of(context).textScaler,
88
+ )..layout();
89
+ return iconWidth +
90
+ iconSpacing +
91
+ textPainter.width +
92
+ pillHorizontalPadding * 2;
93
+ }
94
+
95
+ @override
96
+ Widget build(BuildContext context) {
97
+
98
+ final visibleActions = PageIndicatorActions.all.where((action) {
99
+ return action.isEnabled?.call(widget.dashboardViewModel) ?? true;
100
+ }).toList();
101
+
102
+ // Don't show indicator if less than 2 actions
103
+ if (visibleActions.length < 2) return const SizedBox.shrink();
104
+
105
+ selectedIndex = selectedIndex.clamp(0, visibleActions.length - 1);
106
+
107
+ // Theme setup
108
+ final theme = Theme.of(context);
109
+ final backgroundColor = theme.colorScheme.surfaceContainer.withAlpha(122);
110
+ final pillColor = theme.colorScheme.onSurface.withAlpha(30);
111
+ final activeColor = theme.colorScheme.onSurface;
112
+ final inactiveColor = theme.colorScheme.primary;
113
+
114
+ // Size calculations
115
+ final screenWidth = MediaQuery.of(context).size.width;
116
+ final isRTL = Directionality.of(context) == TextDirection.rtl;
117
+
118
+ final pillWidth = _estimateItemWidthForAction(
119
+ context,
120
+ visibleActions[selectedIndex],
121
+ color: activeColor,
122
+ );
123
+
124
+ final actionWidths = [
125
+ for (final action in visibleActions)
126
+ _estimateItemWidthForAction(context, action, color: inactiveColor)
127
+ ];
128
+
129
+ final totalItemsWidth =
130
+ actionWidths.fold(0.0, (sum, width) => sum + width) +
131
+ barHorizontalPadding * 2;
132
+
133
+ final barWidth = math.min(totalItemsWidth, screenWidth * 0.95);
134
+
135
+ final count = visibleActions.length;
136
+ final firstLeft = edgePadding;
137
+ final secondLeft =
138
+ barWidth - (isRTL ? actionWidths.first : actionWidths[1]) - edgePadding;
139
+
140
+ final List<double> positions;
141
+
142
+ if (count == 2) {
143
+ positions = [firstLeft, secondLeft];
144
+ } else {
145
+ final lastLeft = barWidth -
146
+ (isRTL ? actionWidths.first : actionWidths.last) -
147
+ edgePadding;
148
+
149
+ final centerLeft = (isRTL
150
+ ? actionWidths.last + edgePadding
151
+ : actionWidths.first + edgePadding);
152
+
153
+ positions = [firstLeft, centerLeft, lastLeft];
154
+ }
155
+
156
+ final left =
157
+ (isRTL ? positions.reversed.toList() : positions)[selectedIndex];
158
+ final currentAction = visibleActions[selectedIndex];
159
+
160
+ return Align(
161
+ alignment: Alignment.bottomCenter,
162
+ child: Padding(
163
+ padding: EdgeInsets.only(top: 10),
164
+ child: Container(
165
+ width: barWidth,
166
+ child: ClipRRect(
167
+ borderRadius: BorderRadius.circular(barBorderRadius),
168
+ child: BackdropFilter(
169
+ filter: ImageFilter.blur(sigmaX: 30, sigmaY: 30),
170
+ child: Container(
171
+ height: barHeight,
172
+ decoration: BoxDecoration(
173
+ color: backgroundColor,
174
+ borderRadius: BorderRadius.circular(barBorderRadius),
175
+ ),
176
+ child: Stack(
177
+ alignment: Alignment.center,
178
+ children: [
179
+ AnimatedPill(
180
+ left: left,
181
+ pillColor: pillColor,
182
+ currentAction: currentAction,
183
+ pillIconHeight: iconHeight,
184
+ pillIconWidth: iconWidth,
185
+ pillIconSpacing: iconSpacing,
186
+ pillBorderRadius: pillBorderRadius,
187
+ contentColor: activeColor,
188
+ estimateWidthForAction: pillWidth,
189
+ pillTextStyle: textStyle,
190
+ pillMoveDuration: pillMoveDuration,
191
+ pillResizeDuration: pillResizeDuration,
192
+ ),
193
+ Padding(
194
+ padding: const EdgeInsets.symmetric(
195
+ horizontal: barHorizontalPadding),
196
+ child: Row(
197
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
198
+ children: [
199
+ for (int i = 0; i < visibleActions.length; i++)
200
+ Semantics(
201
+ button: true,
202
+ label: visibleActions[i].name(context),
203
+ value: i == selectedIndex ? 'Selected' : null,
204
+ hint: 'Double tap to open ${visibleActions[i].name(context)} page',
205
+ onTap: () => _onItemTap(i),
206
+ child: GestureDetector(
207
+ behavior: HitTestBehavior.translucent,
208
+ onTap: () => _onItemTap(i),
209
+ child: Container(
210
+ height: barHeight,
211
+ width: i == selectedIndex
212
+ ? pillWidth
213
+ : _estimateItemWidthForAction(
214
+ context, visibleActions[i]),
215
+ alignment: Alignment.center,
216
+ child: Row(
217
+ mainAxisSize: MainAxisSize.min,
218
+ children: [
219
+ TweenAnimationBuilder<Color?>(
220
+ duration: const Duration(
221
+ milliseconds: 300),
222
+ curve: Curves.easeOutCubic,
223
+ tween: ColorTween(
224
+ begin: inactiveColor,
225
+ end: i == selectedIndex
226
+ ? activeColor
227
+ : inactiveColor,
228
+ ),
229
+ builder: (context, color, _) =>
230
+ SvgPicture.asset(
231
+ visibleActions[i].image,
232
+ width: iconWidth,
233
+ height: iconHeight,
234
+ colorFilter: ColorFilter.mode(
235
+ color!, BlendMode.srcIn),
236
+ ),
237
+ ),
238
+ SizedBox(width: iconSpacing),
239
+ TweenAnimationBuilder<Color?>(
240
+ duration: const Duration(
241
+ milliseconds: 300),
242
+ curve: Curves.easeOutCubic,
243
+ tween: ColorTween(
244
+ begin: inactiveColor,
245
+ end: i == selectedIndex
246
+ ? activeColor
247
+ : inactiveColor,
248
+ ),
249
+ builder: (context, color, _) =>
250
+ Text(
251
+ visibleActions[i].name(context),
252
+ style: textStyle.copyWith(
253
+ color: color),
254
+ overflow: TextOverflow.fade,
255
+ softWrap: false,
256
+ ),
257
+ ),
258
+ ],
259
+ ),
260
+ ),
261
+ ),
262
+ ),
263
+ ],
264
+ ),
265
+ )
266
+ ],
267
+ )),
268
+ ),
269
+ ),
270
+ ),
271
+ ),
272
+ );
273
+ }
274
+}
275
+
276
+class AnimatedPill extends StatelessWidget {
277
+ const AnimatedPill({
278
+ super.key,
279
+ required this.left,
280
+ required this.pillColor,
281
+ required this.contentColor,
282
+ required this.pillIconHeight,
283
+ required this.pillIconWidth,
284
+ required this.pillBorderRadius,
285
+ required this.currentAction,
286
+ required this.estimateWidthForAction,
287
+ required this.pillIconSpacing,
288
+ required this.pillTextStyle,
289
+ required this.pillMoveDuration,
290
+ required this.pillResizeDuration,
291
+ });
292
+
293
+ final double left;
294
+ final Color pillColor;
295
+ final Color contentColor;
296
+ final double pillIconHeight;
297
+ final double pillIconWidth;
298
+ final double pillBorderRadius;
299
+ final PageIndicatorActions currentAction;
300
+ final double estimateWidthForAction;
301
+ final double pillIconSpacing;
302
+ final TextStyle pillTextStyle;
303
+ final Duration pillMoveDuration;
304
+ final Duration pillResizeDuration;
305
+
306
+ @override
307
+ Widget build(BuildContext context) {
308
+ return AnimatedPositioned(
309
+ duration: pillMoveDuration,
310
+ curve: Curves.easeOutCubic,
311
+ left: left,
312
+ top: 4,
313
+ bottom: 4,
314
+ child: AnimatedContainer(
315
+ duration: pillResizeDuration,
316
+ curve: Curves.easeOutCubic,
317
+ width: estimateWidthForAction,
318
+ decoration: BoxDecoration(
319
+ color: pillColor,
320
+ borderRadius: BorderRadius.circular(pillBorderRadius)),
321
+ clipBehavior: Clip.hardEdge,
322
+ alignment: Alignment.center,
323
+ ),
324
+ );
325
+ }
326
+}
lib/src/screens/settings/display_settings_page.dart
+1
-1
@@ -37,7 +37,7 @@ class DisplaySettingsPage extends BasePage {
37
crossAxisAlignment: CrossAxisAlignment.start,
38
children: [
39
SettingsSwitcherCell(
40
- title: S.of(context).show_market_place,
40
+ title: S.of(context).apps,
41
value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard,
42
onValueChange: (_, bool value) {
43
_displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value);
pubspec_base.yaml
+1
@@ -221,6 +221,7 @@ flutter:
221
- assets/images/hardware_wallet/
222
- assets/images/crypto/
223
- assets/images/stocks/
224
+ - assets/images/main_actions/
225
- assets/node_list.yml
226
- assets/haven_node_list.yml
227
- assets/bitcoin_electrum_server_list.yml
res/values/strings_ar.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "ﺪﻤﺘﻌﻳ",
61
"approve_request": "الموافقة على الطلب",
62
"approve_tokens": "الموافقة على الرموز",
63
+ "apps": "تطبيقات",
64
"arbiscan_history": "تاريخ أربيسكان",
65
"arrive_in_this_address": "سيصل ${currency} ${tag}إلى هذا العنوان",
66
"ascending": "تصاعدي",
@@ -440,6 +441,8 @@
441
"hide": "يخفي",
442
"hide_details": "أخف التفاصيل",
443
"high_contrast_theme": "موضوع عالي التباين",
444
+ "history": "تاريخ",
445
+ "home": "بيت",
446
"home_screen_settings": "إعدادات الشاشة الرئيسية",
447
"how_to_connect": "كيفية الاتصال",
448
"how_to_use": " ﻞﻤﻌﺘﺴﺗ ﻒﻴﻛ",
res/values/strings_bg.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Одобряване",
61
"approve_request": "Одобрете искане",
62
"approve_tokens": "Одобрете жетоните",
63
+ "apps": "Приложения",
64
"arbiscan_history": "Арбисканска история",
65
"arrive_in_this_address": "${currency} ${tag}ще отидат на този адрес",
66
"ascending": "Възходящ",
@@ -440,6 +441,8 @@
441
"hide": "Скрий",
442
"hide_details": "Скриване на подробностите",
443
"high_contrast_theme": "Тема с висок контраст",
444
+ "history": "История",
445
+ "home": "Начало",
446
"home_screen_settings": "Настройки на началния екран",
447
"how_to_connect": "Как да се свържа",
448
"how_to_use": "Как да използвам",
res/values/strings_cs.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Schvalovat",
61
"approve_request": "Schválit žádost",
62
"approve_tokens": "Schválit tokeny",
63
+ "apps": "Aplikace",
64
"arbiscan_history": "Arbiscan History",
65
"arrive_in_this_address": "${currency} ${tag}přijde na tuto adresu",
66
"ascending": "Vzestupné",
@@ -440,6 +441,8 @@
441
"hide": "Skrýt",
442
"hide_details": "Skrýt detaily",
443
"high_contrast_theme": "Téma s vysokým kontrastem",
444
+ "history": "Dějiny",
445
+ "home": "Domov",
446
"home_screen_settings": "Nastavení domovské obrazovky",
447
"how_to_connect": "Jak se připojit",
448
"how_to_use": "Jak používat",
res/values/strings_de.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Genehmigen",
61
"approve_request": "Anfrage genehmigen",
62
"approve_tokens": "Token genehmigen",
63
+ "apps": "Apps",
64
"arbiscan_history": "ArbiScan-Geschichte",
65
"arrive_in_this_address": "${currency} ${tag} wird an dieser Adresse ankommen",
66
"ascending": "Aufsteigend",
@@ -440,6 +441,8 @@
441
"hide": "Verstecken",
442
"hide_details": "Details ausblenden",
443
"high_contrast_theme": "Kontrastreiches Thema",
444
+ "history": "Geschichte",
445
+ "home": "Heim",
446
"home_screen_settings": "Einstellungen für den Startbildschirm",
447
"how_to_connect": "Anleitung",
448
"how_to_use": "Wie benutzt man",
res/values/strings_en.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Approve",
61
"approve_request": "Approve Request",
62
"approve_tokens": "Approve tokens",
63
+ "apps": "Apps",
64
"arbiscan_history": "ArbiScan History",
65
"arrive_in_this_address": "${currency} ${tag}will arrive in this address",
66
"ascending": "Ascending",
@@ -440,6 +441,8 @@
441
"hide": "Hide",
442
"hide_details": "Hide Details",
443
"high_contrast_theme": "High Contrast Theme",
444
+ "history": "History",
445
+ "home": "Home",
446
"home_screen_settings": "Home screen settings",
447
"how_to_connect": "How to Connect",
448
"how_to_use": "How to use",
res/values/strings_es.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Aprobar",
61
"approve_request": "Aprobar la solicitud",
62
"approve_tokens": "Aprobar tokens",
63
+ "apps": "Apps",
64
"arbiscan_history": "Historia de ArbiScan",
65
"arrive_in_this_address": "${currency} ${tag}llegará a esta dirección",
66
"ascending": "Ascendente",
@@ -440,6 +441,8 @@
441
"hide": "Ocultar",
442
"hide_details": "Ocultar detalles",
443
"high_contrast_theme": "Tema De Alto Contraste",
444
+ "history": "Historial",
445
+ "home": "Inicio",
446
"home_screen_settings": "Configuración de Pantalla de Inicio",
447
"how_to_connect": "Cómo conectar",
448
"how_to_use": "Cómo usar",
res/values/strings_fr.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Approuver",
61
"approve_request": "Approuver la demande",
62
"approve_tokens": "Approuver les jetons",
63
+ "apps": "Applications",
64
"arbiscan_history": "Historique d'ArbiScan",
65
"arrive_in_this_address": "${currency} ${tag}arrivera à cette adresse",
66
"ascending": "Ascendant",
@@ -440,6 +441,8 @@
441
"hide": "Cacher",
442
"hide_details": "Masquer les détails",
443
"high_contrast_theme": "Thème à contraste élevé",
444
+ "history": "Histoire",
445
+ "home": "Maison",
446
"home_screen_settings": "Paramètres de l'écran d'accueil",
447
"how_to_connect": "Comment se connecter",
448
"how_to_use": "Comment utiliser",
res/values/strings_gn.arb
+3
@@ -50,6 +50,7 @@
50
"anonpay_description": "Ojapo ${type}. Pe ojapyhytava ikatu ${method} oipurukuaa oimeraẽva criptomoneda oipytyvõva, ha ojejapyhyta viru ko billetera-pe.",
51
"apk_update": "APK ñembopyahu",
52
"approve": "Ñemoneĩ",
53
+ "apps": "Apps rehegua .",
54
"arrive_in_this_address": "${currency} ${tag} Og̃uahẽta ko dirección-pe",
55
"ascending": "yvateve",
56
"ask_each_time": "Eporandu opa jave",
@@ -331,6 +332,8 @@
332
"hidden_balance": "Mba’erepy ñemi",
333
"hide_details": "mba’e peteíteî ñemokañy",
334
"high_contrast_theme": "Mba’e hesakangue yvateva",
335
+ "history": "Tembiasakue",
336
+ "home": "Óga",
337
"home_screen_settings": "Ñemohenda pe jehechaha ñepyrũme",
338
"how_to_use": "Mba’éichapa ojeIpuru",
339
"how_to_use_card": "Mba’éichapa ojeiporu ko karjeta",
res/values/strings_ha.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Amincewa",
61
"approve_request": "Amince da bukata",
62
"approve_tokens": "Amince da Alamu",
63
+ "apps": "Apps",
64
"arbiscan_history": "Tarihin Arbiscan",
65
"arrive_in_this_address": "${currency} ${tag} zai je wurin wannan adireshi",
66
"ascending": "Hau",
@@ -440,6 +441,8 @@
441
"hide": "Ɓoye",
442
"hide_details": "Ɓoye cikakkun bayanai",
443
"high_contrast_theme": "Babban Jigon Kwatance",
444
+ "history": "Tarihi",
445
+ "home": "Gida",
446
"home_screen_settings": "Saitunan allo na gida",
447
"how_to_connect": "Yadda ake haɗa",
448
"how_to_use": "Yadda ake amfani da shi",
res/values/strings_hi.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "मंज़ूरी देना",
61
"approve_request": "अनुरोध को स्वीकृत करें",
62
"approve_tokens": "टोकन को मंजूरी देना",
63
+ "apps": "ऐप्स",
64
"arbiscan_history": "अरबीस्कैन इतिहास",
65
"arrive_in_this_address": "${currency} ${tag}इस पते पर पहुंचेंगे",
66
"ascending": "आरोही",
@@ -440,6 +441,8 @@
441
"hide": "छिपाना",
442
"hide_details": "विवरण छुपाएं",
443
"high_contrast_theme": "उच्च कंट्रास्ट थीम",
444
+ "history": "इतिहास",
445
+ "home": "घर",
446
"home_screen_settings": "होम स्क्रीन सेटिंग्स",
447
"how_to_connect": "कनेक्ट कैसे करें",
448
"how_to_use": "का उपयोग कैसे करें",
res/values/strings_hr.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Odobriti",
61
"approve_request": "Odobriti zahtjev",
62
"approve_tokens": "Odobriti tokene",
63
+ "apps": "aplikacije",
64
"arbiscan_history": "Arbiskanska povijest",
65
"arrive_in_this_address": "${currency} ${tag}će stići na ovu adresu",
66
"ascending": "Uzlazni",
@@ -440,6 +441,8 @@
441
"hide": "Sakriti",
442
"hide_details": "Sakrij pojedinosti",
443
"high_contrast_theme": "Tema visokog kontrasta",
444
+ "history": "Povijest",
445
+ "home": "Dom",
446
"home_screen_settings": "Postavke početnog zaslona",
447
"how_to_connect": "Kako se povezati",
448
"how_to_use": "Kako koristiti",
res/values/strings_hy.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Հաստատել",
61
"approve_request": "Հաստատում է հայցը",
62
"approve_tokens": "Հաստատում է նշանները",
63
+ "apps": "Հավելվածներ",
64
"arbiscan_history": "Արբիսկանի պատմություն",
65
"arrive_in_this_address": "${currency} ${tag}կժամանի այս հասցեում",
66
"ascending": "Աճող",
@@ -440,6 +441,8 @@
441
"hide": "Թաքցնել",
442
"hide_details": "Թաքցնել մանրամասները",
443
"high_contrast_theme": "Բարձր հակադրության տեսք",
444
+ "history": "Պատմություն",
445
+ "home": "Տուն",
446
"home_screen_settings": "Գլխավոր էկրանի կարգավորումներ",
447
"how_to_connect": "Ինչպես միացնել",
448
"how_to_use": "Ինչպես օգտագործել",
res/values/strings_id.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Menyetujui",
61
"approve_request": "Menyetujui permintaan",
62
"approve_tokens": "Menyetujui token",
63
+ "apps": "Aplikasi",
64
"arbiscan_history": "Sejarah ArbiScan",
65
"arrive_in_this_address": "${currency} ${tag} akan tiba di alamat ini",
66
"ascending": "Naik",
@@ -440,6 +441,8 @@
441
"hide": "Bersembunyi",
442
"hide_details": "Sembunyikan Rincian",
443
"high_contrast_theme": "Tema Kontras Tinggi",
444
+ "history": "Sejarah",
445
+ "home": "Rumah",
446
"home_screen_settings": "Pengaturan layar awal",
447
"how_to_connect": "Cara terhubung",
448
"how_to_use": "Cara Penggunaan",
res/values/strings_it.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Approvare",
61
"approve_request": "Approvare la richiesta",
62
"approve_tokens": "Approvare i token",
63
+ "apps": "App",
64
"arbiscan_history": "Storia dell'ArbiScan",
65
"arrive_in_this_address": "${currency} ${tag}arriverà a questo indirizzo",
66
"ascending": "Ascendente",
@@ -440,6 +441,8 @@
441
"hide": "Nascondi",
442
"hide_details": "Nascondi dettagli",
443
"high_contrast_theme": "Tema ad alto contrasto",
444
+ "history": "Storia",
445
+ "home": "Casa",
446
"home_screen_settings": "Impostazioni della schermata iniziale",
447
"how_to_connect": "Come connettersi",
448
"how_to_use": "Come usare",
res/values/strings_ja.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "承認する",
61
"approve_request": "リクエストを承認します",
62
"approve_tokens": "トークンを承認します",
63
+ "apps": "アプリ",
64
"arbiscan_history": "ArbiScan の歴史",
65
"arrive_in_this_address": "${currency} ${tag}はこの住所に到着します",
66
"ascending": "上昇",
@@ -441,6 +442,8 @@
442
"hide": "隠れる",
443
"hide_details": "詳細を非表示",
444
"high_contrast_theme": "ハイコントラストテーマ",
445
+ "history": "歴史",
446
+ "home": "家",
447
"home_screen_settings": "ホーム画面の設定",
448
"how_to_connect": "接続方法",
449
"how_to_use": "使い方",
res/values/strings_ko.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "승인",
61
"approve_request": "요청 승인",
62
"approve_tokens": "토큰을 승인합니다",
63
+ "apps": "앱",
64
"arbiscan_history": "ArbiScan 역사",
65
"arrive_in_this_address": "${currency} ${tag}이(가) 이 주소로 도착합니다",
66
"ascending": "오름차순",
@@ -440,6 +441,8 @@
441
"hide": "숨기기",
442
"hide_details": "세부 정보 숨기기",
443
"high_contrast_theme": "고대비 테마",
444
+ "history": "역사",
445
+ "home": "집",
446
"home_screen_settings": "홈 화면 설정",
447
"how_to_connect": "연결 방법",
448
"how_to_use": "사용 방법",
res/values/strings_my.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "လက်မခံပါ။",
61
"approve_request": "တောင်းဆိုမှုကိုအတည်ပြု",
62
"approve_tokens": "တိုကင်အတည်ပြု",
63
+ "apps": "အက်ပလီကေးများ",
64
"arbiscan_history": "arbiscan သမိုင်း",
65
"arrive_in_this_address": "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။",
66
"ascending": "တက်",
@@ -440,6 +441,8 @@
441
"hide": "သားရေ",
442
"hide_details": "အသေးစိတ်ကို ဝှက်ပါ။",
443
"high_contrast_theme": "အလင်းအမှောင် မြင့်မားသော အပြင်အဆင်",
444
+ "history": "သမိုင်း",
445
+ "home": "နေအိမ်",
446
"home_screen_settings": "ပင်မစခရင် ဆက်တင်များ",
447
"how_to_connect": "ဘယ်လိုချိတ်ဆက်ရမလဲ",
448
"how_to_use": "အသုံးပြုနည်း",
res/values/strings_nl.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Goedkeuren",
61
"approve_request": "Het verzoek goedkeuren",
62
"approve_tokens": "Tokens goedkeuren",
63
+ "apps": "Apps",
64
"arbiscan_history": "ArbiScan-geschiedenis",
65
"arrive_in_this_address": "${currency} ${tag}komt aan op dit adres",
66
"ascending": "Stijgend",
@@ -440,6 +441,8 @@
441
"hide": "Verbergen",
442
"hide_details": "Details verbergen",
443
"high_contrast_theme": "Thema met hoog contrast",
444
+ "history": "Geschiedenis",
445
+ "home": "Thuis",
446
"home_screen_settings": "Instellingen voor het startscherm",
447
"how_to_connect": "Hoe verbinding te maken",
448
"how_to_use": "Hoe te gebruiken",
res/values/strings_pl.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Zatwierdzić",
61
"approve_request": "Zatwierdzić żądanie",
62
"approve_tokens": "Zatwierdzić tokeny",
63
+ "apps": "Aplikacje",
64
"arbiscan_history": "Historia ArbiScanu",
65
"arrive_in_this_address": "${currency} ${tag}dotrze na ten adres",
66
"ascending": "Wznoszący się",
@@ -439,6 +440,8 @@
440
"hide": "Ukryj",
441
"hide_details": "Ukryj szczegóły",
442
"high_contrast_theme": "Motyw wysokiego kontrastu",
443
+ "history": "Historia",
444
+ "home": "Dom",
445
"home_screen_settings": "Ustawienia ekranu głównego",
446
"how_to_connect": "Jak połączyć się",
447
"how_to_use": "Jak korzystać",
res/values/strings_pt.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Aprovar",
61
"approve_request": "Aprovar solicitação",
62
"approve_tokens": "Aprovar tokens",
63
+ "apps": "Aplicativos",
64
"arbiscan_history": "História do ArbiScan",
65
"arrive_in_this_address": "${currency} ${tag}chegará neste endereço",
66
"ascending": "Ascendente",
@@ -440,6 +441,8 @@
441
"hide": "Esconder",
442
"hide_details": "Ocultar detalhes",
443
"high_contrast_theme": "Tema de alto contraste",
444
+ "history": "História",
445
+ "home": "Lar",
446
"home_screen_settings": "Configurações da tela inicial",
447
"how_to_connect": "Como conectar",
448
"how_to_use": "Como usar",
res/values/strings_ru.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Утвердить",
61
"approve_request": "Утвердить запрос",
62
"approve_tokens": "Одобрить токены",
63
+ "apps": "Приложения",
64
"arbiscan_history": "История АрбиСкан",
65
"arrive_in_this_address": "${currency} ${tag}придет на этот адрес",
66
"ascending": "Восходящий",
@@ -440,6 +441,8 @@
441
"hide": "Скрывать",
442
"hide_details": "Скрыть детали",
443
"high_contrast_theme": "Высококонтрастная тема",
444
+ "history": "История",
445
+ "home": "Дом",
446
"home_screen_settings": "Настройки главного экрана",
447
"how_to_connect": "Как подключиться",
448
"how_to_use": "Как использовать",
res/values/strings_th.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "อนุมัติ",
61
"approve_request": "อนุมัติคำขอ",
62
"approve_tokens": "อนุมัติโทเค็น",
63
+ "apps": "แอพ",
64
"arbiscan_history": "ประวัติ ArbiScan",
65
"arrive_in_this_address": "${currency} ${tag}จะมาถึงที่อยู่นี้",
66
"ascending": "จากน้อยไปมาก",
@@ -440,6 +441,8 @@
441
"hide": "ซ่อน",
442
"hide_details": "ซ่อนรายละเอียด",
443
"high_contrast_theme": "ธีมความคมชัดสูง",
444
+ "history": "ประวัติศาสตร์",
445
+ "home": "บ้าน",
446
"home_screen_settings": "การตั้งค่าหน้าจอหลัก",
447
"how_to_connect": "วิธีการเชื่อมต่อ",
448
"how_to_use": "วิธีใช้",
res/values/strings_tl.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Aprubahan",
61
"approve_request": "Aprubahan ang kahilingan",
62
"approve_tokens": "Aprubahan ang mga token",
63
+ "apps": "Apps",
64
"arbiscan_history": "Kasaysayan ng Arbiscan",
65
"arrive_in_this_address": "Ang ${currency} ${tag} ay darating sa address na ito",
66
"ascending": "Umakyat",
@@ -440,6 +441,8 @@
441
"hide": "Itago",
442
"hide_details": "Itago ang mga detalye",
443
"high_contrast_theme": "High Contrast Theme",
444
+ "history": "Kasaysayan",
445
+ "home": "Home",
446
"home_screen_settings": "Mga setting ng home screen",
447
"how_to_connect": "Paano kumonekta",
448
"how_to_use": "Paano gamitin",
res/values/strings_tr.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Onaylamak",
61
"approve_request": "Talebi Onaylama",
62
"approve_tokens": "Jetonları onaylayın",
63
+ "apps": "Uygulamalar",
64
"arbiscan_history": "ArbiScan Geçmişi",
65
"arrive_in_this_address": "${currency} ${tag}bu adrese ulaşacak",
66
"ascending": "Yükselen",
@@ -440,6 +441,8 @@
441
"hide": "Saklamak",
442
"hide_details": "Detayları Gizle",
443
"high_contrast_theme": "Yüksek Kontrastlı Tema",
444
+ "history": "Tarih",
445
+ "home": "Ev",
446
"home_screen_settings": "Ana ekran ayarları",
447
"how_to_connect": "Nasıl bağlanır",
448
"how_to_use": "Nasıl kullanılır",
res/values/strings_uk.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Затвердити",
61
"approve_request": "Запитайте запит",
62
"approve_tokens": "Затвердити токени",
63
+ "apps": "Застосунки",
64
"arbiscan_history": "Арбісканська історія",
65
"arrive_in_this_address": "${currency} ${tag}надійде на цю адресу",
66
"ascending": "Висхід",
@@ -440,6 +441,8 @@
441
"hide": "Сховати",
442
"hide_details": "Приховати деталі",
443
"high_contrast_theme": "Тема високої контрастності",
444
+ "history": "Історія",
445
+ "home": "Дім",
446
"home_screen_settings": "Налаштування головного екрана",
447
"how_to_connect": "Як підключитися",
448
"how_to_use": "Як використовувати",
res/values/strings_ur.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "ﻭﺮﮐ ﺭﻮﻈﻨﻣ",
61
"approve_request": "درخواست کو منظور کریں",
62
"approve_tokens": "ٹوکن کو منظور کریں",
63
+ "apps": "ایپس",
64
"arbiscan_history": "اربیسکن تاریخ",
65
"arrive_in_this_address": "${currency} ${tag}اس پتے پر پہنچے گا۔",
66
"ascending": "چڑھنے",
@@ -440,6 +441,8 @@
441
"hide": "چھپائیں",
442
"hide_details": "تفصیلات چھپائیں۔",
443
"high_contrast_theme": "ہائی کنٹراسٹ تھیم",
444
+ "history": "تاریخ",
445
+ "home": "گھر",
446
"home_screen_settings": "ہوم اسکرین کی ترتیبات",
447
"how_to_connect": "کیسے مربوط ہوں",
448
"how_to_use": " ﮧﻘﯾﺮﻃ ﺎﮐ ﮯﻧﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ",
res/values/strings_vi.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Phê duyệt",
61
"approve_request": "Phê duyệt yêu cầu",
62
"approve_tokens": "Phê duyệt mã thông báo",
63
+ "apps": "Ứng dụng",
64
"arbiscan_history": "Lịch sử quét Arbi",
65
"arrive_in_this_address": "${currency} ${tag} sẽ đến địa chỉ này",
66
"ascending": "Tăng dần",
@@ -439,6 +440,8 @@
440
"hide": "Trốn",
441
"hide_details": "Ẩn chi tiết",
442
"high_contrast_theme": "Chủ đề độ tương phản cao",
443
+ "history": "Lịch sử",
444
+ "home": "Trang chủ",
445
"home_screen_settings": "Cài đặt màn hình chính",
446
"how_to_connect": "Cách kết nối",
447
"how_to_use": "Cách sử dụng",
res/values/strings_yo.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "Fi ọwọ si",
61
"approve_request": "IKILỌ RẸ",
62
"approve_tokens": "Ṣe fọwọsi awọn àmi",
63
+ "apps": "Lw",
64
"arbiscan_history": "Itan Arbiscan",
65
"arrive_in_this_address": "${currency} ${tag} máa dé sí àdírẹ́sì yìí",
66
"ascending": "Goke",
@@ -441,6 +442,8 @@
442
"hide": "Pamọ",
443
"hide_details": "Dé ìsọfúnni kékeré",
444
"high_contrast_theme": "Akori Iyatọ giga",
445
+ "history": "Itan",
446
+ "home": "Ile",
447
"home_screen_settings": "Awọn eto iboju ile",
448
"how_to_connect": "Bi o ṣe le sopọ",
449
"how_to_use": "Bawo ni lati lo",
res/values/strings_zh.arb
+3
@@ -60,6 +60,7 @@
60
"approve": "批准",
61
"approve_request": "批准请求",
62
"approve_tokens": "批准令牌",
63
+ "apps": "应用程序",
64
"arbiscan_history": "ArbiScan 历史",
65
"arrive_in_this_address": "${currency} ${tag}将到达此地址",
66
"ascending": "上升",
@@ -440,6 +441,8 @@
441
"hide": "隐藏",
442
"hide_details": "隐藏细节",
443
"high_contrast_theme": "高对比度主题",
444
+ "history": "历史",
445
+ "home": "家",
446
"home_screen_settings": "主屏幕设置",
447
"how_to_connect": "如何连接",
448
"how_to_use": "如何使用",