From bbdfbe88b26c6e1f7940cc51e9f08aa754f64077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Sat, 17 May 2025 19:08:39 +0200 Subject: [PATCH] Consider device dark mode setting --- src/static/js/pad.ts | 5 ++++ src/static/js/skin_variants.ts | 53 +++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/static/js/pad.ts b/src/static/js/pad.ts index e94611fcd..d8e3b8e40 100644 --- a/src/static/js/pad.ts +++ b/src/static/js/pad.ts @@ -52,6 +52,7 @@ import {randomString} from "./pad_utils"; const socketio = require('./socketio'); const hooks = require('./pluginfw/hooks'); +const skinVariants = require('./skin_variants'); // This array represents all GET-parameters which can be used to change a setting. // name: the parameter-name, eg `?noColors=true` => `noColors` @@ -480,6 +481,10 @@ const pad = { $('#editorcontainer').addClass('initialized'); + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + skinVariants.updateSkinVariantsClasses(['dark-editor', 'dark-background', 'dark-toolbar']); + } + hooks.aCallAll('postAceInit', {ace: padeditor.ace, clientVars, pad}); }; diff --git a/src/static/js/skin_variants.ts b/src/static/js/skin_variants.ts index c9783aaa3..6bfd286ba 100644 --- a/src/static/js/skin_variants.ts +++ b/src/static/js/skin_variants.ts @@ -1,38 +1,43 @@ // @ts-nocheck 'use strict'; +const containers = ['editor', 'background', 'toolbar']; +const colors = ['super-light', 'light', 'dark', 'super-dark']; + +// add corresponding classes when config change +const updateSkinVariantsClasses = (newClasses) => { + const domsToUpdate = [ + $('html'), + $('iframe[name=ace_outer]').contents().find('html'), + $('iframe[name=ace_outer]').contents().find('iframe[name=ace_inner]').contents().find('html'), + ]; + + colors.forEach((color) => { + containers.forEach((container) => { + domsToUpdate.forEach((el) => { el.removeClass(`${color}-${container}`); }); + }); + }); + + domsToUpdate.forEach((el) => { el.removeClass('full-width-editor'); }); + + domsToUpdate.forEach((el) => { el.addClass(newClasses.join(' ')); }); +}; + // Specific hash to display the skin variants builder popup if (window.location.hash.toLowerCase() === '#skinvariantsbuilder') { $('#skin-variants').addClass('popup-show'); - const containers = ['editor', 'background', 'toolbar']; - const colors = ['super-light', 'light', 'dark', 'super-dark']; - - // add corresponding classes when config change - const updateSkinVariantsClasses = () => { - const domsToUpdate = [ - $('html'), - $('iframe[name=ace_outer]').contents().find('html'), - $('iframe[name=ace_outer]').contents().find('iframe[name=ace_inner]').contents().find('html'), - ]; - colors.forEach((color) => { - containers.forEach((container) => { - domsToUpdate.forEach((el) => { el.removeClass(`${color}-${container}`); }); - }); - }); - - domsToUpdate.forEach((el) => { el.removeClass('full-width-editor'); }); - + const getNewClasses = () => { const newClasses = []; $('select.skin-variant-color').each(function () { newClasses.push(`${$(this).val()}-${$(this).data('container')}`); }); if ($('#skin-variant-full-width').is(':checked')) newClasses.push('full-width-editor'); - domsToUpdate.forEach((el) => { el.addClass(newClasses.join(' ')); }); - $('#skin-variants-result').val(`"skinVariants": "${newClasses.join(' ')}",`); - }; + + return newClasses; + } // run on init const updateCheckboxFromSkinClasses = () => { @@ -48,9 +53,11 @@ if (window.location.hash.toLowerCase() === '#skinvariantsbuilder') { }; $('.skin-variant').on('change', () => { - updateSkinVariantsClasses(); + updateSkinVariantsClasses(getNewClasses()); }); updateCheckboxFromSkinClasses(); - updateSkinVariantsClasses(); + updateSkinVariantsClasses(getNewClasses()); } + +exports.updateSkinVariantsClasses = updateSkinVariantsClasses;