From 66edaa2737770742b6f306f7d157c71e2f4028b0 Mon Sep 17 00:00:00 2001 From: highlander Date: Sun, 12 Jul 2026 12:40:33 -0300 Subject: [PATCH] feat(btc-only): bitcoin-only branded connect splash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a bitcoin-only device is connected (firmwareVariant KeepKeyBTC/EmulatorBTC), the connect/loading splash brands itself bitcoin-only: orange logo glow, a ₿ mark + 'Bitcoin-Only KeepKey' label, and an orange status dot. Falls back to the normal KeepKey splash for multi-chain / unknown devices (isBitcoinOnly defaults false). Wired at the claimed / searching / loading-portfolio splash sites in App. --- projects/keepkey-vault/src/mainview/App.tsx | 9 ++++++-- .../src/mainview/components/SplashScreen.tsx | 22 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/projects/keepkey-vault/src/mainview/App.tsx b/projects/keepkey-vault/src/mainview/App.tsx index cc48995b..d6fa77da 100644 --- a/projects/keepkey-vault/src/mainview/App.tsx +++ b/projects/keepkey-vault/src/mainview/App.tsx @@ -13,6 +13,7 @@ import { MobilePanel } from "./components/MobilePanel" import { WalletConnectPanel } from "./components/WalletConnectPanel" import { FirmwareDropZone } from "./components/FirmwareDropZone" import { SplashScreen } from "./components/SplashScreen" +import { isBitcoinOnlyVariant } from "../shared/flags" import { DeviceGrid } from "./components/DeviceGrid" import { DeviceClaimedDialog } from "./components/DeviceClaimedDialog" import { LinuxUdevWarning } from "./components/LinuxUdevWarning" @@ -852,10 +853,13 @@ function App() { ) } + // Bitcoin-only firmware connected — brand the splash orange with a ₿ mark. + const splashBitcoinOnly = isBitcoinOnlyVariant(deviceState.firmwareVariant) + if (phase === "claimed") { return ( <>{splashNav}{resizeHandles}{updateBanner}{firmwareDropZone}{signingOverlay}{pairingOverlay}{passphraseOverlay}{charOverlay}{pinOverlay} - + @@ -883,6 +887,7 @@ function App() { variant={linuxUdevBlocked ? "error" : needsPin || needsPassphrase || isConnecting ? "connecting" : isError ? "error" : "searching"} childrenReady={linuxUdevBlocked ? true : gridReady} onLogoClick={linuxUdevBlocked || needsPin || needsPassphrase ? undefined : () => { rpcRequest("retryConnect").catch(() => {}) }} + isBitcoinOnly={splashBitcoinOnly} > {linuxUdevBlocked ? ( @@ -919,7 +924,7 @@ function App() { return ( <>{resizeHandles}{updateBanner}{incomingTxToast}{firmwareDropZone}{signingOverlay}{pairingOverlay}{passphraseOverlay}{charOverlay}{pinOverlay} {!portfolioLoaded && activeTab === "vault" && ( - + )} void + /** Bitcoin-only firmware connected — brand the splash orange with a ₿ mark. */ + isBitcoinOnly?: boolean } const STATUS_DOT_COLORS: Record, string> = { @@ -22,10 +24,11 @@ const STATUS_DOT_COLORS: Record, strin claimed: 'var(--teal)', } +const BTC_ORANGE = '#F7931A' const RETRY_HINT_DELAY_MS = 10_000 -export function SplashScreen({ statusText, hintText, children, variant = 'searching', childrenReady = false, onLogoClick }: SplashScreenProps) { - const dotColor = STATUS_DOT_COLORS[variant] +export function SplashScreen({ statusText, hintText, children, variant = 'searching', childrenReady = false, onLogoClick, isBitcoinOnly = false }: SplashScreenProps) { + const dotColor = isBitcoinOnly ? BTC_ORANGE : STATUS_DOT_COLORS[variant] const [showRetry, setShowRetry] = useState(false) // Show "Tap to retry" hint after 10s — only when there's a click handler and grid isn't ready @@ -81,11 +84,24 @@ export function SplashScreen({ statusText, hintText, children, variant = 'search + {isBitcoinOnly && !childrenReady && ( + + + + + + Bitcoin-Only KeepKey + + + )} {showRetry && !childrenReady && (