diff --git a/src/app/organisms/settings/Settings.jsx b/src/app/organisms/settings/Settings.jsx
index e31af8f3..9a3db0fd 100644
--- a/src/app/organisms/settings/Settings.jsx
+++ b/src/app/organisms/settings/Settings.jsx
@@ -5,7 +5,7 @@ import './Settings.scss';
import initMatrix from '../../../client/initMatrix';
import cons from '../../../client/state/cons';
import settings from '../../../client/state/settings';
-import { toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents } from '../../../client/action/settings';
+import { toggleSystemTheme, toggleMarkdown, toggleMembershipEvents, toggleNickAvatarEvents } from '../../../client/action/settings';
import logout from '../../../client/action/logout';
import Text from '../../atoms/text/Text';
@@ -49,20 +49,34 @@ function AppearanceSection() {
return (
settings.setTheme(index)}
+ title="Follow system theme"
+ options={(
+ { toggleSystemTheme(); updateState({}); }}
/>
)}
+ content={Use light or dark mode based on the system's settings.}
/>
+ {(() => {
+ if (!settings.useSystemTheme) {
+ return settings.setTheme(index)}
+ />
+ )}
+ />
+ }
+ })()}
{
+ this.useSystemTheme = !this.useSystemTheme;
+ setSettings('useSystemTheme', this.useSystemTheme);
+ const appBody = document.getElementById('appBody');
+
+ if (this.useSystemTheme) {
+ appBody.classList.add('system-theme');
+ this.themes.forEach((themeName) => {
+ if (themeName === '') return;
+ appBody.classList.remove(themeName);
+ });
+ } else {
+ appBody.classList.remove('system-theme');
+ this.setTheme(this.themeIndex);
+ }
+
+ this.emit(cons.events.settings.SYSTEM_THEME_TOGGLED, this.useSystemTheme);
+ },
[cons.actions.settings.TOGGLE_MARKDOWN]: () => {
this.isMarkdown = !this.isMarkdown;
setSettings('isMarkdown', this.isMarkdown);
diff --git a/src/index.scss b/src/index.scss
index 52688e8d..e24af320 100644
--- a/src/index.scss
+++ b/src/index.scss
@@ -202,8 +202,7 @@
--bg-surface-extra-low-transparent: hsla(0, 0%, 91%, 0);
}
-.dark-theme,
-.butter-theme {
+@mixin dark-mode() {
/* background color | --bg-[background type]: value */
--bg-surface: hsl(208, 8%, 20%);
--bg-surface-transparent: hsla(208, 8%, 20%, 0);
@@ -290,6 +289,17 @@
--font-secondary: 'Inter', 'Roboto', sans-serif;
}
+.dark-theme,
+.butter-theme {
+ @include dark-mode();
+}
+
+@media (prefers-color-scheme: dark) {
+ .system-theme {
+ @include dark-mode();
+ }
+}
+
.butter-theme {
/* background color | --bg-[background type]: value */
--bg-surface: hsl(64, 6%, 14%);