feat: Dark Mode (PR -12) (#7590)

This commit is contained in:
Sivin Varghese
2023-07-27 12:28:06 +05:30
committed by GitHub
parent 2cc82af344
commit fcf0ba12d0
10 changed files with 153 additions and 266 deletions

View File

@@ -1,18 +1,20 @@
<template> <template>
<div <div
v-if="showShowCurrentAccountContext" v-if="showShowCurrentAccountContext"
class="rounded-md text-xs py-2 px-2 mt-2 relative border border-slate-50 dark:border-slate-800/50 hover:bg-slate-50 dark:hover:bg-slate-700 cursor-pointer" class="text-slate-700 dark:text-slate-200 rounded-md text-xs py-2 px-2 mt-2 relative border border-slate-50 dark:border-slate-800/50 hover:bg-slate-50 dark:hover:bg-slate-700 cursor-pointer"
@mouseover="setShowSwitch" @mouseover="setShowSwitch"
@mouseleave="resetShowSwitch" @mouseleave="resetShowSwitch"
> >
{{ $t('SIDEBAR.CURRENTLY_VIEWING_ACCOUNT') }} {{ $t('SIDEBAR.CURRENTLY_VIEWING_ACCOUNT') }}
<p class="text-ellipsis font-medium mb-0"> <p
class="text-ellipsis overflow-hidden whitespace-nowrap font-medium mb-0 text-slate-800 dark:text-slate-100"
>
{{ account.name }} {{ account.name }}
</p> </p>
<transition name="fade"> <transition name="fade">
<div <div
v-if="showSwitchButton" v-if="showSwitchButton"
class="bg-gradient-to-r rtl:bg-gradient-to-l from-transparent via-white dark:via-slate-700 to-white dark:to-slate-700 flex items-center h-full justify-end absolute top-0 right-0 w-full" class="ltr:overlay-shadow ltr:dark:overlay-shadow-dark rtl:rtl-overlay-shadow rtl:dark:rtl-overlay-shadow-dark flex items-center h-full justify-end absolute top-0 right-0 w-full"
> >
<div class="my-0 mx-2"> <div class="my-0 mx-2">
<woot-button <woot-button
@@ -54,7 +56,41 @@ export default {
}, },
}; };
</script> </script>
<style scoped lang="scss"> <style scoped>
@tailwind components;
@layer components {
.overlay-shadow {
background-image: linear-gradient(
to right,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 1) 50%
);
}
.overlay-shadow-dark {
background-image: linear-gradient(
to right,
rgba(0, 0, 0, 0) 0%,
rgb(55, 84, 109) 50%
);
}
.rtl-overlay-shadow {
background-image: linear-gradient(
to left,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 1) 50%
);
}
.rtl-overlay-shadow-dark {
background-image: linear-gradient(
to left,
rgba(0, 0, 0, 0) 0%,
rgb(55, 84, 109) 50%
);
}
}
.fade-enter-active, .fade-enter-active,
.fade-leave-active { .fade-leave-active {
transition: opacity 300ms ease; transition: opacity 300ms ease;
@@ -62,6 +98,6 @@ export default {
.fade-enter, .fade-enter,
.fade-leave-to { .fade-leave-to {
opacity: 0; @apply opacity-0;
} }
</style> </style>

View File

@@ -342,7 +342,7 @@ export default {
label { label {
@apply cursor-pointer; @apply cursor-pointer;
} }
&:hover .button { &:hover button {
@apply dark:bg-slate-800 bg-slate-100; @apply dark:bg-slate-800 bg-slate-100;
} }
} }

View File

@@ -1122,41 +1122,29 @@ export default {
} }
.emoji-dialog { .emoji-dialog {
top: unset; @apply top-[unset] -bottom-10 -left-80 right-[unset];
bottom: -40px;
left: -320px;
right: unset;
&::before { &::before {
right: var(--space-minus-normal);
bottom: var(--space-small);
transform: rotate(270deg); transform: rotate(270deg);
filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.08)); filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.08));
@apply -right-4 bottom-2 rtl:right-0 rtl:-left-4;
} }
} }
.emoji-dialog--rtl { .emoji-dialog--rtl {
left: unset; @apply left-[unset] -right-80;
right: -320px;
&::before { &::before {
left: var(--space-minus-normal);
transform: rotate(90deg); transform: rotate(90deg);
right: 0;
bottom: var(--space-small);
filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.08)); filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.08));
} }
} }
.emoji-dialog--expanded { .emoji-dialog--expanded {
left: unset; @apply left-[unset] bottom-0 absolute z-[100];
bottom: var(--space-jumbo);
position: absolute;
z-index: var(--z-index-normal);
&::before { &::before {
transform: rotate(0deg); transform: rotate(0deg);
left: var(--space-smaller); @apply left-1 -bottom-2;
bottom: var(--space-minus-small);
} }
} }
.message-signature { .message-signature {

View File

@@ -21,7 +21,9 @@
<p class="label-title"> <p class="label-title">
{{ template.name }} {{ template.name }}
</p> </p>
<span class="label-lang label"> <span
class="inline-block py-1 px-2 rounded-sm text-xs leading-none cursor-default bg-white dark:bg-slate-700 text-slate-800 dark:text-slate-100"
>
{{ $t('WHATSAPP_TEMPLATES.PICKER.LABELS.LANGUAGE') }} : {{ $t('WHATSAPP_TEMPLATES.PICKER.LABELS.LANGUAGE') }} :
{{ template.language }} {{ template.language }}
</span> </span>
@@ -114,7 +116,7 @@ export default {
@apply bg-slate-25 dark:bg-slate-900 rounded-md max-h-[18.75rem] overflow-y-auto p-2.5; @apply bg-slate-25 dark:bg-slate-900 rounded-md max-h-[18.75rem] overflow-y-auto p-2.5;
.template__list-item { .template__list-item {
@apply rounded-lg cursor-pointer block p-2.5 text-left w-full hover:bg-woot-50 dark:hover:bg-slate-600; @apply rounded-lg cursor-pointer block p-2.5 text-left w-full hover:bg-woot-50 dark:hover:bg-slate-800;
.label-title { .label-title {
@apply text-sm; @apply text-sm;

View File

@@ -1,12 +1,14 @@
<template> <template>
<div class="card"> <div
class="flex flex-col mb-2 p-4 border border-solid border-slate-75 dark:border-slate-700 overflow-hidden rounded-md flex-grow shadow-sm bg-white dark:bg-slate-900 text-slate-700 dark:text-slate-100"
>
<woot-message-editor <woot-message-editor
v-model="noteContent" v-model="noteContent"
class="input--note" class="input--note"
:placeholder="$t('NOTES.ADD.PLACEHOLDER')" :placeholder="$t('NOTES.ADD.PLACEHOLDER')"
:enable-suggestions="false" :enable-suggestions="false"
/> />
<div class="footer"> <div class="flex justify-end w-full">
<woot-button <woot-button
color-scheme="warning" color-scheme="warning"
:title="$t('NOTES.ADD.TITLE')" :title="$t('NOTES.ADD.TITLE')"
@@ -75,10 +77,4 @@ export default {
max-height: 22.5rem; max-height: 22.5rem;
} }
} }
.footer {
display: flex;
justify-content: flex-end;
width: 100%;
}
</style> </style>

View File

@@ -1,20 +1,28 @@
<template> <template>
<div class="card note-wrap"> <div
<div class="header"> class="flex flex-col mb-2 p-4 border border-solid border-slate-75 dark:border-slate-700 overflow-hidden rounded-md flex-grow shadow-sm bg-white dark:bg-slate-900 text-slate-700 dark:text-slate-100 note-wrap"
<div class="meta"> >
<div class="flex justify-between items-end text-xs gap-1">
<div class="flex items-center">
<thumbnail <thumbnail
:title="noteAuthorName" :title="noteAuthorName"
:src="noteAuthor.thumbnail" :src="noteAuthor.thumbnail"
:username="noteAuthorName" :username="noteAuthorName"
size="20px" size="20px"
/> />
<div class="date-wrap"> <div class="my-0 mx-1 p-0.5 flex flex-row gap-1">
<span class="fw-medium"> {{ noteAuthorName }} </span> <span class="font-medium text-slate-800 dark:text-slate-100">
<span> {{ $t('NOTES.LIST.LABEL') }} </span> {{ noteAuthorName }}
<span class="fw-medium time-stamp"> {{ readableTime }} </span> </span>
<span class="text-slate-700 dark:text-slate-100">
{{ $t('NOTES.LIST.LABEL') }}
</span>
<span class="font-medium text-slate-700 dark:text-slate-100">
{{ readableTime }}
</span>
</div> </div>
</div> </div>
<div class="actions"> <div class="actions flex invisible">
<woot-button <woot-button
v-tooltip="$t('NOTES.CONTENT_HEADER.DELETE')" v-tooltip="$t('NOTES.CONTENT_HEADER.DELETE')"
variant="smooth" variant="smooth"
@@ -35,7 +43,10 @@
:reject-text="$t('DELETE_NOTE.CONFIRM.NO')" :reject-text="$t('DELETE_NOTE.CONFIRM.NO')"
/> />
</div> </div>
<p v-dompurify-html="formatMessage(note || '')" class="note__content" /> <p
v-dompurify-html="formatMessage(note || '')"
class="note__content mt-4"
/>
</div> </div>
</template> </template>
@@ -116,39 +127,9 @@ export default {
} }
} }
.note__content {
margin-top: var(--space-normal);
}
.header {
display: flex;
justify-content: space-between;
align-items: flex-end;
font-size: var(--font-size-mini);
.meta {
display: flex;
align-items: center;
.date-wrap {
margin: 0 var(--space-smaller);
padding: var(--space-micro);
color: var(--color-body);
}
}
.actions {
display: flex;
visibility: hidden;
.button {
margin-left: var(--space-small);
}
}
}
.note-wrap:hover { .note-wrap:hover {
.actions { .actions {
visibility: visible; @apply visible;
} }
} }
</style> </style>

View File

@@ -152,7 +152,7 @@ export default {
} }
} }
.contact--panel { .contact--panel {
@apply border-r border-slate-50 dark:border-slate-700 h-full text-sm overflow-y-auto relative; @apply border-r border-slate-50 dark:border-slate-800/50 h-full text-sm overflow-y-auto relative;
} }
.list-group { .list-group {

View File

@@ -1,5 +1,7 @@
<template> <template>
<div class="view-box columns bg-white"> <div
class="flex justify-between flex-col h-full m-0 flex-1 bg-white dark:bg-slate-900"
>
<settings-header <settings-header
button-route="new" button-route="new"
:header-title="contact.name" :header-title="contact.name"
@@ -13,28 +15,22 @@
:src="contact.thumbnail" :src="contact.thumbnail"
:username="contact.name" :username="contact.name"
size="32px" size="32px"
class="margin-right-1" class="mr-2 rtl:mr-0 rtl:ml-2"
/> />
</settings-header> </settings-header>
<div <div v-if="uiFlags.isFetchingItem" class="text-center p-4 text-base h-full">
v-if="uiFlags.isFetchingItem"
class="text-center p-normal fs-default h-full"
>
<spinner size="" /> <spinner size="" />
<span>{{ $t('CONTACT_PROFILE.LOADING') }}</span> <span>{{ $t('CONTACT_PROFILE.LOADING') }}</span>
</div> </div>
<div <div v-else-if="contact.id" class="overflow-hidden flex-1 min-w-0">
v-else-if="contact.id" <div class="flex flex-wrap ml-auto mr-auto max-w-full h-full">
class="overflow-hidden column contact--dashboard-content"
>
<div class="row h-full">
<contact-info-panel <contact-info-panel
:show-close-button="false" :show-close-button="false"
:show-avatar="false" :show-avatar="false"
:contact="contact" :contact="contact"
/> />
<div class="small-12 medium-9 h-full"> <div class="w-[75%] h-full">
<woot-tabs :index="selectedTabIndex" @change="onClickTabChange"> <woot-tabs :index="selectedTabIndex" @change="onClickTabChange">
<woot-tabs-item <woot-tabs-item
v-for="tab in tabs" v-for="tab in tabs"
@@ -43,7 +39,9 @@
:show-badge="false" :show-badge="false"
/> />
</woot-tabs> </woot-tabs>
<div class="tab-content overflow-auto"> <div
class="bg-slate-25 dark:bg-slate-800 h-[calc(100%-40px)] p-4 overflow-auto"
>
<contact-notes <contact-notes
v-if="selectedTabIndex === 0" v-if="selectedTabIndex === 0"
:contact-id="Number(contactId)" :contact-id="Number(contactId)"
@@ -119,22 +117,3 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss" scoped>
@import '~dashboard/assets/scss/mixins';
.left {
@apply border-r border-slate-50 dark:border-slate-700;
overflow: auto;
}
.right {
padding: var(--space-normal);
}
.tab-content {
background: var(--color-background-light);
height: calc(100% - 40px);
padding: var(--space-normal);
}
</style>

View File

@@ -1,13 +1,15 @@
<template> <template>
<div class="category-list--container"> <div class="w-full pl-4">
<header> <header class="flex justify-between items-center mb-4">
<div class="header-left--wrap"> <div class="flex items-center w-full gap-3">
<label class="sub-block-title header-text">{{ <label
$t('HELP_CENTER.PORTAL.EDIT.CATEGORIES.TITLE') class="font-normal mb-0 text-base text-slate-800 dark:text-slate-100"
}}</label> >
{{ $t('HELP_CENTER.PORTAL.EDIT.CATEGORIES.TITLE') }}
</label>
<select <select
:value="currentLocaleCode" :value="currentLocaleCode"
class="row small-2 select-locale" class="w-[15%] select-locale"
@change="changeCurrentCategory" @change="changeCurrentCategory"
> >
<option <option
@@ -19,7 +21,7 @@
</option> </option>
</select> </select>
</div> </div>
<div class="header-right--wrap"> <div class="flex-none items-center">
<woot-button <woot-button
size="small" size="small"
variant="smooth" variant="smooth"
@@ -168,38 +170,7 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.category-list--container { .select-locale {
width: 100%; @apply h-8 mb-0 py-0.5;
padding-left: var(--space-normal);
header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--space-normal);
.header-left--wrap {
display: flex;
align-items: center;
width: 100%;
.header-text {
font-weight: var(--font-weight-normal);
margin-right: var(--space-slab);
margin-bottom: 0;
}
}
.header-right--wrap {
flex: none;
align-items: center;
}
.select-locale {
height: var(--space-large);
margin-bottom: 0;
padding-top: var(--space-micro);
padding-bottom: var(--space-micro);
}
}
} }
</style> </style>

View File

@@ -1,12 +1,15 @@
<template> <template>
<div role="dialog" class="emoji-dialog"> <div
<div class="emoji-list--wrap"> role="dialog"
class="emoji-dialog bg-white shadow-lg dark:bg-slate-900 rounded-md border border-solid border-slate-75 dark:border-slate-800/50 box-content h-[300px] absolute right-0 -top-[95px] w-80 z-20"
>
<div class="flex flex-col">
<div class="emoji-search--wrap"> <div class="emoji-search--wrap">
<input <input
ref="searchbar" ref="searchbar"
v-model="search" v-model="search"
type="text" type="text"
class="emoji-search--input" class="emoji-search--input focus:box-shadow-blue dark:focus:box-shadow-blue-dark"
:placeholder="$t('EMOJI.PLACEHOLDER')" :placeholder="$t('EMOJI.PLACEHOLDER')"
/> />
</div> </div>
@@ -59,7 +62,11 @@
:class="{ active: selectedKey === 'Search' }" :class="{ active: selectedKey === 'Search' }"
@click="changeCategory('Search')" @click="changeCategory('Search')"
> >
<fluent-icon icon="search" size="16" /> <fluent-icon
icon="search"
size="16"
class="text-slate-700 dark:text-slate-100"
/>
</button> </button>
</li> </li>
<li <li
@@ -158,168 +165,95 @@ export default {
}, },
}; };
</script> </script>
<style lang="scss"> <style scoped>
/** @tailwind components;
* All the units used below are pixels due to variable name conflict in widget and dashboard @layer components {
**/ .box-shadow-blue {
@import '~dashboard/assets/scss/variables'; box-shadow: 0 0 0 1px #1f93ff, 0 0 2px 3px #c7e3ff;
@import '~dashboard/assets/scss/mixins'; }
$space-smaller: 4px; .box-shadow-blue-dark {
$space-small: 8px; box-shadow: 0 0 0 1px #1f93ff, 0 0 2px 3px #37546d;
$space-slab: 12px;
$space-normal: 16px;
$space-two: 20px;
$space-medium: 24px;
$space-large: 28px;
$space-larger: 32px;
$font-size-tiny: 12px;
$font-size-small: 14px;
$font-size-default: 16px;
$font-size-medium: 18px;
$color-bg: #ebf0f5;
$border-radius-normal: 5px;
.emoji-dialog {
@include elegant-card;
background: $color-white;
border-radius: $space-small;
box-sizing: content-box;
height: 300px;
position: absolute;
right: 0;
top: -95px;
width: 320px;
z-index: 1;
&::before {
@include arrow(bottom, $color-bg, $space-slab);
bottom: -$space-slab;
position: absolute;
right: $space-two;
} }
} }
</style>
<style lang="scss">
@import '~dashboard/assets/scss/mixins';
.emoji-list--wrap { .emoji-dialog {
display: flex; &::before {
flex-direction: column; $space-slab: 12px;
@media (prefers-color-scheme: dark) {
$color-bg-dark: #293f51;
@include arrow(bottom, $color-bg-dark, $space-slab);
}
@media (prefers-color-scheme: light) {
$color-bg: #ebf0f5;
@include arrow(bottom, $color-bg, $space-slab);
}
@apply -bottom-3 absolute right-5;
}
} }
.emoji--item { .emoji--item {
background: transparent; @apply bg-transparent border-0 rounded cursor-pointer text-lg h-6 m-0 py-0 px-1 hover:bg-slate-75 dark:hover:bg-slate-800;
border: 0;
border-radius: $space-smaller;
cursor: pointer;
font-size: $font-size-medium;
height: $space-medium;
margin: 0;
padding: 0 $space-smaller;
&:hover {
background: var(--s-75);
}
} }
.emoji--row { .emoji--row {
box-sizing: border-box; @apply box-border p-1;
padding: $space-smaller;
.emoji--item { .emoji--item {
height: 26px; @apply h-[26px] w-[26px] leading-normal m-1;
line-height: 1.5;
margin: $space-smaller;
width: 26px;
} }
} }
.emoji-search--wrap { .emoji-search--wrap {
margin: $space-small; @apply m-2 sticky top-2;
position: sticky;
top: $space-small;
.emoji-search--input { .emoji-search--input {
background-color: $color-bg; @apply text-sm focus-visible:border-transparent text-slate-800 dark:text-slate-100 h-8 m-0 p-2 w-full rounded-md bg-slate-75 dark:bg-slate-800 border border-solid border-transparent dark:border-slate-800/50;
border: 1px solid transparent;
border-radius: $border-radius-normal;
font-size: $font-size-small;
height: $space-larger;
margin: 0;
padding: $space-small;
width: 100%;
&:focus {
box-shadow: 0 0 0 1px $color-woot, 0 0 2px 3px $color-primary-light;
}
} }
} }
.empty-message { .empty-message {
align-items: center; @apply items-center flex flex-col h-[212px] justify-center;
display: flex;
flex-direction: column;
height: 212px;
justify-content: center;
.emoji-icon { .emoji-icon {
color: var(--s-200); @apply text-slate-200 dark:text-slate-200 mb-2;
margin-bottom: $space-small;
} }
.empty-message--text { .empty-message--text {
color: var(--s-200); @apply text-slate-200 dark:text-slate-200 text-sm font-medium;
font-size: $font-size-small;
font-weight: 500;
} }
} }
.emoji-item { .emoji-item {
height: 212px; @apply h-[212px] overflow-y-auto;
overflow-y: auto;
} }
.emoji-category--title { .emoji-category--title {
color: $color-heading; @apply text-slate-800 text-sm dark:text-slate-100 font-medium leading-normal m-0 py-1 px-2 capitalize;
font-size: $font-size-small;
font-weight: 500;
line-height: 1.5;
margin: 0;
padding: $space-smaller $space-small;
text-transform: capitalize;
} }
.emoji-dialog--footer { .emoji-dialog--footer {
background-color: $color-bg; @apply relative w-[322px] -left-px rtl:left-[unset] rtl:-right-px bottom-0 py-0 rounded-b-md border-b border-solid border-slate-75 dark:border-slate-800/50 px-1 bg-slate-75 dark:bg-slate-800;
bottom: 0;
padding: 0 $space-smaller;
position: sticky;
ul { ul {
display: flex; @apply flex relative left-[2px] rtl:left-[unset] rtl:right-[2px] list-none m-0 overflow-auto py-1 px-0;
list-style: none;
margin: 0;
overflow: auto;
padding: $space-smaller 0;
> li { > li {
align-items: center; @apply items-center cursor-pointer flex justify-center p-1;
cursor: pointer;
display: flex;
justify-content: center;
padding: $space-smaller;
} }
li .active { li .active {
background: $color-white; @apply bg-white dark:bg-slate-900;
} }
.emoji--item { .emoji--item {
align-items: center; @apply items-center flex text-sm;
display: flex;
font-size: $font-size-small;
&:hover { &:hover {
background: $color-bg; @apply bg-slate-75 dark:bg-slate-900;
} }
} }
} }