Skip to content

Commit 4d49640

Browse files
authored
feat: Configurable dark mode (color scheme) (#460)
* Add: Dark color scheme * Fix: Remove !important statements preventing forms to implement dark mode * Fix: Final color values * Fix: Announce dark mode to the browser for scrollbar coloring * Add: configurable color scheme * Fix: Propagate dark mode to iframes * Fix: color scheme switch as css variables * Fix: Cascade settings into iframes of iframes (e.g., cms plugins inside ckeditor)
1 parent 845a736 commit 4d49640

File tree

8 files changed

+163
-17
lines changed

8 files changed

+163
-17
lines changed

djangocms_admin_style/sass/components/_sideframe.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// SIDEFRAME
33

44
.cms-admin-sideframe {
5-
color-scheme: light dark;
65
#header {
76
// because there is already toolbar visible, header in side frame has to be hidden to not be visible when scrolling on tablet #245
87
display: none;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
@import "reset-django-dark-mode";
12
@import "cms";
23
@import "custom";

djangocms_admin_style/sass/settings/_cms.scss

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ $gray-super-lightest: var(--dca-gray-super-lightest); //;
3535

3636
:root {
3737
color-scheme: dark light;
38+
}
39+
40+
:root[data-color-scheme="light"] {
41+
color-scheme: light;
42+
--dca-light-mode: 1;
43+
--dca-dark-mode: 0;
3844
--dca-white: #FFFFFF;
3945
--dca-black: #000000;
4046
--dca-primary: #00bbff;
@@ -47,18 +53,41 @@ $gray-super-lightest: var(--dca-gray-super-lightest); //;
4753
--dca-gray-super-lightest: #f7f7f7;
4854
}
4955

56+
:root[data-color-scheme="dark"] {
57+
color-scheme: dark;
58+
--dca-light-mode: 0;
59+
--dca-dark-mode: 1;
60+
--dca-white: #2A2C2E;
61+
--dca-black: #FFF;
62+
--dca-primary: #58D1FC;
63+
--dca-gray: #999; // $gray-light;
64+
--dca-gray-lightest: #444; //$gray-darkest;
65+
--dca-gray-lighter: #666; //$gray-darker;
66+
--dca-gray-light: #888; // $gray-light;
67+
--dca-gray-darker: #aaa; //$gray;
68+
--dca-gray-darkest: #eee; // $gray-lighter;
69+
--dca-gray-super-lightest: #333;
70+
71+
--active-brightness: 2;
72+
--focus-brightness: 1.5;
73+
}
5074
@media (prefers-color-scheme: dark) {
51-
:root {
52-
--dca-white: #2A2C2E;
53-
--dca-black: #FFF;
54-
--dca-primary: #58D1FC;
55-
--dca-gray: #999; //$gray-light;
56-
--dca-gray-lightest: #444; //$gray-darkest;
57-
--dca-gray-lighter: #666; //$gray-darker;
58-
--dca-gray-light: #888; // $gray-light;
59-
--dca-gray-darker: #aaa; //$gray;
60-
--dca-gray-darkest: #eee; // $gray-lighter;
61-
--dca-gray-super-lightest: #333;
75+
:root:not([data-color-scheme]) {
76+
--dca-light-mode: 0;
77+
--dca-dark-mode: 1;
78+
--dca-white: #2A2C2E;
79+
--dca-black: #FFF;
80+
--dca-primary: #58D1FC;
81+
--dca-gray: #999; // $gray-light;
82+
--dca-gray-lightest: #444; //$gray-darkest;
83+
--dca-gray-lighter: #666; //$gray-darker;
84+
--dca-gray-light: #888; // $gray-light;
85+
--dca-gray-darker: #aaa; //$gray;
86+
--dca-gray-darkest: #eee; // $gray-lighter;
87+
--dca-gray-super-lightest: #333;
88+
89+
--active-brightness: 2;
90+
--focus-brightness: 1.5;
6291
}
6392
}
6493

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
:root[data-color-scheme="light"] {
2+
--primary: #79aec8;
3+
--secondary: #417690;
4+
--accent: #f5dd5d;
5+
--primary-fg: #fff;
6+
7+
--body-fg: #333;
8+
--body-bg: #fff;
9+
--body-quiet-color: #666;
10+
--body-loud-color: #000;
11+
12+
--header-color: #ffc;
13+
--header-branding-color: var(--accent);
14+
--header-bg: var(--secondary);
15+
--header-link-color: var(--primary-fg);
16+
17+
--breadcrumbs-fg: #c4dce8;
18+
--breadcrumbs-link-fg: var(--body-bg);
19+
--breadcrumbs-bg: var(--primary);
20+
21+
--link-fg: #447e9b;
22+
--link-hover-color: #036;
23+
--link-selected-fg: #5b80b2;
24+
25+
--hairline-color: #e8e8e8;
26+
--border-color: #ccc;
27+
28+
--error-fg: #ba2121;
29+
30+
--message-success-bg: #dfd;
31+
--message-warning-bg: #ffc;
32+
--message-error-bg: #ffefef;
33+
34+
--darkened-bg: #f8f8f8; /* A bit darker than --body-bg */
35+
--selected-bg: #e4e4e4; /* E.g. selected table cells */
36+
--selected-row: #ffc;
37+
38+
--button-fg: #fff;
39+
--button-bg: var(--primary);
40+
--button-hover-bg: #609ab6;
41+
--default-button-bg: var(--secondary);
42+
--default-button-hover-bg: #205067;
43+
--close-button-bg: #888; /* Previously #bbb, contrast 1.92 */
44+
--close-button-hover-bg: #747474;
45+
--delete-button-bg: #ba2121;
46+
--delete-button-hover-bg: #a41515;
47+
48+
--object-tools-fg: var(--button-fg);
49+
--object-tools-bg: var(--close-button-bg);
50+
--object-tools-hover-bg: var(--close-button-hover-bg);
51+
}
52+
53+
:root[data-color-scheme="dark"] {
54+
--primary: #264b5d;
55+
--primary-fg: #f7f7f7;
56+
57+
--body-fg: #eeeeee;
58+
--body-bg: #121212;
59+
--body-quiet-color: #e0e0e0;
60+
--body-loud-color: #ffffff;
61+
62+
--breadcrumbs-link-fg: #e0e0e0;
63+
--breadcrumbs-bg: var(--primary);
64+
65+
--link-fg: #81d4fa;
66+
--link-hover-color: #4ac1f7;
67+
--link-selected-fg: #6f94c6;
68+
69+
--hairline-color: #272727;
70+
--border-color: #353535;
71+
72+
--error-fg: #e35f5f;
73+
--message-success-bg: #006b1b;
74+
--message-warning-bg: #583305;
75+
--message-error-bg: #570808;
76+
77+
--darkened-bg: #212121;
78+
--selected-bg: #1b1b1b;
79+
--selected-row: #00363a;
80+
81+
--close-button-bg: #333333;
82+
--close-button-hover-bg: #666666;
83+
84+
85+
--object-tools-fg: var(--button-fg);
86+
--object-tools-bg: var(--close-button-bg);
87+
--object-tools-hover-bg: var(--close-button-hover-bg);
88+
}

djangocms_admin_style/static/djangocms_admin_style/css/djangocms-admin.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

djangocms_admin_style/static/djangocms_admin_style/js/base-admin.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var initRelatedWidgetWrappers = require('./modules/related-widget-wrapper');
66
var initToolbarDropdown = require('./modules/toolbar-dropdown');
77
var initUpdateNotification = require('./modules/update-notification');
88
var preventDoubleFormSubmissions = require('./modules/form-submit');
9+
var darkModeSettings = require('./modules/dark-mode');
910

1011
// this attaches to global jQuery because
1112
// we need to touch punch the things like sortedm2m
@@ -22,4 +23,5 @@ $(function () {
2223
initToolbarDropdown();
2324
initUpdateNotification();
2425
preventDoubleFormSubmissions();
26+
darkModeSettings();
2527
});

djangocms_admin_style/static/djangocms_admin_style/js/dist/bundle.adminstyle.min.js

Lines changed: 1 addition & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Get color scheme from parent document (if in iframe) else set to white
3+
*
4+
* @function darkModeSettings
5+
* @returns {void}
6+
*/
7+
function darkModeSettings() {
8+
if (!document.documentElement.dataset.colorScheme) {
9+
var colorScheme = 'light'; // Default mode
10+
var cms_window = window;
11+
12+
while (cms_window.parent !== cms_window) {
13+
cms_window = cms_window.parent;
14+
}
15+
if (cms_window.CMS && cms_window.CMS.config) {
16+
if (cms_window.CMS.settings.color_scheme) {
17+
// Use color_scheme from settings.py
18+
colorScheme = cms_window.CMS.settings.color_scheme;
19+
} else if (cms_window.CMS.config.color_scheme) {
20+
// If overwritten by config use config. This is the toggle button
21+
colorScheme = cms_window.CMS.config.color_scheme;
22+
}
23+
}
24+
if (colorScheme !== 'auto') {
25+
document.documentElement.dataset.colorScheme = colorScheme;
26+
}
27+
}
28+
}
29+
30+
module.exports = darkModeSettings;

0 commit comments

Comments
 (0)