Browse Source

dark mode switcher

jqh 5 years ago
parent
commit
e530c76456

+ 9 - 1
resources/assets/dcat/sass/theme/_dark.scss

@@ -53,7 +53,7 @@ body.dark-mode {
     color: darken($white, 2.5%);
   }
 
-  .dcat-loading {
+  .dcat-loading:not(.layui-layer-shade) {
     background-color: inherit!important;
   }
 
@@ -689,4 +689,12 @@ body.dark-mode {
     }
   }
 
+  // ---- login
+  .login-page {
+    background-color: $body-dark-bg!important;
+  }
+  .login-card-body, .register-card-body {
+    background-color: $body-dark-color;
+    color: $body-dark-font-color
+  }
 }

File diff suppressed because it is too large
+ 0 - 0
resources/dist/dcat/css/dcat-app-blue-dark.css


File diff suppressed because it is too large
+ 0 - 0
resources/dist/dcat/css/dcat-app-blue-light.css


File diff suppressed because it is too large
+ 0 - 0
resources/dist/dcat/css/dcat-app-blue.css


File diff suppressed because it is too large
+ 0 - 0
resources/dist/dcat/css/dcat-app-green.css


File diff suppressed because it is too large
+ 0 - 0
resources/dist/dcat/css/dcat-app.css


+ 22 - 4
src/Layout/Asset.php

@@ -175,6 +175,11 @@ class Asset
      */
     public $script = [];
 
+    /**
+     * @var array
+     */
+    public $directScript = [];
+
     /**
      * css代码.
      *
@@ -500,13 +505,18 @@ class Asset
      * 设置js代码.
      *
      * @param string|array $script
+     * @param bool         $direct
      */
-    public function script($script)
+    public function script($script, bool $direct = false)
     {
         if (! $script) {
             return;
         }
-        $this->script = array_merge($this->script, (array) $script);
+        if ($direct) {
+            $this->directScript = array_merge($this->directScript, (array) $script);
+        } else {
+            $this->script = array_merge($this->script, (array) $script);
+        }
     }
 
     /**
@@ -631,6 +641,7 @@ class Asset
     public function scriptToHtml()
     {
         $script = implode(';', array_unique($this->script));
+        $directScript = implode(';', array_unique($this->directScript));
 
         return <<<HTML
 <script data-exec-on-popstate>
@@ -640,8 +651,15 @@ Dcat.ready(function () {
     } catch (e) {
         console.error(e)
     }
- });
- </script>
+});
+(function () {
+    try {
+        {$directScript}
+    } catch (e) {
+        console.error(e)
+    }
+})()
+</script>
 HTML;
     }
 

+ 10 - 0
src/Layout/Navbar.php

@@ -4,6 +4,7 @@ namespace Dcat\Admin\Layout;
 
 use Dcat\Admin\Support\Helper;
 use Dcat\Admin\Traits\HasBuilderEvents;
+use Dcat\Admin\Widgets\DarkModeSwitcher;
 use Illuminate\Contracts\Support\Htmlable;
 use Illuminate\Contracts\Support\Renderable;
 
@@ -26,6 +27,8 @@ class Navbar implements Renderable
             'right' => collect(),
         ];
 
+        $this->addDefaultElements();
+
         $this->callResolving();
     }
 
@@ -53,6 +56,13 @@ class Navbar implements Renderable
         return $this;
     }
 
+    protected function addDefaultElements()
+    {
+        if (config('admin.layout.dark_mode_switch')) {
+            $this->right((new DarkModeSwitcher())->render());
+        }
+    }
+
     /**
      * @param string $part
      *

+ 3 - 2
src/Traits/HasAssets.php

@@ -105,12 +105,13 @@ trait HasAssets
 
     /**
      * @param string $script
+     * @param bool   $direct
      *
      * @return void
      */
-    public static function script($script)
+    public static function script($script, bool $direct = false)
     {
-        static::asset()->script($script);
+        static::asset()->script($script, $direct);
     }
 
     /**

+ 95 - 0
src/Widgets/DarkModeSwitcher.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace Dcat\Admin\Widgets;
+
+use Dcat\Admin\Admin;
+use Illuminate\Contracts\Support\Renderable;
+use Illuminate\Support\Str;
+
+class DarkModeSwitcher implements Renderable
+{
+    public $defaultDarkMode = false;
+
+    public function __construct(?bool $defaultDarkMode = null)
+    {
+        $this->defaultDarkMode = is_null($defaultDarkMode) ? Str::contains(config('admin.layout.body_class'), 'dark-mode') : $defaultDarkMode;
+    }
+
+    public function render()
+    {
+        $icon = $this->defaultDarkMode ? 'icon-sun' : 'icon-moon';
+
+        $this->addScript();
+        $this->addStyle();
+
+        return <<<HTML
+<span class="dark-mode-switcher">
+    <i class="feather {$icon}"></i>
+</span>
+HTML;
+    }
+
+    protected function addStyle()
+    {
+        Admin::style('.dark-mode-switcher{font-size: 1.5rem;cursor: pointer}');
+    }
+
+    protected function addScript()
+    {
+        $default = $this->defaultDarkMode ? 'true' : 'false';
+        $darkSidebar = config('admin.layout.sidebar_dark') ? 'true' : 'false';
+
+        $script =
+            <<<JS
+(function() {
+    var storage = localStorage || {setItem:function () {}, getItem: function () {}},
+        key = 'dcat-admin-theme-mode',
+        mode = storage.getItem(key),
+        body = $('body'),
+        sidebar = $('.main-menu .main-sidebar'),
+        icon = $('.dark-mode-switcher i');
+        darkSidebar = {$darkSidebar},
+        defaultDark = {$default};
+    
+    function switchMode(dark) {
+        if (dark) {
+            body.addClass('dark-mode');
+            sidebar.removeClass('sidebar-light-primary').addClass('sidebar-dark-white');
+            icon.addClass('icon-sun').removeClass('icon-moon');
+            
+            return;
+        }
+        
+        body.removeClass('dark-mode');
+        icon.removeClass('icon-sun').addClass('icon-moon');
+        if (! darkSidebar) {
+            sidebar.addClass('sidebar-light-primary').removeClass('sidebar-dark-white');
+        }
+    }
+    
+    if (mode === 'dark' || (! mode && defaultDark)) {
+        switchMode(true);
+    } else if (mode === 'def') {
+        switchMode(false)
+    }
+    
+    $('.dark-mode-switcher').off('click').on('click', function () {
+        icon.toggleClass('icon-sun icon-moon');
+        
+        if (icon.hasClass('icon-moon')) {
+            switchMode(false);
+            
+            storage.setItem(key, 'def');
+            
+        } else {
+            storage.setItem(key, 'dark');
+            
+            switchMode(true)
+        }
+    })
+})()
+JS;
+
+        Admin::script($script, true);
+    }
+}

Some files were not shown because too many files changed in this diff