diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue index 839047671..17b8611e7 100644 --- a/app/javascript/dashboard/App.vue +++ b/app/javascript/dashboard/App.vue @@ -3,7 +3,8 @@ v-if="!authUIFlags.isFetching" id="app" class="app-wrapper app-root" - :class="{ 'app-rtl--wrapper': isRTLView }" + :class="{ 'app-rtl--wrapper': isRTLView, dark: theme === 'dark' }" + :dir="isRTLView ? 'rtl' : 'ltr'" > @@ -34,10 +35,12 @@ import PaymentPendingBanner from './components/app/PaymentPendingBanner.vue'; import vueActionCable from './helper/actionCable'; import WootSnackbarBox from './components/SnackbarContainer'; import rtlMixin from 'shared/mixins/rtlMixin'; +import { LocalStorage } from 'shared/helpers/localStorage'; import { registerSubscription, verifyServiceWorkerExistence, } from './helper/pushHelper'; +import { LOCAL_STORAGE_KEYS } from './constants/localStorage'; export default { name: 'App', @@ -58,6 +61,7 @@ export default { return { showAddAccountModal: false, latestChatwootVersion: null, + theme: 'light', }; }, @@ -89,9 +93,34 @@ export default { }, }, mounted() { + this.initializeColorTheme(); + this.listenToThemeChanges(); this.setLocale(window.chatwootConfig.selectedLocale); }, methods: { + initializeColorTheme() { + this.setColorTheme( + window.matchMedia('(prefers-color-scheme: dark)').matches + ); + }, + setColorTheme(isOSOnDarkMode) { + const selectedColorScheme = + LocalStorage.get(LOCAL_STORAGE_KEYS.COLOR_SCHEME) || 'light'; + if ( + (selectedColorScheme === 'auto' && isOSOnDarkMode) || + selectedColorScheme === 'dark' + ) { + this.theme = 'dark'; + document.body.classList.add('dark'); + } else { + this.theme = 'light '; + document.body.classList.remove('dark'); + } + }, + listenToThemeChanges() { + const mql = window.matchMedia('(prefers-color-scheme: dark)'); + mql.onchange = e => this.setColorTheme(e.matches); + }, setLocale(locale) { this.$root.$i18n.locale = locale; }, diff --git a/app/javascript/dashboard/assets/scss/_foundation-custom.scss b/app/javascript/dashboard/assets/scss/_foundation-custom.scss index 605b74483..4cb9fce21 100644 --- a/app/javascript/dashboard/assets/scss/_foundation-custom.scss +++ b/app/javascript/dashboard/assets/scss/_foundation-custom.scss @@ -20,15 +20,6 @@ select { margin-left: var(--space-normal); } -.tooltip { - background-color: var(--black-transparent); - border-radius: $space-smaller; - font-size: $font-size-mini; - max-width: var(--space-giga); - padding: $space-smaller $space-small; - z-index: 999; -} - code { border: 0; font-family: 'ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', diff --git a/app/javascript/dashboard/assets/scss/_helper-classes.scss b/app/javascript/dashboard/assets/scss/_helper-classes.scss index a8a5a0b93..0b400c4e9 100644 --- a/app/javascript/dashboard/assets/scss/_helper-classes.scss +++ b/app/javascript/dashboard/assets/scss/_helper-classes.scss @@ -1,5 +1,5 @@ .bg-light { - @include background-light; + @apply bg-slate-25 dark:bg-slate-800; } .flex-center { diff --git a/app/javascript/dashboard/assets/scss/_mixins.scss b/app/javascript/dashboard/assets/scss/_mixins.scss index a55f0a8dd..2fbb9fa7c 100644 --- a/app/javascript/dashboard/assets/scss/_mixins.scss +++ b/app/javascript/dashboard/assets/scss/_mixins.scss @@ -22,43 +22,43 @@ $spinner-before-border-color: rgba(255, 255, 255, 0.7); } @mixin border-normal() { - border: 1px solid $color-border; + @apply border border-slate-50 dark:border-slate-700; } @mixin border-normal-left() { - border-left: 1px solid $color-border; + @apply border-l border-slate-50 dark:border-slate-700; } @mixin border-normal-top() { - border-top: 1px solid $color-border; + @apply border-t border-slate-50 dark:border-slate-700; } @mixin border-normal-right() { - border-right: 1px solid $color-border; + @apply border-r border-slate-50 dark:border-slate-700; } @mixin border-normal-bottom() { - border-bottom: 1px solid $color-border; + @apply border-b border-slate-50 dark:border-slate-700; } @mixin border-light() { - border: 1px solid $color-border-light; + @apply border border-slate-25 dark:border-slate-700; } @mixin border-light-left() { - border-left: 1px solid $color-border-light; + @apply border-l border-slate-25 dark:border-slate-700; } @mixin border-light-top() { - border-top: 1px solid $color-border-light; + @apply border-t border-slate-25 dark:border-slate-700; } @mixin border-light-right() { - border-right: 1px solid $color-border-light; + @apply border-r border-slate-25 dark:border-slate-700; } @mixin border-light-bottom() { - border-bottom: 1px solid $color-border-light; + @apply border-b border-slate-25 dark:border-slate-700; } // background @@ -67,11 +67,11 @@ $spinner-before-border-color: rgba(255, 255, 255, 0.7); } @mixin background-light() { - background: $color-background-light; + @apply bg-slate-50 dark:bg-slate-800; } @mixin background-white() { - background: $color-white; + @apply bg-white dark:bg-slate-900; } // input form diff --git a/app/javascript/dashboard/assets/scss/_rtl.scss b/app/javascript/dashboard/assets/scss/_rtl.scss index b517fc0f2..213158026 100644 --- a/app/javascript/dashboard/assets/scss/_rtl.scss +++ b/app/javascript/dashboard/assets/scss/_rtl.scss @@ -3,9 +3,6 @@ // Primary sidebar .primary--sidebar { - border-left: 1px solid var(--s-50); - border-right: 0; - .options-menu.dropdown-pane { right: var(--space-smaller); @@ -42,15 +39,6 @@ margin-right: unset; } - .account-context--group .account-context--switch-group { - --overlay-shadow: linear-gradient( - to left, - rgba(255, 255, 255, 0) 0%, - rgba(255, 255, 255, 1) 50% - ); - background-image: var(--overlay-shadow); - } - // Help center sidebar .sidebar-header--wrap .header-title--wrap { margin-left: unset; diff --git a/app/javascript/dashboard/assets/scss/_utility-helpers.scss b/app/javascript/dashboard/assets/scss/_utility-helpers.scss index 06c963a93..a8025ba66 100644 --- a/app/javascript/dashboard/assets/scss/_utility-helpers.scss +++ b/app/javascript/dashboard/assets/scss/_utility-helpers.scss @@ -43,17 +43,13 @@ } .border-right { - border-right: 1px solid var(--color-border); + @apply border-r border-slate-50 dark:border-slate-700; } .border-left { border-left: 1px solid var(--color-border); } -.bg-white { - background-color: var(--white); -} - .text-ellipsis { overflow: hidden; text-overflow: ellipsis; diff --git a/app/javascript/dashboard/assets/scss/_woot.scss b/app/javascript/dashboard/assets/scss/_woot.scss index 2b9229f69..2bf085024 100644 --- a/app/javascript/dashboard/assets/scss/_woot.scss +++ b/app/javascript/dashboard/assets/scss/_woot.scss @@ -1,3 +1,7 @@ +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; + @import 'shared/assets/fonts/plus-jakarta'; @import 'shared/assets/stylesheets/animations'; @import 'shared/assets/stylesheets/colors'; @@ -67,3 +71,8 @@ @import 'plugins/dropdown'; @import '~shared/assets/stylesheets/ionicons'; @import 'utility-helpers'; + + +.tooltip { + @apply bg-slate-900 text-white py-1 px-2 z-40 text-xs rounded-md dark:bg-slate-200 dark:text-slate-900; +} diff --git a/app/javascript/dashboard/assets/scss/views/settings/inbox.scss b/app/javascript/dashboard/assets/scss/views/settings/inbox.scss index 870caf7ee..0cd3baa0e 100644 --- a/app/javascript/dashboard/assets/scss/views/settings/inbox.scss +++ b/app/javascript/dashboard/assets/scss/views/settings/inbox.scss @@ -4,10 +4,8 @@ // Conversation header - Light BG .settings-header { - @include background-white; @include flex; @include flex-align($x: justify, $y: middle); - border-bottom: 1px solid var(--s-50); height: $header-height; min-height: $header-height; padding: $space-small $space-normal; @@ -128,8 +126,8 @@ } .wizard-body { - @include background-white; @include border-light; + @include background-white; @include full-height(); padding: $space-medium; diff --git a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss index 3f36bfa0c..ed0af1771 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_buttons.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_buttons.scss @@ -8,6 +8,11 @@ $default-button-height: 2.5rem; .button__content { width: 100%; + + img, + svg { + display: inline-block; + } } .spinner { diff --git a/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss b/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss index d88a7048d..184ca4b52 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_conv-header.scss @@ -59,11 +59,6 @@ $resolve-button-width: 8.25rem; flex-direction: row; flex-grow: 1; justify-content: flex-end; - margin-top: var(--space-small); - - @include breakpoint(medium up) { - margin-top: 0; - } &.has-open-sidebar { justify-content: flex-end; diff --git a/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss b/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss index f6da1be3f..d78c58f7b 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_conversation-card.scss @@ -82,6 +82,11 @@ text-overflow: ellipsis; white-space: nowrap; width: 16.875rem; + + img, + svg { + display: inline-block; + } } .conversation--meta { diff --git a/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss b/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss index cdf66d741..499064068 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_conversation-view.scss @@ -390,3 +390,42 @@ margin-bottom: 0; } } + +.conversation-sidebar-wrap { + flex: 0 0; + flex-basis: 100%; + height: auto; + overflow: auto; + z-index: var(--z-index-low); + + @include breakpoint(medium up) { + flex-basis: 17.5rem; + } + + @include breakpoint(large up) { + flex-basis: 18.75rem; + } + + @include breakpoint(xlarge up) { + flex-basis: 19.375rem; + } + + @include breakpoint(xxlarge up) { + flex-basis: 20.625rem; + } + + @include breakpoint(xxxlarge up) { + flex-basis: 25rem; + } +} + + +.activity-wrap { + .message-text--metadata { + .time { + @include breakpoint(xlarge up) { + margin-left: var(--space-small); + } + } + } +} diff --git a/app/javascript/dashboard/assets/scss/widgets/_forms.scss b/app/javascript/dashboard/assets/scss/widgets/_forms.scss index 17c0dc859..1f0311237 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_forms.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_forms.scss @@ -61,3 +61,7 @@ input { border-color: var(--r-400); } } + +label { + @apply dark:text-slate-300; +} diff --git a/app/javascript/dashboard/assets/scss/widgets/_modal.scss b/app/javascript/dashboard/assets/scss/widgets/_modal.scss index 644399b9e..2e970e763 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_modal.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_modal.scss @@ -34,7 +34,6 @@ .modal-container { @include normal-shadow; - background-color: $color-white; border-radius: $space-smaller; max-height: 100%; overflow: auto; diff --git a/app/javascript/dashboard/assets/scss/widgets/_reply-box.scss b/app/javascript/dashboard/assets/scss/widgets/_reply-box.scss index a51e6047d..b03a55d7b 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_reply-box.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_reply-box.scss @@ -1,6 +1,6 @@ .reply-box { transition: box-shadow 0.35s $swift-ease-out-function, - height 2s $swift-ease-out-function; + height 2s $swift-ease-out-function; &.is-focused { box-shadow: var(--shadow); diff --git a/app/javascript/dashboard/assets/scss/widgets/_states.scss b/app/javascript/dashboard/assets/scss/widgets/_states.scss index 0ca0b5c76..ba2905e91 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_states.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_states.scss @@ -1,18 +1,3 @@ -.loading-state { - padding: $space-jumbo $space-smaller; - - .message { - color: $color-gray; - display: block; - text-align: center; - width: 100%; - } - - .spinner { - float: none; - top: -$space-smaller; - } -} // EMPTY STATES .empty-state { diff --git a/app/javascript/dashboard/assets/scss/widgets/_widget_builder.scss b/app/javascript/dashboard/assets/scss/widgets/_widget_builder.scss new file mode 100644 index 000000000..e69de29bb diff --git a/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss b/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss index 6f57f9cb5..e3f39f865 100644 --- a/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss +++ b/app/javascript/dashboard/assets/scss/widgets/_woot-tables.scss @@ -4,15 +4,13 @@ table { thead { th { - font-weight: var(--font-weight-bold); - text-align: left; - text-transform: uppercase; + @apply font-medium text-left uppercase text-slate-900 dark:text-slate-200; } } tbody { tr { - border-bottom: 1px solid var(--color-border-light); + @apply border-b border-slate-50 dark:border-slate-700; } td { diff --git a/app/javascript/dashboard/components/ChatList.vue b/app/javascript/dashboard/components/ChatList.vue index e06c5b2e9..168ebecc4 100644 --- a/app/javascript/dashboard/components/ChatList.vue +++ b/app/javascript/dashboard/components/ChatList.vue @@ -956,8 +956,6 @@ export default { diff --git a/app/javascript/dashboard/components/layout/Sidebar.vue b/app/javascript/dashboard/components/layout/Sidebar.vue index 8295adb6d..537db77fd 100644 --- a/app/javascript/dashboard/components/layout/Sidebar.vue +++ b/app/javascript/dashboard/components/layout/Sidebar.vue @@ -1,5 +1,5 @@ - @@ -214,87 +213,3 @@ export default { }, }; - - - - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/AccountContext.vue b/app/javascript/dashboard/components/layout/sidebarComponents/AccountContext.vue index 38761e408..17f6a9060 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/AccountContext.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/AccountContext.vue @@ -1,25 +1,29 @@ {{ $t('SIDEBAR.CURRENTLY_VIEWING_ACCOUNT') }} - + {{ account.name }} - - - {{ $t('SIDEBAR.SWITCH') }} - + + + + {{ $t('SIDEBAR.SWITCH') }} + + @@ -51,51 +55,6 @@ export default { }; diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/Logo.vue b/app/javascript/dashboard/components/layout/sidebarComponents/Logo.vue index 406157fc2..f470bc5b6 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/Logo.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/Logo.vue @@ -1,5 +1,5 @@ - + @@ -30,17 +30,3 @@ export default { }, }; - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/NotificationBell.vue b/app/javascript/dashboard/components/layout/sidebarComponents/NotificationBell.vue index 375cd6ffa..9e997cf16 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/NotificationBell.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/NotificationBell.vue @@ -1,15 +1,25 @@ - - + - - {{ unreadCount }} - + + + {{ unreadCount }} + + - - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/OptionsMenu.vue b/app/javascript/dashboard/components/layout/sidebarComponents/OptionsMenu.vue index 4a8171831..7121536c3 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/OptionsMenu.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/OptionsMenu.vue @@ -7,7 +7,6 @@ :class="{ 'dropdown-pane--open': show }" > - - - - + + + - - + + - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/PrimaryNavItem.vue b/app/javascript/dashboard/components/layout/sidebarComponents/PrimaryNavItem.vue index 36cc69da2..0ebc1ed3e 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/PrimaryNavItem.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/PrimaryNavItem.vue @@ -3,15 +3,28 @@ - - {{ name }} - {{ count }} + + {{ name }} + + {{ count }} + @@ -45,40 +58,3 @@ export default { }, }; - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue b/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue index 22adc05db..f4f395874 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/Secondary.vue @@ -1,7 +1,14 @@ - + - + - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryChildNavItem.vue b/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryChildNavItem.vue index cb5c52c76..f0302c44e 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryChildNavItem.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryChildNavItem.vue @@ -5,38 +5,69 @@ custom active-class="active" > - + - - + + + - - {{ label }} - + + {{ label }} + + {{ childItemCount }} - - - {{ count }} - - + + @@ -72,10 +103,6 @@ export default { type: String, default: '', }, - count: { - type: String, - default: '', - }, showChildCount: { type: Boolean, default: false, @@ -89,96 +116,12 @@ export default { showIcon() { return { 'text-truncate': this.shouldTruncate }; }, + isCountZero() { + return this.childItemCount === 0; + }, menuTitle() { return this.shouldTruncate ? this.label : ''; }, }, }; - diff --git a/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryNavItem.vue b/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryNavItem.vue index 74323b082..12a6f706a 100644 --- a/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryNavItem.vue +++ b/app/javascript/dashboard/components/layout/sidebarComponents/SecondaryNavItem.vue @@ -1,46 +1,41 @@ - - - + + + {{ $t(`SIDEBAR.${menuItem.label}`) }} - - - {{ $t(`SIDEBAR.${menuItem.label}`) }} - + {{ `${menuItem.count}` }} {{ $t('SIDEBAR.BETA') }} - + - - newLinkClick(e, navigate)" - > - - + + + newLinkClick(e, navigate)" + > {{ $t(`SIDEBAR.${menuItem.newLinkTag}`) }} - + @@ -178,7 +173,7 @@ export default { this.isUnattended || this.isCurrentRoute ) { - return 'is-active'; + return 'bg-woot-25 dark:bg-slate-800 text-woot-500 dark:text-woot-500 hover:text-woot-500 dark:hover:text-woot-500'; } if (this.hasSubMenu) { if ( @@ -187,12 +182,12 @@ export default { this.isIntegrationsSettings || this.isApplicationsSettings ) { - return 'is-active'; + return 'bg-woot-25 dark:bg-slate-800 text-woot-500 dark:text-woot-500 hover:text-woot-500 dark:hover:text-woot-500'; } - return ' '; + return 'hover:text-slate-700 dark:hover:text-slate-100'; } - return ''; + return 'hover:text-slate-700 dark:hover:text-slate-100'; }, }, methods: { @@ -233,132 +228,3 @@ export default { }, }; - diff --git a/app/javascript/dashboard/components/ui/TimeAgo.vue b/app/javascript/dashboard/components/ui/TimeAgo.vue index 224856253..09eebe711 100644 --- a/app/javascript/dashboard/components/ui/TimeAgo.vue +++ b/app/javascript/dashboard/components/ui/TimeAgo.vue @@ -5,7 +5,7 @@ delay: { show: 1500, hide: 0 }, hideOnClick: true, }" - class="time-ago" + class="text-xxs text-black-600 leading-4 ml-auto hover:text-black-900" > {{ `${createdAtTime} • ${lastActivityTime}` }} @@ -109,16 +109,3 @@ export default { }, }; - diff --git a/app/javascript/dashboard/components/widgets/LoadingState.vue b/app/javascript/dashboard/components/widgets/LoadingState.vue index 9fdecc2e8..3e07a405d 100644 --- a/app/javascript/dashboard/components/widgets/LoadingState.vue +++ b/app/javascript/dashboard/components/widgets/LoadingState.vue @@ -1,6 +1,11 @@ - - {{ message }} + + + {{ message }} + + diff --git a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue index b682f6f21..0c46c43e8 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue @@ -1144,8 +1144,7 @@ export default { } .reply-box { - border-top: 1px solid var(--color-border); - background: white; + @apply border-r border-slate-50 dark:border-slate-700 bg-white dark:bg-slate-900; &.is-private { background: var(--y-50); diff --git a/app/javascript/dashboard/components/widgets/conversation/bubble/Actions.vue b/app/javascript/dashboard/components/widgets/conversation/bubble/Actions.vue index 750c4a982..466f34b71 100644 --- a/app/javascript/dashboard/components/widgets/conversation/bubble/Actions.vue +++ b/app/javascript/dashboard/components/widgets/conversation/bubble/Actions.vue @@ -254,8 +254,6 @@ export default {
+
{{ account.name }}