Add AMOLED-style Black theme option#295
Merged
Merged
Conversation
ForeverFreed
force-pushed
the
feature/amoled-black-theme
branch
from
July 19, 2026 23:46
2de6686 to
0f00bb1
Compare
Adds a third app theme, Black, alongside Light and Dark, for OLED screens where a true-black background costs no backlight power. The scheme is a variant of the existing dark scheme with background, surface and the lowest container role painted pure black. Getting there meant fixing the M3 surface container ladders on both dark schemes: greyScheme had surfaceContainer set to the same colour as surface, and surfaceContainerHighest sitting *darker* than the page above it, so elevation read inverted and popups had no visible edge against their background. Both schemes now ascend cleanly from lowest to highest. That ladder is what components use to separate themselves from the page -- DropdownMenu paints itself surfaceContainer -- so no per-component styling is needed. The old `== Grey` menu special case in WatchesScreen is removed rather than generalised. Light theme is left alone: it separates menus via shadow elevation, which dark themes suppress. Also switches the Wispr logo and webview colour-scheme checks from an equality test against Grey to a theme-carried isDark flag, so Black picks the dark variant too. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ForeverFreed
force-pushed
the
feature/amoled-black-theme
branch
from
July 20, 2026 03:32
9e1e3a7 to
f0e1f67
Compare
Contributor
|
thanks @ForeverFreed! Keep in mind that as things change, we might not check them on this theme. If you notice any problems, please feel free to send another PR or mention the problem here. |
Contributor
Author
Thanks @ericmigi! I finally got my PT2 just today and can't wait to continue making this project the best it can be! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add AMOLED black theme
Adds a third app theme — Black — alongside Light and Dark, for OLED screens where a true-black background costs no backlight power.
Also fixes some minor readability issues with the original Dark theme, which would have carried over to the new Black theme (see below).
What you get
A new "Black" option in the app theme picker. It's the existing Dark scheme with
background,surface, and the lowest container role painted pure black.The interesting part: the surface ladder
Material 3 gives every scheme a ladder of container colours (
surfaceContainerLowest→surfaceContainerHighest) that components use to lift themselves off the page. ADropdownMenu, for example, paints itselfsurfaceContainer.Both dark schemes had a broken ladder when I first implemented this:
surfaceContainerwas set to the same colour assurface, so popups had almost no visible edge against the page behind them.surfaceContainerHighestwas darker than the page above it, so elevation read inverted.#333333page.Both ladders now ascend cleanly. Because the scheme carries the difference, components separate themselves correctly with no per-component styling — which is why this PR deletes the
== Greymenu special case inWatchesScreenrather than generalising it.Light theme is deliberately untouched: it separates menus via shadow elevation, which works on white. Dark themes suppress shadows, which is exactly why M3 uses tonal elevation there instead.
Theme-carried
isDarkCoreAppColorSchemenow carries anisDarkflag instead of callers testing== Grey. Two places were picking a dark asset by comparing against the Dark theme specifically, so Black got the wrong one: the Wispr Flow logo (rendered black-on-black) and the webview'sprefers-color-scheme. Both now follow the flag.Files
10 files, +121 / −51. The substance is in
util/src/commonMain/kotlin/theme/Theme.kt; most of the rest is one- to three-line touches.Testing
:composeApp:assembleDebug— passing:util:testDebugUnitTest— passing, including new coverage asserting both dark ladders ascend and that menu containers clear the page colourNot yet verified on iOS. The only iOS-side change is one deleted import in
PebbleWebview.ios.kt(isDarkbecame a member property, so it resolves without one). It could not be compiled locally::util:compileKotlinIosSimulatorArm64fails inlibpebble3on an unresolvedLibPebbleSwiftreference, which needspodInstalland reproduces on a clean checkout — pre-existing, unrelated to this change. Worth a build on macOS before merge.Worth a look when reviewing
The Dark theme ladder fix restyles the shipped Dark theme, not just the new Black one. It was unavoidable — the ladder is what makes menus work without per-component styling, so leaving Dark broken would have meant keeping the special case. Surfaces in Dark will look slightly different: containers now sit lighter than the page rather than darker.
Screenshots
Old vs. New Dark Theme, and New Black Theme
AI Disclosure
I used Claude (Sonnet 5 and Opus 4.8) to work on this feature. I am very new to Kotlin (but not coding in general), so using AI to help build out a maintainable new theme like this seemed appropriate. I am fully open to hearing out any changes you'd like to see before this is merged.