fix: toggle for reply editor (#10680)
The reply editor toggle was a bit confusing for a few users, where it's not clear that it's clickable. This PR updates it to make it more clear ### Pending Work - [x] RTL view ### Preview ##### Dark Mode https://github.com/user-attachments/assets/9e377eda-34d5-4f64-a06a-23ae822da50e ##### Light Mode https://github.com/user-attachments/assets/84c6b23c-cd17-4805-8e63-9d7d1cc0d799
This commit is contained in:
@@ -1,9 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
import { computed, useTemplateRef } from 'vue';
|
||||||
|
import { useElementSize } from '@vueuse/core';
|
||||||
import { REPLY_EDITOR_MODES } from './constants';
|
import { REPLY_EDITOR_MODES } from './constants';
|
||||||
|
|
||||||
import Icon from 'dashboard/components-next/icon/Icon.vue';
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
mode: {
|
mode: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -13,52 +12,66 @@ const props = defineProps({
|
|||||||
|
|
||||||
defineEmits(['toggleMode']);
|
defineEmits(['toggleMode']);
|
||||||
|
|
||||||
|
const wootEditorReplyMode = useTemplateRef('wootEditorReplyMode');
|
||||||
|
const wootEditorPrivateMode = useTemplateRef('wootEditorPrivateMode');
|
||||||
|
|
||||||
|
const replyModeSize = useElementSize(wootEditorReplyMode);
|
||||||
|
const privateModeSize = useElementSize(wootEditorPrivateMode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computed boolean indicating if the editor is in private note mode
|
||||||
|
* @type {ComputedRef<boolean>}
|
||||||
|
*/
|
||||||
const isPrivate = computed(() => props.mode === REPLY_EDITOR_MODES.NOTE);
|
const isPrivate = computed(() => props.mode === REPLY_EDITOR_MODES.NOTE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the width of the sliding background chip in pixels
|
||||||
|
* Includes 16px of padding in the calculation
|
||||||
|
* @type {ComputedRef<string>}
|
||||||
|
*/
|
||||||
|
const width = computed(() => {
|
||||||
|
const widthToUse = isPrivate.value
|
||||||
|
? privateModeSize.width.value
|
||||||
|
: replyModeSize.width.value;
|
||||||
|
|
||||||
|
const widthWithPadding = widthToUse + 16;
|
||||||
|
return `${widthWithPadding}px`;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the X translation value for the sliding background chip
|
||||||
|
* Translates by the width of reply mode + padding when in private mode
|
||||||
|
* @type {ComputedRef<string>}
|
||||||
|
*/
|
||||||
|
const translateValue = computed(() => {
|
||||||
|
const xTranslate = isPrivate.value ? replyModeSize.width.value + 16 : 0;
|
||||||
|
|
||||||
|
return `${xTranslate}px`;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<button
|
<button
|
||||||
class="flex items-center h-8 p-1 transition-all border rounded-full duration-600 bg-n-alpha-2 dark:bg-n-alpha-2 hover:bg-n-alpha-1 dark:hover:brightness-105 group relative transition-all duration-300 ease-in-out"
|
class="flex items-center w-auto h-8 p-1 transition-all border rounded-full bg-n-alpha-2 group relative duration-300 ease-in-out"
|
||||||
:class="[
|
|
||||||
isPrivate
|
|
||||||
? 'border-n-amber-12/10 dark:border-n-amber-3/30 w-[128px]'
|
|
||||||
: 'border-n-weak dark:border-n-weak ',
|
|
||||||
]"
|
|
||||||
@click="$emit('toggleMode')"
|
@click="$emit('toggleMode')"
|
||||||
>
|
>
|
||||||
<div
|
<div ref="wootEditorReplyMode" class="flex items-center gap-1 px-2 z-20">
|
||||||
class="flex absolute items-center justify-center w-6 transition-all duration-200 rounded-full bg-n-alpha-black1 size-6 transition-all duration-300 ease-in-out"
|
{{ $t('CONVERSATION.REPLYBOX.REPLY') }}
|
||||||
:class="[
|
|
||||||
isPrivate
|
|
||||||
? 'ltr:translate-x-[94px] rtl:-translate-x-[94px]'
|
|
||||||
: 'translate-x-0',
|
|
||||||
]"
|
|
||||||
>
|
|
||||||
<Icon
|
|
||||||
:icon="
|
|
||||||
isPrivate
|
|
||||||
? 'i-material-symbols-lock'
|
|
||||||
: 'i-material-symbols-lock-open-rounded'
|
|
||||||
"
|
|
||||||
class="flex-shrink-0 size-3.5"
|
|
||||||
:class="[
|
|
||||||
isPrivate ? 'dark:text-n-amber-9 text-n-amber-11' : 'text-n-slate-10',
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<span
|
<div ref="wootEditorPrivateMode" class="flex items-center gap-1 px-2 z-20">
|
||||||
class="flex items-center text-sm font-medium transition-all duration-200 w-fit whitespace-nowrap"
|
{{ $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE') }}
|
||||||
:class="[
|
</div>
|
||||||
isPrivate
|
<div
|
||||||
? 'text-n-amber-12 ltr:mr-7 ltr:ml-1.5 rtl:ml-7 rtl:mr-1.5'
|
class="absolute shadow-sm rounded-full h-6 w-[var(--chip-width)] transition-all duration-300 ease-in-out translate-x-[var(--translate-x)] rtl:translate-x-[var(--rtl-translate-x)]"
|
||||||
: 'text-n-slate-12 ltr:ml-7 ltr:mr-1.5 rtl:mr-7 rtl:ml-1.5',
|
:class="{
|
||||||
]"
|
'bg-n-solid-1': !isPrivate,
|
||||||
>
|
'bg-n-amber-2': isPrivate,
|
||||||
{{
|
}"
|
||||||
isPrivate
|
:style="{
|
||||||
? $t('CONVERSATION.REPLYBOX.PRIVATE_NOTE')
|
'--chip-width': width,
|
||||||
: $t('CONVERSATION.REPLYBOX.REPLY')
|
'--translate-x': translateValue,
|
||||||
}}
|
'--rtl-translate-x': `calc(-1 * var(--translate-x))`,
|
||||||
</span>
|
}"
|
||||||
|
/>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user