LCOV - code coverage report
Current view: top level - pkg/lib - cockpit-dark-theme.ts Coverage Total Hit
Test: cockpit Lines: 100.0 % 41 41
Test Date: 2026-07-17 14:32:59

            Line data    Source code
       1              : /*
       2              :  * Copyright (C) 2022 Red Hat, Inc.
       3              :  * SPDX-License-Identifier: LGPL-2.1-or-later
       4              :  */
       5              : 
       6          727 : function debug(...args: unknown[]) {
       7          131 :     if (window.debugging == "all" || window.debugging?.includes("style")) {
       8          131 :         console.debug([`cockpit-dark-theme: ${document.documentElement.id}:`, ...args].join(" "));
       9          131 :     }
      10          727 : }
      11              : 
      12          727 : function changeDarkThemeClass(documentElement: Element, dark_mode: boolean) {
      13          133 :     debug(`Setting cockpit theme to ${dark_mode ? "dark" : "light"}`);
      14              : 
      15          133 :     if (dark_mode) {
      16          133 :         documentElement.classList.add('pf-v6-theme-dark');
      17          133 :     } else {
      18          727 :         documentElement.classList.remove('pf-v6-theme-dark');
      19          727 :     }
      20          727 : }
      21              : 
      22          727 : function _setDarkMode(_style?: string) {
      23          727 :     const style = _style || localStorage.getItem('shell:style') || 'auto';
      24          727 :     let dark_mode;
      25              :     // If a user set's an explicit theme, ignore system changes.
      26          133 :     if ((window.matchMedia?.('(prefers-color-scheme: dark)').matches && style === "auto") || style === "dark") {
      27          133 :         dark_mode = true;
      28          133 :     } else {
      29          727 :         dark_mode = false;
      30          727 :     }
      31          727 :     changeDarkThemeClass(document.documentElement, dark_mode);
      32          727 : }
      33              : 
      34          236 : window.addEventListener("storage", event => {
      35           25 :     if (event.key === "shell:style") {
      36           25 :         debug(`Storage element 'shell:style' changed from  ${event.oldValue} to ${event.newValue}`);
      37              : 
      38           25 :         _setDarkMode();
      39           25 :     }
      40          236 : });
      41              : 
      42              : // When changing the theme from the shell switcher the localstorage change will not fire for the same page (aka shell)
      43              : // so we need to listen for the event on the window object.
      44            1 : window.addEventListener("cockpit-style", event => {
      45            1 :     if (event instanceof CustomEvent) {
      46            1 :         const style = event.detail.style;
      47            1 :         debug(`Event received from shell with 'cockpit-style'  ${style}`);
      48              : 
      49            1 :         _setDarkMode(style);
      50            1 :     }
      51            1 : });
      52              : 
      53            2 : window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
      54            2 :     debug(`Operating system theme preference changed to ${window.matchMedia?.('(prefers-color-scheme: dark)').matches ? "dark" : "light"}`);
      55            2 :     _setDarkMode();
      56            2 : });
      57              : 
      58          727 : _setDarkMode();
        

Generated by: LCOV version 2.0-1