]> git.joonet.de Git - adminer.git/commitdiff
Plugins: Allow setting dark mode in css() (bug #1049)
authorJakub Vrana <jakub@vrana.cz>
Thu, 17 Apr 2025 14:57:28 +0000 (16:57 +0200)
committerJakub Vrana <jakub@vrana.cz>
Thu, 17 Apr 2025 14:58:58 +0000 (16:58 +0200)
CHANGELOG.md
adminer/include/adminer.inc.php
adminer/include/design.inc.php
editor/include/adminer.inc.php
plugins/designs.php

index e6d1948ced9b853b2d9ea057fb1385c15089491b..f08ebc39a6e85bc2ac115422b67143ce30637fd2 100644 (file)
@@ -5,8 +5,9 @@
 - PostgreSQL, CockroachDB: Creating partitioned tables (bug #1031)
 - PostgreSQL: Move partitioned tables from table list to parent table
 - PostgreSQL: Support calling functions returning table (bug #1040)
-- Designs: adminer.css with 'prefers-color-scheme: dark' don't disable dark mode
+- Designs: adminer.css with 'prefers-color-scheme: dark' doesn't disable dark mode
 - Plugins: Method bodyClass() to add &lt;body class>
+- Plugins: Allow setting dark mode in css()
 - Hindi translation
 
 ## Adminer 5.2.1 (released 2025-04-11)
index 1000711ec00745cd3f077ba045a6dbcf623b05f9..eb0338aba83729bf5251f33b4b0f8f56bce11236 100644 (file)
@@ -114,14 +114,18 @@ class Adminer {
        }
 
        /** Get URLs of the CSS files
-       * @return list<string>
+       * @return string[] key is URL, value is either 'light' (supports only light color scheme), 'dark' or '' (both)
        */
        function css(): array {
                $return = array();
                foreach (array("", "-dark") as $mode) {
                        $filename = "adminer$mode.css";
                        if (file_exists($filename)) {
-                               $return[] = "$filename?v=" . crc32(file_get_contents($filename));
+                               $file = file_get_contents($filename);
+                               $return["$filename?v=" . crc32($file)] = ($mode
+                                       ? "dark"
+                                       : (preg_match('~prefers-color-scheme:\s*dark~', $file) ? '' : 'light')
+                               );
                        }
                }
                return $return;
index d074ca21563ab6c22b5da0caa2a1b040e3cd891b..9f16c7c262360189f0542ffb1069f4da66b97819 100644 (file)
@@ -29,20 +29,11 @@ function page_header(string $title, string $error = "", $breadcrumb = array(), s
 <?php
 
        $css = adminer()->css();
-       $has_light = false;
-       $has_dark = false;
-       foreach ($css as $url) {
-               if (strpos($url, "adminer.css") !== false) {
-                       $has_light = true;
-                       $filename = preg_replace('~\?.*~', '', $url);
-                       if (!preg_match('~//~', $url) && is_readable($filename) && preg_match('~prefers-color-scheme:\s*dark~', file_get_contents($filename))) {
-                               $has_dark = true;
-                       }
-               }
-               if (strpos($url, "adminer-dark.css") !== false) {
-                       $has_dark = true;
-               }
+       if (is_int(key($css))) { // legacy return value
+               $css = array_fill_keys($css, 'light');
        }
+       $has_light = in_array('light', $css) || in_array('', $css);
+       $has_dark = in_array('dark', $css) || in_array('', $css);
        $dark = ($has_light
                ? ($has_dark ? null : false) // both styles - autoswitching, only adminer.css - light
                : ($has_dark ?: null) // only adminer-dark.css - dark, neither - autoswitching
@@ -60,8 +51,8 @@ function page_header(string $title, string $error = "", $breadcrumb = array(), s
                echo "<link rel='icon' href='data:image/gif;base64,R0lGODlhEAAQAJEAAAQCBPz+/PwCBAROZCH5BAEAAAAALAAAAAAQABAAAAI2hI+pGO1rmghihiUdvUBnZ3XBQA7f05mOak1RWXrNq5nQWHMKvuoJ37BhVEEfYxQzHjWQ5qIAADs='>\n";
                echo "<link rel='apple-touch-icon' href='../adminer/static/logo.png'>\n";
        }
-       foreach ($css as $val) {
-               echo "<link rel='stylesheet'" . (preg_match('~-dark\.~', $val) && !$dark ? $media : "") . " href='" . h($val) . "'>\n";
+       foreach ($css as $url => $mode) {
+               echo "<link rel='stylesheet'" . ($mode == 'dark' && !$dark ? $media : "") . " href='" . h($url) . "'>\n";
        }
        echo "\n<body class='" . lang('ltr') . " nojs";
        adminer()->bodyClass();
index 7aa478af9354d3b9e124440c2f2a334db14ec147..c66e5ceaa1d82166290839fdd8789e942c744ee9 100644 (file)
@@ -79,7 +79,11 @@ class Adminer {
                foreach (array("", "-dark") as $mode) {
                        $filename = "adminer$mode.css";
                        if (file_exists($filename)) {
-                               $return[] = "$filename?v=" . crc32(file_get_contents($filename));
+                               $file = file_get_contents($filename);
+                               $return["$filename?v=" . crc32($file)] = ($mode
+                                       ? "dark"
+                                       : (preg_match('~prefers-color-scheme:\s*dark~', $file) ? '' : 'light')
+                               );
                        }
                }
                return $return;
index 8b93ad3adb97d7a9c0daf8f648cf887cb660893e..318db8a9c9280cf4fdf85bec3372b2731010b3da 100644 (file)
@@ -27,7 +27,7 @@ class AdminerDesigns extends Adminer\Plugin {
        function css() {
                $return = array();
                if (array_key_exists($_SESSION["design"], $this->designs)) {
-                       $return[] = $_SESSION["design"];
+                       $return[$_SESSION["design"]] = (preg_match('~-dark~', $_SESSION["design"]) ? "dark" : "light");
                }
                return $return;
        }