Features
- Automatically enables Android's EdgeToEdge StatusBar and NavigationBar Styling
- Access MaterialYou Dynamic Color Palette
- Change Status Bar and Navigation Bar Color
- Access Window Insets to align EdgeToEdge layout correctly
Install
Install the Core plugin by adding the following to your Cargo.toml file:
src-tauri/Cargo.toml
# via crates.io
[]
= "0.2.2"
# or directly
[]
= { = "https://github.com/0xk1f0/tauri-plugin-m3" }
And then install the JavaScript Guest bindings like this:
# via npmjs.org
# or directly
Usage
First you need to register the core plugin with Tauri:
src-tauri/src/main.rs
Then set the default permissions for the plugin:
src-tauri/capabilities/default.json
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
import { M3 } from "tauri-plugin-m3";
// get the full material color palette
// choose either "dark", "light" or "system" (default)
let colorScheme = await M3.getColors("system");
console.log(colorScheme.primary); // "#F4F678FF"
// apply colors to CSS variables
// choose either "dark", "light" or "system" (default)
let isSuccess = await M3.applyColors("light");
console.log(isSuccess); // "true"
// get insets for compensating EdgeToEdge display
// either already scale compensated or raw
let deviceInsets = await M3.getInsets();
console.log(deviceInsets.adjustedInsetTop); // f.E. 96
// set the status and navigation bar color
// choose either "dark", "light" or "system" (default)
let isSuccess = await M3.setBarColor("dark");
console.log(isSuccess); // "true"
The following colors are available
type ColorScheme = {
primary?: string;
onPrimary?: string;
primaryContainer?: string;
onPrimaryContainer?: string;
inversePrimary?: string;
secondary?: string;
onSecondary?: string;
secondaryContainer?: string;
onSecondaryContainer?: string;
tertiary?: string;
onTertiary?: string;
tertiaryContainer?: string;
onTertiaryContainer?: string;
background?: string;
onBackground?: string;
surface?: string;
onSurface?: string;
surfaceVariant?: string;
onSurfaceVariant?: string;
inverseSurface?: string;
inverseOnSurface?: string;
outline?: string;
};
Transparent Navigation Bar
To get a fully transaprent navigation bar, add the following in your app
src-tauri/gen/android/app/src/main/res/values/themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.stority" parent="Theme.MaterialComponents.DayNight.NoActionBar">
+ <item name="android:enforceNavigationBarContrast">false</item>
+ <item name="android:enforceStatusBarContrast">false</item>
</style>
</resources>
Global Theming
We can implement automatic global theming of our app via defining a fallback theme in our primary CSS file first
styles.css
}
Then initialize our colors when our app loads for the first time, f.E. in Svelte's onMount()
App.svelte
Hello World
This will ensure that our MaterialYou colors get loaded into our predefined CSS variables, but also provides a fallback theme.
Of course this is only one way to do it, feel free to use this plugin like you want! :)
Credits and Thanks
- plugins-workspace - For showing me how to build Tauri Plugins