/**
* Extra functions related to dark mode.
*/
class Bunyad_Theme_DarkMode
{
public function __construct()
{
add_action('bunyad_theme_init', [$this, 'init']);
}
public function init()
{
add_action('wp_head', [$this, 'add_js']);
// Add the root class.
add_filter('bunyad_html_root_class', [$this, 'add_root_class']);
}
/**
* This CANNOT be an enqueue as it's required inline early as possible. Otherwise
* the dark mode will have a flash of light mode.
*/
public function add_js()
{
if (Bunyad::amp()->active()) {
return;
}
$scheme_key = apply_filters('bunyad_scheme_store_key', 'bunyad-scheme');
// Auto-detection for dark mode.
$auto_detect = '';
if (Bunyad::options()->color_scheme_detect) {
$auto_detect = "
if (!scheme && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
scheme ='dark';
d.dataset.autoDark = 1;
}
";
}
echo "
";
}
/**
* Filter callback: Add scheme classes for the HTML root element.
*
* @param string $classes
* @return string
*/
public function add_root_class($classes) {
$scheme_class = 's-light site-s-light';
if (Bunyad::options()->color_scheme === 'dark') {
$scheme_class = 's-dark site-s-dark';
}
if ($scheme_class) {
$classes .= $classes ? ' ' : '';
$classes .= $scheme_class;
}
return $classes;
}
}
// init and make available in Bunyad::get('dark_mode')
Bunyad::register('dark_mode', [
'class' => 'Bunyad_Theme_DarkMode',
'init' => true
]);