improve context menu item text fill on dark theme for default split menu buttons
What changed, and why it matters
This commit is a purely cosmetic fix for the Sparrow Wallet desktop application. It makes sure that when using the dark theme, the text on menu items attached to certain default-style buttons is colored white so it remains readable. There is no security issue here.
No security action required. Treat as a normal UI/theme fix.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change refactors how the ‘default-button’ CSS style class is applied to SplitMenuButton controls and their associated MenuItems. Previously only the button’s label received the white text-fill styling in darktheme.css. The new setDefaultButton() helper applies the style class to existing and dynamically added MenuItems, and the CSS selector is updated to target .menu-item.default-button > .label as well. This is a UI/theming consistency fix.
Changed components
src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.javasrc/main/resources/com/sparrowwallet/sparrow/darktheme.cssCodexKeystoreImportPane.javaDevicePane.javaMnemonicKeystoreImportPane.javaMnemonicShareKeystoreImportPane.javaXprvKeystoreImportPane.javaInspect captured patch +25 / −8
diff --git a/src/main/java/com/sparrowwallet/sparrow/control/CodexKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/CodexKeystoreImportPane.java
index cd5d390..deaf96c 100644
--- a/src/main/java/com/sparrowwallet/sparrow/control/CodexKeystoreImportPane.java
+++ b/src/main/java/com/sparrowwallet/sparrow/control/CodexKeystoreImportPane.java
@@ -97,7 +97,7 @@ public class CodexKeystoreImportPane extends TitledDescriptionPane {
importButton = new SplitMenuButton();
importButton.setAlignment(Pos.CENTER_RIGHT);
importButton.setText("Import Keystore");
- importButton.getStyleClass().add("default-button");
+ setDefaultButton(importButton);
importButton.setOnAction(event -> {
importButton.setDisable(true);
importKeystore(getDefaultDerivation());
diff --git a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java
index e4137a9..0a5d98c 100644
--- a/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java
+++ b/src/main/java/com/sparrowwallet/sparrow/control/DevicePane.java
@@ -519,7 +519,7 @@ public class DevicePane extends TitledDescriptionPane {
SplitMenuButton sendPassphraseButton = new SplitMenuButton();
sendPassphraseButton.setText("Send Passphrase");
- sendPassphraseButton.getStyleClass().add("default-button");
+ setDefaultButton(sendPassphraseButton);
sendPassphraseButton.setOnAction(event -> {
setExpanded(false);
setDescription("Confirm passphrase on device...");
@@ -1124,7 +1124,7 @@ public class DevicePane extends TitledDescriptionPane {
private void showOperationButton() {
if(deviceOperation.equals(DeviceOperation.IMPORT)) {
if(defaultDevice) {
- importButton.getStyleClass().add("default-button");
+ setDefaultButton(importButton);
}
importButton.setVisible(true);
showHideLink.setText("Show derivation...");
@@ -1148,7 +1148,7 @@ public class DevicePane extends TitledDescriptionPane {
showHideLink.setVisible(false);
} else if(deviceOperation.equals(DeviceOperation.GET_PRIVATE_KEY)) {
if(defaultDevice) {
- getPrivateKeyButton.getStyleClass().add("default-button");
+ setDefaultButton(getPrivateKeyButton);
}
getPrivateKeyButton.setVisible(true);
showHideLink.setVisible(false);
diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java
index 2372ab3..8ef0854 100644
--- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java
+++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicKeystoreImportPane.java
@@ -58,7 +58,7 @@ public class MnemonicKeystoreImportPane extends MnemonicKeystorePane {
importButton = new SplitMenuButton();
importButton.setAlignment(Pos.CENTER_RIGHT);
importButton.setText("Import Keystore");
- importButton.getStyleClass().add("default-button");
+ setDefaultButton(importButton);
importButton.setOnAction(event -> {
importButton.setDisable(true);
importKeystore(getDefaultDerivation(), false);
diff --git a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java
index 906659b..a3885f1 100644
--- a/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java
+++ b/src/main/java/com/sparrowwallet/sparrow/control/MnemonicShareKeystoreImportPane.java
@@ -196,7 +196,7 @@ public class MnemonicShareKeystoreImportPane extends MnemonicKeystorePane {
importButton = new SplitMenuButton();
importButton.setAlignment(Pos.CENTER_RIGHT);
importButton.setText("Import Keystore");
- importButton.getStyleClass().add("default-button");
+ setDefaultButton(importButton);
importButton.setOnAction(event -> {
importButton.setDisable(true);
importKeystore(getDefaultDerivation(), false);
diff --git a/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java b/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java
index 84f8c24..2882cc2 100644
--- a/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java
+++ b/src/main/java/com/sparrowwallet/sparrow/control/TitledDescriptionPane.java
@@ -5,6 +5,7 @@ import com.sparrowwallet.drongo.wallet.Wallet;
import com.sparrowwallet.drongo.wallet.WalletModel;
import com.sparrowwallet.sparrow.AppServices;
import javafx.application.Platform;
+import javafx.collections.ListChangeListener;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
@@ -182,6 +183,22 @@ public class TitledDescriptionPane extends TitledPane {
});
}
+ protected static void setDefaultButton(ButtonBase button) {
+ button.getStyleClass().add("default-button");
+ if(button instanceof SplitMenuButton splitMenuButton) {
+ for(MenuItem item : splitMenuButton.getItems()) {
+ item.getStyleClass().add("default-button");
+ }
+ splitMenuButton.getItems().addListener((ListChangeListener<MenuItem>) c -> {
+ while(c.next()) {
+ for(MenuItem item : c.getAddedSubList()) {
+ item.getStyleClass().add("default-button");
+ }
+ }
+ });
+ }
+ }
+
protected static int getAccount(Wallet wallet, KeyDerivation requiredDerivation) {
if(wallet == null || requiredDerivation == null) {
return 0;
diff --git a/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java b/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java
index e7c15ba..06a16eb 100644
--- a/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java
+++ b/src/main/java/com/sparrowwallet/sparrow/control/XprvKeystoreImportPane.java
@@ -79,7 +79,7 @@ public class XprvKeystoreImportPane extends TitledDescriptionPane {
importButton = new SplitMenuButton();
importButton.setAlignment(Pos.CENTER_RIGHT);
importButton.setText("Import Keystore");
- importButton.getStyleClass().add("default-button");
+ setDefaultButton(importButton);
importButton.setOnAction(event -> {
importButton.setDisable(true);
importKeystore(getDefaultDerivation());
diff --git a/src/main/resources/com/sparrowwallet/sparrow/darktheme.css b/src/main/resources/com/sparrowwallet/sparrow/darktheme.css
index c7d721a..477a769 100644
--- a/src/main/resources/com/sparrowwallet/sparrow/darktheme.css
+++ b/src/main/resources/com/sparrowwallet/sparrow/darktheme.css
@@ -38,7 +38,7 @@
-fx-base: -fx-default-button;
}
-.split-menu-button.default-button > .label {
+.split-menu-button.default-button > .label, .menu-item.default-button > .label {
-fx-text-fill: white;
}
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.