Skip to content

ollm/cordova-plugin-dynamic-color

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cordova-plugin-dynamic-color

cordova-dynamic-color

The DynamicColor object provides some functions to obtain current dynamic color palette/colors in Android 12+ and dark theme status in Android 9+.

Table of Contents

Installation

cordova plugin add cordova-plugin-dynamic-color

Methods

This plugin defines global DynamicColor object.

Although in the global scope, it is not available until after the deviceready event.

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady()
{
    console.log(DynamicColor);
}

Simple example of plugin usage

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady()
{
	DynamicColor.isDynamicColorAvailable(function(available) {

		if(available) {

			getDynamicColor();

			document.addEventListener('dynamicColorChange', getDynamicColor);
		}

	});

}

function getDynamicColor() {

	DynamicColor.colors(function(colors) {

		DynamicColor.colorsToDom(DynamicColor.tintSurfaceColors(colors.dayNight));

	});

	// Optional palette colors
	DynamicColor.palette(function(colors) {

		DynamicColor.paletteToDom(colors.palette);

	});

}
.myAppStyle
{
	color: var(--md-sys-color-primary);
	background: var(--md-ref-palette-neutral-variant95);
}

DynamicColor.isDynamicColorAvailable

Check if the DynamicColor its available in current Android device.

DynamicColor.isDynamicColorAvailable(function(available) {

	if(available) {

	}

});

DynamicColor.dayNight

Check current DayNight theme (check if dark theme is on or off).

DynamicColor.dayNight(function(theme) {

	if(theme == 'light') {

	} else { // theme == 'dark'

	}

});

DynamicColor.colors

Return the DynamicColor colors

DynamicColor.colors(function(colors) {

	colors = {
		theme: 'light', // 'light' or 'dark'
		light: {
			primary: '#8D4E2A',
			onPrimary: '#FFFFFF',
			primaryContainer: '#331100',
			onPrimaryContainer: '#000000',
			secondary: '#765848',
			onSecondary: '#FFFFFF',
			secondaryContainer: '#FFDBCA',
			onSecondaryContainer: '#2B160A',
			tertiary: '#646032',
			onTertiary: '#FFFFFF',
			tertiaryContainer: '#1E1C00',
			onTertiaryContainer: '#000000',
			error: '#B3261E',
			onError: '#FFFFFF',
			errorContainer: '#F9DEDC',
			onErrorContainer: '#410E0B',
			outline: '#84736A',
			background: '#FFFBFF',
			onBackground: '#201A17',
			surface: '#FFFBFF',
			onSurface: '#201A17',
			surfaceVariant: '#F4DED4',
			onSurfaceVariant: '#52443D',
			inverseSurface: '#362F2C',
			inverseOnSurface: '#FBEEE9',
			inversePrimary: '#FFB68F',
			shadow: '#000000',
			surfaceTint: '#000000',
			outlineVariant: '#D7C2B9',
			scrim: '#000000',
		},
		dark: {
			...
		}
		dayNight: {
			...
		}
	}

});

DynamicColor.palette

Return the DynamicColor palette

DynamicColor.palette(function(colors) {

	colors = {
		theme: 'light', // 'light' or 'dark'
		palette: {
			error0: '#000000',
			error10: '#410E0B',
			error20: '#601410',
			error30: '#8C1D18',
			error40: '#B3261E',
			error50: '#DC362E',
			error60: '#E46962',
			error70: '#EC928E',
			error80: '#F2B8B5',
			error90: '#F9DEDC',
			error95: '#FCEEEE',
			error99: '#FFFBF9',
			error100: '#FFFFFF',
			neutral0: '#000000',
			neutral10: '#201A17',
			neutral20: '#362F2C',
			neutral30: '#4D4542',
			neutral40: '#655D59',
			neutral50: '#7D7470',
			neutral60: '#998F8A',
			neutral70: '#B4A9A4',
			neutral80: '#D0C4BF',
			neutral90: '#ECE0DB',
			neutral95: '#FBEEE9',
			neutral99: '#FFFBFF',
			neutral100: '#FFFFFF',
			neutralVariant0: '#000000',
			neutralVariant10: '#241913',
			neutralVariant20: '#3B2E27',
			neutralVariant30: '#52443D',
			neutralVariant40: '#6B5B53',
			neutralVariant50: '#84736A',
			neutralVariant60: '#9F8D84',
			neutralVariant70: '#BBA79E',
			neutralVariant80: '#D7C2B9',
			neutralVariant90: '#F4DED4',
			neutralVariant95: '#FFEDE6',
			neutralVariant99: '#FFFBFF',
			neutralVariant100: '#FFFFFF',
			primary0: '#000000',
			primary10: '#331100',
			primary20: '#532201',
			primary30: '#703715',
			primary40: '#8D4E2A',
			primary50: '#A9653F',
			primary60: '#C87F56',
			primary70: '#E7996E',
			primary80: '#FFB68F',
			primary90: '#FFDBCA',
			primary95: '#FFEDE6',
			primary99: '#FFFBFF',
			primary100: '#FFFFFF',
			secondary0: '#000000',
			secondary10: '#2B160A',
			secondary20: '#432B1D',
			secondary30: '#5C4132',
			secondary40: '#765848',
			secondary50: '#906F5E',
			secondary60: '#AC8978',
			secondary70: '#C9A391',
			secondary80: '#E6BEAB',
			secondary90: '#FFDBCA',
			secondary95: '#FFEDE6',
			secondary99: '#FFFBFF',
			secondary100: '#FFFFFF',
			tertiary0: '#000000',
			tertiary10: '#1E1C00',
			tertiary20: '#343108',
			tertiary30: '#4B481D',
			tertiary40: '#646032',
			tertiary50: '#7C7847',
			tertiary60: '#97925F',
			tertiary70: '#B2AD78',
			tertiary80: '#CEC891',
			tertiary90: '#EBE4AA',
			tertiary95: '#F9F3B8',
			tertiary99: '#FFFBFF',
			tertiary100: '#FFFFFF'
		}
	}

});

DynamicColor.tintColors

Apply the tint according to Material Design Guidelines, you can also use css color-mix to mix the surface with tint (color-mix(in srgb, var(--md-sys-color-on-surface), var(--md-sys-color-on-surface-tint) 5%)), but currently it's not supported for many browsers.

var colors = DynamicColor.tintColors(colors.light, Array onlyKeys = false);

colors = {
	surface: '#FFFBFF',
	surface1: '#f9f2f4',
	surface2: '#f6edee',
	surface3: '#f2e8e8',
	surface4: '#f1e6e5',
	surface5: '#efe3e1',
	...
}

/*
--md-sys-color-surface: #FFFBFF;
--md-sys-color-surface1: #f9f2f4;
--md-sys-color-surface2: #f6edee;
--md-sys-color-surface3: #f2e8e8;
--md-sys-color-surface4: #f1e6e5;
--md-sys-color-surface5: #efe3e1;
...
*/
  • onlyKeys Keys to generate tint versions, by default all keys.

DynamicColor.tintSurfaceColors

Same as above code, but only applies to surfaces (Including background).

var colors = DynamicColor.tintSurfaceColors(colors.light);

colors = {
	surface: '#FFFBFF',
	surface1: '#f9f2f4',
	surface2: '#f6edee',
	surface3: '#f2e8e8',
	surface4: '#f1e6e5',
	surface5: '#efe3e1',
	...
}

/*
--md-sys-color-surface: #FFFBFF;
--md-sys-color-surface1: #f9f2f4;
--md-sys-color-surface2: #f6edee;
--md-sys-color-surface3: #f2e8e8;
--md-sys-color-surface4: #f1e6e5;
--md-sys-color-surface5: #efe3e1;
...
*/

DynamicColor.mixColor

Mix two colors to one acording a amount.

DynamicColor.mixColor(String color1, String color2, Float amount);
  • amount Amount, from 0.0 to 1.0

DynamicColor.mixColorElevation

Mix two colors to one acording a Material Design Guidelines Elevation.

DynamicColor.mixColorElevation(String color1, String color2, Int elevation);
  • elevation Elevation, from 1 to 5.

DynamicColor.colorsToCssVars

Convert the colors object to css vars.

DynamicColor.colors(function(colors) {

	var cssVars = DynamicColor.colorsToCssVars(colors.light, String prefix = '--md-sys-color');

	/*
	--md-sys-color-primary: #8D4E2A;
	--md-sys-color-on-primary: #FFFFFF;
	...
	*/

}

DynamicColor.paletteToCssVars

Convert the palette object to css vars.

DynamicColor.palette(function(colors) {

	var cssVars = DynamicColor.paletteToCssVars(colors.palette, String prefix = '--md-ref-palette');

	/*
	--md-ref-palette-error0: #000000;
	--md-ref-palette-error10: #410E0B;
	...
	*/

}

DynamicColor.colorsToDom

Convert the colors object to css vars and insert/update it in the dom.

DynamicColor.colors(function(colors) {

	DynamicColor.colorsToDom(colors.dark, String prefix = '--md-sys-color');

}

DynamicColor.paletteToDom

Convert the palette object to css vars and insert/update it in the dom.

DynamicColor.palette(function(colors) {

	DynamicColor.paletteToDom(colors.palette, String prefix = '--md-ref-palette');

}

Events

dynamicColorChange

This event is fired when any change in DayNight or DynamiColor (or both at the same time) is detected.

document.addEventListener('dynamicColorChange', function(event) {

	event.changed = {
		dayNight: true, // true if the DayNight theme have changed (dark theme turned on or off)
		dynamicColor: true, // true if the DynamiColor colors/palette have changed
	}

	if(event.changed.dayNight) {

		DynamicColor.dayNight(function(theme) {

			if(theme == 'light') {

			} else { // theme == 'dark'

			}

		});

	}

	if(event.changed.dynamicColor) {
		getDynamicColor();
	}

});