diff --git a/gui/default/assets/css/theme.css b/gui/default/assets/css/theme.css index e54b06517..c577564c4 100644 --- a/gui/default/assets/css/theme.css +++ b/gui/default/assets/css/theme.css @@ -7,29 +7,5 @@ */ -.panel-progress { - background: #3498db; -} - -.identicon rect { - fill: #333; -} - -.panel-warning .identicon rect { - fill: #fff; -} - -.li-column { - background-color: rgb(236, 240, 241); - border-radius: 3px; -} - -.panel-heading:hover, .panel-heading:focus { - text-decoration: none; -} - -.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title, -.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title { - color: black !important; - font-weight: lighter !important; -} +@import "/theme-assets/dark/assets/css/theme.css" screen and (prefers-color-scheme: dark); +@import "/theme-assets/light/assets/css/theme.css" (prefers-color-scheme: light), (prefers-color-scheme: no-preference); diff --git a/gui/default/syncthing/core/syncthingController.js b/gui/default/syncthing/core/syncthingController.js index 5d8b98780..6da3d8c34 100755 --- a/gui/default/syncthing/core/syncthingController.js +++ b/gui/default/syncthing/core/syncthingController.js @@ -389,6 +389,7 @@ angular.module('syncthing.core') }); refreshNoAuthWarning(); + setDefaultTheme(); if (!hasConfig) { $scope.$emit('ConfigLoaded'); @@ -651,6 +652,23 @@ angular.module('syncthing.core') $scope.remoteNeedDevice = undefined; } + + function setDefaultTheme() { + if (!document.getElementById("fallback-theme-css")){ + + // check if no support for prefers-color-scheme + var colorSchemeNotSupported = typeof window.matchMedia === "undefined" || window.matchMedia('(prefers-color-scheme: dark)').media === 'not all'; + + if ($scope.config.gui.theme === "default" && colorSchemeNotSupported) { + document.documentElement.style.display = 'none'; + document.head.insertAdjacentHTML( + 'beforeend', + '' + ); + } + } + } + function saveIgnores(ignores, cb) { $http.post(urlbase + '/db/ignores?folder=' + encodeURIComponent($scope.currentFolder.id), { ignore: ignores diff --git a/gui/light/assets/css/theme.css b/gui/light/assets/css/theme.css new file mode 100644 index 000000000..e54b06517 --- /dev/null +++ b/gui/light/assets/css/theme.css @@ -0,0 +1,35 @@ +/* +// Copyright (C) 2016 The Syncthing Authors. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at https://mozilla.org/MPL/2.0/. + +*/ + +.panel-progress { + background: #3498db; +} + +.identicon rect { + fill: #333; +} + +.panel-warning .identicon rect { + fill: #fff; +} + +.li-column { + background-color: rgb(236, 240, 241); + border-radius: 3px; +} + +.panel-heading:hover, .panel-heading:focus { + text-decoration: none; +} + +.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title, +.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title { + color: black !important; + font-weight: lighter !important; +} diff --git a/lib/api/api_statics.go b/lib/api/api_statics.go index ab939d198..719f211c4 100644 --- a/lib/api/api_statics.go +++ b/lib/api/api_statics.go @@ -23,6 +23,8 @@ import ( "github.com/syncthing/syncthing/lib/sync" ) +const themePrefix = "theme-assets/" + type staticsServer struct { assetDir string assets map[string][]byte @@ -91,6 +93,20 @@ func (s *staticsServer) serveAsset(w http.ResponseWriter, r *http.Request) { modificationTime := s.lastThemeChange s.mut.RUnlock() + // If path starts with special prefix, get theme and file from path + if strings.HasPrefix(file, themePrefix) { + path := file[len(themePrefix):] + i := strings.IndexRune(path, '/') + + if i == -1 { + http.NotFound(w, r) + return + } + + theme = path[:i] + file = path[i+1:] + } + // Check for an override for the current theme. if s.assetDir != "" { p := filepath.Join(s.assetDir, theme, filepath.FromSlash(file))