dev #5

Merged
such-gitea merged 5 commits from github-such-software/hash-wallet:dev into dev 2026-05-16 10:37:44 -04:00
17 changed files with 238 additions and 249 deletions

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 100" width="360" height="100">
<title>Hash Wallet horizontal lockup (dark theme)</title>
<desc>Hash Wallet logo with green-boxed hash mark on the left and a white wordmark to the right, intended for dark-theme backgrounds.</desc>
<rect x="10" y="18" width="64" height="64" rx="14" fill="#1a5c38"/>
<text x="42" y="68" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="48" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
<text x="90" y="63" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="32" font-weight="500" fill="#ffffff">Hash Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 728 B

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 380 80" width="380" height="80">
<title>#ash Wallet — inline lockup (dark theme)</title>
<desc>Hash Wallet inline lockup spelling "#ash Wallet" with white text, intended for dark-theme backgrounds.</desc>
<rect x="6" y="14" width="52" height="52" rx="11" fill="#1a5c38"/>
<text x="32" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
<text x="68" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="42" font-weight="500" fill="#ffffff">ash Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 699 B

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 80" width="500" height="80">
<title>H(ash) = Wallet (dark theme)</title>
<desc>Hash Wallet function-joke wordmark with green-boxed hash as the function name, light-on-dark variant. Punctuation/operators in mid-gray that reads on either background; argument and return in white.</desc>
<rect x="6" y="14" width="52" height="52" rx="11" fill="#1a5c38"/>
<text x="32" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
<text x="68" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="400" fill="#aaa">(</text>
<text x="88" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="500" fill="#ffffff">ash</text>
<text x="158" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="400" fill="#aaa">)</text>
<text x="186" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="400" fill="#aaa">=</text>
<text x="218" y="55" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="40" font-weight="500" fill="#7fcaa0">Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
<title>Hash Wallet mark — outline</title>
<desc>The Hash Wallet mark as a green outline + green hash, no fill. For monochrome UI surfaces and tiny sizes where the solid green box overwhelms.</desc>
<rect x="4" y="4" width="92" height="92" rx="20" fill="none" stroke="#1a5c38" stroke-width="6"/>
<text x="50" y="76" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="74" font-weight="700" fill="#1a5c38" text-anchor="middle">#</text>
</svg>

After

Width:  |  Height:  |  Size: 600 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 280 60" width="280" height="60">
<title>Hash Wallet wordmark</title>
<desc>The Hash Wallet wordmark in mono, no mark — for headers, footers, or surfaces that already display the logo elsewhere. Uses currentColor so the consuming theme picks the tint.</desc>
<text x="0" y="44" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="36" font-weight="500" fill="currentColor">Hash Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 521 B

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 240" width="200" height="240">
<title>Hash Wallet vertical lockup</title>
<desc>Hash Wallet logo with green-boxed hash mark on top, wordmark centered below — for splash screens, about screens, vertical-aspect surfaces. Wordmark uses currentColor for theme adaptability.</desc>
<rect x="50" y="20" width="100" height="100" rx="22" fill="#1a5c38"/>
<text x="100" y="96" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="74" font-weight="700" fill="#ffffff" text-anchor="middle">#</text>
<text x="100" y="180" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="28" font-weight="500" fill="currentColor" text-anchor="middle">Hash Wallet</text>
</svg>

After

Width:  |  Height:  |  Size: 808 B

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<title>Hash Wallet notification mark</title>
<desc>Single-color silhouette of the hash mark, no background, sized for Android notification tray (24x24 dp). Renders as white-on-system-tint per Android notification icon rules.</desc>
<text x="12" y="20" font-family="ui-monospace, 'JetBrains Mono', 'Courier New', monospace" font-size="22" font-weight="700" fill="currentColor" text-anchor="middle">#</text>
</svg>

After

Width:  |  Height:  |  Size: 536 B

View File

@@ -563,13 +563,10 @@ Future<void> defaultSettingsMigration(
await _backupWowneroSeeds(havenSeedStore);
break;
case 55:
await addWalletNodeList(nodes: nodes, type: WalletType.zcash);
await _changeDefaultNode(
nodes: nodes,
sharedPreferences: sharedPreferences,
type: WalletType.zcash,
currentNodePreferenceKey: PreferencesKey.currentZcashNodeIdKey,
);
// Hash Wallet: zcash removed. The original migration here added
// zcash node list + set default zcash node. We no longer load
// zcash_node_list.yml (it was deleted), so skip the whole step.
break;
case 56:
await sharedPreferences.setString(
PreferencesKey.syncStatusDisplayMode, SyncStatusDisplayMode.blocksRemaining.name);

View File

@@ -115,7 +115,9 @@ Future<void> resetToDefault(Box<Node> nodeSource) async {
final dogecoinElectrumServerList = await loadDefaultNodes(WalletType.dogecoin);
final baseNodes = await loadDefaultNodes(WalletType.base);
final arbitrumNodes = await loadDefaultNodes(WalletType.arbitrum);
final zcashNodes = await loadDefaultNodes(WalletType.zcash);
// Hash Wallet: zcash node list deleted with the chain. Skip the load,
// skip the concat — stops the first-launch popup "Unable to load asset:
// assets/zcash_node_list.yml".
final bscNodes = await loadDefaultNodes(WalletType.bsc);
final nodes = moneroNodes +
@@ -133,7 +135,6 @@ Future<void> resetToDefault(Box<Node> nodeSource) async {
dogecoinElectrumServerList +
baseNodes +
arbitrumNodes +
zcashNodes +
bscNodes;
await nodeSource.clear();

View File

@@ -4,15 +4,17 @@ class Palette {
static const Color green = Color.fromRGBO(39, 206, 80, 1.0);
static const Color red = Color.fromRGBO(255, 51, 51, 1.0);
static const Color darkRed = Color.fromRGBO(205, 0, 0, 1.0);
static const Color blueAlice = Color.fromRGBO(229, 247, 255, 1.0);
static const Color lightBlue = Color.fromRGBO(172, 203, 238, 1.0);
static const Color lavender = Color.fromRGBO(237, 245, 252, 1.0);
static const Color oceanBlue = Color.fromRGBO(30, 52, 78, 1.0);
static const Color lightBlueGrey = Color.fromRGBO(118, 131, 169, 1.0);
static const Color periwinkle = Color.fromRGBO(195, 210, 227, 1.0);
static const Color blue = Color.fromRGBO(88, 143, 252, 1.0);
static const Color darkLavender = Color.fromRGBO(229, 238, 250, 1.0);
static const Color nightBlue = Color.fromRGBO(46, 57, 96, 1.0);
// Hash Wallet: Cake's blue-family accents repainted into the green-primary
// brand palette. Names retained so call-sites compile unchanged.
static const Color blueAlice = Color.fromRGBO(229, 247, 235, 1.0); // pale green tint
static const Color lightBlue = Color.fromRGBO(127, 202, 160, 1.0); // mint
static const Color lavender = Color.fromRGBO(242, 248, 244, 1.0); // very light minty
static const Color oceanBlue = Color.fromRGBO(11, 31, 20, 1.0); // deep brand green
static const Color lightBlueGrey = Color.fromRGBO(155, 181, 166, 1.0); // muted mint-gray
static const Color periwinkle = Color.fromRGBO(199, 229, 210, 1.0); // pale mint
static const Color blue = Color.fromRGBO(31, 125, 191, 1.0); // Such Software blue accent
static const Color darkLavender = Color.fromRGBO(234, 242, 236, 1.0); // pale green bg
static const Color nightBlue = Color.fromRGBO(26, 92, 56, 1.0); // brand green primary
static const Color moderateOrangeYellow = Color.fromRGBO(245, 134, 82, 1.0);
static const Color moderateOrange = Color.fromRGBO(235, 117, 63, 1.0);
static const Color moneroOrange = Color.fromRGBO(255, 102, 0, 1.0);
@@ -20,86 +22,90 @@ class Palette {
static const Color bitcoinOrange = Color.fromRGBO(242, 169, 0, 1.0);
static const Color shineGreen = Color.fromRGBO(76, 189, 87, 1.0);
static const Color moderateGreen = Color.fromRGBO(45, 158, 56, 1.0);
static const Color cornflower = Color.fromRGBO(85, 147, 240, 1.0);
static const Color royalBlue = Color.fromRGBO(43, 114, 221, 1.0);
static const Color cornflower = Color.fromRGBO(106, 183, 230, 1.0); // soft Such blue
static const Color royalBlue = Color.fromRGBO(31, 125, 191, 1.0); // Such blue primary
static const Color lightRed = Color.fromRGBO(227, 87, 87, 1.0);
static const Color veryLightRed = Color.fromRGBO(239, 156, 156, 1.0);
static const Color persianRed = Color.fromRGBO(206, 55, 55, 1.0);
static const Color blueCraiola = Color.fromRGBO(69, 110, 255, 1.0);
static const Color blueGreyCraiola = Color.fromRGBO(106, 177, 207, 1.0);
static const Color greyBlueCraiola = Color.fromRGBO(116, 139, 219, 1.0);
static const Color darkBlueCraiola = Color.fromRGBO(53, 86, 136, 1.0);
static const Color pinkFlamingo = Color.fromRGBO(240, 60, 243, 1.0);
static const Color blueCraiola = Color.fromRGBO(26, 92, 56, 1.0); // brand green primary
static const Color blueGreyCraiola = Color.fromRGBO(127, 202, 160, 1.0); // mint
static const Color greyBlueCraiola = Color.fromRGBO(155, 181, 166, 1.0); // muted mint-gray
static const Color darkBlueCraiola = Color.fromRGBO(11, 31, 20, 1.0); // deep green
static const Color pinkFlamingo = Color.fromRGBO(184, 50, 120, 1.0); // Such Software pink
static const Color redHat = Color.fromRGBO(209, 68, 37, 1.0);
static const Color shineOrange = Color.fromRGBO(255, 184, 78, 1.0);
static const Color paleBlue = Color.fromRGBO(225, 228, 233, 1.0);
static const Color violetBlue = Color.fromRGBO(56, 69, 103, 1.0);
static const Color periwinkleCraiola = Color.fromRGBO(229, 232, 242, 1.0);
static const Color moderatePurpleBlue = Color.fromRGBO(57, 74, 95, 1.0);
static const Color moderateLavender = Color.fromRGBO(233, 242, 252, 1.0);
static const Color wildLavender = Color.fromRGBO(224, 230, 246, 1.0);
static const Color paleBlue = Color.fromRGBO(217, 230, 222, 1.0); // pale green tint
static const Color violetBlue = Color.fromRGBO(31, 69, 48, 1.0); // darker green container
static const Color periwinkleCraiola = Color.fromRGBO(234, 242, 236, 1.0);
static const Color moderatePurpleBlue = Color.fromRGBO(31, 69, 48, 1.0);
static const Color moderateLavender = Color.fromRGBO(234, 242, 236, 1.0);
static const Color wildLavender = Color.fromRGBO(199, 229, 210, 1.0);
static const Color gray = Color.fromRGBO(112, 147, 186, 1.0);
static const Color wildPeriwinkle = Color.fromRGBO(219, 227, 243, 1.0);
static const Color wildPeriwinkle = Color.fromRGBO(214, 234, 222, 1.0);
static const Color darkGray = Color.fromRGBO(122, 147, 186, 1.0);
static const Color shadowWhite = Color.fromRGBO(242, 245, 255, 1.0);
static const Color niagara = Color.fromRGBO(152, 172, 201, 1.0);
static const Color shadowWhite = Color.fromRGBO(242, 248, 244, 1.0); // pale minty
static const Color niagara = Color.fromRGBO(155, 181, 166, 1.0); // mint-gray
static const Color alizarinRed = Color.fromRGBO(233, 45, 45, 1.0);
static const Color moderateSlateBlue = Color.fromRGBO(129, 93, 251, 1.0);
static const Color brightOrange = Color.fromRGBO(255, 102, 0, 1.0);
static const Color dullGray = Color.fromRGBO(98, 98, 98, 1.0);
static const Color protectiveBlue = Color.fromRGBO(33, 148, 255, 1.0);
static const Color darkBlue = Color.fromRGBO(109, 128, 178, 1.0);
static const Color paleCornflowerBlue = Color.fromRGBO(185, 196, 237, 1.0);
static const Color manatee = Color.fromRGBO(153, 161, 176, 1.0);
static const Color stateGray = Color.fromRGBO(68, 74, 89, 1.0);
static const Color highContrastGray = Color.fromRGBO(76, 76, 76, 1.0);
static const Color frostySky = Color.fromRGBO(0, 184, 250, 1.0);
static const Color protectiveBlue = Color.fromRGBO(31, 125, 191, 1.0); // Such blue
static const Color darkBlue = Color.fromRGBO(20, 80, 122, 1.0); // deeper Such blue
static const Color paleCornflowerBlue = Color.fromRGBO(214, 234, 246, 1.0); // pale Such blue
static const Color manatee = Color.fromRGBO(153, 161, 176, 1.0); // neutral gray (kept)
static const Color stateGray = Color.fromRGBO(68, 74, 89, 1.0); // neutral (kept)
static const Color highContrastGray = Color.fromRGBO(76, 76, 76, 1.0); // neutral (kept)
static const Color frostySky = Color.fromRGBO(127, 202, 160, 1.0); // mint
}
class PaletteDark {
static const Color lightDistantBlue = Color.fromRGBO(81, 96, 147, 1.0);
static const Color gray = Color.fromRGBO(140, 153, 201, 1.0);
static const Color pigeonBlue = Color.fromRGBO(91, 112, 146, 1.0);
static const Color moderateNightBlue = Color.fromRGBO(39, 53, 96, 1.0);
static const Color headerNightBlue = Color.fromRGBO(41, 52, 84, 1.0);
static const Color moderatePurpleBlue = Color.fromRGBO(57, 74, 95, 1.0);
static const Color backgroundColor = Color.fromRGBO(25, 35, 60, 1.0);
static const Color nightBlue = Color.fromRGBO(35, 47, 79, 1.0);
static const Color wildNightBlue = Color.fromRGBO(39, 53, 96, 1.0);
static const Color distantNightBlue = Color.fromRGBO(46, 57, 96, 1.0);
static const Color cyanBlue = Color.fromRGBO(99, 113, 150, 1.0);
static const Color darkCyanBlue = Color.fromRGBO(91, 112, 146, 1.0);
static const Color orangeYellow = Color.fromRGBO(243, 166, 50, 1.0);
static const Color brightGreen = Color.fromRGBO(88, 243, 50, 1.0);
static const Color oceanBlue = Color.fromRGBO(27, 39, 71, 1.0);
static const Color lightOceanBlue = Color.fromRGBO(32, 45, 80, 1.0);
static const Color lightNightBlue = Color.fromRGBO(39, 52, 89, 1.0);
static const Color wildBlue = Color.fromRGBO(165, 176, 205, 1.0);
static const Color buttonNightBlue = Color.fromRGBO(46, 57, 96, 1.0);
static const Color lightBlueGrey = Color.fromRGBO(125, 141, 183, 1.0);
static const Color lightVioletBlue = Color.fromRGBO(56, 71, 109, 1.0);
static const Color darkVioletBlue = Color.fromRGBO(49, 60, 96, 1.0);
static const Color wildVioletBlue = Color.fromRGBO(45, 60, 97, 1.0);
static const Color darkNightBlue = Color.fromRGBO(33, 45, 76, 1.0);
static const Color blueGrey = Color.fromRGBO(87, 98, 138, 1.0);
static const Color moderateBlue = Color.fromRGBO(60, 73, 118, 1.0);
static const Color deepPurpleBlue = Color.fromRGBO(19, 29, 56, 1.0);
static const Color darkOceanBlue = Color.fromRGBO(30, 42, 73, 1.0);
static const Color wildBlueGrey = Color.fromRGBO(125, 137, 182, 1.0);
static const Color darkGrey = Color.fromRGBO(118, 131, 169, 1.0);
static const Color dividerColor = Color.fromRGBO(48, 59, 95, 1.0);
static const Color violetBlue = Color.fromRGBO(59, 72, 119, 1.0);
static const Color distantBlue = Color.fromRGBO(72, 85, 131, 1.0);
static const Color moderateVioletBlue = Color.fromRGBO(62, 73, 113, 1.0);
static const Color deepVioletBlue = Color.fromRGBO(52, 66, 104, 1.0);
static const Color lightPurpleBlue = Color.fromRGBO(120, 133, 170, 1.0);
static const Color indicatorVioletBlue = Color.fromRGBO(59, 72, 119, 1.0);
static const Color granite = Color.fromRGBO(48, 51, 60, 1.0);
static const Color matrixGreen = Color.fromRGBO(18, 229, 90, 1.0);
static const Color moneroOrange = Color.fromRGBO(255, 102, 0, 1.0);
static const Color moneroCard = Color.fromRGBO(20, 21, 24, 1.0);
static const Color red = Color.fromRGBO(195, 0, 0, 1.0);
static const Color darkPurple = Color.fromRGBO(109, 14, 210, 1.0);
static const Color cakeBlue = Color.fromRGBO(0, 184, 250, 1.0);
static const Color darkBlue = Color.fromRGBO(0, 123, 168, 1.0);
// Hash Wallet: PaletteDark was almost entirely Cake's night-blue surfaces.
// Repainted into the deep-green dark theme. moneroCard and moneroOrange
// stay as chain identifiers. Original names retained — every call-site
// compiles unchanged.
static const Color lightDistantBlue = Color.fromRGBO(96, 147, 113, 1.0);
static const Color gray = Color.fromRGBO(155, 181, 166, 1.0);
static const Color pigeonBlue = Color.fromRGBO(91, 146, 112, 1.0);
static const Color moderateNightBlue = Color.fromRGBO(23, 53, 36, 1.0);
static const Color headerNightBlue = Color.fromRGBO(17, 42, 29, 1.0);
static const Color moderatePurpleBlue = Color.fromRGBO(31, 69, 48, 1.0);
static const Color backgroundColor = Color.fromRGBO(11, 31, 20, 1.0);
static const Color nightBlue = Color.fromRGBO(17, 42, 29, 1.0);
static const Color wildNightBlue = Color.fromRGBO(23, 53, 36, 1.0);
static const Color distantNightBlue = Color.fromRGBO(31, 69, 48, 1.0);
static const Color cyanBlue = Color.fromRGBO(113, 150, 128, 1.0);
static const Color darkCyanBlue = Color.fromRGBO(91, 146, 112, 1.0);
static const Color orangeYellow = Color.fromRGBO(243, 166, 50, 1.0); // neutral accent (kept)
static const Color brightGreen = Color.fromRGBO(88, 243, 130, 1.0); // tweaked for brand harmony
static const Color oceanBlue = Color.fromRGBO(11, 31, 20, 1.0);
static const Color lightOceanBlue = Color.fromRGBO(17, 42, 29, 1.0);
static const Color lightNightBlue = Color.fromRGBO(23, 53, 36, 1.0);
static const Color wildBlue = Color.fromRGBO(176, 205, 188, 1.0);
static const Color buttonNightBlue = Color.fromRGBO(31, 69, 48, 1.0);
static const Color lightBlueGrey = Color.fromRGBO(141, 183, 159, 1.0);
static const Color lightVioletBlue = Color.fromRGBO(42, 88, 64, 1.0);
static const Color darkVioletBlue = Color.fromRGBO(31, 69, 48, 1.0);
static const Color wildVioletBlue = Color.fromRGBO(35, 75, 52, 1.0);
static const Color darkNightBlue = Color.fromRGBO(17, 42, 29, 1.0);
static const Color blueGrey = Color.fromRGBO(98, 138, 113, 1.0);
static const Color moderateBlue = Color.fromRGBO(60, 118, 88, 1.0);
static const Color deepPurpleBlue = Color.fromRGBO(11, 31, 20, 1.0);
static const Color darkOceanBlue = Color.fromRGBO(17, 42, 29, 1.0);
static const Color wildBlueGrey = Color.fromRGBO(137, 182, 156, 1.0);
static const Color darkGrey = Color.fromRGBO(131, 169, 148, 1.0);
static const Color dividerColor = Color.fromRGBO(31, 69, 48, 1.0);
static const Color violetBlue = Color.fromRGBO(42, 88, 64, 1.0);
static const Color distantBlue = Color.fromRGBO(85, 131, 105, 1.0);
static const Color moderateVioletBlue = Color.fromRGBO(62, 113, 84, 1.0);
static const Color deepVioletBlue = Color.fromRGBO(52, 104, 75, 1.0);
static const Color lightPurpleBlue = Color.fromRGBO(133, 170, 149, 1.0);
static const Color indicatorVioletBlue = Color.fromRGBO(42, 88, 64, 1.0);
static const Color granite = Color.fromRGBO(48, 51, 60, 1.0); // neutral (kept)
static const Color matrixGreen = Color.fromRGBO(18, 229, 90, 1.0); // matrix accent (kept)
static const Color moneroOrange = Color.fromRGBO(255, 102, 0, 1.0); // chain identifier (kept)
static const Color moneroCard = Color.fromRGBO(20, 21, 24, 1.0); // chain card (kept)
static const Color red = Color.fromRGBO(195, 0, 0, 1.0); // neutral (kept)
static const Color darkPurple = Color.fromRGBO(184, 50, 120, 1.0); // Such Software pink
static const Color cakeBlue = Color.fromRGBO(106, 183, 230, 1.0); // Such Software blue
static const Color darkBlue = Color.fromRGBO(31, 125, 191, 1.0); // Such Software blue darker
}

View File

@@ -81,107 +81,27 @@ class CakeFeaturesPage extends StatelessWidget {
);
}
Widget _buildOldUi(BuildContext context) {
return Column(
children: [
const SizedBox(height: 2),
DashBoardRoundedCardWidget(
shadowBlur: dashboardViewModel.getShadowBlur(),
shadowSpread: dashboardViewModel.getShadowSpread(),
onTap: () => _onCakePayTap(context),
title: 'Cake Pay',
subTitle: S.of(context).cake_pay_subtitle,
image: Image.asset('assets/images/cakepay.png', height: 74, width: 70, fit: BoxFit.cover),
),
Observer(builder: (_) {
if (dashboardViewModel.type == WalletType.ethereum) {
return DashBoardRoundedCardWidget(
shadowBlur: dashboardViewModel.getShadowBlur(),
shadowSpread: dashboardViewModel.getShadowSpread(),
onTap: () => Navigator.of(context).pushNamed(Routes.dEuroSavings),
title: S.of(context).deuro_savings,
subTitle: S.of(context).deuro_savings_subtitle,
image: Image.asset('assets/images/deuro_icon.png', height: 80, width: 80, fit: BoxFit.cover),
);
}
return const SizedBox();
}),
DashBoardRoundedCardWidget(
shadowBlur: dashboardViewModel.getShadowBlur(),
shadowSpread: dashboardViewModel.getShadowSpread(),
onTap: () => _launchUrl("cake.nano-gpt.com"),
title: "NanoGPT",
subTitle: S.of(context).nanogpt_subtitle,
image: Image.asset('assets/images/nanogpt.png', height: 80, width: 80, fit: BoxFit.cover),
),
const Spacer(),
const SizedBox(height: 125),
],
);
}
// Hash Wallet: gutted Cake Pay, Cupcake, NanoGPT, and dEuro Savings
// entries — all third-party Cake-affiliate income. dEuro kept out for
// consistency (also has affiliate revenue, not our relationship).
// Re-populate this page when we have Hash Wallet / Such Software apps
// to feature here.
Widget _buildOldUi(BuildContext context) => _emptyState(context);
Widget _buildNewUi(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Align(
alignment: Alignment.centerLeft,
child: Padding(
padding: const EdgeInsets.only(left: 24, bottom: 8),
child: CakeImageWidget(imageUrl: "assets/new-ui/by-cakelabs.svg", height: 20, color: Theme.of(context).colorScheme.onSurfaceVariant),
),
Widget _buildNewUi(BuildContext context) => _emptyState(context);
Widget _emptyState(BuildContext context) {
return Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 64),
child: Text(
'No apps available yet.',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
AppsWidget(
isWide: true,
isCake: true,
onTap: () => _onCakePayTap(context),
title: 'Cake Pay',
subTitle: S.of(context).cake_pay_subtitle,
image: 'assets/images/cakepay.png',
),
AppsWidget(
isWide: true,
isLink: true,
isCake: true,
onTap: () => _launchUrl("cupcakewallet.com"),
title: "Cupcake",
subTitle: "Turn your old phone into your new hardware wallet with our new app",
image: 'assets/images/cupcake.png',
),
const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.only(left: 24, top: 16, bottom: 8),
child: Text(
"Featured Apps",
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
fontWeight: FontWeight.w500,
color: Theme.of(context).colorScheme.onSurface,
),
),
),
AppsWidget(
isWide: true,
isLink: true,
onTap: () => _launchUrl("cake.nano-gpt.com"),
title: "NanoGPT",
subTitle: S.of(context).nanogpt_subtitle,
image: 'assets/images/nanogpt.png',
),
Observer(builder: (_) {
if (dashboardViewModel.type == WalletType.ethereum) {
return AppsWidget(
isWide: true,
onTap: () => Navigator.of(context).pushNamed(Routes.dEuroSavings),
title: S.of(context).deuro_savings,
subTitle: S.of(context).deuro_savings_subtitle,
image: 'assets/images/deuro_icon.png',
);
}
return const SizedBox();
}),
const Spacer(),
const SizedBox(height: 125),
],
),
);
}

View File

@@ -12,17 +12,17 @@ class DarkThemeCustomColors extends CustomThemeColors {
Color get backgroundMainColor => const Color(0xFF000000);
@override
Color get backgroundGradientColor => const Color(0xFF0F1A36);
Color get backgroundGradientColor => const Color(0xFF06150C);
@override
Color get cardGradientColorPrimary => const Color(0xFF2B3A67);
Color get cardGradientColorPrimary => const Color(0xFF1F4530);
@override
Color get cardGradientColorSecondary => const Color(0xFF1C2A4F);
Color get cardGradientColorSecondary => const Color(0xFF112A1D);
@override
Color get toggleKnobStateColor => const Color(0xFFFFFFFF);
@override
Color get toggleColorOffState => const Color(0xFF3A4F88);
Color get toggleColorOffState => const Color(0xFF2A5840);
}

View File

@@ -9,20 +9,20 @@ class LightThemeCustomColors extends CustomThemeColors {
Color get warningOutlineColor => const Color(0xFF312938);
@override
Color get backgroundMainColor => const Color(0xFF000000);
Color get backgroundMainColor => const Color(0xFF0B1F14);
@override
Color get backgroundGradientColor => const Color(0xFFE7E7FD);
Color get backgroundGradientColor => const Color(0xFFDDEBE3);
@override
Color get cardGradientColorPrimary => const Color(0xFFFFFFFF);
@override
Color get cardGradientColorSecondary => const Color(0xFFF3F3FF);
Color get cardGradientColorSecondary => const Color(0xFFEAF2EC);
@override
Color get toggleKnobStateColor => const Color(0xFFFFFFFF);
@override
Color get toggleColorOffState => const Color(0xFFCACAE7);
Color get toggleColorOffState => const Color(0xFFC7E5D2);
}

View File

@@ -4,12 +4,12 @@ import 'package:cake_wallet/themes/core/custom_theme_colors.dart';
import 'package:cake_wallet/themes/custom_theme_colors/black_theme_custom_colors.dart';
enum BlackThemeAccentColor implements ThemeAccentColor {
cakePrimary(Color(0xFF52B6F0), 'Cake Primary'),
hashGreen(Color(0xFF7FCAA0), 'Hash Green'),
suchPink(Color(0xFFE16FA6), 'Such Pink'),
suchBlue(Color(0xFF6AB7E6), 'Such Blue'),
bchGreen(Color(0xFF44BA52), 'BCH Green'),
bitcoinYellow(Color(0xFFFFC107), 'Bitcoin Yellow'),
moneroOrange(Color(0xFFFF6600), 'Monero Orange'),
tronRed(Color(0xFFFF4242), 'Tron Red'),
frostingPurple(Color(0xFFBABAF3), 'Frosting Purple');
moneroOrange(Color(0xFFFF6600), 'Monero Orange');
const BlackThemeAccentColor(this.color, this.name);
@@ -263,12 +263,12 @@ class BlackTheme extends MaterialThemeBase {
@override
int get raw {
final baseValue = switch (accentColor) {
BlackThemeAccentColor.cakePrimary => 12,
BlackThemeAccentColor.hashGreen => 12,
BlackThemeAccentColor.bchGreen => 13,
BlackThemeAccentColor.bitcoinYellow => 14,
BlackThemeAccentColor.moneroOrange => 15,
BlackThemeAccentColor.tronRed => 16,
BlackThemeAccentColor.frostingPurple => 17,
BlackThemeAccentColor.suchPink => 16,
BlackThemeAccentColor.suchBlue => 17,
};
if (!isOled) return baseValue;
// OLED encodes as 100 + base to avoid collisions

View File

@@ -10,50 +10,55 @@ class DarkTheme extends MaterialThemeBase {
@override
ThemeMode get themeMode => ThemeMode.dark;
// Hash Wallet dark palette:
// - Primary: mint (#7FCAA0) — light enough to read on dark surface
// - Secondary: soft pink (#E16FA6)
// - Tertiary: soft blue (#6AB7E6)
// - Surface: deep green (#0B1F14)
@override
Color get primaryColor => const Color(0xFF91B0FF);
Color get primaryColor => const Color(0xFF7FCAA0);
@override
Color get secondaryColor => const Color(0xFFA1B9FF);
Color get secondaryColor => const Color(0xFFE16FA6);
@override
Color get errorColor => const Color(0xFFFFB4AB);
@override
Color get surfaceColor => const Color(0xFF1B284A);
Color get surfaceColor => const Color(0xFF0B1F14);
@override
Color get tertiaryColor => const Color(0xFF162028);
Color get tertiaryColor => const Color(0xFF6AB7E6);
@override
ColorScheme get colorScheme => ColorScheme.dark(
primary: primaryColor,
onPrimary: const Color(0xFF002860),
primaryContainer: const Color(0xFF004C9E),
onPrimaryContainer: const Color(0xFFFFF3F0),
onPrimary: const Color(0xFF0B1F14),
primaryContainer: const Color(0xFF1A5C38),
onPrimaryContainer: const Color(0xFFC7E5D2),
secondary: secondaryColor,
onSecondary: const Color(0xFF0C1C58),
secondaryContainer: const Color(0xFF1A3C6C),
onSecondaryContainer: const Color(0xFFBACBFF),
onSecondary: const Color(0xFF3A0F22),
secondaryContainer: const Color(0xFF7A1F4E),
onSecondaryContainer: const Color(0xFFFAD5E5),
tertiary: tertiaryColor,
onTertiary: const Color(0xFF2B373F),
tertiaryContainer: const Color(0xFF1F2832),
onTertiaryContainer: const Color(0xFFA8B3C6),
onTertiary: const Color(0xFF0B2C46),
tertiaryContainer: const Color(0xFF14507A),
onTertiaryContainer: const Color(0xFFD6EAF6),
error: errorColor,
onError: const Color(0xFFB71919),
errorContainer: const Color(0xFFC53636),
onErrorContainer: const Color(0xFFFFDAD6),
surface: surfaceColor,
onSurface: const Color(0xFFD7E2F7),
surfaceDim: const Color(0xFF0F1A36),
onSurfaceVariant: const Color(0xFF8C9FBB),
surfaceContainerLowest: Color(0xFF171C30),
surfaceContainerLow: Color(0xFF2D385C),
surfaceContainer: Color(0xFF24335B),
surfaceContainerHigh: Color(0xFF2A3E73),
surfaceContainerHighest: Color(0xFF334C8C),
outline: const Color(0xFF9EACC1),
outlineVariant: const Color(0xFF2A3E73),
onSurface: const Color(0xFFE0F0E8),
surfaceDim: const Color(0xFF06150C),
onSurfaceVariant: const Color(0xFF9BB5A6),
surfaceContainerLowest: Color(0xFF06150C),
surfaceContainerLow: Color(0xFF112A1D),
surfaceContainer: Color(0xFF173524),
surfaceContainerHigh: Color(0xFF1F4530),
surfaceContainerHighest: Color(0xFF2A5840),
outline: const Color(0xFF8AAA98),
outlineVariant: const Color(0xFF1F4530),
);
static const String fontFamily = 'Wix Madefor Text';
@override

View File

@@ -10,51 +10,56 @@ class LightTheme extends MaterialThemeBase {
@override
ThemeMode get themeMode => ThemeMode.light;
// Hash Wallet palette:
// - Primary: brand green (#1A5C38)
// - Secondary: Such Software pink (#B83278)
// - Tertiary: Such Software blue (#1F7DBF)
// - Surface: very light minty bg (#F2F8F4)
@override
Color get primaryColor => const Color(0xFF4EBEFF);
Color get primaryColor => const Color(0xFF1A5C38);
@override
Color get secondaryColor => const Color(0xFF625C64);
Color get secondaryColor => const Color(0xFFB83278);
@override
Color get tertiaryColor => const Color(0xFFBFCBDE);
Color get tertiaryColor => const Color(0xFF1F7DBF);
@override
Color get errorColor => const Color(0xFFBA1A1A);
@override
Color get surfaceColor => const Color(0xFFEFEFF8);
Color get surfaceColor => const Color(0xFFF2F8F4);
@override
ColorScheme get colorScheme => ColorScheme.light(
primary: primaryColor,
onPrimary: const Color(0xFFFFFFFF),
primaryContainer: const Color(0xFF403747),
onPrimaryContainer: const Color(0xFFD5C8DC),
primaryContainer: const Color(0xFFC7E5D2),
onPrimaryContainer: const Color(0xFF0B1F14),
secondary: secondaryColor,
onSecondary: const Color(0xFFFFFFFF),
secondaryContainer: const Color(0xFFE1E4EA),
onSecondaryContainer: const Color(0xFF4C474E),
secondaryContainer: const Color(0xFFF9D6E5),
onSecondaryContainer: const Color(0xFF4A0E2C),
tertiary: tertiaryColor,
onTertiary: const Color(0xFFFFFFFF),
tertiaryContainer: const Color(0xFF35404A),
onTertiaryContainer: const Color(0xFFC5D7E5),
tertiaryContainer: const Color(0xFFD6EAF6),
onTertiaryContainer: const Color(0xFF0B2C46),
error: errorColor,
onError: const Color(0xFFFFFFFF),
errorContainer: const Color(0xFFFFBDBD),
onErrorContainer: const Color(0xFFE43D3D),
surface: surfaceColor,
surfaceDim: const Color(0xFFE7E7FD),
onSurface: const Color(0xFF312938),
onSurfaceVariant: const Color(0xFF6C6772),
surfaceContainerLowest: Color(0xFFE4E4E4),
surfaceContainerLow: Color(0xFFECECED),
surfaceContainer: Color(0xFFFBFBFD),
surfaceContainerHigh: Color(0xFFFDFDFE),
surfaceDim: const Color(0xFFDDEBE3),
onSurface: const Color(0xFF0B1F14),
onSurfaceVariant: const Color(0xFF5A6B61),
surfaceContainerLowest: Color(0xFFE2EEE7),
surfaceContainerLow: Color(0xFFEAF2EC),
surfaceContainer: Color(0xFFF5FAF6),
surfaceContainerHigh: Color(0xFFFAFDFB),
surfaceContainerHighest: Color(0xFFFFFFFF),
onInverseSurface: Color(0xFFFAFAFA),
outline: const Color(0xFF7B757C),
outlineVariant: const Color(0xFFEDEDF6),
outline: const Color(0xFF6F857A),
outlineVariant: const Color(0xFFD9E6DE),
);
@override

View File

@@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) {
if (use_header_bar) {
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
gtk_widget_show(GTK_WIDGET(header_bar));
gtk_header_bar_set_title(header_bar, "Cake Wallet");
gtk_header_bar_set_title(header_bar, "Hash Wallet");
gtk_header_bar_set_show_close_button(header_bar, TRUE);
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
} else {
gtk_window_set_title(window, "Cake Wallet");
gtk_window_set_title(window, "Hash Wallet");
}
if (getenv("DESKTOP_FORCE_MOBILE")) {
gtk_window_set_default_size(window, 720, 1280);