From 113bebed3b910070bb90c1e52c7246a40fb4ca78 Mon Sep 17 00:00:00 2001 From: zadam Date: Sun, 26 Sep 2021 15:24:37 +0200 Subject: [PATCH] switching themes via loading only specific CSS --- db/demo.zip | Bin 828322 -> 828335 bytes .../0185__migrate_black_theme_to_dark.sql | 2 + src/public/app/dialogs/options/appearance.js | 14 +- src/public/app/setup.js | 14 +- src/public/app/widgets/buttons/global_menu.js | 2 +- src/public/app/widgets/note_detail.js | 2 +- .../{themes.css => ckeditor-theme.css} | 176 ------------------ src/public/stylesheets/style.css | 33 ++++ src/public/stylesheets/theme-dark.css | 75 ++++++++ src/public/stylesheets/theme-light.css | 66 +++++++ src/routes/index.js | 24 ++- src/services/attributes.js | 13 -- src/views/desktop.ejs | 10 +- src/views/mobile.ejs | 5 +- src/views/setup.ejs | 15 +- 15 files changed, 219 insertions(+), 232 deletions(-) rename src/public/stylesheets/{themes.css => ckeditor-theme.css} (54%) create mode 100644 src/public/stylesheets/theme-dark.css create mode 100644 src/public/stylesheets/theme-light.css diff --git a/db/demo.zip b/db/demo.zip index 00ad7c5545b2f397f89c4c1315bbe5c7dd1bbf3b..958fa4be27899553d2f1ca4f7e66356d9e66e582 100644 GIT binary patch delta 23623 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 delta 23525 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Ð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 W1nt*che-Wy%9K>dmpFs_THQY|s)h^z diff --git a/db/migrations/0185__migrate_black_theme_to_dark.sql b/db/migrations/0185__migrate_black_theme_to_dark.sql index a785bb039..7285f6eb7 100644 --- a/db/migrations/0185__migrate_black_theme_to_dark.sql +++ b/db/migrations/0185__migrate_black_theme_to_dark.sql @@ -1,2 +1,4 @@ -- black theme has been removed, dark is closest replacement UPDATE options SET value = 'dark' WHERE name = 'theme' AND value = 'black'; + +UPDATE options SET value = 'light' WHERE name = 'theme' AND value = 'white'; diff --git a/src/public/app/dialogs/options/appearance.js b/src/public/app/dialogs/options/appearance.js index 874380025..31052c020 100644 --- a/src/public/app/dialogs/options/appearance.js +++ b/src/public/app/dialogs/options/appearance.js @@ -95,20 +95,12 @@ export default class ApperanceOptions { this.$detailFontSize = $("#detail-font-size"); this.$body = $("body"); - this.$themeSelect.on('change', () => { + this.$themeSelect.on('change', async () => { const newTheme = this.$themeSelect.val(); - this.toggleBodyClass("theme-", newTheme); + await server.put('options/theme/' + newTheme); - const noteId = $(this).find(":selected").attr("data-note-id"); - - if (noteId) { - // make sure the CSS is loaded - // if the CSS has been loaded and then updated then the changes won't take effect though - libraryLoader.requireCss(`api/notes/download/${noteId}`); - } - - server.put('options/theme/' + newTheme); + utils.reloadFrontendApp("theme change"); }); this.$zoomFactorSelect.on('change', () => { appContext.triggerCommand('setZoomFactorAndSave', {zoomFactor: this.$zoomFactorSelect.val()}); }); diff --git a/src/public/app/setup.js b/src/public/app/setup.js index d265888e6..b7df9ae72 100644 --- a/src/public/app/setup.js +++ b/src/public/app/setup.js @@ -23,19 +23,7 @@ function SetupModel() { this.password1 = ko.observable(); this.password2 = ko.observable(); - this.theme = ko.observable("white"); - this.theme.subscribe(function(newTheme) { - const $body = $("body"); - - for (const clazz of Array.from($body[0].classList)) { // create copy to safely iterate over while removing classes - if (clazz.startsWith("theme-")) { - $body.removeClass(clazz); - } - } - - $body.addClass("theme-" + newTheme); - }); - + this.theme = ko.observable("light"); this.syncServerHost = ko.observable(); this.syncProxy = ko.observable(); diff --git a/src/public/app/widgets/buttons/global_menu.js b/src/public/app/widgets/buttons/global_menu.js index a597a5458..f1d6c4d76 100644 --- a/src/public/app/widgets/buttons/global_menu.js +++ b/src/public/app/widgets/buttons/global_menu.js @@ -14,7 +14,7 @@ const TPL = ` } .global-menu-button { - background-image: url("images/icon-color.png"); + background-image: url("images/icon-black.png"); background-repeat: no-repeat; background-position: 50% 45%; width: 100%; diff --git a/src/public/app/widgets/note_detail.js b/src/public/app/widgets/note_detail.js index 3e50dd4ab..775f49349 100644 --- a/src/public/app/widgets/note_detail.js +++ b/src/public/app/widgets/note_detail.js @@ -229,7 +229,7 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { "libraries/katex/katex.min.css", "stylesheets/print.css", "stylesheets/relation_map.css", - "stylesheets/themes.css" + "stylesheets/ckeditor-theme.css" ], debug: true }); diff --git a/src/public/stylesheets/themes.css b/src/public/stylesheets/ckeditor-theme.css similarity index 54% rename from src/public/stylesheets/themes.css rename to src/public/stylesheets/ckeditor-theme.css index ad96cddf5..f1af43c98 100644 --- a/src/public/stylesheets/themes.css +++ b/src/public/stylesheets/ckeditor-theme.css @@ -1,143 +1,3 @@ -:root { - --main-font-family: MontserratLight; - --main-font-size: normal; - - --tree-font-family: MontserratLight; - --tree-font-size: normal; - - --detail-font-family: MontserratLight; - --detail-font-size: normal; - - --font-family-monospace: JetBrainsLight; - --detail-text-font-family: MontserratLight; - - --main-background-color: white; - --main-text-color: black; - --main-border-color: #ccc; - - --accented-background-color: #f5f5f5; - --more-accented-background-color: #ddd; - - --button-background-color: transparent; - --button-disabled-background-color: #ddd; - --button-border-color: #ddd; - --button-text-color: black; - --button-border-radius: 5px; - - --primary-button-background-color: #6c757d; - --primary-button-text-color: white; - --primary-button-border-color: #6c757d; - - --muted-text-color: #666; - - --input-text-color: black; - --input-background-color: transparent; - - --hover-item-text-color: black; - --hover-item-background-color: #ddd; - - --active-item-text-color: black; - --active-item-background-color: #ddd; - - --menu-text-color: black; - --menu-background-color: white; - - --modal-background-color: white; - --modal-backdrop-color: black; - - --left-pane-background-color: #F3F3F3; - --left-pane-text-color: #333; - - --launcher-pane-background-color: #F3F3F3; - --launcher-pane-text-color: #333; - - --active-tab-background-color: #ddd; - --active-tab-text-color: black; - - --inactive-tab-background-color: #f5f5f5; - --inactive-tab-text-color: #666; - - --scrollbar-border-color: #ddd; - --tooltip-background-color: #f8f8f8; - --link-color: blue; -} - -body.theme-dark { - --main-font-family: MontserratLight; - --main-font-size: normal; - - --tree-font-family: MontserratLight; - --tree-font-size: normal; - - --detail-font-family: MontserratLight; - --detail-font-size: normal; - - --font-family-monospace: JetBrainsLight; - --detail-text-font-family: MontserratLight; - - --main-background-color: #333; - --main-text-color: #ccc; - --main-border-color: #aaa; - - --accented-background-color: #555; - --more-accented-background-color: #777; - - --button-background-color: transparent; - --button-disabled-background-color: #222; - --button-border-color: #ccc; - --button-text-color: currentColor; - --button-border-radius: 5px; - - --primary-button-background-color: #888; - --primary-button-text-color: white; - --primary-button-border-color: #999; - - --muted-text-color: #bbb; - - --input-text-color: #ccc; - --input-background-color: #333; - - --hover-item-text-color: black; - --hover-item-background-color: #777; - - --active-item-text-color: black; - --active-item-background-color: #777; - - --menu-text-color: white; - --menu-background-color: #222; - - --modal-background-color: #333; - --modal-backdrop-color: #444; - - --left-pane-background-color: #1f1f1f; - --left-pane-text-color: #AAAAAA; - - --launcher-pane-background-color: #1f1f1f; - --launcher-pane-text-color: #AAAAAA; - - --active-tab-background-color: #666; - --active-tab-text-color: #ccc; - - --inactive-tab-background-color: #444; - --inactive-tab-text-color: #bbb; - - --scrollbar-border-color: #888; - --tooltip-background-color: #333; - --link-color: lightskyblue; -} - -body.theme-dark .global-menu-button { - background-image: url("../images/icon-grey.png"); -} - -body.theme-dark ::-webkit-calendar-picker-indicator { - filter: invert(1); -} - -body.theme-dark .CodeMirror { - filter: invert(90%) hue-rotate(180deg); -} - body { /* -- Overrides generic colors. ------------------------------------------------------------- */ @@ -242,39 +102,3 @@ body { --ck-color-widget-type-around-button: var(--main-border-color); --ck-color-widget-type-around-button-hover: var(--main-border-color); } - -body { - background-color: var(--main-background-color); - color: var(--main-text-color); - font-family: var(--main-font-family); -} - -a, a:visited, a:hover { - color: var(--link-color); -} - -input, select, textarea { - color: var(--input-text-color) !important; - background: var(--input-background-color) !important; -} - -#left-pane input, select, textarea { - color: var(--left-pane-text-color) !important; - background: var(--left-pane-background-color) !important; -} - -input::placeholder { - color: var(--muted-text-color); -} - -table td, table th { - color: var(--main-text-color); -} - -.ck .todo-list__checkmark { - top: 10px !important; -} - -.modal-backdrop { - background-color: var(--modal-backdrop-color) !important; -} diff --git a/src/public/stylesheets/style.css b/src/public/stylesheets/style.css index 4f8888315..38e709fbc 100644 --- a/src/public/stylesheets/style.css +++ b/src/public/stylesheets/style.css @@ -18,6 +18,39 @@ body { on the last line of the editor. */ position: fixed; width: 100%; + background-color: var(--main-background-color); + color: var(--main-text-color); + font-family: var(--main-font-family); +} + +a, a:visited, a:hover { + color: var(--link-color); +} + +input, select, textarea { + color: var(--input-text-color) !important; + background: var(--input-background-color) !important; +} + +#left-pane input, select, textarea { + color: var(--left-pane-text-color) !important; + background: var(--left-pane-background-color) !important; +} + +input::placeholder { + color: var(--muted-text-color); +} + +table td, table th { + color: var(--main-text-color); +} + +.ck .todo-list__checkmark { + top: 10px !important; +} + +.modal-backdrop { + background-color: var(--modal-backdrop-color) !important; } .component { diff --git a/src/public/stylesheets/theme-dark.css b/src/public/stylesheets/theme-dark.css new file mode 100644 index 000000000..9b200376b --- /dev/null +++ b/src/public/stylesheets/theme-dark.css @@ -0,0 +1,75 @@ +:root { + --main-font-family: MontserratLight; + --main-font-size: normal; + + --tree-font-family: MontserratLight; + --tree-font-size: normal; + + --detail-font-family: MontserratLight; + --detail-font-size: normal; + + --font-family-monospace: JetBrainsLight; + --detail-text-font-family: MontserratLight; + + --main-background-color: #333; + --main-text-color: #ccc; + --main-border-color: #aaa; + + --accented-background-color: #555; + --more-accented-background-color: #777; + + --button-background-color: transparent; + --button-disabled-background-color: #222; + --button-border-color: #ccc; + --button-text-color: currentColor; + --button-border-radius: 5px; + + --primary-button-background-color: #888; + --primary-button-text-color: white; + --primary-button-border-color: #999; + + --muted-text-color: #bbb; + + --input-text-color: #ccc; + --input-background-color: #333; + + --hover-item-text-color: black; + --hover-item-background-color: #777; + + --active-item-text-color: black; + --active-item-background-color: #777; + + --menu-text-color: white; + --menu-background-color: #222; + + --modal-background-color: #333; + --modal-backdrop-color: #444; + + --left-pane-background-color: #1f1f1f; + --left-pane-text-color: #AAAAAA; + + --launcher-pane-background-color: #1f1f1f; + --launcher-pane-text-color: #AAAAAA; + + --active-tab-background-color: #666; + --active-tab-text-color: #ccc; + + --inactive-tab-background-color: #444; + --inactive-tab-text-color: #bbb; + + --scrollbar-border-color: #888; + --tooltip-background-color: #333; + --link-color: lightskyblue; +} + +body .global-menu-button { + background-image: url("../images/icon-grey.png"); +} + +body ::-webkit-calendar-picker-indicator { + filter: invert(1); +} + +body .CodeMirror { + filter: invert(90%) hue-rotate(180deg); +} diff --git a/src/public/stylesheets/theme-light.css b/src/public/stylesheets/theme-light.css new file mode 100644 index 000000000..6d41b9cf8 --- /dev/null +++ b/src/public/stylesheets/theme-light.css @@ -0,0 +1,66 @@ +/* Light theme is special since it's also baseline/default so when a theme does not define some variable then + value from this theme will be used. For this reason this theme uses "html" instead of ":root" + since it's less "specific" and thus serves as default */ +html { + --main-font-family: MontserratLight; + --main-font-size: normal; + + --tree-font-family: MontserratLight; + --tree-font-size: normal; + + --detail-font-family: MontserratLight; + --detail-font-size: normal; + + --font-family-monospace: JetBrainsLight; + --detail-text-font-family: MontserratLight; + + --main-background-color: white; + --main-text-color: black; + --main-border-color: #ccc; + + --accented-background-color: #f5f5f5; + --more-accented-background-color: #ddd; + + --button-background-color: transparent; + --button-disabled-background-color: #ddd; + --button-border-color: #ddd; + --button-text-color: black; + --button-border-radius: 5px; + + --primary-button-background-color: #6c757d; + --primary-button-text-color: white; + --primary-button-border-color: #6c757d; + + --muted-text-color: #666; + + --input-text-color: black; + --input-background-color: transparent; + + --hover-item-text-color: black; + --hover-item-background-color: #ddd; + + --active-item-text-color: black; + --active-item-background-color: #ddd; + + --menu-text-color: black; + --menu-background-color: white; + + --modal-background-color: white; + --modal-backdrop-color: black; + + --left-pane-background-color: #F3F3F3; + --left-pane-text-color: #333; + + --launcher-pane-background-color: #F3F3F3; + --launcher-pane-text-color: #333; + + --active-tab-background-color: #ddd; + --active-tab-text-color: black; + + --inactive-tab-background-color: #f5f5f5; + --inactive-tab-text-color: #666; + + --scrollbar-border-color: #ddd; + --tooltip-background-color: #f8f8f8; + --link-color: blue; +} diff --git a/src/routes/index.js b/src/routes/index.js index a80ed4d36..9b9be6ffc 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -19,7 +19,7 @@ function index(req, res) { res.render(view, { csrfToken: csrfToken, - theme: options.theme, + themeCssUrl: getThemeCssUrl(options.theme), headingStyle: options.headingStyle, mainFontSize: parseInt(options.mainFontSize), treeFontSize: parseInt(options.treeFontSize), @@ -36,8 +36,28 @@ function index(req, res) { }); } +function getThemeCssUrl(theme) { + if (theme === 'light') { + return false; // light theme is always loaded as baseline + } + + if (theme === 'dark') { + return `stylesheets/theme-dark.css`; + } + else { + const themeNote = attributeService.getNoteWithLabel('appTheme', theme); + + if (themeNote) { + return `api/notes/download/${themeNote.noteId}`; + } + else { + return false; // baseline light theme + } + } +} + function getAppCssNoteIds() { - return attributeService.getNoteIdsWithLabels(['appCss', 'appTheme']); + return attributeService.getNotesWithLabel('appCss').map(note => note.noteId); } module.exports = { diff --git a/src/services/attributes.js b/src/services/attributes.js index 90d90b936..430264756 100644 --- a/src/services/attributes.js +++ b/src/services/attributes.js @@ -69,18 +69,6 @@ function getNotesWithLabel(name, value) { }); } -function getNoteIdsWithLabels(names) { - const noteIds = new Set(); - - for (const name of names) { - for (const attr of becca.findAttributes('label', name)) { - noteIds.add(attr.noteId); - } - } - - return Array.from(noteIds); -} - // TODO: should be in search service function getNoteWithLabel(name, value) { const notes = getNotesWithLabel(name, value); @@ -179,7 +167,6 @@ function sanitizeAttributeName(origName) { module.exports = { getNotesWithLabel, - getNoteIdsWithLabels, getNoteWithLabel, createLabel, createRelation, diff --git a/src/views/desktop.ejs b/src/views/desktop.ejs index f6d42523d..a8fcb428e 100644 --- a/src/views/desktop.ejs +++ b/src/views/desktop.ejs @@ -5,7 +5,7 @@ Trilium Notes - + - + + + +<% if (themeCssUrl) { %> + +<% } %> + - + +<% if (themeCssUrl) { %> + +<% } %> diff --git a/src/views/setup.ejs b/src/views/setup.ejs index 91515af9a..b07dc56ef 100644 --- a/src/views/setup.ejs +++ b/src/views/setup.ejs @@ -6,15 +6,6 @@ Setup