diff --git a/app/images/bg-shape.svg b/app/images/bg-shape.svg
deleted file mode 100644
index aa0132f3d..000000000
--- a/app/images/bg-shape.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/app/soapbox/actions/soapbox.js b/app/soapbox/actions/soapbox.js
index 91e1a26f2..2871e2aae 100644
--- a/app/soapbox/actions/soapbox.js
+++ b/app/soapbox/actions/soapbox.js
@@ -41,6 +41,47 @@ export const makeDefaultConfig = features => {
banner: '',
brandColor: '', // Empty
accentColor: '',
+ colors: ImmutableMap({
+ gray: ImmutableMap({
+ 50: '#f9fafb',
+ 100: '#f3f4f6',
+ 200: '#e5e7eb',
+ 300: '#d1d5db',
+ 400: '#9ca3af',
+ 500: '#6b7280',
+ 600: '#4b5563',
+ 700: '#374151',
+ 800: '#1f2937',
+ 900: '#111827',
+ }),
+ success: ImmutableMap({
+ 50: '#f0fdf4',
+ 100: '#dcfce7',
+ 200: '#bbf7d0',
+ 300: '#86efac',
+ 400: '#4ade80',
+ 500: '#22c55e',
+ 600: '#16a34a',
+ 700: '#15803d',
+ 800: '#166534',
+ 900: '#14532d',
+ }),
+ danger: ImmutableMap({
+ 50: '#fef2f2',
+ 100: '#fee2e2',
+ 200: '#fecaca',
+ 300: '#fca5a5',
+ 400: '#f87171',
+ 500: '#ef4444',
+ 600: '#dc2626',
+ 700: '#b91c1c',
+ 800: '#991b1b',
+ 900: '#7f1d1d',
+ }),
+ 'gradient-purple': '#b8a3f9',
+ 'gradient-blue': '#9bd5ff',
+ 'sea-blue': '#2feecc',
+ }),
customCss: ImmutableList(),
promoPanel: ImmutableMap({
items: ImmutableList(),
@@ -72,7 +113,8 @@ export const getSoapboxConfig = createSelector([
state => state.get('soapbox'),
state => getFeatures(state.get('instance')),
], (soapbox, features) => {
- return makeDefaultConfig(features).merge(soapbox);
+ const defaultConfig = makeDefaultConfig(features);
+ return soapbox.mergeDeepWith((o, n) => o || n, defaultConfig);
});
export function rememberSoapboxConfig(host) {
diff --git a/app/soapbox/containers/soapbox.js b/app/soapbox/containers/soapbox.js
index 227b8cabc..4dcfdafb7 100644
--- a/app/soapbox/containers/soapbox.js
+++ b/app/soapbox/containers/soapbox.js
@@ -25,6 +25,7 @@ import { createGlobals } from 'soapbox/globals';
import messages from 'soapbox/locales/messages';
import { makeGetAccount } from 'soapbox/selectors';
import SoapboxPropTypes from 'soapbox/utils/soapbox_prop_types';
+import { generateThemeCss } from 'soapbox/utils/theme';
import { INTRODUCTION_VERSION } from '../actions/onboarding';
import { preload } from '../actions/preload';
@@ -83,6 +84,7 @@ const mapStateToProps = (state) => {
dyslexicFont: settings.get('dyslexicFont'),
demetricator: settings.get('demetricator'),
locale: validLocale(locale) ? locale : 'en',
+ themeCss: generateThemeCss(soapboxConfig),
brandColor: soapboxConfig.get('brandColor'),
themeMode: settings.get('themeMode'),
singleUserMode,
@@ -103,6 +105,7 @@ class SoapboxMount extends React.PureComponent {
dyslexicFont: PropTypes.bool,
demetricator: PropTypes.bool,
locale: PropTypes.string.isRequired,
+ themeCss: PropTypes.string,
themeMode: PropTypes.string,
brandColor: PropTypes.string,
dispatch: PropTypes.func,
@@ -139,7 +142,7 @@ class SoapboxMount extends React.PureComponent {
}
render() {
- const { me, account, instanceLoaded, locale, singleUserMode } = this.props;
+ const { me, account, instanceLoaded, themeCss, locale, singleUserMode } = this.props;
if (me === null) return null;
if (me && !account) return null;
if (!instanceLoaded) return null;
@@ -169,6 +172,7 @@ class SoapboxMount extends React.PureComponent {
{/* */}