diff --git a/app/soapbox/actions/settings.js b/app/soapbox/actions/settings.js
index 205250c3b..03b538bcc 100644
--- a/app/soapbox/actions/settings.js
+++ b/app/soapbox/actions/settings.js
@@ -9,7 +9,7 @@ export const SETTING_SAVE = 'SETTING_SAVE';
export const FE_NAME = 'soapbox_fe';
-const defaultSettings = ImmutableMap({
+export const defaultSettings = ImmutableMap({
onboarded: false,
skinTone: 1,
diff --git a/app/soapbox/components/sidebar_menu.js b/app/soapbox/components/sidebar_menu.js
index ea9f753d4..f0e407033 100644
--- a/app/soapbox/components/sidebar_menu.js
+++ b/app/soapbox/components/sidebar_menu.js
@@ -15,7 +15,7 @@ import { shortNumberFormat } from '../utils/numbers';
import { isStaff } from '../utils/accounts';
import { makeGetAccount } from '../selectors';
import { logOut } from 'soapbox/actions/auth';
-import ThemeToggle from '../features/ui/components/theme_toggle';
+import ThemeToggle from '../features/ui/components/theme_toggle_container';
const messages = defineMessages({
followers: { id: 'account.followers', defaultMessage: 'Followers' },
diff --git a/app/soapbox/features/soapbox_config/components/site_preview.js b/app/soapbox/features/soapbox_config/components/site_preview.js
new file mode 100644
index 000000000..725ed3079
--- /dev/null
+++ b/app/soapbox/features/soapbox_config/components/site_preview.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import classNames from 'classnames';
+import { defaultSettings } from 'soapbox/actions/settings';
+import { brandColorToCSS } from 'soapbox/utils/theme';
+
+export default function SitePreview({ soapbox }) {
+
+ const settings = defaultSettings.mergeDeep(soapbox.get('defaultSettings'));
+
+ const bodyClass = classNames('site-preview app-body', `theme-mode-${settings.get('themeMode')}`, {
+ 'system-font': settings.get('systemFont'),
+ 'no-reduce-motion': !settings.get('reduceMotion'),
+ 'dyslexic': settings.get('dyslexicFont'),
+ 'demetricator': settings.get('demetricator'),
+ 'halloween': settings.get('halloween'),
+ });
+
+ return (
+
+
+
+
+
+
+
+ Site Preview
+
+
+
+
+
+ );
+
+}
+
+SitePreview.propTypes = {
+ soapbox: ImmutablePropTypes.map.isRequired,
+};
diff --git a/app/soapbox/features/soapbox_config/index.js b/app/soapbox/features/soapbox_config/index.js
index d6823cee0..50ba5257d 100644
--- a/app/soapbox/features/soapbox_config/index.js
+++ b/app/soapbox/features/soapbox_config/index.js
@@ -23,6 +23,9 @@ import Overlay from 'react-overlays/lib/Overlay';
import { isMobile } from 'soapbox/is_mobile';
import detectPassiveEvents from 'detect-passive-events';
import Accordion from '../ui/components/accordion';
+import SitePreview from './components/site_preview';
+import ThemeToggle from 'soapbox/features/ui/components/theme_toggle';
+import { defaultSettings } from 'soapbox/actions/settings';
const messages = defineMessages({
heading: { id: 'column.soapbox_config', defaultMessage: 'Soapbox config' },
@@ -185,15 +188,26 @@ class SoapboxConfig extends ImmutablePureComponent {
render() {
const { intl } = this.props;
const soapbox = this.getSoapboxConfig();
+ const settings = defaultSettings.mergeDeep(soapbox.get('defaultSettings'));
return (