diff --git a/app/javascript/sdk/constants.js b/app/javascript/sdk/constants.js
index 7bf84d430..7c172d159 100644
--- a/app/javascript/sdk/constants.js
+++ b/app/javascript/sdk/constants.js
@@ -1,3 +1,3 @@
export const BUBBLE_DESIGN = ['standard', 'expanded_bubble'];
export const WIDGET_DESIGN = ['standard', 'flat'];
-export const DARK_MODE = ['light', 'auto'];
+export const DARK_MODE = ['light', 'auto', 'dark'];
diff --git a/app/javascript/widget/App.vue b/app/javascript/widget/App.vue
index 7d158eb74..d4611b3a4 100755
--- a/app/javascript/widget/App.vue
+++ b/app/javascript/widget/App.vue
@@ -2,6 +2,7 @@
@@ -13,6 +14,7 @@
'is-widget-right': isRightAligned,
'is-bubble-hidden': hideMessageBubble,
'is-flat-design': isWidgetStyleFlat,
+ dark: prefersDarkMode,
}"
>
@@ -65,6 +67,7 @@ export default {
isFetchingList: 'conversation/getIsFetchingList',
isRightAligned: 'appConfig/isRightAligned',
isWidgetOpen: 'appConfig/getIsWidgetOpen',
+ darkMode: 'appConfig/darkMode',
messageCount: 'conversation/getMessageCount',
unreadMessageCount: 'conversation/getUnreadMessageCount',
isWidgetStyleFlat: 'appConfig/isWidgetStyleFlat',
@@ -75,6 +78,12 @@ export default {
isRNWebView() {
return RNHelper.isRNWebView();
},
+ prefersDarkMode() {
+ const isOSOnDarkMode =
+ this.darkMode === 'auto' &&
+ window.matchMedia('(prefers-color-scheme: dark)').matches;
+ return isOSOnDarkMode || this.darkMode === 'dark';
+ },
},
watch: {
activeCampaign() {
diff --git a/app/javascript/widget/components/ConversationWrap.vue b/app/javascript/widget/components/ConversationWrap.vue
index eff57fd86..1c589488d 100755
--- a/app/javascript/widget/components/ConversationWrap.vue
+++ b/app/javascript/widget/components/ConversationWrap.vue
@@ -60,7 +60,7 @@ export default {
isAgentTyping: 'conversation/getIsAgentTyping',
}),
colorSchemeClass() {
- return `${this.darkMode === 'light' ? 'light' : 'dark'}`;
+ return `${this.darkMode === 'dark' ? 'dark-scheme' : 'light-scheme'}`;
},
},
watch: {
@@ -117,10 +117,10 @@ export default {
overflow-y: auto;
color-scheme: light dark;
- &.light {
+ &.light-scheme {
color-scheme: light;
}
- &.dark {
+ &.dark-scheme {
color-scheme: dark;
}
}
diff --git a/app/javascript/widget/mixins/darkModeMixin.js b/app/javascript/widget/mixins/darkModeMixin.js
index dd8f19cfc..87d7c8048 100644
--- a/app/javascript/widget/mixins/darkModeMixin.js
+++ b/app/javascript/widget/mixins/darkModeMixin.js
@@ -9,6 +9,9 @@ export default {
if (this.darkMode === 'light') {
return light;
}
+ if (this.darkMode === 'dark') {
+ return dark;
+ }
return light + ' ' + dark;
},
},
diff --git a/tailwind.config.js b/tailwind.config.js
index 0dc013c8e..81def1169 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,6 +1,7 @@
const { colors } = require('tailwindcss/defaultTheme');
module.exports = {
+ dark: 'class',
purge: [
'./app/javascript/widget/**/*.vue',
'./app/javascript/portal/**/*.vue',
@@ -11,6 +12,9 @@ module.exports = {
future: {
removeDeprecatedGapUtilities: true,
},
+ experimental: {
+ darkModeVariant: true,
+ },
theme: {
colors: {
white: colors.white,